作者:刘璐
出品:AI机器思维
最近重温了一遍泰坦尼克号,又一次为杰克和露丝甜美的爱情感动,两人坦诚真挚的相爱让人神往,一阵幻想过后咬了口嘴边的柠檬,真酸...
从泰坦尼克号撞上冰山,到最终完全沉没的两个半小时里,随着事态的不断恶化,人们求生的态度从有序,到混乱,直到最后绝望蔓延,所有安宁时的伪装被狠狠撕碎,人性的善与恶在此刻被急剧放大,一览无余。而船长“让女士和孩子先上船”的号召则让绝境下的撤离生出一丝温暖,是爱与责任让你我相伴,也愿这份爱护你余生周全。
跳出整个事件的情感漩涡,单就撤离这件事来看,船长的命令起没起作用?或者起了多大作用?真正逃生的又是哪些人?今天我们就一起来探讨下泰坦尼克号的逃生率问题,该问题主要分为两部分,一是分析影响逃生率的因素有哪些,二是在这种因素影响下,预测另一群人逃生的概率。
本期“品玩SAS”主要分析影响逃生率的各项因素,探索发现哪些人更有可能逃生。
1 事件介绍
泰坦尼克号由白星航运公司于1909年开始建造,1912年全部建造完成,是当时世界上最大,最豪华的轮船,被世人称为“永不沉没”的轮船。泰坦尼克号最大载员3,547人,救生艇最大载员1500人。1912年4月10日,泰坦尼克号载着2224名船员及乘客从英国南安普敦出发,开始了她的第一次也是最后一次航行。1912年4月14日23:40分左右,泰坦尼克号撞上一座冰山,导致右舷船艏至船中部破裂,五间水密舱进水,轮船开始沉没,最终2224人中1517人丧生,仅有705人登上救生艇获救。
2 理解数据
2.1 数据来源
本文数据取自KAGGLE泰坦尼克号生存预测比赛:https://www.kaggle.com/c/titanic/overview,其中包括训练集和测试集,训练集中包括乘客获救状态和基本信息,测试集仅包括乘客基本信息,需根据训练集信息建立模型,对测试集乘客进行生存预测。
2.2 查看数据
2.2.1 导入数据
首先把数据导入SAS,看一看数据长什么样。
*导入数据;
proc import out=train
datafile='D:\sastest\liulu\titanic\train.csv'
dbms=csv replace;
getnames=yes;
run;
proc print data=train;
run;
proc contents data=train;
run;
训练集总计891条数据,12个变量,即891名乘客的12种基本信息,其中PassengerId、Survived、Pclass、Age、SibSp、Parch、Fare为数值型, Name、Sex、Ticket Cabin、Embarked为字符型。
2.2.2 字段解释
PassengerId:乘客ID
Survived : 生存状态,0为死亡,1为幸存
Pclass:乘客等级(1/2/3等舱位)
Name:乘客姓名
Sex:性别
Age:年龄
SibSp:兄弟姐妹个数
Parch:父母孩子个数
Ticket:船票号码
Fare:票价
Cabin:客舱
Embarked:登船港口
对数值型变量进行描述性统计。
*查看描述性统计;
proc means data=train mean median mode min max;
run;
从上图可以看出,891名乘客中仅有38.38384%的人最后获救了,2等舱3等舱的乘客比1等舱的要多,乘客的平均年龄大概为29.7岁,登上泰坦尼克号的平均票价为32.2英镑,而大多数乘客的票价则在8英镑左右,说明票价高低差距悬殊,使得平均值被显著拉大,无法真实显示票价情况。
3 数据分析
3.1 总体情况
*查看生存状态、性别、乘客等级、登场港口、年龄分布情况;
proc sql;
select survived,count(*) from train
group by survived;
quit;
proc sql;
select sex,count(*) fromtrain
group by sex;
quit;
proc sql;
select Pclass,count(*) from train
group by Pclass;
quit;
proc sql;
select Embarked,count(*) from train
group by Embarked;
quit;
proc sql;
create table agee as
select age,count(*)
from train
where age is not null
group by age;
quit;
我们从上图可以看出,获救的人数占比38%,不到半数;在全体乘客中男性居多,占到65%;乘客等级中,3等舱乘客占比超过一半,其次为1等舱乘客;登船港口人数按照S、C、Q递减,而且S远多于另外俩港口,其次另有两名乘客没有登船港口信息;年龄上集中在16至40岁之间的青壮年,儿童与老人较少。
3.2 性别与幸存率的关系
*性别与幸存率;
proc sql;
select sex,count(case when survived=0 then passengerid end) as死亡,
count(case when survived=1 then passengerid end) as生存,
catt(round(count(case when survived=1 then passengerid end)/(count(case when survived=0 then passengerid end)+count(case when survived=1then passengerid end))*100,0.1),'%') as 存活率
from train
group by sex;
quit;
在泰坦尼克号电影里,船长曾呼吁“让女士与小孩先走”,到底遵循情况如何呢?上图给了我们一半答案,女性的存活人数显著高于死亡人数,且74.2%的存活率远高于男性的18.9%,看来歪果朋友们绅士的执行了这一规则。
3.3 船舱等级与幸存率的关系
*船舱等级与幸存率;
proc sql;
select Pclass,count(case when survived=0 then passengerid end) as死亡,
count(case when survived=1 then passengerid end) as生存,
catt(round(count(case when survived=1then passengerid end)/(count(case when survived=0then passengerid end)+count(case when survived=1then passengerid end))*100,0.1),'%') as存活率
from train
group by Pclass;
quit;
从船舱等级上来看,1等舱生存人数大幅高于死亡人数,乘客幸存率为63%,3等舱与1等舱恰好相反,死亡人数是生存人数的3倍,幸存率仅为24.2%,推测高社会地位获得优先选择权。
3.4 年龄与幸存率的关系
*年龄与幸存率;
proc sql;
select age,survived,count(*) from
(select case whenAge <= 1 then '婴儿'
when Age <= 18 then '青少年'
when Age <= 30 then '青年'
when Age <= 60 then '中年'
else'老年'endas Age,survived
from train
where Age >0) As a
group by age,survived;
quit;
我们将小于1岁的定义为婴儿,1-18岁的为青少年,19-30岁的为青年,31-60岁的为中年,60+的为老年,从上图来看,青少年和婴儿的幸存率最高,其次为中年和青年,幸存率最低的为老年。
3.5 票价与幸存率的关系
*票价与幸存率;
proc sql;
select fare,
count(case when survived=0 then passengerid end) as死亡,
count(case when survived=1 then passengerid end) as生存,
catt(round(count(case whensurvived=1 then passengerid end)/(count(case when survived=0 then passengerid end)+count(case when survived=1 then passengerid end))*100,0.1),'%') as 存活率
from
(select case when fare<100 then floor(fare/10)*10
else 100 end as fare,survived,passengerid
from train) a
group by fare;
quit;
票价与幸存率之间基本符合票价越高幸存率越高的趋势,票价和乘客等级吻合。
3.6 登船港口与幸存率的关系
*登船港口与幸存率;
proc sql;
select Embarked,count(case when survived=0 then passengerid end) as死亡,
count(case when survived=1 then passengerid end) as生存,
catt(round(count(case when survived=1 then passengerid end)/(count(case when survived=0 then passengerid end)+count(case when survived=1 then passengerid end))*100,0.1),'%') as 存活率
from train
group by Embarked;
quit;
从登船港口来看,登船人数最多的S港幸存率最低,Q港登船人数最少,幸存率也仅有369%,而C港的乘客有超过一半获救,幸存率最高。
3.7 兄弟姐妹数与幸存率的关系
*兄弟姐妹数与幸存率;
proc sql;
select SibSp,count(case when survived=0 then passengerid end) as 死亡,
count(case when survived=1 then passengerid end) as 生存,
catt(round(count(case whensurvived=1 then passengerid end)/(count(case when survived=0 then passengerid end)+count(case when survived=1then passengerid end))*100,0.1),'%') as 存活率
from train
group by SibSp;
quit;
兄弟姐妹数为0、1、2的乘客,幸存率较高;其中为1或2的乘客,幸存率在50%左右;数值大于等于3的乘客,幸存率很低。
3.7 父母孩子数与幸存率的关系
*父母孩子数与幸存率;
proc sql;
select Parch,count(case when survived=0 then passengerid end) as 死亡,
count(case when survived=1 then passengerid end) as 生存,
catt(round(count(case when survived=1 then passengerid end)/(count(case when survived=0 then passengerid end)+count(case when survived=1 then passengerid end))*100,0.1),'%') as 存活率
from train
group by Parch;
quit;
父母孩子数为1到3的乘客,幸存率高于50%;父母孩子数为0的乘客幸存率次之,大于等于4的乘客,幸存率非常低。
4 总结
通过对乘客各个基本信息的分析,以往对于幸存率感觉上的认知得到了验证,总结以上的分析,结论如下:
1)女性幸存率远高于男性
2)乘客(船舱)等级越高,幸存率越高
3)婴儿和青少年幸存率高于成年人
4)票价越高幸存率越高
5)S港登船乘客最多,但乘客幸存率最低,C港过半乘客获救
6)综合来看,家人亲友数为3及以下的乘客幸存率较高