泰坦尼克號生存率預測——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 Titanic

Titanic - RF Prediction 0.81818

Predictive Analysis of Survival Rate on Titanic

特徵工程總結:R與Python的比較實現 - 知乎專欄

《R語言實戰》
推薦閱讀:

我為什麼要學習數據分析
決定改變——零基礎數據分析第一步
【數據降維】主成分分析法

TAG:R编程语言 | 数据分析 | 「泰坦尼克号」沉没事故 |