《吊打分析师》实战—经典重现,你会怎么选择?
2020,努力做一个无可替代的人! 长文多图,建议先收藏再看
作者|小一
全文共5683字,阅读全文需19分钟
写在前面的话
小一使用的Python版本是3.8
开发环境是Pycharm2019.3
图形可视化使用matplotlib+seaborn
正文
船长冷静下令:女士和小孩先走,请把机会让给她们。
一. 提出问题&分析问题
生还与遇难是完全看运气吗?
什么样的人生还几率较大?反之?
生还与遇难与什么有关?与什么最相关?
如何准确的预测生还者情况?
在往下看之前,先稍停一会,考虑一下如果是你,这几个问题应该怎么去分析?
生还与遇难的总体分布
单特征下整体结果的分布
多特征下整体结果的分布
每个特征的得分情况
小一哥,说了半天,我们的数据是什么样的?
敲黑板:
我们不是针对数据去讨论结果,我们是针对问题去取数据,通过数据去验证、去预测。
二. 数据预处理
数据预处理的目的是什么?
PassengerId: 乘客ID
Pclass: 乘客等级(1/2/3等舱位)
Name: 乘客姓名
Sex: 性别
Age: 年龄
SibSp: 堂兄弟/妹个数
Parch: 父母与小孩个数
Ticket: 船票信息
Fare: 票价
Cabin: 客舱
Embarked: 登船港口
目标信息:
Survived: 生还
但是实际上Pclass、Survived属于类别数据,这里只是通过1/2/3去表示类别,需要注意嗷
为什么要单独挑出数值型数据呢?
Pclass:最小值为1,最大值为3,均值为2.3,说明3等舱位的应该是多数
Age:最小值为0.17,最大值为80,均值为29.88,最大最小值需要再观察一下
Fare:最小值为0,最大值为512,std为51,波动较大,需要注意
2.1 字段分析
为什么要进行字段分析,不是要进行数据预处理吗?
分析具体的字段含义,更有利于我们进行缺失值的填补,所以这里放在了第一步
df_data['last_name'] = df_data['Name'].apply(lambda name: name.split(',')[0])
df_data['first_name'] = df_data['Name'].apply(lambda name: name.split(',')[1])
不懂就问呗,小一在狂补了自己的英语之后,才发现数据中的称呼竟然是这样的:
Miss、Mlle、Ms:都表示女士(未结婚或没有子女之类的)
Mrs、Mme:指夫人(亦指已婚妇女)
Master:少爷(小一猜指小孩)
Rev:牧师
Dr:医生
Capt、Col、Major:上校、中校、少校(小一猜想应该属于船上的船长、副船长这类人员,所以分为一类)
Don、Dona、Sir(先生、女士。指贵族和有地位者)
Jonkheer、Countess、Lady:乡绅、伯爵(亦指有地位者)
这么多称呼,难道分为这么多类别?
普通人士,分为男士和女士
特征职业的人士,比如船员、医生、牧师,因为是海难,所以船员可单独分类
有地位者、贵族等
Miss、Mlle、Ms、Mrs、Mme:指女士
Rev、Dr::牧师、医生
Capt、Col、Major:船员等
Master、Don、Dona、Sir、Jonkheer、Countess、Lady:有地位者
df_data['Title'] = df_data['first_name'].apply(lambda first_name: re.search('([A-Za-z]+)\.', first_name, flags=0).group(1))
title_mapping = {'Mr': 1, 'Miss': 2, 'Mlle': 2, 'Ms': 2, 'Mrs': 2, 'Mme': 2,
'Rev': 3, 'Dr': 3, 'Col': 4, 'Major': 4, 'Capt': 4,
'Master': 5, 'Don': 5, 'Dona': 5, 'Lady': 5, 'Countess': 5, 'Jonkheer': 5, 'Sir': 5,
}
# 将Title直接量化
df_data['TitleType'] = df_data['Title'].map(title_mapping)
大概意思是:名字越长,表示家庭底蕴越丰厚,所以,地位也就越高。
这个标准靠谱吗?
df_data['Namelen'] = df_data['Name'].apply(lambda name: len(name))
另外,上面提到的小团体概念我们也可以根据字段进行分类
df_data["Numbers"] = df_data["SibSp"] + df_data["Parch"] + 1
2.2 缺失数据处理
Fare缺失填充:根据缺失特征进行填充
Embarked 缺失填充:同样的根据缺失特征进行填充
Age 缺失填充:小一这里使用比较简单的一种填充方法
Cabin缺失填充
三. 可视化探索
今天的数据应该怎么去可视化呢?
需要注意的是,对数值型数据和离散型数据的可视化要特别注意
确定定性、定量数据
定性数据包括:定类数据和定序数据,主要包括以下字段:
PassengerId:乘客id
Survived:生还or遇难
Pclass:船舱等级
Name:乘客姓名
Sex:性别
SibSp:堂兄弟/妹个数
Parch:父母与小孩个数
Ticket:船票信息
Cabin:客舱
Embarked:登船港口
CabinType:客舱的分类(新增)
last_name & first_name & Title(新增姓名衍生列)
Title:姓名的title标识(新增)
Title_type:Title的分类(新增)
Namelen:姓名的长度(新增)
Numbers:家庭成员数(新增)
title_rank:姓名的title标识分类(新增)
定量数据包括:定距数据和定比数据,主要包括以下字段:
Age:年龄
Fare:票价
"""
Pclass、Sex、SibSp、Parch、Embarked类别较少,可以进行条形图可视化
Age、Ticket为离散数据,可以用折线图、散点图可视化
3.1 离散型单特征的分布
离散型单特征分析的目的是什么呢?
看图说话
船舱等级为1的生还率最高(生还率0.7),等级3最低(不足1/3),但是等级3的人数最多
女性的生还率较高(超过2/3),但是男性人数远大于女性
地位为2、5的生还率高于死亡率,2和5分别对应:女士和有地位者
登录港口为C的生还率最高(超过1/2),S的最低(1/3),但S的人数最多
堂兄弟/妹个数为1的生还率最高(超过1/2),为0的样本最多
父母和孩子个数为1和2的生还率最高(超过1/2),为0的样本最多
亲人数量为2、3、4的生还率高于死亡率,只有自已一个人的团体最多,生还率低(不足1/3)
客舱非空的生还率高于客舱为空的
上面这些都是我们可以从图中得出的数据,根据这些小节我们还可以大胆推测一下:
船舱等级为3的人数最多,生还率最低,所以等级3为多为普通阶层?
女性生还率大于男性,所以C登陆港口女性居多?
亲人数量字段Numbers 可以代替SibSp 和Parch?
3.2 数值型单特征的分布
看图说话
通过离中趋势得出中年人占据多数,年龄段在15-47
通过存活率得出儿童存活率高,儿童和中年人的年龄段分割点是15岁
通过离中趋势得出票价在0-100较多
通过存活率得出30是分界点,票价高于30,生还率大于死亡率
需要注意的是,票价的分布过于分散,后期考虑进行进一步处理
3.3 多特征的分布
多特征联合是怎么联合的?
看图说话
年龄中位数分布大致为 Pclass1>Pclass2>Pclass3
男性年龄中位数大于女性
船舱等级为1的票价较高,C登陆港口的票价稍高
女性的票价稍高于男性
结合1 中结论,可以推断出:
Pclass1为中上层人士,年龄稍大;而Pclass3为底层青年,年龄稍小
C登陆港口票价极有可能是女性贵族专用
Sex,Pclass分类条件下的 Age与Survived的散点分布图
Sex,Embarked分类条件下的 Age与Survived的散点分布图
Embarked,Pclass分类条件下的 Age与Survived的散点分布图
Embarked,Pclass分类条件下的 Fare与Survived的散点分布图
3个票价为500+(最高)的乘客最终都幸存了
船舱等级为1男性、女性生还率高于其他
女性生还率普遍高于男性
C登陆港口的女性居多
Q登陆港口人数较少,年龄分布主要在18~20
船舱等级为2和3的票价分布都在100以下,低于船舱等级1
相关系数
sns.heatmap(df_data.corr(), linewidths=0.1, vmax=1.0, square=True, cmap=sns.color_palette('RdBu', n_colors=256),
linecolor='white', annot=True)
plt.title('the features of corr')
plt.show()
如何选择和生还率最相关的特征?直接看会不会有点不严谨?
纳尼?可视化部分明明Age 和Numbers 对结果影响很大,这里怎么得分这么低?
这里需要用到特征工程的思想,简单说一下
所以,我们需要对Age 进行数据划分
总结
然鹅小一知道你们懒得再往回翻,于是就在这又添油加醋的总结了一番:
第一当属受之无愧的“
Lady First
”,在灾难面前,女士、小孩拥有优先选择权中上层人士占据一定的领导地位,包括在面对生死
底层人士多年龄较小,金钱和地位都缺失
独生子女的社会地位优于多孩的社会地位
一个人旅行比较容易出事(文中的出事指的是遇难),
尽量和父母、兄弟姐妹一起
西方国家对于儿童和成人的
年龄划分点是15岁
,不同于中国的18岁成年
本来打算是直接在可视化的下面继续写建模部分,然鹅小一实在是有点顶不住,就把这个需求变成让大家决定吧:
如果在看超过15,小一就在下一篇带你们杀入kaggle大赛,实战一下我们的分析究竟能在kaggle的众多大佬中处于怎样的水准。
关于源码
公众号后台
回复 分析001
获取本节分析内容的源码写在后面的话
很感谢大家对上篇文章的认可
,小一确实是花了心思的,也确实是没有填完所有的坑,这个真的抱歉
碎碎念一下
小一已经开启了实战狂躁模式,一起做项目咩? 另外,每周两篇原创看来是没戏了,一周一个实战项目倒是不错的选择 好了,我们下节见!
好巧啊,你也读到这了!
点个
在看
让小一看到你