kaggle案例:員工離職預測

附視頻鏈接: 天善智能Kaggle十大案例精講(連載中)

有代碼有課件,可以實操。歡迎學習!!

案例背景介紹:Our example concerns a big company that wants to understand why some of their best and most experienced employees are leaving prematurely. The company also wishes to predict which valuable employees will leave next.

################### ============== 載入包 =================== #################library(plyr) # Rmisc的關聯包,若同時需要載入dplyr包,必須先載入plyr包library(dplyr) # filter()library(ggplot2) # ggplot() library(DT) # datatable() 建立互動式數據表library(caret) # createDataPartition() 分層抽樣函數library(rpart) # rpart()library(e1071) # naiveBayes()library(pROC) # roc()library(Rmisc) # multiplot() 分割繪圖區域################### ============= 導入數據 ================== #################hr <- read.csv("D:/R/天善智能/書豪十大案例/員工離職預測\HR_comma_sep.csv")str(hr) # 查看數據的基本數據結構

描述性分析

################### ============= 描述性分析 ================== ###############str(hr) # 查看數據的基本數據結構summary(hr) # 計算數據的主要描述統計量# 後續的個別模型需要目標變數必須為因子型,我們將其轉換為因子型hr$left <- factor(hr$left, levels = c(0, 1)) ## 探索員工對公司滿意度、績效評估和月均工作時長與是否離職的關係# 繪製對公司滿意度與是否離職的箱線圖box_sat <- ggplot(hr, aes(x = left, y = satisfaction_level, fill = left)) + geom_boxplot() + theme_bw() + # 一種ggplot的主題 labs(x = left, y = satisfaction_level) # 設置橫縱坐標標籤box_sat

員工對公司滿意度與是否離職的箱線圖

離職員工對公司的滿意度較低,大多集中在0.4左右;

# 繪製績效評估與是否離職的箱線圖box_eva <- ggplot(hr, aes(x = left, y = last_evaluation, fill = left)) + geom_boxplot() + theme_bw() + labs(x = left, y = last_evaluation)box_eva

績效評估與是否離職的箱線圖

離職員工的績效評估較高,在0.8以上的較為集中;

# 繪製平均月工作時長與是否離職的箱線圖box_mon <- ggplot(hr, aes(x = left, y = average_montly_hours, fill = left)) + geom_boxplot() + theme_bw() + labs(x = left, y = average_montly_hours)box_mon

離職員工的平均月工作時長較高,一多半超過了平均水平(200小時)

# 繪製員工在公司工作年限與是否離職的箱線圖box_time <- ggplot(hr, aes(x = left, y = time_spend_company, fill = left)) + geom_boxplot() + theme_bw() + labs(x = left, y = time_spend_company)box_time

離職員工的工作年限在4年左右

# 合併這些圖形在一個繪圖區域,cols = 2的意思就是排版為一行二列multiplot(box_sat, box_eva, box_mon, box_time, cols = 2)

## 探索參與項目個數、五年內有沒有升職和薪資與離職的關係# 繪製參與項目個數條形圖時需要把此變數轉換為因子型hr$number_project <- factor(hr$number_project, levels = c(2, 3, 4, 5, 6, 7))# 繪製參與項目個數與是否離職的百分比堆積條形圖bar_pro <- ggplot(hr, aes(x = number_project, fill = left)) + geom_bar(position = fill) + # position = fill即繪製百分比堆積條形圖 theme_bw() + labs(x = left, y = number_project)bar_pro

員工參與項目個數與是否離職的百分比堆積條形圖

參加項目數越多的員工離職率越大(去除項目數為2的樣本)

# 繪製5年內是否升職與是否離職的百分比堆積條形圖bar_5years <- ggplot(hr, aes(x = as.factor(promotion_last_5years), fill = left)) + geom_bar(position = fill) + theme_bw() + labs(x = left, y = promotion_last_5years)bar_5years

5年內是否升職與是否離職的百分比堆積條形圖

五年內沒有升職的員工的離職率比較大

# 繪製薪資與是否離職的百分比堆積條形圖bar_salary <- ggplot(hr, aes(x = salary, fill = left)) + geom_bar(position = fill) + theme_bw() + labs(x = left, y = salary)bar_salary

薪資與是否離職的百分比堆積條形圖

薪資越高離職率越低

# 合併這些圖形在一個繪圖區域,cols = 3的意思就是排版為一行三列multiplot(bar_pro, bar_5years, bar_salary, cols = 3)

建模預測之回歸樹

############## =============== 提取優秀員工 =========== #################### filter()用來篩選符合條件的樣本hr_model <- filter(hr, last_evaluation >= 0.70 | time_spend_company >= 4 | number_project > 5)############### ============ 自定義交叉驗證方法 ========== ################### 設置5折交叉驗證 method = 『cv』是設置交叉驗證方法,number = 5意味著是5折交叉驗證train_control <- trainControl(method = cv, number = 5)

################ =========== 分成抽樣 ============== ##########################set.seed(1234) # 設置隨機種子,為了使每次抽樣結果一致# 根據數據的因變數進行7:3的分層抽樣,返回行索引向量 p = 0.7就意味著按照7:3進行抽樣,# list=F即不返回列表,返迴向量index <- createDataPartition(hr_model$left, p = 0.7, list = F)traindata <- hr_model[index, ] # 提取數據中的index所對應行索引的數據作為訓練集testdata <- hr_model[-index, ] # 其餘的作為測試集##################### ============= 回歸樹 ============= ###################### 使用caret包中的trian函數對訓練集使用5折交叉的方法建立決策樹模型# left ~.的意思是根據因變數與所有自變數建模;trCintrol是控制使用那種方法進行建模# methon就是設置使用哪種演算法rpartmodel <- train(left ~ ., data = traindata, trControl = train_control, method = rpart)# 利用rpartmodel模型對測試集進行預測,([-7]的意思就是剔除測試集的因變數這一列)pred_rpart <- predict(rpartmodel, testdata[-7])# 建立混淆矩陣,positive=『1』設定我們的正例為「1」con_rpart <- table(pred_rpart, testdata$left)con_rpart

建模預測之樸素貝葉斯

################### ============ Naives Bayes =============== #################nbmodel <- train(left ~ ., data = traindata, trControl = train_control, method = nb)pred_nb <- predict(nbmodel, testdata[-7])con_nb <- table(pred_nb, testdata$left)con_nb

模型評估+應用

################### ================ ROC ==================== ################## 使用roc函數時,預測的值必須是數值型pred_rpart <- as.numeric(as.character(pred_rpart))pred_nb <- as.numeric(as.character(pred_nb))roc_rpart <- roc(testdata$left, pred_rpart) # 獲取後續畫圖時使用的信息#假正例率:(1-Specififity[真反例率])Specificity <- roc_rpart$specificities # 為後續的橫縱坐標軸奠基,真反例率Sensitivity <- roc_rpart$sensitivities # 查全率 : sensitivities,也是真正例率# 繪製ROC曲線#我們只需要橫縱坐標 NULL是為了聲明我們沒有用任何數據p_rpart <- ggplot(data = NULL, aes(x = 1- Specificity, y = Sensitivity)) + geom_line(colour = red) + # 繪製ROC曲線 geom_abline() + # 繪製對角線 annotate(text, x = 0.4, y = 0.5, label = paste(AUC=, #text是聲明圖層上添加文本注釋 #『3』是round函數裡面的參數,保留三位小數 round(roc_rpart$auc, 3))) + theme_bw() + # 在圖中(0.4,0.5)處添加AUC值 labs(x = 1 - Specificity, y = Sensitivities) # 設置橫縱坐標軸標籤p_rpart

回歸樹的ROC曲線

roc_nb <- roc(testdata$left, pred_nb)Specificity <- roc_nb$specificitiesSensitivity <- roc_nb$sensitivitiesp_nb <- ggplot(data = NULL, aes(x = 1- Specificity, y = Sensitivity)) + geom_line(colour = red) + geom_abline() + annotate(text, x = 0.4, y = 0.5, label = paste(AUC=, round(roc_nb$auc, 3))) + theme_bw() + labs(x = 1 - Specificity, y = Sensitivities)p_nb

樸素貝葉斯ROC曲線圖

回歸樹的AUC值(0.93) > 樸素貝葉斯的AUC值(0.839)

最終我們選擇了回歸樹模型做為我們的實際預測模型

######################### ============= 應用 =============##################### 使用回歸樹模型預測分類的概率,type=『prob』設置預測結果為離職的概率和不離職的概率pred_end <- predict(rpartmodel, testdata[-7], type = prob)# 合併預測結果和預測概率結果data_end <- cbind(round(pred_end, 3), pred_rpart)# 為預測結果表重命名names(data_end) <- c(pred.0, pred.1, pred) # 生成一個互動式數據表datatable(data_end)

最終我們會生成一個預測結果表

預測結果表第一列代表:員工不離職概率(pred.0)

預測結果表第二列代表:員工離職概率(pred.1)

預測結果表第三列代表:員工是否離職(pred)

推薦閱讀:

打字習慣匹配(Typing Pattern Recognition)有什麼好的演算法實現?
絕對收藏!民生銀行用戶畫像建設分享30頁PPT放送
聊聊傳統演算法系統與機器學習系統的一點不同
formatR代碼自動化排版
【機器學習】Bootstrap詳解

TAG:数据挖掘 | 数据分析师 | 数据可视化 |