泰坦尼克事件被一再提起塘辅,因為這次沉船事件的戲劇化的悲劇色彩,一瞬間華麗到幻滅的無常都使人嗟嘆不已。只是沒想到在R語言的學(xué)習(xí)中,竟然也要再次觸碰這場事件。第一次接觸kaggle,一個為開發(fā)商和數(shù)據(jù)科學(xué)家提供舉辦機器學(xué)習(xí)競賽劲厌、托管數(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名乘客的命運需要預(yù)測锌半,且只有11個變量,這是因為“Survived”列缺失了寇漫。這就是我們想要預(yù)測的列刊殉。
一、首先預(yù)測看下觀測數(shù)據(jù)中的存活率:
table(train$Survived)01549342
0代表死亡州胳,1代表存活记焊,從此看出,多數(shù)人未能存活栓撞。但就此來預(yù)測未免太粗略了遍膜。
二碗硬、泰坦尼克號事件中比較著名的“婦女和孩子先走”,先來看看是否如此瓢颅。先看船上男女?dāng)?shù)量:
> table(train$Sex)
female? male? ? 314? ? 577
顯然女性乘客數(shù)量遠少于男性恩尾,所以用存活的男女?dāng)?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è)是一個實例練習(xí)谷浅,沒有明確的指引該怎么往下做扒俯。在兩眼一抹黑的情況下奶卓,幸有前人引路,一點點揭開R語言神秘的面紗『承現(xiàn)在只是簡單地一窺尊容夺姑,發(fā)現(xiàn)R里面的乾坤世界,在Kaggle上更是見識了機器學(xué)習(xí)的浩然大海掌猛。