用R语言分析与预測员工离职

用R语言分析与预測员工离职用R语言分析与预測员工离职

作者简单介绍

糖甜甜甜,R语言中文社区专栏作者

公众号:经管人学数据分析

在实验室搬砖之后,继续我们的kaggle数据分析之旅,这次数据也是答主在kaggle上选择的比較火的一份关于人力资源的数据集,关注点在于员工离职的分析和预測,依旧还是从数据读取,数据预处理,EDA和机器学习建模这几个部分開始进行,最后使用集成学习中比較火的random forest算法来预測离职情况。

数据读取

undefined

<span>setwd("E:/kaggle/human resource") library(data.table) library(plotly) library(corrplot) library(randomForest) library(pROC) library(tidyverse) library(caret) hr<-as.tibble(fread("hr_comma_sep.csv")) 10 glimpse(hr) sapply(hr,function(x){sum(is.na(x))}) ———————————————————————————————————————————————————————————————————————————————————— observations: 14,999 variables: $ satisfaction_level    <dbl> 0.38, 0.80, 0.11, 0.72, 0.37, 0.41, 0.10, 0.92, 0.89, 0.42, 0.45, 0.11, 0.84, 0.41, 0.36, 0.38, 0.45, 0.78, 0.45, 0.76, 0.11, 0.3...</p> <p>$ last_evaluation       <dbl> 0.53, 0.86, 0.88, 0.87, 0.52, 0.50, 0.77, 0.85, 1.00, 0.53, 0.54, 0.81, 0.92, 0.55, 0.56, 0.54, 0.47, 0.99, 0.51, 0.89, 0.83, 0.5...</p> <p>$ number_project        <int> 2, 5, 7, 5, 2, 2, 6, 5, 5, 2, 2, 6, 4, 2, 2, 2, 2, 4, 2, 5, 6, 2, 6, 2, 2, 5, 4, 2, 2, 2, 6, 2, 2, 2, 4, 6, 2, 2, 6, 2, 5, 2, 2, ...</p> <p>$ average_montly_hours  <int> 157, 262, 272, 223, 159, 153, 247, 259, 224, 142, 135, 305, 234, 148, 137, 143, 160, 255, 160, 262, 282, 147, 304, 139, 158, 242,...</p> <p>$ time_spend_company    <int> 3, 6, 4, 5, 3, 3, 4, 5, 5, 3, 3, 4, 5, 3, 3, 3, 3, 6, 3, 5, 4, 3, 4, 3, 3, 5, 5, 3, 3, 3, 4, 3, 3, 3, 6, 4, 3, 3, 4, 3, 5, 3, 3, ...</p> <p>$ Work_accident         <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ...</p> <p>$ left                  <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ...</p> <p>$ promotion_last_5years <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ...</p> <p>$ sales                 <chr> "sales", "sales", "sales", "sales", "sales", "sales", "sales", "sales", "sales", "sales", "sales", "sales", "sales", "sales", "sa...</p> <p>$ salary                <chr> "low", "medium", "medium", "low", "low", "low", "low", "low", "low", "low", "low", "low", "low", "low", "low", "low", "low", "low...</p> <p>satisfaction_level       last_evaluation        number_project  average_montly_hours    time_spend_company         Work_accident                  left                    0                     0                     0                     0                     0                     0                     0 promotion_last_5years                 sales                salary                    0                     0                     0 </chr></chr></int></int></int></int></int></int></dbl><!---as.tibble(fread("hr_comma_sep.csv"))--></span>

数据集情况例如以下。一共10维数据,14999个观測值。变量的代表名称各自是
satisfaction_level–惬意度,last_evaluation–最后一次评估,number_project–參与项目数量。average_montly_hours–每月平均工作时间。time_spend_company–公司停留时间。Work_accident–工作事故次数,left–是否离职。promotion_last_5years–过去五年升值状况,sales–工种,salary–工资。

并且简单的观測了一下。没有发现缺失值,那么我就能够直接进入数据分析阶段了。

数据预处理

依据每个特征的数值情况。我们能够将不少特征因子化,方便后期做不同类别的差异分析。

undefined

<span>hr$sales<-as.factor(hr$sales) hr$salary<-as.factor(hr$salary) hr$left<-as.factor(hr$left) hr$work_accident<-as.factor(hr$work_accident) hr$left<-recode(hr$left,'1'="yes" ,'0'="no" ) hr$promotion_last_5years<-as.factor(hr$promotion_last_5years)< span><!---as.factor(hr$sales)--></span>

看的出大部分数据都是数值型的。我们使用相关性来衡量不同变量之间的相关性高低:

undefined

<span>cor.hr<-hr %>% select(-sales,-salary)
cor.hr$Work_accident<-as.numeric(as.character(cor.hr$work_accident)) cor.hr$promotion_last_5years<-as.numeric(as.character(cor.hr$promotion_last_5years)) cor.hr$left<-as.numeric(as.character(cor.hr$left)) corrplot(corr="cor(cor.hr),type" = "lower",method="square" ,title="&#x53D8;&#x91CF;&#x76F8;&#x5173;&#x6027;" ,order="AOE" )< span><!---as.numeric(as.character(cor.hr$work_accident))--><!---hr--></span>

用R语言分析与预測员工离职

直观的来看。是否离职和惬意度高低就有非常高的关联性啊。

EDA

undefined

<span>ggplot(group_by(hr,sales),aes(x=sales,fill=sales))+geom_bar(width = 1)+coord_polar(theta = "x")+ggtitle("&#x4E0D;&#x540C;&#x804C;&#x4E1A;&#x7684;&#x4EBA;&#x6570;")
ggplot(hr,aes(x=sales,y=satisfaction_level,fill=sales))+geom_boxplot()+ggtitle("&#x4E0D;&#x540C;&#x804C;&#x4E1A;&#x7684;&#x60EC;&#x610F;&#x5EA6;")+stat_summary(fun.y = mean,size=3,color='white',geom = "point")+
&#xA0;theme(legend.position = "none")
ggplot(hr,aes(x=sales,y=satisfaction_level,fill=left))+geom_boxplot()+ggtitle("&#x4E0D;&#x540C;&#x804C;&#x4E1A;&#x7684;&#x60EC;&#x610F;&#x5EA6;")
ggplot(hr,aes(x=sales,y=average_montly_hours,fill=left))+geom_boxplot()+ggtitle("&#x4E0D;&#x540C;&#x804C;&#x4E1A;&#x7684;&#x5DE5;&#x4F5C;&#x65F6;&#x957F;")
ggplot(hr,aes(x=sales,y=number_project,fill=left))+geom_boxplot()+ggtitle("&#x4E0D;&#x540C;&#x804C;&#x4E1A;&#x7684;&#x9879;&#x76EE;&#x60C5;&#x51B5;")</span>

用R语言分析与预測员工离职

首先观察不同岗位的工作人数。搞销售的人数真的是不少。难道有不少我大生科的同学吗??(哈哈哈哈哈哈哈。开个玩笑而已,只是说实话做生物真的非常累啊)。

销售,后期支持,和技术岗人数占领人数排行榜前三。

用R语言分析与预測员工离职

不同的职业惬意度的分布大体相当。只是accounting的小伙伴们似乎打分都不高哦,其它的几个工种均值和中位数都没有明显区别,接下来我们看看不同职业是否离职的情况和打分的高低情况:

用R语言分析与预測员工离职

和想象中结果差点儿没有区别,离职和不离职的打分区分度非常高,和职业差点儿没有关系。

用R语言分析与预測员工离职

那么不同职业的平均工作时长呢,看图而言,没有离职的人群工作时间都非常稳定。可是离职人群的工作时间呈现两极分化的趋势。看来太忙和太闲都不是非常好。这对hr的考验还是非常大的。

后面我们来一次关注一下不同特征和离职的关系问题:

undefined

<span>ggplot(hr,aes(x=satisfaction_level,color=left))+geom_line(stat = "density")+ggtitle("&#x60EC;&#x610F;&#x5EA6;&#x548C;&#x79BB;&#x804C;&#x7684;&#x5173;&#x7CFB;")
ggplot(hr,aes(x=salary,fill=left))+geom_histogram(stat="count")+ggtitle("&#x5DE5;&#x8D44;&#x548C;&#x79BB;&#x804C;&#x7684;&#x5173;&#x7CFB;")
ggplot(hr,aes(x=promotion_last_5years,fill=left))+geom_histogram(stat="count")+ggtitle("&#x8FD1;5&#x5E74;&#x5347;&#x503C;&#x548C;&#x79BB;&#x804C;&#x7684;&#x5173;&#x7CFB;")
ggplot(hr,aes(x=last_evaluation,color=left))+geom_point(stat = "count")+ggtitle("&#x6700;&#x540E;&#x4E00;&#x6B21;&#x8BC4;&#x4EF7;&#x548C;&#x79BB;&#x804C;&#x7684;&#x5173;&#x7CFB;")
hr %>% group_by(sales) %>% ggplot(aes(x=sales,fill=Work_accident))+geom_bar()+coord_flip()+
&#xA0;theme(axis.text.x = element_blank(),axis.title.x = element_blank(),axis.title.y = element_blank())+scale_fill_discrete(labels=c("no accident","at least once"))</span>

用R语言分析与预測员工离职

没有离职的人群打分已知非常稳定,而离职人群的打分就有点难以估摸了

用R语言分析与预測员工离职

还是那句话。”有钱好办事啊”

用R语言分析与预測员工离职

你不给宝宝升职,宝宝就生气离职

用R语言分析与预測员工离职

和前面的面积图几乎相同,hr也要警惕那些最后一次打分非常高的,尽管大部分是不准备离职的。可是有些为了给老东家面子还是会来点”善意的谎言”的。

用R语言分析与预測员工离职

不出错是不可能的,出错人数多少基本和总人数成正比,所以这个对于离职来说不是问题。

模型构建和评估

undefined

<span>index<-sample(2,nrow(hr),replace = t,prob="c(0.7,0.3))" train<-hr[index="=1,];test<-hr[index==2,]" model<-randomforest(left~.,data="train)" predict.hr<-predict(model,test) confusionmatrix(test$left,predict.hr) prob.hr<-predict(model,test,type="prob" ) roc.hr<-roc(test$left,prob.hr[,2],levels="levels(test$left))" plot(roc.hr,type="S" ,col="red" ,main="paste("AUC=",roc.hr$auc,sep" ""))< span><!---sample(2,nrow(hr),replace--></span>

依据前面的特征分析,本次答主并没有认为有非常好的特征来提取。就直接扔进算法里面计算去了,计算出来的混淆矩阵的情况效果还是杠杠的:

undefined

<span>Confusion Matrix and Statistics</p> <p>         Reference Prediction   no  yes       no  3429    5       yes   28 1010                                                         Accuracy : 0.9926                           95% CI : (0.9897, 0.9949)    No Information Rate : 0.773              P-Value [Acc > NIR] : < 2.2e-16                                                                  Kappa : 0.9791           Mcnemar's Test P-Value : 0.0001283                                                            Sensitivity : 0.9919                      Specificity : 0.9951                   Pos Pred Value : 0.9985                   Neg Pred Value : 0.9730                       Prevalence : 0.7730                   Detection Rate : 0.7668             Detection Prevalence : 0.7679                Balanced Accuracy : 0.9935                                                           'Positive' Class : no                                                        </span>

acc=0.9926,recall=0.9951,precision=0.9730,基本都是逆天的数据了,看来kaggle的数据集已经清洗的非常棒了,rf算法也是一如既往地给力。最后贴出ROC曲线的图

用R语言分析与预測员工离职

写在最后

本次分析事实上并没有非常多的技巧可言,答主的ggplot2水平也遇到了瓶颈期,后期须要不断加强,并且仅仅会调包不懂算法后面的原理更是不能够的,所以近期在慢慢把概率论。线性代数,还是统计学捡起来,当然R语言的数据分析实践还是不会停下来的,答主英语还不错,能够和实验室的老外教授”忽悠”几句。也算是有了不少的进步。

道阻且长,大家共勉~~~

往期回想

词云一分钟了解周董的歌词

R语言实现统计分析——非參数如果检验

《我不是药神》30亿票房后分析徐峥的选角眼光

用R语言分析与预測员工离职

公众号后台回复keyword就可以学习

回复 爬虫 爬虫三大案例实战
回复Python 1小时破冰入门
回复数据挖掘R语言入门及数据挖掘
回复人工智能三个月入门人工智能
回复 数据分析师数据分析师成长之路
回复机器学习机器学习的商业应用
回复 数据科学数据科学实战
回复 经常使用算法经常使用数据挖掘算法

Original: https://www.cnblogs.com/zhchoutai/p/9894131.html
Author: zhchoutai
Title: 用R语言分析与预測员工离职

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/547129/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 71.底细

    dfs posted @2022-09-28 08:47 随遇而安== 阅读(6 ) 评论() 编辑 Original: https://www.cnblogs.com/55zjc…

    技术杂谈 2023年6月21日
    097
  • 一次不规范HTTP请求引发的nginx响应400问题分析与解决

    背景 最近分析数据偶然发现nginx log中有一批用户所有的HTTP POST log上报请求均返回400,没有任何200成功记录,由于只占整体请求的不到0.5%,所以之前也一直…

    技术杂谈 2023年6月21日
    0147
  • 【LEETCODE】70、字符匹配1023 Camelcase Matching

    最近做leetcode总感觉自己是个智障,基本很少有题能自己独立做出来,都是百度。。。 不过终于还是做出了一题。。。而且速度效率还可以 哎,加油吧,尽量锤炼自己 package y…

    技术杂谈 2023年7月24日
    068
  • Win10注册表无法保存对权限所作的更改拒绝访问

    确定后,这样就可以对上项目的权限进行修改了。应用后,再确定,即可。 14:38 18-07-24 周二 Original: https://www.cnblogs.com/zjoc…

    技术杂谈 2023年5月31日
    0118
  • MySQL — 索引

    索引(Index)是高效获取数据的数据结构,就像书的目录,提高检索数据的效率。 优点:提高数据检索效率,降低数据库的 IO 成本;通过索引列对数据进行排序,降低数据排序的成本,降低…

    技术杂谈 2023年7月11日
    061
  • 「免费开源」基于Vue和Quasar的前端SPA项目crudapi后台管理系统实战之联合索引(十一)

    基于Vue和Quasar的前端SPA项目实战之联合索引(十一) 回顾 通过之前文章基于Vue和Quasar的前端SPA项目实战之动态表单(五)的介绍,关于表单元数据配置相关内容已经…

    技术杂谈 2023年7月24日
    077
  • 设计模式 12 享元模式

    享元模式(Flyweight Pattern)属于 结构型模式 享元,英文名称为 Flyweigh, 轻量级的意思。它通过与其他 类似对象共享数据来减小内存占用,也就是它名字的来由…

    技术杂谈 2023年7月25日
    068
  • 常见的垃圾回收机制

    如何工作 在某些 Java 虚拟机中,堆的实现截然不同:它更像一个传送带,每分配一个新对象,它就向前移动一格。这意味着对象存储空间的分配速度特别快。Java 的”堆指针…

    技术杂谈 2023年7月25日
    064
  • 如何将Excel中数据前的空格去除

    我们在工作中有时会碰到格式不统一的数据,这时会需要将数据前的空格去除,那么该如何操作呢? 下面小编就来具体介绍一下步骤吧~ Original: https://www.cnblog…

    技术杂谈 2023年5月31日
    0124
  • 关于力场

    1.概念陈述 接触力(contact force):只有相互接触才会发生的力叫做接触力,接触力分为弹性力和摩擦力,因为它们在本质上都是由电磁场引起的,属于电磁力. 非接触力(non…

    技术杂谈 2023年5月31日
    096
  • UIScrollView 在手指点击的坐标处放大

    写了一个extension,如下: extension UIScrollView{ ///在ScrollView上的某个点放大 func zoomWithPoint(var zoo…

    技术杂谈 2023年5月31日
    088
  • win10下计算文件哈希值的方法

    cmd下使用certutil命令 使用方法: certutil -hashfile FILE_NAME ALGORITHM_NAME 支持的加密算法包括:MD2,MD4,MD5,S…

    技术杂谈 2023年7月25日
    072
  • LeetCode27.移除元素

    给你一个数组nums和一个值val,你需要 原地 移除所有数值等于val的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用O(1)额外空间并 原地 修改输入数…

    技术杂谈 2023年7月24日
    079
  • 设计模式-适配器模式

    类型:结构型 目的:解决接口不兼容问题。 话不多说,看个案例吧。 优化案例 在真实的开发场景中,系统的每个模块都是分配给不同的团队或个人来开发的。这使得事前沟通变得尤为重要,且沟通…

    技术杂谈 2023年7月11日
    068
  • 初识C++01:初探C++

    c++介绍 c++支持面向过程编程(如c),面向对象编程(OOP)和泛型编程; c/c++编译器比较多,window下是微软编译器cl.exe,Linux机下是GCC编译器,mac…

    技术杂谈 2023年7月25日
    074
  • 基于STC51单片机的自动门铃

    基于STC51单片机的自动门铃 设计要求: 利用红外对管检测是否有人进出 在触发红外对管后,使用PWM驱动蜂鸣器,使其发出叮咚叮咚的声音 设计概述: ​ 按照设计要求,为了直观的说…

    技术杂谈 2023年7月25日
    061
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球