在当今竞争激烈的商业环境中,员工流失已成为企业面临的一个严峻问题。招聘和培训新员工的成本高昂,因此,保持现有员工的稳定性对于企业的竞争优势至关重要。为了实现这一目标,企业需要营造一个愉悦的工作环境,使员工愿意长期留在公司。随着机器学习和数据分析技术的发展,人力资源部门可以利用这些工具来识别需要改进的领域,以减少员工流失。
员工是否会离开公司,其答案只有“是”或“否”,即二元选择。因此,因变量“员工流失”是一个分类变量。在处理分类变量时,不能使用线性回归,而应使用“逻辑回归”。
本文将通过五个简单的步骤,使用R软件分析员工流失:
数据集由IBM人力资源部门提供,包含1470个观测值和35个变量。其中“员工流失”是因变量。
首先,需要检查数据集中是否有缺失值。使用anyNA(JOB_Attrition)
检查,结果显示FALSE
,即数据集中没有缺失值。接下来,需要将因变量“员工流失”从分类变量转换为数值型变量,将“Yes”赋值为1,“No”赋值为0,并转换为数值型。
JOB_Attrition$Attrition[JOB_Attrition$Attrition=="Yes"]=1
JOB_Attrition$Attrition[JOB_Attrition$Attrition=="No"]=0
JOB_Attrition$Attrition=as.numeric(JOB_Attrition$Attrition)
然后,将所有“字符型”变量转换为“因子”型。有8个字符型变量:商务旅行、部门、教育、教育领域、性别、工作角色、婚姻状况、加班。这些列的编号分别是2、4、6、7、11、15、17、22。
JOB_Attrition[,c(2,4,6,7,11,15,17,22)]=lapply(JOB_Attrition[,c(2,4,6,7,11,15,17,22)],as.factor)
最后,还有一个变量“超过18岁”,所有输入都是“Y”。这是一个字符型变量,将把它转换为数值型,因为它只有一个级别,所以转换为因子型不会得到好的结果。将“Y”赋值为1,并转换为数值型。
JOB_Attrition$Over18[JOB_Attrition$Over18=="Y"]=1
JOB_Attrition$Over18=as.numeric(JOB_Attrition$Over18)
在任何回归分析中,需要将数据集分为两部分:训练集和测试集。使用训练集构建模型,并使用测试集测试模型的准确性。
set.seed(1000)
ranuni=sample(x=c("Training","Testing"),size=nrow(JOB_Attrition),replace=T,prob=c(0.7,0.3))
TrainingData=JOB_Attrition[ranuni=="Training",]
TestingData=JOB_Attrition[ranuni=="Testing",]
nrow(TrainingData)
nrow(TestingData)
成功地将整个数据集分为两部分。现在有1025个训练数据和445个测试数据。
现在将按照以下简单步骤构建模型:
independentvariables=colnames(JOB_Attrition[,2:35])
Model=paste(independentvariables,collapse="+")
Model_1=paste("Attrition~",Model)
formula=as.formula(Model_1)
接下来,将“训练数据”纳入公式,使用“glm”函数构建逻辑回归模型。
Trainingmodel1=glm(formula=formula,data=TrainingData,family="binomial")
现在,将通过“逐步选择”方法来设计模型,以获取模型中显著的变量。执行代码将给一个输出列表,其中变量根据模型的显著性被添加和移除。每一步的AIC值反映了相应模型的好坏。随着AIC值的降低,模型的拟合度越好。
Trainingmodel1=step(object = Trainingmodel1,direction = "both")
summary(Trainingmodel1)
从上述结果可以看到,商务旅行、离家距离、环境满意度、工作参与度、工作满意度、婚姻状况、曾在公司数量、加班、人际关系满意度、总工作年限、在公司工作年限、上次晋升以来的年数、当前角色的工作年限等都是决定员工流失的最重要变量。如果公司主要关注这些领域,那么员工流失的可能性就会降低。
在这里使用了Tableau进行这些可视化;它不是很漂亮吗?这个软件让工作变得更容易。
为了判断模型预测概率的准确性,可以对数据集进行Hoshmer-Lemeshow拟合优度检验。假设是:
如果p值大于0.05,将接受H0并拒绝H1。在R中执行此测试,需要安装mkMisc包。
HLgof.test(fit=Trainingmodel1$fitted.values,obs=Trainingmodel1$y)
在这里,可以看到p值大于0.05,因此将接受H0。现在,证明了模型是拟合良好的。
另一种分析逻辑回归拟合度的技术是ROC度量(接收者操作特征)。ROC度量包括敏感性、1-特异性、假阳性和假阴性。广泛使用的两个度量是敏感性和特异性。敏感性度量模型的准确性,而特异性度量模型的弱点。
在R中执行此操作,需要安装pROC包。
troc=roc(response=Trainingmodel1$y,predictor = Trainingmodel1$fitted.values,plot=T)
troc$auc
曲线下面积:0.8759。解释:这两个度量的图表给出了一个凹形图,显示随着敏感性的增加,1-特异性也在增加,但以递减的速率。C值(AUC)或一致性指数的值给出了ROC曲线下面积的度量。如果c=0.5,则意味着模型不能完美地区分0和1响应。这意味着初始模型不能完美地说出哪些员工将离职,哪些员工将留下。但是,可以看到c值远大于0.5。它是0.8759。模型可以完美地区分0和1。因此,可以成功地得出结论,它是一个拟合良好的模型。
trpred=ifelse(test=Trainingmodel1$fitted.values>0.5,yes = 1,no=0)
table(Trainingmodel1$y,trpred)
上述代码表示,如果概率预测值大于0.5,则状态值为1,否则为0。基于这个标准,此代码重新标记“员工流失”的“Yes”和“No”响应。现在,了解预测与数据集中获得的初始信念的匹配百分比是很重要的。在这里,将比较(1-1)和(0-0)对。
有1025个训练数据。预测{(839+78)/1025}*100=89%正确。
现在,将模型与测试数据进行比较。这很像一个准确性测试。
testpred=predict.glm(object=Trainingmodel1,newdata=TestingData,type = "response")
tsroc=roc(response=TestingData$Attrition,predictor = testpred,plot=T)
tsroc$auc
testpred=ifelse(test=testpred>0.5,yes=1,no=0)
table(TestingData$Attrition,testpred)