泰坦尼克号(RMS Titanic),又译作铁达尼号,是英国白星航运公司下辖的一艘奥林匹克级邮轮,于1909年3月31日在爱尔兰贝尔法斯特港的哈兰德与沃尔夫造船厂动工建造,1911年5月31日下水,1912年4月2日完工试航。

泰坦尼克号是当时世界上体积最庞大、内部设施最豪华的客运轮船,有“永不沉没”的美誉 。然而不幸的是,在她的处女航中,泰坦尼克号便遭厄运——她从英国南安普敦出发,途经法国瑟堡-奥克特维尔以及爱尔兰昆士敦,驶向美国纽约。图1 泰坦尼克号航线

1912年4月14日23时40分左右,泰坦尼克号与一座冰山相撞,造成右舷船艏至船中部破裂,五间水密舱进水。次日凌晨2时20分左右,泰坦尼克船体断裂成两截后沉入大西洋底3700米处。2224名船员及乘客中,仅705人生还。什么样的乘客能免遭葬身大海的命运?让我们从数据一探究竟。

提出问题

在泰坦尼克号上,什么样的乘客能免遭葬身大海的命运?

量化问题:用训练数据训练模型,预测乘客生还的概率。如果模型计算出概率>=0.5,预测结果为生还;如果模型计算出概率<0.5,预测结果为丧生。

理解数据

理解数据是保证分析结果的关键。数据分析师对字段概念理解错误就像火影中的忍者中了幻术,对虚无的假象白费力气,浪费时间和精力。需对每个字段的含义,字段不同取值的意义都正确理解。

用于分析的数据来源于kaggle:Titanic: Machine Learning from Disasterwww.kaggle.com

数据包含训练数据891条和测试数据418条:图2 导入数据

训练数据集包括以下12个字段:图3 数据一窥

PassengerId:乘客ID

Survived:是否生还,0 = 否, 1 = 是

Pclass:船舱等级,1,2,3依次为高,中,低

Name:乘客姓名

Sex:乘客性别

Age:乘客年龄

SibSp:船上兄弟姐妹人数

Parch:船上父母/孩子人数

Ticket:船票号

Fare:旅客票价

Cabin:船舱号

Embarked:登船港口,C = Cherbourg, Q = Queenstown, S = Southampton

清洗数据

在建模分析前,需要对原始数据做处理,包括数据类型转换,缺失值处理,异常值剔除,排序。清洗数据可提升数据质量,对后续的构建模型起到事倍功半的作用。

缺失值处理

合并训练集和测试集,方便后续对整体数据做清洗。图4 数据信息一览

通过上图可以看出:

1)生还信息只有891例,和训练样本集条数相同,测试样本集没有这个字段。

2)年龄、船票价格为数值类型数据,缺失值较少。可以用众数或平均数填充缺失值。在评估模型阶段将对比使用平均数和众数的效果。

3)登船港口为object类型,仅2个缺失值,用出现最多的值填充缺失值。

4)船舱号为object类型,仅295条数据有值,缺失值过多,用'U'填充,表明该乘客船舱未知。图5 填充缺失值

特征提取

结合图3,图4可看出:

1)船舱等级分高中低三类,但在数据框中为int类型数据,需要将这个变量转换为一组虚拟变量。

2)船舱号为字母+数字,数字各不相同,但首字母可表明船舱等级。故提取首字母,之后转换成一组虚拟变量处理。

3)船票号较为分散,没有很强烈的规律,舍弃,不作处理。

4)登船港口转换为一组虚拟变量。

5)姓名的头衔包含了社会地位,提取头衔后做虚拟变量处理。

6)性别信息为字符串,转换成虚拟变量处理。

7)家庭类别按照人数分类。1人为单人家庭;2-4人为小家庭;5人及以上为大家庭。分类后做虚拟变量处理。

用drop_first=True参数设置避免多重共线性。图6 特征提取

特征选择

将转换后的变量加入原数据框,删除被处理的变量,用相关系数矩阵筛选特征。

all_data.drop(['Pclass','Name','Sex','Ticket','Cabin','Embarked'], axis = 1, inplace = True)

all_data = pd.concat([all_data, PClassDf, CabinDf, EmbarkedDf, TitleDf, sex, FamilyDf.loc[:,'FamilySmall':'FamilyMiddle'],FamilyDf['FamilySize']], sort = False ,axis=1)图7 相关系数矩阵

对与生存标签列的相关系数降序排列,可看到除生存标签外绝对值最大的10个指标,分别为:Mrs,Miss,Fare,CabinB,FamilyMiddle,FamilySmall,CabinU,Pclass3,Sex,Mr。对应头衔、性别、船票价格、家庭规模、船舱等级属性。Mrs,Miss与生存正相关,说明在逃生时,机会优先给了女士,Mr、Sex系数同理;FamilyMiddle,FamilySmall与生存正相关,说明家庭规模为中、小时,逃生可能更大,可能是因为逃离的速度更快;Fare与生存正相关,说明船票价格越贵,生存希望越大,可能与舱位更高级,人少,便于撤离有关;Cabin_B同理。图8 生存标签相关系数

将以上头衔、性别、船票价格、家庭规模、船舱等级属性作为特征,构造数据框用于后续处理。

all_X = pd.concat([TitleDf, all_data['Fare'], CabinDf, FamilyDf.loc[:,'FamilySmall':'FamilyMiddle'], PClassDf, sex],axis = 1)

构建模型

1)把来源于test.csv的数据分为训练数据、测试数据;把来源于train.csv的数据设置为预测数据。用逻辑回归方法建模。图9 数据分组,建模

2)评估模型效果(正确率=0.715)图10 评估模型正确率

模型实施

1)用预测组的特征数据,上文构建的模型,预测生存标签,将结果保存至csv。图11 预测数据

2)上传数据至kaggle,获取建模效果数据,可看到预测的准确率为0.75。后续可用不同算法对指标选取、建模方法做进一步优化。图12 数据上传Kaggle