一、提出问题:
获救与其他因素(性别、年龄、舱位)的关系大小
二、整理数据:
数据来源:经典的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 #可视化在页面展示
讯享网
导入数据
讯享网df = pd.read_csv(r'C:\Users\jessie\train.csv',engine='python')
df.shape #输出:(891, 12)
查看数据信息
讯享网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
如果只想单纯查看数据的数据类型,可以用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
查看列名
讯享网df.columns #输出 Index(['PassengerId', 'Survived', 'Pclass', 'Name', 'Sex', 'Age', 'SibSp', 'Parch', 'Ticket', 'Fare', 'Cabin', 'Embarked'], dtype='object')
做到这里我们对泰坦尼克号的数据有了基本了解:
1.数据一共有891行,12列;
2.列【Age】、【Cabin】、【Embarked】有缺失值;
3.有些数据需要修改数据类型,如【PassengerId】,ID是纯文本,不应是数字类型
我们对数据作更进一步了解,可以查看数据的前N行或后N行
df.head() #输出

讯享网
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()

由图形可以看出,这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()

结论:第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.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) #新增一列
这个分类标准标准是小于等于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()

可以看到中年人(24-59岁)的人数最多,获救人数也最多,儿童(0-9岁)的获救率最高
2多因素分析
2.1、Age和Pclass共同对获救的影响
先导入其他的库
from __future__ import division from scipy import stats import seaborn as sns
定义获救人员
讯享网survives_passenger_df=df[df['Survived']==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))
讯享网print_bar(group_passenger_survived_rate(['Sex','Pclass']),'Sex_Pclass_Survived')

可以看到,对获救率的影响Age>Pclass,其次是Pclass对获救率的影响是1>2>3等级
2.2、性别和年龄共同对获救率的影响
#按Pclass分组计算每组的人数 def Pclass_survived_all(data,Pclass): return data.groupby(Pclass)['Sex'].count()
讯享网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()
#按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
讯享网print_bar(Pclass_survived_probability(['Sex','age_level']),'Sex_Sge_Survived')
2.3、年龄和乘客等级共同对生还率的影响
print_bar(Pclass_survived_probability(['age_level','Pclass']),'age_pclass_Survivedd')

可以看出乘客的等级对获救率的影响>乘客年龄的影响
年龄越大获救率越小,乘客等级越差获救率越差
五、结论
通过分析,可以看出对获救率影响最大的因素是乘客等级,其次是性别,最后年龄段也对生化率有影响
六、分析的局限性
七、结果的相关性
这里的数据并非通过试验得出,所以无法说自变量之间的因果性,只能说她们之间有相关性
八、参考文章:
https://www.jianshu.com/p/17fa
https://zhuanlan.zhihu.com/p/
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/10894.html