![3969427646a4732fe189ee475a8fe141.png](https://i-blog.csdnimg.cn/blog_migrate/23123cf29e7686309d5be95978890fdf.jpeg)
泰坦尼克号幸存者预测是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)
![66f808fdc05e92bd5411e40ac1b045c9.png](https://i-blog.csdnimg.cn/blog_migrate/6ff88f81037dbcf052e7819fcea6fd01.jpeg)
2、查看数据大小
df.shape
![d2e6bf1d67be3c8ebf21e2cd8ddc5006.png](https://i-blog.csdnimg.cn/blog_migrate/2669460fae50e02f7edee7592048e53d.png)
可以看到,我们的数据集有891个样本,12个特征。
3、查看特征
df.info()
![5955934b4a88a6864d11ae90728b4a24.png](https://i-blog.csdnimg.cn/blog_migrate/d59e6b8eb3a3d924a8758fb6ecce18de.jpeg)
其中,
Survived:代表是否幸存,0否,1是
Pclass:船舱等级,1最好,2次之,3最后
SibSp:该名乘客上船后,与其一起同行上船的兄弟姐妹的个数
Parch:该名乘客上船后,与其一起同行上船的家里的老人与孩子的个数
Ticket:船票编号
Fare:船票价格
Cabin:该名乘客所在船舱的编号
Embarked:该名乘客登船的码头,有三个:S、C、Q三个码头
4、查看数据缺失情况
df.isnull().sum()
![81a3a7d5873073a3a0250ce8b8f5d510.png](https://i-blog.csdnimg.cn/blog_migrate/5841a49b49d7ef1b137d8df439247998.png)
可以看到,Cabin(乘客所在船舱的编号)大量缺失。
5、使用describe()做简单的数理统计
df.describe()
![3bb0bf06e69329a018b0def117819b32.png](https://i-blog.csdnimg.cn/blog_migrate/f1569d3f41c385c64818319fd623acfe.jpeg)
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))
![eae4e4ec171056e4e2accc88843642a7.png](https://i-blog.csdnimg.cn/blog_migrate/e218c3512ca7e545b0aac68582fcb07f.png)
可视化:
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()
![06049201267eac64d0f8612ef1b42229.png](https://i-blog.csdnimg.cn/blog_migrate/c656e792eb9182e3f6a5171bb3b87f86.png)
我们可以得到一个不幸的信息,在本次海难中获救人数仅占38.4%。
7、统计性别特征对获救几率的影响
首先看一下船上乘客的男女比例:
df['Sex'].value_counts()
![f41a124430fed493e4d839b305f39f18.png](https://i-blog.csdnimg.cn/blog_migrate/1a6cb121de3672bc1302801fd6804d18.png)
男性乘客577人,女性314人。
看过电影的同学,可能也有注意到电影里的这一个细节:邮轮出事后,是本着“老人、小孩、女士优先”的准则,也就是说这一部分乘客会优先获救。下面我们来看看在这一点在数据集中是否有体现:
df['Survived'].groupby(df['Sex']).value_counts()
![df8ee31cdc87d2ce6001e953b36a7aec.png](https://i-blog.csdnimg.cn/blog_migrate/20cd7350620cf2c5b33ad41764d54435.png)
可以看到,女性乘客总人数比男性少,但是获救人数却比男性乘客要多。
分别统计船上女性乘客与男性乘客的获救率:
sur_fe = 233/314
sur_ma = 109/577
print("女性获救比例:{:.2%};男性获救比例:{:.2%}".format(sur_fe,sur_ma))
![c0842a1f3d0ca217be004eaae05f21a9.png](https://i-blog.csdnimg.cn/blog_migrate/6927a9cf50bfbbb5b163bee8ad742c8e.png)
可以看到,
性别特征是影响获救概率的一个重要因素。
女性获救概率要远远高于男性。
8、研究船舱等级对获救几率的影响
查看船舱等级分类及各船舱人数:
df['Pclass'].value_counts()
![deba3c292b7de835bc91fc13991e77e3.png](https://i-blog.csdnimg.cn/blog_migrate/07e81da40df62d774dbb8edf3691508a.png)
查看各船舱的获救情况:
df['Survived'].groupby(df['Pclass']).value_counts()
![a93f90aebb6df22bfe996ac882750ea8.png](https://i-blog.csdnimg.cn/blog_migrate/aaaaeef8979d8b7d73f55f34aef9c28d.png)
我们也可以用另一种方法查看:
pd.crosstab(df.Pclass,df.Survived,margins=True).style.background_gradient()
![28066fc2d359fa15bab935b82ef42887.png](https://i-blog.csdnimg.cn/blog_migrate/059c92da8613d386632bdc6d9db2273c.png)
分别统计不同船舱乘客的获救率:
sur_1 = 136/216
sur_2 = 87/184
sur_3 = 119/491
print("一号舱获救比例:{:.2%};二号舱获救比例:{:.2%};三号舱获救比例:{:.2%}".format(sur_1,sur_2,sur_3))
![e400b240b6361c5cd32208066b8c3cdc.png](https://i-blog.csdnimg.cn/blog_migrate/36d421d85b2637a0b7ff6dcfa0dc37c5.png)
可视化:
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)
![4a4cebe5fc8b8853661f789572647e23.png](https://i-blog.csdnimg.cn/blog_migrate/1ef2f2d517cf0662f35da67667169bc8.png)
可以看到,船舱等级对于乘客的获救率还是存在很大的影响,从三个船舱的获救率可以看到,一号舱乘客有着很高的优先级,获救率接近63%,二号舱次之,只有47.28%,三号舱获救率则很低,不到25%。
9、研究在不同等级的船舱内,“女士优先”的原则还是否存在:
(依然使用groupby函数)
第一步,统计不同船舱内的男女人数:
df['Sex'].groupby(df['Pclass']).value_counts()
![83709ff01fe1e936271aa63ac42595a5.png](https://i-blog.csdnimg.cn/blog_migrate/ea099b55c6b94a69289509f8cc74115b.png)
df['Survived'].groupby([df['Pclass'],df['Sex']]).value_counts()
![81772b0f7130973c110043424b006f9c.png](https://i-blog.csdnimg.cn/blog_migrate/08aab316399596a29e7ec196236fc473.png)
第二步,分别计算在不同等级的船内,女性乘客与男性乘客的获救率:
1、一号舱:
sur_fe = 91/94
sur_ma = 45/122
print("一号舱女性获救比例:{:.2%};一号舱男性获救比例:{:.2%}".format(sur_fe,sur_ma))
![a04cfa4c16658d908cc8bdd52cdae976.png](https://i-blog.csdnimg.cn/blog_migrate/a0bea412c07b5f5ac1b714d83b212768.png)
2、二号舱:
sur_fe = 70/76
sur_ma = 17/108
print("二号舱女性获救比例:{:.2%};二号舱男性获救比例:{:.2%}".format(sur_fe,sur_ma))
![f58273d5b5459df16df692f37e76adb5.png](https://i-blog.csdnimg.cn/blog_migrate/b40bc8300edc0c246672d94179e04992.png)
3、三号舱:
sur_fe = 72/144
sur_ma = 47/347
print("三号舱女性获救比例:{:.2%};三号舱男性获救比例:{:.2%}".format(sur_fe,sur_ma))
![5bf022a7139616a4402dee9a1bf8d0af.png](https://i-blog.csdnimg.cn/blog_migrate/d504481e4a7ee742a58c6435773d405d.png)
可以看到,在一等舱和二等舱,女性的获救率都很高,在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)
![10d7556392dc150c7904506c0b296cb0.png](https://i-blog.csdnimg.cn/blog_migrate/f9f846d36570bbda409b013e0a72bf95.png)
从这个图我们就能明显看到,性别及船舱等级对获救概率的影响。
小结:
从上述分析结果,我们可以得到以下两个关于乘客获救率结论:
(1)在泰坦尼克号上,女性的获救率会高于男性;
(2)高等级船舱的乘客获救率会高于低等级船舱。
除此之外,也可以从年龄等其他角度进行分析,这里由于篇幅问题我们就不再续写了,感兴趣的小伙伴可以自己动手试试。
在本篇中,我们使用了常用的数据挖掘手段对乘客的获救率进行预测;下一篇中,我们将会使用回归树的方法,同样实现预测获救率的目标。
以上便是<数据挖掘经典实例——泰坦尼克号幸存者预测>的内容,感谢大家的细心阅读,同时欢迎感兴趣的小伙伴一起讨论、学习,想要了解更多内容的可以看我的其他文章,同时可以持续关注我的动态~