首页 > 编程知识 正文

泰坦尼克数据处理分析,泰坦尼克号 数据

时间:2023-05-04 20:05:39 阅读:200915 作者:3501

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

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

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

导入python的数据分析库

import pandas as pdimport numpy as npimport matplotlib.pyplot as plt%matplotlib inline #可视化在页面展示

导入数据

df = pd.read_csv(r'C:Usersjessietrain.csv',engine='python')

查看数据
行列数

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

查看数据信息

df.info()#输出:<class 'pandas.core.frame.DataFrame'>RangeIndex: 891 entries, 0 to 890Data columns (total 12 columns):PassengerId 891 non-null int64Survived 891 non-null int64Pclass 891 non-null int64Name 891 non-null objectSex 891 non-null objectAge 714 non-null float64SibSp 891 non-null int64Parch 891 non-null int64Ticket 891 non-null objectFare 891 non-null float64Cabin 204 non-null objectEmbarked 889 non-null objectdtypes: float64(2), int64(5), object(5)memory usage: 83.6+ KB

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

df.dtypes#输出:PassengerId int64Survived int64Pclass int64Name objectSex objectAge float64SibSp int64Parch int64Ticket objectFare float64Cabin objectEmbarked objectdtype: 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')

这个分类标准标准是小于等于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 divisionfrom scipy import statsimport 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

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。