小编只是尝试用数据探索一下,百年前,泰坦尼克号沉船事件的真相是不是和媒体所说的一样,仅此而已。
故事先从美联社
1912年4月15日临晨收到的电报说起
10点25分,白星轮船公司的“泰坦尼克号”向马可尼电台发出CQD,报告撞上冰山,泰坦尼克号请求紧急救援。
第二天一早,也就是4月15日,《纽约时报》用四排大字做了头版头条:
新邮轮泰坦尼克号触及冰山
午夜船艏已开始进水下沉
妇孺登上救生艇撤离险境
凌晨零时27分后电讯已告中断
其他无良媒体的报道
船上全部妇孺均已入救生船
——《芝加哥每日纪事报》
船上大部分乘客已入救生船
——《匹兹堡评论报》
在整个沉船报道事件中大出风头的《纽约时报》究竟在背后隐瞒了什么秘密?究竟有没有妇孺先行?人性有没有战胜理性?问题太多,小编一个一个尝试解答。
用随机森林预测一下泰坦尼克号的幸存者
小编先装下B,用随机森林模型,预测一下幸存者,看看效果如何。如果模型效果较好,说明游客的生死之间有一定的规律可循,并非随机事件。
数据集来自:
https://www.kaggle.com/wise2kaggle/titannic/data
下载即可,先看一下数据集的整体情况,Python代码如下:
#coding=utf-8
importpandasaspd
data=pd.read_csv(r'C:\Users\Frank\Desktop\Titanic.csv')
print(data.shape)
结果如下:
(891, 12)
说明数据集总共有891个样本,12个人物特征,先说明一下12个特征的含义:
PassengerId:乘客的ID;
Survived:1表示幸存者,0表示遇难者;
Pclass:仓位等级;
Name:游客姓名;
Sex:性别;
Age:年龄;
SibSp:兄弟姐妹同在船上的数量;
Parch:同船父辈人员的数量;
Ticket:票号;
Fare:乘客上船前测量的体热特征;
Cabin:船舱号;
Embarked乘客登船的港口
先对DATA进行一下简单的描述统计,代码如下:
print(data.describe())
结果显示:
从上表可以看出,几个字段中,“Age”的数量不足891条,存在缺失,“Fare”值的差异较大,“Sex”是字符型需要处理。
首先处理一下乱七八糟的原始数据:
#删除无用的字段/字符转换/填补空缺
data.drop(['Name','Ticket','Cabin'],axis=1,inplace=True)
data['Sex']=(data['Sex']=='male').astype('int')
labels=data['Embarked'].unique().tolist()
data['Embarked']=data['Embarked'].apply(lambdan : labels.index(n))
data['Age']=data['Age'].fillna(data['Age'].median())
#处理一下极值
defdeletemax(array):
array=array.copy()
sigma = array.std()
mu = array.mean()
array[array >= mu +3*sigma] = mu +3*sigma
array[array
returnarray
data['Fare']=deletemax(data['Fare'])
处理完之后的原始数据如下(前5行):
看着清洗之后的原始数据,小编的心情感到舒畅了很多。
抓紧时间,开始用随机森林训练一个预测模型
首先把Survived作为模型目标。将891个样本,按照2:8的比例划分成测试集和训练集,代码如下:
fromsklearn.model_selectionimporttrain_test_split
fromsklearn.ensembleimportRandomForestClassifier
Y = data['Survived']
X = data[['Pclass',
'Sex','Age',
'SibSp',
'Parch',
'Fare',
'Embarked']]
X_train,X_test,Y_train,Y_test = train_test_split(X,Y,test_size=0.2)
model=RandomForestClassifier(max_depth=8,n_estimators=6)
model.fit(X_train,Y_train)
train_score=model.score(X_train,Y_train)
test_score=model.score(X_test,Y_test)
print("训练得分:,测试得分:".format(train_score,test_score))
运行结果如下:
训练得分: 0.8890449438202247
测试得分: 0.8603351955307262
考虑到时间因素,本次建模基本不考虑对模型参数进行调试,但是从结果里,我们还是惊讶地发现,预测准确率达到86%,
也就是说游客的生死和6个因素有非常紧密的关系。
影响生死的重要因素
既然生死不是听天由命,那么哪些因素会决定游客能否幸存呢?接下去再挖掘一下影响生死的重要因素。
Python代码如下:
importmatplotlib.pyplotasplt
importance=model.feature_importances_
print("Feature importance:\n{}:".format(importance))
defplot_feature_importance(model):
n_features =X.shape[1]
plt.figure(figsize=(10,6),dpi=100)
plt.barh(range(n_features),model.feature_importances_,
align='center')
feature_names=X.columns
plt.yticks(np.arange(n_features),feature_names)
plt.xlabel('Feature importance')
plt.ylabel('Feature')
plot_feature_importance(model)
plt.show()
运行结果如下:
从结果看,Sex是最重要的影响因素,所以身为男性,瞬间感到很悲壮。
再往后观察发现:
决定生死的重要因素还有Fare,Age,Pclass。
揭开媒体的百年谎言
既然有了这几个关键的因素,那么重点是,除了Sex之外,对其他几个因素的进一步分析,看结论是否和媒体报道一致。
先看一下生死和Age的关系。
Python代码如下:
data1= pd.pivot_table(data,values='Age',index=['Survived'],columns='Sex',aggfunc='mean',margins=True)
print(data1)
输出结果:
Sex 0 1 All
Survived
25.666667 30.783120 30.028233
128.716738 27.382294 28.291433
All27.929936 30.140676 29.361582
从生死与性别、年龄角度看,幸存者的平均年龄是28.29岁,而遇难者的平均年龄是30.03岁,差异很小,并不能说明年龄小的优先撤离。而且,女性遇难者的年龄反而更小。
再看一下生死与Pclass的关系
Python代码如下:
data2=pd.pivot_table(data,values='Age',index=['Survived'],columns='Pclass',aggfunc='count',margins=True)
print(data2)
输出结果:
Pclass 1 2 3 All
Survived
80 97 372 549
1136 87 119 342
All216 184 491 891
PERCENT63% 47% 24% 38%
从生死与仓位角度,显然高等级仓位的幸存比例最高,逃离的优先权是在高等级仓位的权贵手里。不禁想问,多少权贵其实是隐藏在妇孺之中逃之夭夭了。
附录-花边新闻:
泰坦尼克的幸存乘客都被要求签署一份保证书,让他们同意上岸后不对记者透露海难细节。
1、不光彩的媒体,涉嫌故意隐瞒、拖延海难消息,为博取眼球,编撰软文;
2、将泰坦尼克号上遇难的英美名流描述成礼让风度的绅士和坚毅勇敢的骑士,成了媒体,以及英美两国的危机公关策略。在虚构的场景下,让民众感受到民族的高贵以及优越性。
最后小编提醒:勿要轻信媒体,眼见为实。
领取专属 10元无门槛券
私享最新 技术干货