地点:北上广深
时间:凌晨 00:38
“
北上广深,凌晨0点38分,你是否想过离职?
2016年,我国员工离职率达到20.1%,一线城市22.4%,意味着你身边每10个同事中就有2个会离职。科技行业员工离职率最高,达到25.1%,其中主动离职率为21.6%。员工流失率太高显然对企业长期经营发展是不利,那么将大数据运用于员工离职预测,帮助企业制定策略、留住人才,势在必行,必定大有可为。
大数据员工离职预测,听起来很高大上?其实操作很简单!
魔术师此次专程找了一位零R语言基础的同学将接下来进行的一系列探索性分析和建模过程代码进行了重现,该同学表示毫无障碍!因此不要犹豫,赶紧动起手来,跟着魔术师把代码跑起来吧~
任务结构
案例背景
一家具有14999名员工的公司想要探寻为什么最优秀和最有经验的员工总是离职,同时希望能够对下一个离职的员工进行预测。
数据来源及变量说明
数据来源于kaggle比赛案例中的Human Resources Analytics数据集。
数据链接网址为https://www.kaggle.com/c/sm。
分析任务
通过建立决策树模型以及支持向量机模型来预测员工是否离职,同时通过对比混淆矩阵中的precision、recall以及accuracy三大指标来评估两个模型的优劣。
对于二分类问题,可以将样例根据其真实类别和分类器预测类别划分为:
真正例(True Positive,TP):真实类别为正例,预测类别为正例。
假正例(False Positive,FP):真实类别为负例,预测类别为正例。
假负例(False Negative,FN):真实类别为正例,预测类别为负例。
真负例(True Negative,TN):真实类别为负例,预测类别为负例。
然后可以构建如下表所示的混淆矩阵(Confusion Matrix):
混淆矩阵
在本案例中,离职员工(left=1)视为正例,未离职员工(left=0)视为负例。三大指标的计算如下所示:
(1)Accuracy=(TP+TN)/(TN+FN+FP+TP):即准确度,是指正确预测的离职与未离职员工占总员工数的百分比;
(2)Precision=TP/(TP+FP),即精确率,是指正确预测的离职员工占所有被预测为离职员工的百分比;
(3)Recall=TP/(TP+FN):即召回率,是指正确预测的离职员工占实际离职员工的百分比。
探索性分析
1.数据预览
首先将数据载入R,命名为hr。在Rstudio中可以通过修改工作目录的形式读取数据文件,也就是将当前工作目录设置为数据文件所在的文件夹。
调用View()函数预览数据。
可以看出,数据集共包含14999条记录,图中显示了前20条。
2.总体情况描述
调用summary()函数观察各个变量的主要描述统计量。
满意程度在62%左右;
绩效评估在72%左右;
平均每人参加3-4个项目;
月平均工作时长约200小时;
在该公司的平均工作年限为3-4年;
离职率约24%;
3.探索各变量与离职的关系
首先我们通过ggplot2包绘制箱线图来对员工的满意度、绩效评估、月工作时长、以及工作年限与离职的关系进行探索分析。
ggplot2包是使用R进行数据可视化的重要工具。在调用ggplot2函数前需要下载并安装该包(install.packages(“ggplot2”)),第一次使用前还需要进行加载(library(ggplot2))。
类别(名义型)变量和有序类别(有序型)变量在R中称为因子(factor)。因子在R中非常重要,因为它决定了数据的分析方式以及如何进行视觉呈现。因此首先对离职与否(left)这个类别变量通过factor()函数,指定水平参数的取值为1和0后将其转变为因子型。
然后调用ggplot()函数指定要绘制的数据源和变量,其中参数fill表示对填充区域进行着色,几何函数geom_boxplot()表示添加箱线图,theme_bw是一种ggplot的主题,labs()函数则设置了横纵轴的标签。
最后再调用Rmisc包中的multiplot()函数将这四幅图合并在一个绘图区域,col=2代表排版时一行放置二列。所以合并之前请先下载和安装Rmisc包。(install.packages(“Rmisc”)),第一次使用前还需要进行加载(library(Rmisc))。
运行结果如下图所示:
从箱线图可以看出,离职员工具有以下特点:
离职员工对公司的满意程度较低,大多集中在0.4;
离职员工的月平均工作时长较长,一半多在200小时以上;
离职员工的绩效评估都较高,大多集中在0.8以上;
离职员工基本都在公司工作了4年左右。
然后通过堆砌条形图对参与项目数、五年内是否升职、收入水平、是否有工作差错以及岗位与离职的关系进行探索分析。堆砌条形图通过几何函数geom_bar()获得。参数position=fill表示垂直地堆叠分组条形图并规范其高度相等。
其中针对收入水平变量,我们通过dplyr包中的mutate()函数和forcats包中的fct_relevel()函数将数据集中的salary变量按照指定的低、中、高的顺序进行排列,因此在调用之前先安装和加载dplyr包和forcats包(install.packages(“dplyr”)、install.packages(“forcats”)),第一次使用前还需要进行加载(library(dplyr)、library(forcats))。
输出结果如下图所示:
由堆砌条形图可以看出:
假设去除项目为2的样本,那么参加项目数越多的员工离职率越高;
五年内未得到升职的员工离职率比较高;
薪资水平为低档的员工,离职率最高;
输出结果如下图所示:
即:
相比于在工作中发生过差错的员工,未发生过工作差错的员工离职率反而较高;
各个岗位上的员工离职率水平相当;
决策树模型
1.方法简介
决策树是机器学习中的经典算法。其基本思想是对预测变量进行二元分离,从而构造一棵可用于预测新样本单元所属类别的树。
关于决策树更多的详细信息,可以点击查看数据魔术师公众号往期的一篇推文:决策树|算法原理介绍
2.数据准备
首先利用factor()函数将变量中的定性变量转换为因子型,然后调用str()函数查看数据的基本结构。可以看出是否发生工作差错、五年内是否升职、部门、薪资水平以及是否离职这五个类别变量的数据类型已经全部都是因子型了。
3.划分训练集和测试集
使用sample函数进行抽样,按7:3产生训练集和测试集。
4.模型建立
在R中可以通过rpart、rpart.plot包来实现决策树模型及其可视化。其中rpart包中的rpart()函数可用于构造决策树,函数中的第一个参数是指用数据集中的其他所有剩余变量构建一个用来预测left这个因变量的决策树模型,点即代表剩余的所有变量,模型的变种可以通过修改公式中的自变量和因变量来实现,例如假设我们只想用满意度和工作绩效来预测left,那么第一个参数可写成left~satisfaction_level+last_evaluation,以此类推。
data这个参数是指给出用于建立决策树所使用的训练样本。rpart.plot包中的prp()函数可用于画出最终的决策树,prp()函数有很多可供选择的参数(详见?prp),因此首先下载和安装rpart和rpart.plot包。(install.packages(“rpart”)、install.packages(“rpart.plot”)),第一次使用前还需要进行加载(library(rpart)、library(rpart.plot))。
决策树图形所下所示:
通过决策树的具体信息以及决策树图形,我们可以看到,实际在构造树的时候只用到了月平均工作时长、绩效水平、项目数、对公司的满意程度以及工作年限这五个特征。因此基于这五个特征以及分类条件,便可以根据已有的员工特征,按照决策路径得到的叶子结点的值来预测其是否会离职。
5.对测试集进行预测和评价
调用predict()函数,参数设置为已生成的决策树模型,测试集,以及type指定为分类可获得离职与否的预测结果,然后通过table()函数将其转化为一个混淆矩阵。
从三个指标的结果中可看出该模型取得了不错的预测效果,各指标均在90%以上,尤其是准确度指标,即accuracy达到了97.1%。
支持向量机模型
1.方法简介
支持向量机(SVM)是一类可用于分类和回归的有监督机器学习模型,它在解决小样本、非线性及高维模式识别中表现出许多特有的优势。将其应用于二分类问题时,SVM旨在多维空间中找到一个能将全部样本单元分成两类的最优平面,这一平面应使两类中距离最近的点的间距尽可能大,在间距边界上的点被称为支持向量(它们决定间距),分割的超平面位于间距的中间。关于支持向量机模型的更多内容,推荐阅读周志华教授的《机器学习》西瓜书第六章支持向量机。
2.模型建立
首先在R中安装和加载e1071包,然后利用e1071包中的svm( )函数,通过给定自变量与因变量,同时给出训练数据,并将参数type值设置为”C”以表示进行分类,由此建立起可用于处理二分类问题的支持向量机模型(注:此处使用的训练集和测试集与决策树模型一致)。
并通过fit.svm查看模型的一些具体信息。
由输出结果可以看出,SVM模型默认选用的是径向基函数将样本单元投射到高维空间。其中参数gamma的取值为0.05263158,cost(成本)的取值为1。
3.初始模型评价
选用predict()函数,利用初始模型fit.svm对测试集进行预测。并通过table()函数生成预测结果的混淆矩阵表。通过svm.perf查看混淆矩阵表。
从混淆矩阵可以看出,被正确预测的未离职员工人(实际未离职同时预测也是未离职的人数,即混淆矩阵第一行第一列的数值)有3317人,被正确预测的离职员工(实际离职同时预测也是离职的人数,即混淆矩阵第二行第二列的数值)有963人,错误地预测离职与否的人数(包含实际离职但预测为未离职与实际未离职但是预测为离职的人数,即混淆矩阵的第二和第一列的数值和第一行第二列的数值相加)为124+92=216人。然后我们通过计算前文所述的召回率(recall)、精确率(precision)、准确度(accuracy)对预测结果进行评价。
由输出结果可以看出,召回率约为91.4%,精确率约为88.5%,准确度约为95.2%。在这个结果中,精确度不是很高,所以我们尝试通过调整参数的办法来尽量提高各评价指标的数值。
4.选择调和参数
在用带RBF核(Radial Basis Function)的SVM拟合样本时,gamma和cost这两个参数的取值可能会影响最终的结果。因此,基于初始的gamma值和cost值,我们为gamma和cost参数设置一个候选范围,一共尝试了5个不同的gamma值(0.001,0.01,0.1,1,10)以及5个成本参数(0.01,0.1,1,10,100),通过tune.svm( )函数对每一个参数组合生成一个SVM模型,并输出在每一个参数组合上的表现。总体来说,我们一共拟合了25个模型,(这25个模型训练时间较长,约一个半小时输出结果)。然后通过tuned代码,可以输出最优模型的gamma参数和cost参数的值。
通过输出的最优模型,我们可以得到训练集中10倍交叉验证误差最小的模型所对应的参数为gamma=1,cost=10。
然后基于这一参数值,我们将gamma和cost的参数分别设置为1,10,重新查看新生成模型fit.svm1的相关参数信息。
我们重复以上的建模和模型评价步骤,也即通过以下代码获取当前最优模型的各项评价指标。
5.调整后的模型评价与对比
再次将两个模型的结果输出后进行对比分析。
我们可以发现,实际未离职但被错误的预测为离职的人数从124下降至40,实际离职但被错误地预测为未离职的人数也下降了32人。召回率,精确率,准确度都得到了提高,其中精确率从88.6%提高至96.1%,准确度达到了97.8%,参数调节后所生成的新模型优于基于svm()函数默认参数之下所生成的模型,也就是说进行参数调节后的模型取得了更好的预测效果。
最后,我们再次输出决策树模型和调整后的支持向量机模型进行对比。
从输出结果我们可以发现,支持向量机模型的三大指标均高于决策树模型,因此支持向量机模型的表现更好。但总体来说,二者都取得了不错的预测效果。
作者简介
张娅峰,管理科学与工程硕士研一在读,目前师从华南理工大学工商管理学院朱文斌教授,主要的研究兴趣和方向是:机器学习以及大数据在营销领域的应用。
文章简介
这篇文章的研究内容是来自于我《大数据分析与数据挖掘》的课程设计,课程设计的报告由我们小组成员共同完成,然后由我将报告的主体内容精炼成一篇短小精悍的推文分享给大家。我们小组还有四位同学,分别是华南理工大学工商管理学院冉启斌(企业管理)、冼晓儿(企业管理)这两位同学主要是负责探索性分析部分;周丽华(管理科学与工程),她主要是负责决策树建模过程;贺萌远(企业管理)主要负责整个报告的前期背景研究以及后期系统梳理。
——张娅峰