標籤:

泰坦尼克號存活率實踐筆記-排名3626

泰坦尼克library(ggplot2) # 可視化library(ggthemes) # 可視化library(scales) # 可視化library(dplyr) # 數據處理library(mice) # 缺失值處理library(randomForest) # 建模library(Amelia)#缺失值library(ipred)#建模

導入數據 然後合併數據

train <- read.csv(C:/Users/ximen/Documents/MYR/P5/train.csv, stringsAsFactors = F,header=T,na.strings=c(""))test <- read.csv(C:/Users/ximen/Documents/MYR/P5/test.csv, stringsAsFactors = F,header=T,na.strings=c(""))full <- bind_rows(train, test)

Survived : 取值0和1(0表示死亡,1表示獲救)

Pclass :乘客的船倉等級(1,2,3)

Name :乘客姓名

Sex :乘客性別

Age :乘客年齡

SibSp :船上配偶或兄妹的人數

Parch :船上父母或孩子的人數

Ticket :票號

Fare :票價

Cabin :乘客船艙號

Embarked :出發港口

Name :乘客姓名可以提取 爵士 還有名子提取各個身份的爵士名字full$Title <- gsub((.*, )|(\..*), , full$Name)# 展示名稱及性別列聯表table(full$Sex, full$Title)# 將比較少出現的名稱抬頭合併為一個組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] <- Missfull$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#提取乘客名字full$Surname <- sapply(full$Name, function(x) strsplit(x, split = [,.])[[1]][1])# 創建一個家庭成員大小變數(數量包含乘客本身)full$Fsize <- full$SibSp + full$Parch + 1# 創建家庭變數,姓氏_家庭人數full$Family <- paste(full$Surname, full$Fsize, sep=_)# 觀察家庭大小及成員生存狀態是否存在相關ggplot(full[1:891,], aes(x = Fsize, fill = factor(Survived))) + geom_bar(stat=count, position=dodge) + scale_x_continuous(breaks=c(1:11)) + labs(x = Family Size) +theme_few()

原來是沒有運行這個

library(ggthemes) # 可視化library(scales) # 可視化

這兩個包

# 將家庭大小離散化full$FsizeD[full$Fsize == 1] <- singletonfull$FsizeD[full$Fsize < 5 & full$Fsize > 1] <- smallfull$FsizeD[full$Fsize > 4] <- large# 展示家庭大小及生存關係的馬賽克圖mosaicplot(table(full$FsizeD, full$Survived), main=Family Size by Survival, shade=TRUE)

從上圖上看 一等艙的生存率比較高的

家庭大小的生產率圖示

二、年齡與生存率關係

age Survived

三、性別與生存率關係

ggplot(full[1:891,], aes(Age, fill = factor(Survived))) +

geom_histogram() +

facet_grid(.~Sex) +

theme_few()

缺失值處理,

補缺失值

# 查看數據集缺失數據missmap(full, main = "Missing values vs observed")

# 查看數據集缺失數據sapply(full,function(x) sum(is.na(x)))

年齡比較多確實值, 還有生存的確實值

1,處理embarked缺失#處理embarked變數缺失值,首先確定缺失值觀測值所在行數which(full$Embarked %in% NA)#輸出缺失值信息full[full$PassengerId==62,]full[full$PassengerId==830,]

隨機森林3,AGE變數缺失值# mice包主要用於插補數據,先將變數因子化處理factor_vars <- c(PassengerId,Pclass,Sex,Embarked, Title,Surname,Family,FsizeD)full[factor_vars] <- lapply(full[factor_vars], function(x) as.factor(x))# 設置隨機變數種子set.seed(129)# 刪除除創建的變數之外的其他變數,method=隨機森林(rf)mice_mod <- mice(full[, !names(full) %in% c(PassengerId,Name,Ticket,Cabin,Family,Surname,Survived)], method=rf) iter imp variable 1 1 Age Deck 1 2 Age Deck 1 3 Age Deck 1 4 Age Deck 1 5 Age Deck 2 1 Age Deck 2 2 Age Deck 2 3 Age Deck 2 4 Age Deck 2 5 Age Deck 3 1 Age Deck 3 2 Age Deck 3 3 Age Deck 3 4 Age Deck 3 5 Age Deck 4 1 Age Deck 4 2 Age Deck 4 3 Age Deck 4 4 Age Deck 4 5 Age Deck 5 1 Age Deck 5 2 Age Deck 5 3 Age Deck 5 4 Age Deck 5 5 Age Deck

# 保存完整的輸出

mice_output <- complete(mice_mod)

年齡的缺失已經使用 隨機森林不、補完缺失值

# 繪製圖形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數據集年齡的值full$Age <- mice_output$Age

現在我們擁有一個完整的數據集。接下來再思考一下,哪些屬性會影響生存狀態。會被優先救助?

ggplot(full[1:891,], aes(Age, fill = factor(Survived))) + geom_histogram() + facet_grid(.~Sex) + theme_few()

生存率 男女生存率

table(full$Sex, full$Survived)

船上有38%的人員生存下來,而女性的比例明顯比男性高出一倍。那麼如果是18歲以下的成員呢?

> full$Child[full$Age < 18] <- Child> full$Child[full$Age >= 18] <- Adult> table(full$Child, full$Survived)table(full$child,full$Survived)

#因子化full$Child <- factor(full$Child)full$Mother <- factor(full$Mother)建模:# 拆分數據集,進行預測訓練train <- full[1:891,]test <- full[892:1309,]# 設置隨機種子set.seed(754)# 構建模型,保留有用變數rf_model <- randomForest(factor(Survived) ~ Pclass + Sex + Age + SibSp + Parch + Fare + Embarked + Title + Child + Mother, data = train)# 使用測試數據集進行預測prediction <- predict(rf_model, test)# 保存測試ID和測試結果生存與否solution <- data.frame(PassengerID = test$PassengerId, Survived = prediction)# 寫出結果文件write.csv(solution, file = rf_mod_Solution.csv, row.names = F)

上傳到 kaggle上去排名是3626 ,看有的戰友的排名在1000以內,看來自己還需要努力去學習;

#觀察變數重要性importance <- importance(rf_model)varImportance <- data.frame(Variables = row.names(importance), Importance = round( importance[ ,MeanDecreaseGini],2))# 對重要性排序rankImportance <- varImportance %>% mutate(Rank = paste0(#,dense_rank(desc(Importance))))# 畫出重要程度圖ggplot(rankImportance, aes(x = reorder(Variables, Importance), y = Importance, fill = Importance)) + geom_bar(stat=identity) + geom_text(aes(x = Variables, y = 0.5, label = Rank), hjust=0, vjust=0.55, size = 4, colour = red) + labs(x = Variables) + coord_flip() + theme_few()ggplot(rankImportance, aes(x = reorder(Variables, Importance), y = Importance, fill = Importance)) +reorder(Variables, Importance), ggplot 重新排序

這次泰坦尼克號的斷斷續續的學習實踐了好一段時間,一開始就特徵工程的 正則表達式整蒙了,因為很難理解,對於新手不是很有友好;慢慢一個代碼一個代碼敲,除了正則表達式之外,其他的代碼多多少少理解了一些。不知道別的戰友是不是和我類似這樣的;


推薦閱讀:

對於入侵檢測,貝葉斯推理異常檢測方法與模式預測異常檢測方法的區別?
數據分析,讓你成為人群中的1%
一張象棋圖看懂鹿豹座平台的業務內容
數據分析的三板斧
用戶畫像就是這樣簡單

TAG:數據分析 |