当前位置:   article > 正文

转: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.

image.png

变量说明


image.png

  1. ################### ============== 加载包 =================== #################
  2. library(plyr) # Rmisc的关联包,若同时需要加载dplyr包,必须先加载plyr包
  3. library(dplyr) # filter()
  4. library(ggplot2) # ggplot()
  5. library(DT) # datatable() 建立交互式数据表
  6. library(caret) # createDataPartition() 分层抽样函数
  7. library(rpart) # rpart()
  8. library(e1071) # naiveBayes()
  9. library(pROC) # roc()
  10. library(Rmisc) # multiplot() 分割绘图区域
  11. ################### ============= 导入数据 ================== #################
  12. hr <- read.csv("D:/R/天善智能/书豪十大案例/员工离职预测\\HR_comma_sep.csv")
  13. str(hr) # 查看数据的基本数据结构

image.png

描述性分析

  1. ################### ============= 描述性分析 ================== ###############
  2. str(hr) # 查看数据的基本数据结构
  3. summary(hr) # 计算数据的主要描述统计量
  4. # 后续的个别模型需要目标变量必须为因子型,我们将其转换为因子型
  5. hr$left <- factor(hr$left, levels = c('0', '1'))
  6. ## 探索员工对公司满意度、绩效评估和月均工作时长与是否离职的关系
  7. # 绘制对公司满意度与是否离职的箱线图
  8. box_sat <- ggplot(hr, aes(x = left, y = satisfaction_level, fill = left)) +
  9. geom_boxplot() +
  10. theme_bw() + # 一种ggplot的主题
  11. labs(x = 'left', y = 'satisfaction_level') # 设置横纵坐标标签
  12. box_sat

image.png

离职员工对公司的满意度较低,大多集中在0.4左右;

  1. # 绘制绩效评估与是否离职的箱线图
  2. box_eva <- ggplot(hr, aes(x = left, y = last_evaluation, fill = left)) +
  3. geom_boxplot() +
  4. theme_bw() +
  5. labs(x = 'left', y = 'last_evaluation')
  6. box_eva

image.png

离职员工的绩效评估较高,在0.8以上的较为集中;

  1. # 绘制平均月工作时长与是否离职的箱线图
  2. box_mon <- ggplot(hr, aes(x = left, y = average_montly_hours, fill = left)) +
  3. geom_boxplot() +
  4. theme_bw() +
  5. labs(x = 'left', y = 'average_montly_hours')
  6. box_mon

image.png

离职员工的平均月工作时长较高,一多半超过了平均水平(200小时)

  1. # 绘制员工在公司工作年限与是否离职的箱线图
  2. box_time <- ggplot(hr, aes(x = left, y = time_spend_company, fill = left)) +
  3. geom_boxplot() +
  4. theme_bw() +
  5. labs(x = 'left', y = 'time_spend_company')
  6. box_time

image.png

离职员工的工作年限在4年左右

  1. # 合并这些图形在一个绘图区域,cols = 2的意思就是排版为一行二列
  2. multiplot(box_sat, box_eva, box_mon, box_time, cols = 2)

8.jpg

  1. ## 探索参与项目个数、五年内有没有升职和薪资与离职的关系
  2. # 绘制参与项目个数条形图时需要把此变量转换为因子型
  3. hr$number_project <- factor(hr$number_project,
  4. levels = c('2', '3', '4', '5', '6', '7'))
  5. # 绘制参与项目个数与是否离职的百分比堆积条形图
  6. bar_pro <- ggplot(hr, aes(x = number_project, fill = left)) +
  7. geom_bar(position = 'fill') + # position = 'fill'即绘制百分比堆积条形图
  8. theme_bw() +
  9. labs(x = 'left', y = 'number_project')
  10. bar_pro

image.png

参加项目数越多的员工离职率越大(去除项目数为2的样本)

  1. # 绘制5年内是否升职与是否离职的百分比堆积条形图
  2. bar_5years <- ggplot(hr, aes(x = as.factor(promotion_last_5years), fill = left)) +
  3. geom_bar(position = 'fill') +
  4. theme_bw() +
  5. labs(x = 'left', y = 'promotion_last_5years')
  6. bar_5years

image.png

五年内没有升职的员工的离职率比较大

  1. # 绘制薪资与是否离职的百分比堆积条形图
  2. bar_salary <- ggplot(hr, aes(x = salary, fill = left)) +
  3. geom_bar(position = 'fill') +
  4. theme_bw() +
  5. labs(x = 'left', y = 'salary')
  6. bar_salary

11.jpg

薪资越高离职率越低

  1. # 合并这些图形在一个绘图区域,cols = 3的意思就是排版为一行三列
  2. multiplot(bar_pro, bar_5years, bar_salary, cols = 3)

12.jpg

建模预测之回归树

  1. ############## =============== 提取优秀员工 =========== ###################
  2. # filter()用来筛选符合条件的样本
  3. hr_model <- filter(hr, last_evaluation >= 0.70 | time_spend_company >= 4
  4. | number_project > 5)
  5. ############### ============ 自定义交叉验证方法 ========== ##################
  6. # 设置5折交叉验证 method = ‘cv’是设置交叉验证方法,number = 5意味着是5折交叉验证
  7. train_control <- trainControl(method = 'cv', number = 5)

image.png

  1. ################ =========== 分成抽样 ============== ##########################
  2. set.seed(1234) # 设置随机种子,为了使每次抽样结果一致
  3. # 根据数据的因变量进行7:3的分层抽样,返回行索引向量 p = 0.7就意味着按照7:3进行抽样,
  4. # list=F即不返回列表,返回向量
  5. index <- createDataPartition(hr_model$left, p = 0.7, list = F)
  6. traindata <- hr_model[index, ] # 提取数据中的index所对应行索引的数据作为训练集
  7. testdata <- hr_model[-index, ] # 其余的作为测试集
  8. ##################### ============= 回归树 ============= #####################
  9. # 使用caret包中的trian函数对训练集使用5折交叉的方法建立决策树模型
  10. # left ~.的意思是根据因变量与所有自变量建模;trCintrol是控制使用那种方法进行建模
  11. # methon就是设置使用哪种算法
  12. rpartmodel <- train(left ~ ., data = traindata,
  13. trControl = train_control, method = 'rpart')
  14. # 利用rpartmodel模型对测试集进行预测,([-7]的意思就是剔除测试集的因变量这一列)
  15. pred_rpart <- predict(rpartmodel, testdata[-7])
  16. # 建立混淆矩阵,positive=1’设定我们的正例为“1
  17. con_rpart <- table(pred_rpart, testdata$left)
  18. con_rpart

14.jpg

image.png

image.png



image.png


建模预测之朴素贝叶斯

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

image.png


模型评估+应用

19.jpg

image.png



  1. ################### ================ ROC ==================== #################
  2. # 使用roc函数时,预测的值必须是数值型
  3. pred_rpart <- as.numeric(as.character(pred_rpart))
  4. pred_nb <- as.numeric(as.character(pred_nb))
  5. roc_rpart <- roc(testdata$left, pred_rpart) # 获取后续画图时使用的信息
  6. #假正例率:(1-Specififity[真反例率])
  7. Specificity <- roc_rpart$specificities # 为后续的横纵坐标轴奠基,真反例率
  8. Sensitivity <- roc_rpart$sensitivities # 查全率 : sensitivities,也是真正例率
  9. # 绘制ROC曲线
  10. #我们只需要横纵坐标 NULL是为了声明我们没有用任何数据
  11. p_rpart <- ggplot(data = NULL, aes(x = 1- Specificity, y = Sensitivity)) +
  12. geom_line(colour = 'red') + # 绘制ROC曲线
  13. geom_abline() + # 绘制对角线
  14. annotate('text', x = 0.4, y = 0.5, label = paste('AUC=', #text是声明图层上添加文本注释
  15. #‘3’是round函数里面的参数,保留三位小数
  16. round(roc_rpart$auc, 3))) + theme_bw() + # 在图中(0.4,0.5)处添加AUC值
  17. labs(x = '1 - Specificity', y = 'Sensitivities') # 设置横纵坐标轴标签
  18. p_rpart


image.png

  1. roc_nb <- roc(testdata$left, pred_nb)
  2. Specificity <- roc_nb$specificities
  3. Sensitivity <- roc_nb$sensitivities
  4. p_nb <- ggplot(data = NULL, aes(x = 1- Specificity, y = Sensitivity)) +
  5. geom_line(colour = 'red') + geom_abline() +
  6. annotate('text', x = 0.4, y = 0.5, label = paste('AUC=',
  7. round(roc_nb$auc, 3))) + theme_bw() +
  8. labs(x = '1 - Specificity', y = 'Sensitivities')
  9. p_nb

image.png

回归树的AUC值(0.93) > 朴素贝叶斯的AUC值(0.839)

最终我们选择了回归树模型做为我们的实际预测模型

  1. ######################### ============= 应用 =============####################
  2. # 使用回归树模型预测分类的概率,type=‘prob’设置预测结果为离职的概率和不离职的概率
  3. pred_end <- predict(rpartmodel, testdata[-7], type = 'prob')
  4. # 合并预测结果和预测概率结果
  5. data_end <- cbind(round(pred_end, 3), pred_rpart)
  6. # 为预测结果表重命名
  7. names(data_end) <- c('pred.0', 'pred.1', 'pred')
  8. # 生成一个交互式数据表
  9. datatable(data_end)

image.png

最终我们会生成一个预测结果表

预测结果表第一列代表:员工不离职概率(pred.0)

预测结果表第二列代表:员工离职概率(pred.1)

预测结果表第三列代表:员工是否离职(pred)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/代码探险家/article/detail/769721
推荐阅读
相关标签
  

闽ICP备14008679号