? ? ? ? ################### ============== 加載包 =================== #################
library(plyr) # Rmisc的關(guān)聯(lián)包,若同時(shí)需要加載dplyr包,必須先加載plyr包
library(dplyr) # filter()
library(ggplot2) # ggplot()
library(DT) # datatable() 建立交互式數(shù)據(jù)表
library(caret) # createDataPartition() 分層抽樣函數(shù)
library(rpart) # rpart()
library(e1071) # naiveBayes()
library(pROC) # roc()
library(Rmisc) # multiplot() 分割繪圖區(qū)域
################### ============= 導(dǎo)入數(shù)據(jù) ================== #################
hr 《- read.csv(“D:/R/天善智能/書豪十大案例/員工離職預(yù)測(cè)\HR_comma_sep.csv”)
str(hr) # 查看數(shù)據(jù)的基本數(shù)據(jù)結(jié)構(gòu)
描述性分析
################### ============= 描述性分析 ================== ###############
str(hr) # 查看數(shù)據(jù)的基本數(shù)據(jù)結(jié)構(gòu)
summary(hr) # 計(jì)算數(shù)據(jù)的主要描述統(tǒng)計(jì)量
# 后續(xù)的個(gè)別模型需要目標(biāo)變量必須為因子型,我們將其轉(zhuǎn)換為因子型
hr$left 《- factor(hr$left, levels = c(‘0’, ‘1’))
## 探索員工對(duì)公司滿意度、績效評(píng)估和月均工作時(shí)長與是否離職的關(guān)系
# 繪制對(duì)公司滿意度與是否離職的箱線圖
box_sat 《- ggplot(hr, aes(x = left, y = satisfaction_level, fill = left)) +
geom_boxplot() +
theme_bw() + # 一種ggplot的主題
labs(x = ‘left’, y = ‘satisfaction_level’) # 設(shè)置橫縱坐標(biāo)標(biāo)簽
box_sat
員工對(duì)公司滿意度與是否離職的箱線圖
離職員工對(duì)公司的滿意度較低,大多集中在0.4左右;
# 繪制績效評(píng)估與是否離職的箱線圖
box_eva 《- ggplot(hr, aes(x = left, y = last_evaluation, fill = left)) +
geom_boxplot() +
theme_bw() +
labs(x = ‘left’, y = ‘last_evaluation’)
box_eva
績效評(píng)估與是否離職的箱線圖
離職員工的績效評(píng)估較高,在0.8以上的較為集中;
# 繪制平均月工作時(shí)長與是否離職的箱線圖
box_mon 《- ggplot(hr, aes(x = left, y = average_montly_hours, fill = left)) +
geom_boxplot() +
theme_bw() +
labs(x = ‘left’, y = ‘a(chǎn)verage_montly_hours’)
box_mon
離職員工的平均月工作時(shí)長較高,一多半超過了平均水平(200小時(shí))
# 繪制員工在公司工作年限與是否離職的箱線圖
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年左右
# 合并這些圖形在一個(gè)繪圖區(qū)域,cols = 2的意思就是排版為一行二列
multiplot(box_sat, box_eva, box_mon, box_time, cols = 2)
## 探索參與項(xiàng)目個(gè)數(shù)、五年內(nèi)有沒有升職和薪資與離職的關(guān)系
# 繪制參與項(xiàng)目個(gè)數(shù)條形圖時(shí)需要把此變量轉(zhuǎn)換為因子型
hr$number_project 《- factor(hr$number_project,
levels = c(‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’))
# 繪制參與項(xiàng)目個(gè)數(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
員工參與項(xiàng)目個(gè)數(shù)與是否離職的百分比堆積條形圖
參加項(xiàng)目數(shù)越多的員工離職率越大(去除項(xiàng)目數(shù)為2的樣本)
# 繪制5年內(nèi)是否升職與是否離職的百分比堆積條形圖
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年內(nèi)是否升職與是否離職的百分比堆積條形圖
五年內(nèi)沒有升職的員工的離職率比較大
# 繪制薪資與是否離職的百分比堆積條形圖
bar_salary 《- ggplot(hr, aes(x = salary, fill = left)) +
geom_bar(position = ‘fill’) +
theme_bw() +
labs(x = ‘left’, y = ‘salary’)
bar_salary
薪資與是否離職的百分比堆積條形圖
薪資越高離職率越低
# 合并這些圖形在一個(gè)繪圖區(qū)域,cols = 3的意思就是排版為一行三列
multiplot(bar_pro, bar_5years, bar_salary, cols = 3)
建模預(yù)測(cè)之回歸樹
############## =============== 提取優(yōu)秀員工 =========== ###################
# filter()用來篩選符合條件的樣本
hr_model 《- filter(hr, last_evaluation 》= 0.70 | time_spend_company 》= 4
| number_project 》 5)
############### ============ 自定義交叉驗(yàn)證方法 ========== ##################
# 設(shè)置5折交叉驗(yàn)證 method = ‘cv’是設(shè)置交叉驗(yàn)證方法,number = 5意味著是5折交叉驗(yàn)證
train_control 《- trainControl(method = ‘cv’, number = 5)
################ =========== 分成抽樣 ============== ##########################
set.seed(1234) # 設(shè)置隨機(jī)種子,為了使每次抽樣結(jié)果一致
# 根據(jù)數(shù)據(jù)的因變量進(jìn)行7:3的分層抽樣,返回行索引向量 p = 0.7就意味著按照7:3進(jìn)行抽樣,
# list=F即不返回列表,返回向量
index 《- createDataPartition(hr_model$left, p = 0.7, list = F)
traindata 《- hr_model[index, ] # 提取數(shù)據(jù)中的index所對(duì)應(yīng)行索引的數(shù)據(jù)作為訓(xùn)練集
testdata 《- hr_model[-index, ] # 其余的作為測(cè)試集
##################### ============= 回歸樹 ============= #####################
# 使用caret包中的trian函數(shù)對(duì)訓(xùn)練集使用5折交叉的方法建立決策樹模型
# left ~。的意思是根據(jù)因變量與所有自變量建模;trCintrol是控制使用那種方法進(jìn)行建模
# methon就是設(shè)置使用哪種算法
rpartmodel 《- train(left ~ 。, data = traindata,
trControl = train_control, method = ‘rpart’)
# 利用rpartmodel模型對(duì)測(cè)試集進(jìn)行預(yù)測(cè),([-7]的意思就是剔除測(cè)試集的因變量這一列)
pred_rpart 《- predict(rpartmodel, testdata[-7])
# 建立混淆矩陣,positive=‘1’設(shè)定我們的正例為“1”
con_rpart 《- table(pred_rpart, testdata$left)
con_rpart
建模預(yù)測(cè)之樸素貝葉斯
################### ============ 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
模型評(píng)估+應(yīng)用
################### ================ ROC ==================== #################
# 使用roc函數(shù)時(shí),預(yù)測(cè)的值必須是數(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ù)畫圖時(shí)使用的信息
#假正例率:(1-Specififity[真反例率])
Specificity 《- roc_rpart$specificities # 為后續(xù)的橫縱坐標(biāo)軸奠基,真反例率
Sensitivity 《- roc_rpart$sensitivities # 查全率 : sensitivities,也是真正例率
# 繪制ROC曲線
#我們只需要橫縱坐標(biāo) NULL是為了聲明我們沒有用任何數(shù)據(jù)
p_rpart 《- ggplot(data = NULL, aes(x = 1- Specificity, y = Sensitivity)) +
geom_line(colour = ‘red’) + # 繪制ROC曲線
geom_abline() + # 繪制對(duì)角線
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’) # 設(shè)置橫縱坐標(biāo)軸標(biāo)簽
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)
最終我們選擇了回歸樹模型做為我們的實(shí)際預(yù)測(cè)模型
######################### ============= 應(yīng)用 =============####################
# 使用回歸樹模型預(yù)測(cè)分類的概率,type=‘prob’設(shè)置預(yù)測(cè)結(jié)果為離職的概率和不離職的概率
pred_end 《- predict(rpartmodel, testdata[-7], type = ‘prob’)
# 合并預(yù)測(cè)結(jié)果和預(yù)測(cè)概率結(jié)果
data_end 《- cbind(round(pred_end, 3), pred_rpart)
# 為預(yù)測(cè)結(jié)果表重命名
names(data_end) 《- c(‘pred.0’, ‘pred.1’, ‘pred’)
# 生成一個(gè)交互式數(shù)據(jù)表
datatable(data_end)
最終我們會(huì)生成一個(gè)預(yù)測(cè)結(jié)果表
評(píng)論
查看更多