当前位置:   article > 正文

泰坦尼克号—数据分析(单因素、多因素分析)_泰坦尼克号数据分析

泰坦尼克号数据分析

一、提出问题:
获救与其他因素(性别、年龄、舱位)的关系大小

二、整理数据:
数据来源:经典的titanic数据分析,大多数人都会从这个案例做教学或者做练习,数据可从kaggle(https://www.kaggle.com/c/titanic/data)上一个机器学习的数据集获得,kaggle有三个表格,我们现在用train这个表。

工具:jupyter notebook,可以更好的展示分析思维和过程。

导入python的数据分析库

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline  #可视化在页面展示
  • 1
  • 2
  • 3
  • 4

导入数据

df = pd.read_csv(r'C:\Users\jessie\train.csv',engine='python')
  • 1

查看数据
行列数

df.shape
#输出:(891, 12)
  • 1
  • 2

查看数据信息

df.info()

#输出:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 12 columns):
PassengerId    891 non-null int64
Survived       891 non-null int64
Pclass         891 non-null int64
Name           891 non-null object
Sex            891 non-null object
Age            714 non-null float64
SibSp          891 non-null int64
Parch          891 non-null int64
Ticket         891 non-null object
Fare           891 non-null float64
Cabin          204 non-null object
Embarked       889 non-null object
dtypes: float64(2), int64(5), object(5)
memory usage: 83.6+ KB
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

如果只想单纯查看数据的数据类型,可以用dtypes

df.dtypes
#输出:
PassengerId      int64
Survived         int64
Pclass           int64
Name            object
Sex             object
Age            float64
SibSp            int64
Parch            int64
Ticket          object
Fare           float64
Cabin           object
Embarked        object
dtype: object
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

查看列名

df.columns
#输出
Index(['PassengerId', 'Survived', 'Pclass', 'Name', 'Sex', 'Age', 'SibSp',
       'Parch', 'Ticket', 'Fare', 'Cabin', 'Embarked'],
      dtype='object')
  • 1
  • 2
  • 3
  • 4
  • 5

做到这里我们对泰坦尼克号的数据有了基本了解:
1.数据一共有891行,12列;
2.列【Age】、【Cabin】、【Embarked】有缺失值;
3.有些数据需要修改数据类型,如【PassengerId】,ID是纯文本,不应是数字类型

我们对数据作更进一步了解,可以查看数据的前N行或后N行

df.head()
#输出
  • 1
  • 2

在这里插入图片描述
ps:如果你用的其他例子列数比较多,可以用pd.set_option(‘max_columns’, 1000)来展示所有的列
展示的前5行,列【Cabin】有三个NaN缺失值,处理缺失值的方法有删除、填充中位数或者平均数,删除会使数据量减少,如果数据量大还好,数据量小会影响整个的分析结果,填充平均数或者中位数是更常见的方法

三、数据清洗
如前面所说,有三列数据是有缺失值,选择不删除用填充的方法来解决,【Age】这一列用平均值来填充
在这里插入图片描述
列【Embarked】只有两个缺失值,这里我们用中位数来填充
在这里插入图片描述
在这里插入图片描述
【Cabin】这列缺失值太多,先放着

至此,我们的数据清洗已完成,下面开始数据分析+视化

四、数据分析

1.单因素分析

1.1、先计算泰坦尼克号的获救人数和获救率

total_survived = df.Survived.value_counts()  #对列【Survived】进行计数
total_survived.index = total_survived.index.astype('str')  #将index由数字0,1转化为字符串“0”,“1”
_x = total_survived.index  #赋值
_y = total_survived.values  #赋值

#下面画图
plt.figure(figsize=(10, 5), dpi=80)  #figsize设置画布大小,dpi设置图片的精度
plt.subplot(121)  #画两个左右对称的子图,现在是画第一个

plt.bar(_x[0], _y[0],label='survived',color='#39CC6A',align='center')
plt.bar(_x[1], _y[1],label='not survived',color='#FF9361',align='center')
plt.xlabel('survived or not',fontsize=10)  
plt.ylabel('count',fontsize=10)
plt.ylim(0,600)
plt.title('Survival Count')

plt.subplot(122)  #现在是画第二个
plt.pie(total_survived, labels=total_survived.index,colors=['#FF9361','#39CC6A'], autopct='%3.0f%%', startangle=230,pctdistance = 0.6, labeldistance = 1.1)
plt.title('Survival Rate')
plt.axis('equal') #设置为正圆

plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

在这里插入图片描述
由图形可以看出,这891名乘客中,获救的占38%,没获救的占比62,死亡率很高

1.2、下面是计算Pclass和获救的关系

df['Pclass'] = df['Pclass'].astype('str')  #将数字类型改为字符串
df_survived = df['Pclass'][df['Survived'] == 1]  #将获救的Pclass数据取出来,右边等式返回的是索引值和Pclass值
df_not_survived = df['Pclass'][df['Survived'] == 0]

plt.figure(figsize=(5, 5),dpi = 80)

plt.hist([df_survived ,df_not_survived], stacked=True,color=['#39CC6A','#FF9361'],label=['Survived','not Survived'])
plt.xticks(['1','2','3'],['Upper','Middle','lower'])
plt.legend()
plt.xlabel('Pclass',fontsize=10)  
plt.ylabel('count',fontsize=10)
plt.title('Pclass_Survived')
plt.ylim(0,600)

plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

在这里插入图片描述
结论:第3层的船舱人数越多,获救率反而最小,船舱等级越高,获救率越大

1.3、下面是计算性别对获救的影响

df_sex1=df['Sex'][df['Survived']==1]
df_sex0=df['Sex'][df['Survived']==0]

plt.figure(figsize=(5, 5), dpi=80)
plt.hist([df_sex1,df_sex0],stacked=True,color=['#39CC6A','#FF9361'],label=['Survived','not Survived'],rwidth=10)
plt.xticks([-1,0,1,2],[-1,'F','M',2])
plt.legend()
plt.xlabel('Sex',fontsize=10)  
plt.ylabel('count',fontsize=10)
plt.title('Sex_Survived')

plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

在这里插入图片描述
由数据可以看出,船上男性的人数比女性多,但女性的获救率远大于男性

1.4、计算年龄对获救的影响

先对年龄分层

def age_level(age):
        if age <= 9:
            return str('1')
        elif age <=24:
            return str('2')
        elif age <=59:
            return str('3')
        else:
            return str('4')

df['age_level'] = df['Age'].apply(age_level)   #新增一列
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

这个分类标准标准是小于等于9岁的是儿童,小于等于24岁的是青年,小于等于59岁的是中年,大于59岁的是老年

plt.figure(figsize=(5, 5), dpi=80)
df_age1=df['age_level'][df['Survived']==1]
df_age0=df['age_level'][df['Survived']==0]
plt.hist([df_age1,df_age0],stacked=True,color=['#39CC6A','#FF9361'],label=['Survived','not Survived'])
plt.xticks(['1','2','3','4'],['child','youth','middle','elderly'])
plt.legend()
plt.xlabel('Age_level',fontsize=10)
plt.ylabel('count',fontsize=10)
plt.title('Age_Survived')
plt.ylim(0,700)

plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

在这里插入图片描述
可以看到中年人(24-59岁)的人数最多,获救人数也最多,儿童(0-9岁)的获救率最高

2多因素分析

2.1、Age和Pclass共同对获救的影响

先导入其他的库

from __future__ import division
from scipy import stats
import seaborn as sns
  • 1
  • 2
  • 3

定义获救人员

survives_passenger_df=df[df['Survived']==1]
  • 1
#定义几个常用的方法

#按照xx对乘客进行分组,计算每组的人数
def xx_group_all(df,xx):
    #按照xx对乘客进行分组后 ,每个组的人数
    return df.groupby(xx)['PassengerId'].count()

#计算每个组的生还率
def group_passenger_survived_rate(xx):
    #按xx对乘客进行分组后每个组的人数
    group_all=xx_group_all(df,xx)
    #按xx对乘客进行分组后每个组生还者的人数
    group_survived_value=xx_group_all(survives_passenger_df,xx)
    #按xx对乘客进行分组后,每组生还者的概率
    return group_survived_value/group_all

#输出饼图
def print_pie(group_data,title):
    group_data.plt.pie(title=title,figsize=(6,6),autopct='%.2f%%'\
                      ,startangle=90,legend=True)

#输出柱状图
def print_bar(data,title):
    bar=data.plot.bar(title=title)
    for p in bar.patches:
        bar.annotate('%.2f%%'%(p.get_height()*100),(p.get_x()*1.005\
                     ,p.get_height()*1.005))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
print_bar(group_passenger_survived_rate(['Sex','Pclass']),'Sex_Pclass_Survived')
  • 1

在这里插入图片描述
可以看到,对获救率的影响Age>Pclass,其次是Pclass对获救率的影响是1>2>3等级

2.2、性别和年龄共同对获救率的影响

#按Pclass分组计算每组的人数
def Pclass_survived_all(data,Pclass):
    return data.groupby(Pclass)['Sex'].count()
  • 1
  • 2
  • 3
dd0=df[['age_level','Sex','Pclass']]
dd11=df[['age_level','Sex','Pclass']][df['Survived']==1]
c=Pclass_survived_all(dd11,['age_level','Sex','Pclass'])
dd0['Sex'].count()
  • 1
  • 2
  • 3
  • 4
#按Pclass分组计算每组的生还率
def Pclass_survived_probability(data):
    #计算每组生还者的人数
    groupby_survived=Pclass_survived_all(dd11,data)
    #计算每组的总人数
    groupby_survived_all=Pclass_survived_all(dd0,data)
    return groupby_survived/groupby_survived_all
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
print_bar(Pclass_survived_probability(['Sex','age_level']),'Sex_Sge_Survived')
  • 1

可以看出,对获救率影响大的是性别,女性>男性
其次儿童的获救率大于青年、中年和老年,青年跟中年的获救率差不多,老年人最低。

2.3、年龄和乘客等级共同对生还率的影响

print_bar(Pclass_survived_probability(['age_level','Pclass']),'age_pclass_Survivedd')
  • 1

在这里插入图片描述
可以看出乘客的等级对获救率的影响>乘客年龄的影响
年龄越大获救率越小,乘客等级越差获救率越差

五、结论
通过分析,可以看出对获救率影响最大的因素是乘客等级,其次是性别,最后年龄段也对生化率有影响

六、分析的局限性

这里并没有从统计上分析得出这些结果的偶然性,所以并不知道这里的结果是真正的差异造成的还是噪音造成的
年龄字段有一些缺失值,因为是连续数据这里用的是全体乘客年龄的均值填充缺失值,这样会缩小年龄之间的差异,也会影响分析结果

七、结果的相关性
这里的数据并非通过试验得出,所以无法说自变量之间的因果性,只能说她们之间有相关性

八、参考文章:
https://www.jianshu.com/p/17f99100525a
https://zhuanlan.zhihu.com/p/30920420

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/718124
推荐阅读
相关标签
  

闽ICP备14008679号