赞
踩
一、提出问题:
获救与其他因素(性别、年龄、舱位)的关系大小
二、整理数据:
数据来源:经典的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/17f99100525a
https://zhuanlan.zhihu.com/p/30920420
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。