
泰坦尼克事件被一再提起,因為這次沉船事件的戲劇化的悲劇色彩,一瞬間華麗到幻滅的無常都使人嗟嘆不已。只是沒想到在R語言的學習中,竟然也要再次觸碰這場事件。第一次接觸kaggle,一個為開發(fā)商和數(shù)據(jù)科學家提供舉辦機器學習競賽、托管數(shù)據(jù)庫、編寫和分享代碼的平臺,入門第一步就是從泰坦尼克事件中的數(shù)據(jù)分析開始。

拜讀了PPV課大數(shù)據(jù)的文章之后,也試圖結(jié)合自己的思考模仿做一下數(shù)據(jù)分析。
首先下載和加載數(shù)據(jù)包:
在Kaggle上,有三個csv可供下載:train.csv,test.csv,gender_submission.csv.

在train.csv中有891個觀測值(行),每個觀測值有12個變量。test.csv較小,只有418名乘客的命運需要預測,且只有11個變量,這是因為“Survived”列缺失了。這就是我們想要預測的列。
一、首先預測看下觀測數(shù)據(jù)中的存活率:
table(train$Survived)01549342
0代表死亡,1代表存活,從此看出,多數(shù)人未能存活。但就此來預測未免太粗略了。
二、泰坦尼克號事件中比較著名的“婦女和孩子先走”,先來看看是否如此。先看船上男女數(shù)量:
> table(train$Sex)
female? male? ? 314? ? 577
顯然女性乘客數(shù)量遠少于男性,所以用存活的男女數(shù)量比較是得不出想要的結(jié)果的。想知道男女分別存活的比率才是我們想要的。
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已被設(shè)為“adult”。
> prop.table(table(train$Child,train$Survived),1)
? ? ? ? ? ? ? 0? ? ? ? 1?
adult 0.6388175 0.3611825? child 0.4601770 0.5398230
成人的存活比例是36%,而孩子的存活比例是54%。這個維度如果和性別交叉起來看,又該如何呢?先看一下各類人群人數(shù)。
> aggregate(Survived~Child+Sex,data=train,FUN=length)
? Child? ? Sex Survived1
adult female? ? ? 2592
child female? ? ? 553
adult? male? ? ? 5194
child? male? ? ? 58
現(xiàn)在要找出存活比例,此時需創(chuàng)建一個函數(shù)來解決:
> 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
這里能看出,無論女性是否是孩子,比例很相近,而男孩子的存活比例要略高于成年男性,均遠低于女性比例??吹竭@個比例,似乎不太符合孩子優(yōu)先存活的說法,生活中其實十八歲的孩子其實身形已和成年人沒有什么區(qū)別,在沉船發(fā)生后的混亂局面中,很難去分辨是否低于18歲,因此,被優(yōu)先的可能是更小的孩子。因此,我們把孩子的年齡定義改為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)

決策樹按照算法,將數(shù)據(jù)分析后一層層地,找到最可能分界點,最上一層是總比例,多數(shù)為“0”即死亡,按性別分,男性占比65%,但是多數(shù)為“0”即死亡,女性占比35%,多數(shù)為“1”即存活。年齡這層,分界點選在了6.5歲,因為在這個分界線上,生存概率區(qū)分最明顯,在6.5歲以下,兄弟姐妹數(shù)量大于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名。
這次的作業(yè)是一個實例練習,沒有明確的指引該怎么往下做。在兩眼一抹黑的情況下,幸有前人引路,一點點揭開R語言神秘的面紗?,F(xiàn)在只是簡單地一窺尊容,發(fā)現(xiàn)R里面的乾坤世界,在Kaggle上更是見識了機器學習的浩然大海。