泰坦尼克號生存率預測——R語言
分析主要分為以下五個部分
一、分析簡介
1、背景2、目標二、數據導入
1、載入包2、導入數據
3、變數描述三、數據處理
1、缺失值處理2、特徵工程四、建模和預測
1、建立模型2、預測五、總結
1、Kaggle排名2、收穫
3、待改進4、參考資料一、分析簡介
1、背景泰坦尼克號的沉沒是歷史上最著名的海難之一。1912年的4月15日,在它首次的航行中,由於和冰山相撞而發生沉沒,而在這次海難中,2224名的乘客和船員中,有1502人遇難。而這場影響巨大的事故,也直接導致了之後船隻的安全標準的升級。2、目標通過分析乘客的不同特徵和分類來預測乘客的生存狀態(存活 1 或者死亡 0)。二、數據導入
1、載入包
pkgs <- c("dplyr","ggplot2","ggthemes","mice","randomForest")install.packages(pkgs,dependencies = TRUE)library("dplyr")library("ggplot2")library("ggthemes")library("mice")library("randomForest")
2、導入數據
train <- read.csv("C:/Users/Administrator/Desktop/train.csv", stringsAsFactors = F)test <- read.csv("C:/Users/Administrator/Desktop/test.csv", stringsAsFactors = F)full <- bind_rows(train, test)head(full)str(full)
將訓練集和測試集連接起來,是為了接下來的特徵工程和缺失值處理做準備,如下顯示了新集的前幾行數據和具體內部結構:
PassengerId Survived Pclass Name Sex Age SibSp (int) (int) (int) (chr) (chr) (dbl) (int)1 1 0 3 Braund, Mr. Owen Harris male 22 12 2 1 1 Cumings, Mrs. John Bradley (Florence Briggs Thayer) female 38 13 3 1 3 Heikkinen, Miss. Laina female 26 04 4 1 1 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35 15 5 0 3 Allen, Mr. William Henry male 35 06 6 0 3 Moran, Mr. James male NA 0Variables not shown: Parch (int), Ticket (chr), Fare (dbl), Cabin (chr), Embarked (chr), Title (chr)
Classes 『tbl_df』, 『tbl』 and "data.frame": 1309 obs. of 12 variables: $ PassengerId: int 1 2 3 4 5 6 7 8 9 10 ... $ Survived : int 0 1 1 1 0 0 0 0 1 1 ... $ Pclass : int 3 1 3 1 3 3 1 3 3 2 ... $ Name : chr "Braund, Mr. Owen Harris" "Cumings, Mrs. John Bradley (Florence Briggs Thayer)" "Heikkinen, Miss. Laina" "Futrelle, Mrs. Jacques Heath (Lily May Peel)" ... $ Sex : chr "male" "female" "female" "female" ... $ Age : num 22 38 26 35 35 NA 54 2 27 14 ... $ SibSp : int 1 1 0 1 0 0 0 3 0 1 ... $ Parch : int 0 0 0 0 0 0 0 1 2 0 ... $ Ticket : chr "A/5 21171" "PC 17599" "STON/O2. 3101282" "113803" ... $ Fare : num 7.25 71.28 7.92 53.1 8.05 ... $ Cabin : chr "" "C85" "" "C123" ... $ Embarked : chr "S" "C" "S" "S" ...
可以看出,新集有1309個觀測,和12個變數,並且含有缺失值。
3、變數描述三、數據處理
1、缺失值處理
完整的缺失值處理方法通常包含以下幾個步驟:
(1) 識別缺失數據;
(2) 檢查導致數據缺失的原因;(3) 刪除包含缺失值的實例或用合理的數值代替(插補)缺失值 處理不完整數據的方法,以及R中相關的包和函數 可以發現Age, Cabin ,Fare 和Embarked四列存在缺失值,其中Cabin缺失值太多,因此不做處理。而處理缺失值有以下三種流行方法:推理法、行刪除法和多重插補,因為數據集不大,所以並不能採用刪除缺失值行的方法,這樣會導致預測結果存在較大偏差,因此這裡採用推理法和多重插補的方法處理缺失值。1.1 推理法 1.1.1船票價格缺失值的處理找出缺失Fare值所在行:full$PassengerId[is.na(full$Fare)]
缺失值只有一行,是1044行:
[1] 1044
顯示本行的全部信息:
full[1044, ]
PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked 1044 1044 NA 3 Storey, Mr. Thomas male 60.5 0 0 3701 NA S
可以看出,這位乘客的客艙等級是3級,乘船港口是S,根據這一特徵,可以通過其他有相同特徵的乘客推理出客艙號。
通過ggplot2中的密度圖和垂線繪製圖形:ggplot(full[full$Pclass == "3" & full$Embarked == "S", ], aes(x = Fare)) + geom_density(fill = "#99d6ff", alpha=0.4) + geom_vline(aes(xintercept=median(Fare, na.rm=T)), colour="red", linetype="dashed", lwd=1)
由上圖可以得出,可以用中位數來填補缺失值:
full$Fare[1044] <- median(full[full$Pclass == "3" & full$Embarked == "S", ]$Fare, na.rm = TRUE)
1.1.2登船港口缺失值的處理
利用客艙等級來填補缺失值:tapply(full$Embarked, full$Pclass,median,na.rm = TRUE)
1 2 3"S" "S" "S"
用S來填補缺失值:
full[c(62, 830), "Embarked"]full$Embarked[c(62, 830)] <- "S"
1.2 多重插補
通過mice包應用多重插補的步驟
1.2.1年齡缺失值的處理 利用mice包進行多重插補:set.seed(123)mice_mod <- mice(full)mice_output <- complete(mice_mod)
其中set.seed()是隨機種子,目的是使模擬能夠重複出現。
iter imp variable 1 1 Survived Age Fare 1 2 Survived Age Fare 1 3 Survived Age Fare 1 4 Survived Age Fare 1 5 Survived Age Fare 2 1 Survived Age Fare 2 2 Survived Age Fare 2 3 Survived Age Fare 2 4 Survived Age Fare 2 5 Survived Age Fare 3 1 Survived Age Fare
par(mfrow=c(1,2))hist(full$Age, freq=F, main="Age: Original Data", col="darkgreen", ylim=c(0,0.04))hist(mice_output$Age, freq=F, main="Age: MICE Output", col="lightgreen", ylim=c(0,0.04))
缺失值填補:
full$Age <- mice_output$Age
2、特徵工程
定義最大限度地從原始數據中提取有用信息以供演算法和模型使用,通過尋求最優特徵子集等方法使模型預測性能最高。重要性數據和特徵決定了機器學習的上限,而模型和演算法只是逼近這個上限而已。2.1 名字的變數提取 可以觀察到,名字中的中間部分,也就是頭銜或者稱謂具有一定的分類規律,因此利用正則表達式來提取頭銜。full$Title <- gsub("(.*, )|(\..*)", "", full$Name)table(full$Title) Capt Col Don Dona Dr Jonkheer Lady 1 4 1 1 8 1 1 Major Master Miss Mlle Mme Mr Mrs 2 61 260 2 1 757 197 Ms Rev Sir the Countess 2 8 1 1
提取出18個頭銜分類,其中Master、Miss、Mr和Mrs出現頻率較高,而 Mlle、Ms和Miss屬於同一頭銜的不同寫法,可以歸為一類,同樣Mme和Mrs歸為一類,其餘的頭銜出現頻率較低,可以歸為一類。
rare_title <- c("Dona", "Lady", "the Countess","Capt", "Col", "Don", "Dr", "Major", "Rev", "Sir", "Jonkheer")full$Title[full$Title == "Mlle"] <- "Miss"full$Title[full$Title == "Ms"] <- "Miss"full$Title[full$Title == "Mme"] <- "Mrs"full$Title[full$Title %in% rare_title] <- "Rare Title"table(full$Sex, full$Title)
Master Miss Mr Mrs Rare Title female 0 264 0 198 4 male 61 0 757 0 25
2.2年齡的變數提取
full$Child[full$Age < 18] <- "Child"full$Adult[full$Age >= 18] <- "Adult"table(full$Child, full$Survived)
0 1 Adult 453 261 Child 96 81
四、建模和預測
1、建立模型因子化:full$Child <- factor(full$Child)full$Sex <- factor(full$Sex)full$Embarked <- factor(full$Embarked)full$Title <- factor(full$Title)full$Pclass <- factor(full$Pclass)
拆分成訓練集和測試集:
train <- full[1:891,]test <- full[892:1309,]
隨機森林建模:
rf_model <- randomForest(factor(Survived) ~ Pclass + Sex + Fare + Embarked + Title +Child, data = train)
Call: randomForest(formula = factor(Survived) ~ Pclass + Sex + Fare + Embarked + Title + Child, data = train) Type of random forest: classification Number of trees: 500No. of variables tried at each split: 2 OOB estimate of error rate: 17.51%Confusion matrix: 0 1 class.error0 507 42 0.076502731 114 228 0.33333333
變數重要性:
importance(rf_model, type=2)
MeanDecreaseGiniPclass 37.898965Sex 53.989580Fare 54.604026Embarked 9.404359Title 78.934933Child 6.193212
2、預測
prediction <- predict(rf_model, test)solution <- data.frame(PassengerID = test$PassengerId, Survived = prediction)write.csv(solution, file = "C:/Users/Administrator/Desktop/Titanic.csv", row.names = F)
五、總結
1、Kaggle排名2、收穫這是第一次運用R語言來做預測分析,可以說是數據分析學習過程中的一個重要的轉折點,從現在開始,才算是真正意義上的進入了數據分析的奇妙世界。這次分析,主要學習到的知識有如下三點:缺失值插補、特徵工程和隨機森林的分類方法,雖然運用相關的代碼解決了問題,但是對於細節的知識點還是有些模糊不清,需要時間來消化理解。其中特徵工程是一個比較複雜的過程,而且數據和特徵決定了機器學習的上限,所以需要繼續學習和實踐更好的特徵提取方法。最後,感謝Kaggle上各路大神的實例教程,這篇分析也是模仿的成果,希望以後能夠擁有自己的原創分析。3、待改進分析中對可視化的使用較少,需要進一步加深對ggplot2的學習和使用。對特徵變數的提取不夠深入。對其他分類方法了解的還不夠,沒有對比預測結果。4、參考資料Exploring Survival on the TitanicTitanic - RF Prediction 0.81818Predictive Analysis of Survival Rate on Titanic特徵工程總結:R與Python的比較實現 - 知乎專欄《R語言實戰》推薦閱讀:
※我為什麼要學習數據分析
※決定改變——零基礎數據分析第一步
※【數據降維】主成分分析法
TAG:R编程语言 | 数据分析 | 「泰坦尼克号」沉没事故 |