泰坦尼克号幸存者预测是kaggle上一个较为经典的数据分析案例,之前做了这个案例,今天向大家分享一下自己的学习笔记。
小伙伴注意了,本次实例分为两部分,第一部分(也就是本篇)我们会用我们之前使用过的一些数据挖掘方法来对数据集进行探索,并进行幸存者预测;第二部分(下篇)我们会使用机器学习的内容,利用分类树模型来进行幸存者预测。
数据集来源:
https://www.kaggle.com/c/titanicwww.kaggle.com为了让部分没看过《泰坦尼克号》这部电影的小伙伴也能对数据背景有一个基本认识,我们简单概括一下背景:
泰坦尼克号的沉没是世界上最严重的海难事故之一,造成了大量的人员伤亡。这是一艘号称当时世界上最大的邮轮,船上的人年龄各异,背景不同,有贵族豪门,也有平民旅人,邮轮撞击冰山后,船上的人马上采取措施安排救生艇转移人员,从本次海难中存活下来的,也就是幸存者。
而这也引出了我们今天的主题:通过挖掘数据中的关键信息来预测一下哪些人可能成为幸存者。
下面,正文开始~
import numpy as np
import pandas as pd
df = pd.read_csv(r'C:UsersAdministratorDesktopdata.csv',encoding='utf-8')
为了方便,我们将等会可能需要用到的库一并导入:
from matplotlib import pyplot as plt
%matplotlib inline
plt.style.use('fivethirtyeight')
import seaborn as sns
sns.set()
import warnings
warnings.filterwarnings('ignore')
1、查看前10行数据
df.head(10)
2、查看数据大小
df.shape
可以看到,我们的数据集有891个样本,12个特征。
3、查看特征
df.info()
其中,
Survived:代表是否幸存,0否,1是
Pclass:船舱等级,1最好,2次之,3最后
SibSp:该名乘客上船后,与其一起同行上船的兄弟姐妹的个数
Parch:该名乘客上船后,与其一起同行上船的家里的老人与孩子的个数
Ticket:船票编号
Fare:船票价格
Cabin:该名乘客所在船舱的编号
Embarked:该名乘客登船的码头,有三个:S、C、Q三个码头
4、查看数据缺失情况
df.isnull().sum()
可以看到,Cabin(乘客所在船舱的编号)大量缺失。
5、使用describe()做简单的数理统计
df.describe()
6、统计一下获救人数占比
df_survive = df['Survived'].value_counts(normalize=True)
n0_sample = df_survive[0]
n1_sample = df_survive[1]
print('死亡人数占{:.2%}; 幸存人数占{:.2%}'.format(n0_sample,n1_sample))
可视化:
df_counts = df['Survived'].value_counts()
plt.rcParams['font.sans-serif']=['SimHei']
plt.pie(df_counts, explode=(0, 0.1),labels=['未获救','获救'],
shadow=True, autopct='%1.1f%%')
plt.axis('equal')
plt.legend()
我们可以得到一个不幸的信息,在本次海难中获救人数仅占38.4%。
7、统计性别特征对获救几率的影响
首先看一下船上乘客的男女比例:
df['Sex'].value_counts()
男性乘客577人,女性314人。
看过电影的同学,可能也有注意到电影里的这一个细节:邮轮出事后,是本着“老人、小孩、女士优先”的准则,也就是说这一部分乘客会优先获救。下面我们来看看在这一点在数据集中是否有体现:
df['Survived'].groupby(df['Sex']).value_counts()
可以看到,女性乘客总人数比男性少,但是获救人数却比男性乘客要多。
分别统计船上女性乘客与男性乘客的获救率:
sur_fe = 233/314
sur_ma = 109/577
print("女性获救比例:{:.2%};男性获救比例:{:.2%}".format(sur_fe,sur_ma))
可以看到,
性别特征是影响获救概率的一个重要因素。
女性获救概率要远远高于男性。
8、研究船舱等级对获救几率的影响
查看船舱等级分类及各船舱人数:
df['Pclass'].value_counts()
查看各船舱的获救情况:
df['Survived'].groupby(df['Pclass']).value_counts()
我们也可以用另一种方法查看:
pd.crosstab(df.Pclass,df.Survived,margins=True).style.background_gradient()
分别统计不同船舱乘客的获救率:
sur_1 = 136/216
sur_2 = 87/184
sur_3 = 119/491
print("一号舱获救比例:{:.2%};二号舱获救比例:{:.2%};三号舱获救比例:{:.2%}".format(sur_1,sur_2,sur_3))
可视化:
sur_123 = [136/216,87/184,119/491]
import matplotlib
plt.figure(figsize=(8,6),dpi=80,num=4)
myfont = matplotlib.font_manager.FontProperties(fname='C:WindowsFontssimsun.ttc')
x= range(1,4)
plt.bar(x, sur_123, color='g',label='不同船舱下的乘客获救比例')
plt.xlabel('船舱',FontProperties=myfont,fontsize=15)
plt.ylabel('获救比例',FontProperties=myfont,fontsize=15)
plt.title('不同船舱下乘客的获救率',FontProperties=myfont,fontsize=15)
xtick_labels=['{}号舱'.format(i) for i in x]
plt.xticks(x,xtick_labels,FontProperties=myfont)
plt.legend(prop=myfont)
可以看到,船舱等级对于乘客的获救率还是存在很大的影响,从三个船舱的获救率可以看到,一号舱乘客有着很高的优先级,获救率接近63%,二号舱次之,只有47.28%,三号舱获救率则很低,不到25%。
9、研究在不同等级的船舱内,“女士优先”的原则还是否存在:
(依然使用groupby函数)
第一步,统计不同船舱内的男女人数:
df['Sex'].groupby(df['Pclass']).value_counts()
df['Survived'].groupby([df['Pclass'],df['Sex']]).value_counts()
第二步,分别计算在不同等级的船内,女性乘客与男性乘客的获救率:
1、一号舱:
sur_fe = 91/94
sur_ma = 45/122
print("一号舱女性获救比例:{:.2%};一号舱男性获救比例:{:.2%}".format(sur_fe,sur_ma))
2、二号舱:
sur_fe = 70/76
sur_ma = 17/108
print("二号舱女性获救比例:{:.2%};二号舱男性获救比例:{:.2%}".format(sur_fe,sur_ma))
3、三号舱:
sur_fe = 72/144
sur_ma = 47/347
print("三号舱女性获救比例:{:.2%};三号舱男性获救比例:{:.2%}".format(sur_fe,sur_ma))
可以看到,在一等舱和二等舱,女性的获救率都很高,在90%以上,在三等舱中的乘客获救率普遍较低,女性的获救率为50%,仍远高于男性获救率。
可以看出,“女士优先”的准则,在各个船舱中都得到呈现。
可视化:
sur_fe = [91/94,70/76,72/144]
sur_ma = [45/122,17/108,47/347]
import matplotlib
plt.figure(figsize=(8,6),dpi=80,num=4)
myfont = matplotlib.font_manager.FontProperties(fname='C:WindowsFontssimsun.ttc')
x= range(1,4)
plt.plot(x, sur_fe, color='r',label='女性获救比例', linewidth=2)
plt.plot(x, sur_ma, color='g',label='男性获救比例', linewidth=2)
plt.xlabel('船舱',FontProperties=myfont,fontsize=15)
plt.ylabel('获救比例',FontProperties=myfont,fontsize=15)
plt.title('不同船舱及不同性别下乘客的获救率',FontProperties=myfont,fontsize=15)
xtick_labels=['{}号舱'.format(i) for i in x]
plt.xticks(x,xtick_labels,FontProperties=myfont)
plt.legend(prop=myfont)
从这个图我们就能明显看到,性别及船舱等级对获救概率的影响。
从上述分析结果,我们可以得到以下两个关于乘客获救率结论:
(1)在泰坦尼克号上,女性的获救率会高于男性;
(2)高等级船舱的乘客获救率会高于低等级船舱。
除此之外,也可以从年龄等其他角度进行分析,这里由于篇幅问题我们就不再续写了,感兴趣的小伙伴可以自己动手试试。
在本篇中,我们使用了常用的数据挖掘手段对乘客的获救率进行预测;下一篇中,我们将会使用回归树的方法,同样实现预测获救率的目标。
以上便是<数据挖掘经典实例——泰坦尼克号幸存者预测>的内容,感谢大家的细心阅读,同时欢迎感兴趣的小伙伴一起讨论、学习,想要了解更多内容的可以看我的其他文章,同时可以持续关注我的动态~