? ? ? ? ################### ============== 加載包 =================== #################
library(plyr) # Rmisc的關聯(lián)包,若同時需要加載dplyr包,必須先加載plyr包
library(dplyr) # filter()
library(ggplot2) # ggplot()
library(DT) # datatable() 建立交互式數(shù)據表
library(caret) # createDataPartition() 分層抽樣函數(shù)
library(rpart) # rpart()
library(e1071) # naiveBayes()
library(pROC) # roc()
library(Rmisc) # multiplot() 分割繪圖區(qū)域
################### ============= 導入數(shù)據 ================== #################
hr 《- read.csv(“D:/R/天善智能/書豪十大案例/員工離職預測\HR_comma_sep.csv”)
str(hr) # 查看數(shù)據的基本數(shù)據結構
描述性分析
################### ============= 描述性分析 ================== ###############
str(hr) # 查看數(shù)據的基本數(shù)據結構
summary(hr) # 計算數(shù)據的主要描述統(tǒng)計量
# 后續(xù)的個別模型需要目標變量必須為因子型,我們將其轉換為因子型
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年左右
# 合并這些圖形在一個繪圖區(qū)域,cols = 2的意思就是排版為一行二列
multiplot(box_sat, box_eva, box_mon, box_time, cols = 2)
## 探索參與項目個數(shù)、五年內有沒有升職和薪資與離職的關系
# 繪制參與項目個數(shù)條形圖時需要把此變量轉換為因子型
hr$number_project 《- factor(hr$number_project,
levels = c(‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’))
# 繪制參與項目個數(shù)與是否離職的百分比堆積條形圖
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
員工參與項目個數(shù)與是否離職的百分比堆積條形圖
參加項目數(shù)越多的員工離職率越大(去除項目數(shù)為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
薪資與是否離職的百分比堆積條形圖
薪資越高離職率越低
# 合并這些圖形在一個繪圖區(qū)域,cols = 3的意思就是排版為一行三列
multiplot(bar_pro, bar_5years, bar_salary, cols = 3)
建模預測之回歸樹
############## =============== 提取優(yōu)秀員工 =========== ###################
# 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) # 設置隨機種子,為了使每次抽樣結果一致
# 根據數(shù)據的因變量進行7:3的分層抽樣,返回行索引向量 p = 0.7就意味著按照7:3進行抽樣,
# list=F即不返回列表,返回向量
index 《- createDataPartition(hr_model$left, p = 0.7, list = F)
traindata 《- hr_model[index, ] # 提取數(shù)據中的index所對應行索引的數(shù)據作為訓練集
testdata 《- hr_model[-index, ] # 其余的作為測試集
##################### ============= 回歸樹 ============= #####################
# 使用caret包中的trian函數(shù)對訓練集使用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函數(shù)時,預測的值必須是數(shù)值型
pred_rpart 《- as.numeric(as.character(pred_rpart))
pred_nb 《- as.numeric(as.character(pred_nb))
roc_rpart 《- roc(testdata$left, pred_rpart) # 獲取后續(xù)畫圖時使用的信息
#假正例率:(1-Specififity[真反例率])
Specificity 《- roc_rpart$specificities # 為后續(xù)的橫縱坐標軸奠基,真反例率
Sensitivity 《- roc_rpart$sensitivities # 查全率 : sensitivities,也是真正例率
# 繪制ROC曲線
#我們只需要橫縱坐標 NULL是為了聲明我們沒有用任何數(shù)據
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函數(shù)里面的參數(shù),保留三位小數(shù)
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$specificities
Sensitivity 《- roc_nb$sensitivities
p_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’)
# 生成一個交互式數(shù)據表
datatable(data_end)
最終我們會生成一個預測結果表
評論
查看更多