泰坦尼克事件探秘


泰坦尼克事件被一再提起,因为这次沉船事件的戏剧化的悲剧色彩,一瞬间华丽到幻灭的无常都使人嗟叹不已。只是没想到在R语言的学习中,竟然也要再次触碰这场事件。第一次接触kaggle,一个为开发商和数据科学家提供举办机器学习竞赛、托管数据库、编写和分享代码的平台,入门第一步就是从泰坦尼克事件中的数据分析开始。

拜读了PPV课大数据的文章之后,也试图结合自己的思考模仿做一下数据分析。

首先下载和加载数据包:

在Kaggle上,有三个csv可供下载:train.csv,test.csv,gender_submission.csv.


在train.csv中有891个观测值(行),每个观测值有12个变量。test.csv较小,只有418名乘客的命运需要预测,且只有11个变量,这是因为“Survived”列缺失了。这就是我们想要预测的列。

一、首先预测看下观测数据中的存活率:

table(train$Survived)01549342

0代表死亡,1代表存活,从此看出,多数人未能存活。但就此来预测未免太粗略了。

二、泰坦尼克号事件中比较著名的“妇女和孩子先走”,先来看看是否如此。先看船上男女数量:

> table(train$Sex)

female  male    314    577

显然女性乘客数量远少于男性,所以用存活的男女数量比较是得不出想要的结果的。想知道男女分别存活的比率才是我们想要的。

prop.table(table(train$Sex, train$Survived),1)

                0        1 

female 0.2579618 0.7420382  male  0.8110919 0.1889081

女性74.2%存活,而男性只有19%存活。

接着来看一下年龄因素的影响。

> prop.table(table(train$Child,train$Survived),1)

summary(train$Age) 

Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's    0.42  20.12  28.00  29.70  38.00  80.00    177

缺失的记录达177份,我们可以用年龄的均值来填补这些缺失值。我们把成人定义为18岁以上的人,孩子定义为18岁及以下的人,来对所有人作个归类。

> train$Child<-"adult"> train$Child[train$Age<18]<-"child"

年龄的均值为29.7岁,大于18岁,属性child已被设为“adult”。

> prop.table(table(train$Child,train$Survived),1)

              0        1 

adult 0.6388175 0.3611825  child 0.4601770 0.5398230

成人的存活比例是36%,而孩子的存活比例是54%。这个维度如果和性别交叉起来看,又该如何呢?先看一下各类人群人数。

> aggregate(Survived~Child+Sex,data=train,FUN=length)

  Child    Sex Survived1

adult female      2592

child female      553

adult  male      5194

child  male      58

现在要找出存活比例,此时需创建一个函数来解决:

> aggregate(Survived~Child+Sex,data=train,FUN=function(x){sum(x)/length(x)})  Child    Sex  Survived1 adult female 0.75289582 child female 0.69090913 adult  male 0.16570334 child  male 0.3965517

这里能看出,无论女性是否是孩子,比例很相近,而男孩子的存活比例要略高于成年男性,均远低于女性比例。看到这个比例,似乎不太符合孩子优先存活的说法,生活中其实十八岁的孩子其实身形已和成年人没有什么区别,在沉船发生后的混乱局面中,很难去分辨是否低于18岁,因此,被优先的可能是更小的孩子。因此,我们把孩子的年龄定义改为10岁,再来看看。

> train$Child<-"adult"> train$Child[train$Age<10]<-"child"> aggregate(Survived~Child+Sex,data=train,FUN=function(x){sum(x)/length(x)})

  Child    Sex  Survived1

adult female 0.75352112

child female 0.63333333

adult  male 0.16513764

child  male 0.5937500

10岁以下的男孩子存活比例明显高于10岁以上的男性。

那么除了这些因素以外,其他因素是如何影响存活率的?想看看舱位等级是否对存活率有影响,船上有三种舱位,用Pclass表示。

> aggregate(Survived~Pclass+Sex,data=train,FUN=function(x){sum(x)/length(x)})

Pclass    Sex  Survived1     

1 female 0.96808512     

2 female 0.92105263     

3 female 0.50000004     

1  male 0.36885255     

2  male 0.15740746     

3  male 0.1354467

可以看出,对女性来说,一等舱和二等舱的存活率几乎是三等舱的二倍,男性来说,一等舱是二等舱和三等舱存活率的二倍。

先按照以上推论做一版提交,打个底

> test$Survived<-0> test$Survived[test$Sex=="female"]<-1> test$Survived[test$Age<10]<-1> test$Survived[test$Pclass=="1"]<-1>

submit<-data.frame(PassengerId=test$PassengerId,Survived=test$Survived)> write.csv(submit, file ="theyallperish.csv", row.names =FALSE)

这次的成绩:6485,0.7081

显然,目前利用到的信息只有性别、年龄、舱位,在下一步利用“决策树”(rpart—Recursive Partitioning andRegression Trees,递归分割和回归树)从更多的维度去分析。

library(rpart)

fit <- rpart(Survived ~ Pclass + Sex + Age + SibSp + Parch + Fare + Embarked,data=train,method="class")

我们看看fit:

> plot(fit)

> text(fit)

有些不清,用武器强化一下:

> install.packages('rattle')

> install.packages('rpart.plot')

> install.packages('RColorBrewer')

> library(rattle)

> library(rpart.plot)

> library(RColorBrewer)

> fancyRpartPlot(fit)


决策树按照算法,将数据分析后一层层地,找到最可能分界点,最上一层是总比例,多数为“0”即死亡,按性别分,男性占比65%,但是多数为“0”即死亡,女性占比35%,多数为“1”即存活。年龄这层,分界点选在了6.5岁,因为在这个分界线上,生存概率区分最明显,在6.5岁以下,兄弟姐妹数量大于2.5的存活机率又比其他的更多。以此类推。

> Prediction <- predict(fit, test, type ="class")

> submit <- data.frame(PassengerId = test$PassengerId, Survived = Prediction)

> write.csv(submit, file ="myfirstdtree.csv", row.names =FALSE)

这次上传后排名直接上升到3039名。

这次的作业是一个实例练习,没有明确的指引该怎么往下做。在两眼一抹黑的情况下,幸有前人引路,一点点揭开R语言神秘的面纱。现在只是简单地一窥尊容,发现R里面的乾坤世界,在Kaggle上更是见识了机器学习的浩然大海。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容