摘要

在经济不景气的背景下使得人才的吸引力不足,大部分企业都面临着较大的人才流失问题。本文基于kaggle上的某公司2015年员工信息数据,分析了影响员工离职的主要因素,并运用LASSO等分析方法建立员工离职倾向预测模型,对企业人力资源管理提供决策依据。

关键词:员工、离职倾向、LASSO

引言

随着时代的变更与发展,计算机网络的出现、资源共享的实现,企业与企业之间的竞争不再只是局限于资源、设备以及理念等方面,而更多的是人才的竞争。人才发挥的作用是企业发展的基础,人才的流失对企业的兴亡至关重要。在企业各个部门中都拥有一些专业人才,他们能够提高企业各个部门的运营效率,也能够使企业在行业中快速地立足与强大。反之,如果企业中缺少这样的人才,不仅会造成企业各个部门的工作效率低下,而且会使企业的各种资源出现严重浪费的现象。除此之外,企业人才的流失也不利于企业产品的创新与销售,使企业无法长期稳定的发展。因此,本文利用kaggle上的某公司2015年员工信息数据,分析影响员工离职的主要因素,并运用LASSO等分析方法建立员工离职倾向预测模型,对企业人力资源管理提供决策依据。

数据预处理

数据介绍

员工基本信息表

Employee1
字段 简写 含义
Age AGE 年龄
Attrition Attrition 是否离职(Yes or No)
BusinessTravel BT 出差频繁程度
(Non-Travel、Travel_Rarely、Travel_Frequently)
Department DP 所在部门
DistanceFromHome DFH 加到公司的距离
Education EDU 受教育水平
(1 ‘Below College’;2 ‘College’;3 ‘Bachelor’, 4 ‘Master’;5 ‘Doctor’)
EducationField EDUF 受教育领域(即专业)
EmployeeCount EC 员工数
EmployeeID EID 员工编号
Gender GEN 性别
JobLevel JBL 职位水平
JobRole JBR 职务名称
MaritalStatus MAS 婚姻状况
MonthlyIncome MC 月收入(卢比)
NumCompaniesWorked NCW 工作过的公司数量
Over18 O18 是否年满18岁
PercentSalaryHike PSH 去年加薪百分比
StandardHours SH 标准工作时长
StockOptionLevel SOL 职工优先认股权水平
TotalWorkingYears TWY 总工作年限
TrainingTimesLastYear TTLY 去年受培训的次数
YearsAtCompany YAC 在公司的工作年限
YearsSinceLastPromotion YSLP 自上次晋升以来的年数
YearsWithCurrManager YWCM 在现任主管下工作年数

员工调查表

Employee2
字段 简写 含义
EmployeeID EID 员工编号
EnvironmentSatisfaction ESF 环境满意度
(1 ‘Low’;2 ‘Medium’;3 ‘High’;4 ‘Very High’)
JobSatisfaction JBS 工作满意度(同上)
WorkLifeBalance WLB 工作生活平衡水平
(1 ‘Bad’;2 ‘Good’;3 ‘Better’;4 ‘Best’)

主管调查表

Employee3
字段 简写 含义
EmployeeID EID 员工编号
JobInvolvement JBI 员工工作投入水平
(1 ‘Low’;2 ‘Medium’;3 ‘High’;4 ‘Very High’)
PerformanceRating PR 员工去年的绩效评级
(1 ‘Low’;2 ‘Good’;3 ‘Excellent’;4 ‘Outstanding’)

员工考勤表

包括2015年每天每个员工的上下班打卡记录。

数据整理与转换

缺失值填充

miss=Employee1%>%map_dbl(~sum(is.na(.))/4410)
aggr(Employee1,prop=T,numbers=T)

从图中可看出Employee1表中有小部分值缺失,其中NumCompaniesWorked有0.4308390%的值缺失,TotalWorkingYears有0.2040816%的值缺失,分别用各列的均值对缺失值进行填充。

Employee1$NumCompaniesWorked[is.na(Employee1$NumCompaniesWorked)]=
  round(mean(Employee1$NumCompaniesWorked,na.rm=T))
Employee1$TotalWorkingYears[is.na(Employee1$TotalWorkingYears)]=
  round(mean(Employee1$TotalWorkingYears,na.rm=T))

从图中可看出Employee2表中EnvironmentSatisfaction列有0.5668934%的值缺失,JobSatisfaction列有0.4535147%的值缺失,WorkLifeBalance列有0.861678%的值缺失,分别用各列的均值对缺失值进行填充。

Employee2[[2]][is.na(Employee2[[2]])]=round(mean(Employee2[[2]],na.rm=T))
Employee2[[3]][is.na(Employee2[[3]])]=round(mean(Employee2[[3]],na.rm=T))
Employee2[[4]][is.na(Employee2[[4]])]=round(mean(Employee2[[4]],na.rm=T))
aggr(Employee3,prop=T,numbers=T)

从图中可看出Employee3表中无缺失值。

数据类型转换

表1中不仅有数值型变量还有文本型分类变量,为方便下文进行数据分析对Employee1表中的部分分类变量进行了数值化处理,将无序变量Attrition和Gender转换为了为(0,1)哑变量;将有序变量BusinessTravel变为数值型变量,1,2,3分别表示Non-Travel、Travel_Rarely、Travel_Frequently;将有序变量MaritalStatus变为数值型变量,其中1,2,3分别表示Divorced,Married,Single。

Employee4=Employee1%>%
  mutate(Attrition=model.matrix(EmployeeID~Attrition,data=Employee1)[,2])
Employee4=mutate(Employee4,Gender=model.matrix(EmployeeID~Gender,data=Employee1)[,2])
Employee4=mutate(Employee4,BusinessTravel=as.numeric(BusinessTravel))
Employee4$BusinessTravel[is.na(Employee4$BusinessTravel)]=1
Employee4=mutate(Employee4,MaritalStatus=as.numeric(MaritalStatus))
Employee4=Employee4%>%
  select(-Department,-EducationField,-EmployeeCount,-JobRole,-Over18,-StandardHours)
Employee4=Employee4%>%select(EmployeeID,Attrition,everything())

确认各表主键,并将关联表连接起来合成一个表:

Employee2%>%count(EmployeeID)%>%filter(n>1)
Employee3%>%count(EmployeeID)%>%filter(n>1)
Employee4%>%count(EmployeeID)%>%filter(n>1)
employee=Employee4%>%
  left_join(Employee2,by="EmployeeID")%>%
  left_join(Employee3,by="EmployeeID")
employee=employee%>%select(-EmployeeID)

员工离职因素分析

基本情况分析

员工离职情况

ggplot(data=Employee1)+
  geom_bar(aes(x=Attrition,fill=Attrition),position="dodge")

经统计得公司去年离职员工711名,占总员工数的16.12%,未离职员工3699名,占总员工数的83.88%。而在前程无忧发布《2016离职与调薪调研报告》显示,我国2015年企业员工平均离职率为17.7%,对比看来这家公司的离职率处于一般水平。

教育水平与离职情况间的关系

Employee1$Education=factor(Employee1$Education,levels=1:5)  #将Education改为因子变量
p1=ggplot(data=Employee1)+
  geom_bar(aes(x=Attrition,fill=Education),position="dodge")
p2=ggplot(data=Employee1)+
  geom_bar(aes(x=Education,fill=Attrition),position="fill")

p3=ggplot(data=Employee1)+
  geom_bar(aes(x=Attrition,fill=EducationField),position="dodge")
p4=ggplot(data=Employee1)+
  geom_bar(aes(x=EducationField,fill=Attrition),position="fill")

Employee1$TrainingTimesLastYear=factor(Employee1$TrainingTimesLastYear,levels=0:6)
p5=ggplot(data=Employee1)+
  geom_bar(aes(x=Attrition,fill=TrainingTimesLastYear),position="dodge")
p6=ggplot(data=Employee1)+
  geom_bar(aes(x=TrainingTimesLastYear,fill=Attrition),position="fill")

grid.newpage()
pushViewport(viewport(layout = grid.layout(3,2)))
vplayout <- function(x,y){
  viewport(layout.pos.row = x, layout.pos.col = y)
}
print(p1, vp = vplayout(1,1))   
print(p2, vp = vplayout(1,2))
print(p3, vp = vplayout(2,1))
print(p4, vp = vplayout(2,2))
print(p5, vp = vplayout(3,1))
print(p6, vp = vplayout(3,2))

从离职人数来看拥有学士学位的离职人数最多,但离职率却是大学生的较高;在所有专业中学习生命科学方向的离职人数最多,而人力资源专业的离职率最高;在接受培训上,接受0至5次培训的离职率相差不大,但接受过6次培训的人离职率大大降低。

生活状况与离职情况间的关系

p1=ggplot(data=Employee1)+
  geom_bar(aes(x=Attrition,fill=Gender),position="dodge")
p2=ggplot(data=Employee1)+
  geom_bar(aes(x=Gender,fill=Attrition),position="fill")

p3=ggplot(data=Employee1)+
  geom_bar(aes(x=Attrition,fill=MaritalStatus),position="dodge")
p4=ggplot(data=Employee1)+
  geom_bar(aes(x=MaritalStatus,fill=Attrition),position="fill")

p5=ggplot(data=Employee1,aes(x=Attrition,y=DistanceFromHome))+
  geom_boxplot()

grid.newpage()
pushViewport(viewport(layout = grid.layout(3,2)))
vplayout <- function(x,y){
  viewport(layout.pos.row = x, layout.pos.col = y)
}
print(p1, vp = vplayout(1,1))   
print(p2, vp = vplayout(1,2))
print(p3, vp = vplayout(2,1))
print(p4, vp = vplayout(2,2))
print(p5, vp = vplayout(3,1))

从右边的两个柱状图可看出,离职率在不同性别之间几乎无差异,而单身的离职率是离婚的三倍;箱线图中离职和未离职人群的家到公司距离差异不大,说明家里公司的距离对是否离职应该影响不大。

工作投入度与离职情况间的关系

p1=ggplot(data=Employee1)+
  geom_bar(aes(x=Attrition,fill=BusinessTravel),position="dodge")
p2=ggplot(data=Employee1)+
  geom_bar(aes(x=BusinessTravel,fill=Attrition),position="fill")

Employee3$JobInvolvement=factor(Employee3$JobInvolvement,levels=1:4)
df=Employee1%>%
  left_join(Employee3,by="EmployeeID")
p3=ggplot(data=df)+
  geom_bar(aes(x=Attrition,fill=JobInvolvement),position="dodge")
p4=ggplot(data=df)+
  geom_bar(aes(x=JobInvolvement,fill=Attrition),position="fill")

grid.newpage()
pushViewport(viewport(layout = grid.layout(2,2)))
vplayout <- function(x,y){
  viewport(layout.pos.row = x, layout.pos.col = y)
}
print(p1, vp = vplayout(1,1))   
print(p2, vp = vplayout(1,2))
print(p3, vp = vplayout(2,1))
print(p4, vp = vplayout(2,2))

从前两个柱状图可看出该公司员工出差频繁的人占绝大部分,说明该公司员工出差较频繁,相应的,出差较多的人群中离职的人也多,因为事实上人们都喜欢过更稳定一点的生活,出差太过频繁一来会由于四处奔跑波疲于适应环境频繁改变,二来也给家人带来烦恼增加对工作的厌恶感,所以出差太过频繁很难留住员工。后两个柱状图显示工作投入较低的人离职率也较高,说明员工对工作的热爱程度很大程度决定了他们是否会离职。

在公司地位与离职情况间的关系

p1=ggplot(data=Employee1)+
  geom_bar(aes(x=Attrition,fill=Department),position="dodge")
p2=ggplot(data=Employee1)+
  geom_bar(aes(x=Department,fill=Attrition),position="fill")

Employee1$JobLevel=factor(Employee1$JobLevel,levels=1:5)
p3=ggplot(data=Employee1)+
  geom_bar(aes(x=Attrition,fill=JobLevel),position="dodge")
p4=ggplot(data=Employee1)+
  geom_bar(aes(x=JobLevel,fill=Attrition),position="fill")

p5=ggplot(data=Employee1)+
  geom_bar(aes(x=Attrition,fill=JobRole),position="dodge")
p6=ggplot(data=Employee1)+
  geom_bar(aes(x=JobRole,fill=Attrition),position="fill")

grid.newpage()
pushViewport(viewport(layout = grid.layout(3,2)))
vplayout <- function(x,y){
  viewport(layout.pos.row = x, layout.pos.col = y)
}
print(p1, vp = vplayout(1,1))   
print(p2, vp = vplayout(1,2))
print(p3, vp = vplayout(2,1))
print(p4, vp = vplayout(2,2))
print(p5, vp = vplayout(3,1))
print(p6, vp = vplayout(3,2))

在三个部门中,人力资源部的离职率最高,这可能与他们掌握着大量人力资源信息有关。而在所有工作岗位中研究员的离职率最高,说明公司核心人才流失严重。各职位水平的离职率不相上下,说明职位对员工是否离职影响不大。

工作经验与离职情况间的关系

p1=ggplot(data=Employee1)+
  geom_boxplot(aes(x=Attrition,y=Age))
p2=ggplot(data=Employee1)+
  geom_boxplot(aes(x=Attrition,y=NumCompaniesWorked))
p3=ggplot(data=Employee1)+
  geom_boxplot(aes(x=Attrition,y=TotalWorkingYears))
p4=ggplot(data=Employee1)+
  geom_boxplot(aes(x=Attrition,y=YearsAtCompany))
p5=ggplot(data=Employee1,aes(x=Attrition,y=YearsWithCurrManager))+
  geom_boxplot()

grid.newpage()
pushViewport(viewport(layout = grid.layout(3,2)))
vplayout <- function(x,y){
  viewport(layout.pos.row = x, layout.pos.col = y)
}
print(p1, vp = vplayout(1,1))   
print(p2, vp = vplayout(1,2))
print(p3, vp = vplayout(2,1))
print(p4, vp = vplayout(2,2))
print(p5, vp = vplayout(3,1))

上图反映出工作经验越低的员工离职率越高。

收入与离职情况间的关系

p1=ggplot(data=Employee1)+
  geom_boxplot(aes(x=Attrition,y=MonthlyIncome))
p2=ggplot(data=Employee1)+
  geom_boxplot(aes(x=Attrition,y=PercentSalaryHike))
Employee1$StockOptionLevel=factor(Employee1$StockOptionLevel,levels=0:3)
p3=ggplot(data=Employee1)+
  geom_bar(aes(x=StockOptionLevel,fill=Attrition),position="fill")
p4=ggplot(data=Employee1,aes(x=Attrition,y=YearsSinceLastPromotion))+
  geom_boxplot()

grid.newpage()
pushViewport(viewport(layout = grid.layout(2,2)))
vplayout <- function(x,y){
  viewport(layout.pos.row = x, layout.pos.col = y)
}
print(p1, vp = vplayout(1,1))   
print(p2, vp = vplayout(1,2))
print(p3, vp = vplayout(2,1))
print(p4, vp = vplayout(2,2))

根据上面三个箱线图和一个柱状图显示,月收入、去年加薪百分比、职工优先认股权水平和自上次晋升以来的年数与员工是否离职关系不大。

小结

根据以上单因素分析可知,对员工离职率影响较大的有受教育专业领域、接受培训次数、婚姻状况、出差情况、工作投入度、所在部门、工作职务、年龄、过做过的公司数量、总的工作年限、在现在公司工作年限和在现任主管下工作的时间等因素,而其余因素的影响不是很大。但事实上是否真的如此简单呢,下面将通过多因素进行分析。

数据集划分

根据因变量y(Attrition)的分布情况,用分层抽样的方法将数据划分为训练集(train)和测试集(test),其中训练集数据占总数据量的三分之二,测试集数据占三分之一。

trian0=createDataPartition(y=employee$Attrition,p=2/3,list=FALSE)
trian=employee[trian0,]
test=employee[-trian0,]

logistic回归

变量相关性分析

cor=corr.test(employee)
corrplot(cor$r,method="square",type="lower",tl.col="black",tl.cex=0.6,tl.pos="1t")

通过这个图我们可以清楚的观察到年龄和总的工作年限,在公司工作年限和在现任主管下工作年限,绩效评级和去年加薪百分比等均有较强的正相关关系;离职和满意度,离职和总工作年限有一定负相关关系。

logistic模型

Logistic模型是实际上也是一种回归模型,其因变量为二分类变量,且没有关于自变量分布的假定,自变量可以是连续性变量、离散型变量和虚拟变量,模型中的参数使用最大似然法估计。公式为:\[ Y = exp(β_0+β_1 x_1+···+β_p x_p)/(1+exp(β_0+β_1 x_1+···+β_p x_p))\]

回归结果为:

glm1=glm(Attrition~.,family=binomial(link="logit"),data=trian)
summary(glm1)
## 
## Call:
## glm(formula = Attrition ~ ., family = binomial(link = "logit"), 
##     data = trian)
## 
## Deviance Residuals: 
##     Min       1Q   Median       3Q      Max  
## -1.5241  -0.6118  -0.3981  -0.2045   3.2585  
## 
## Coefficients:
##                           Estimate Std. Error z value Pr(>|z|)    
## (Intercept)              2.276e+00  7.937e-01   2.867 0.004140 ** 
## Age                     -4.215e-02  8.860e-03  -4.757 1.96e-06 ***
## BusinessTravel          -2.000e-02  8.336e-02  -0.240 0.810412    
## DistanceFromHome        -7.153e-03  7.059e-03  -1.013 0.310892    
## Education               -6.033e-02  5.367e-02  -1.124 0.261037    
## Gender                   1.984e-01  1.148e-01   1.728 0.083963 .  
## JobLevel                -1.126e-01  5.160e-02  -2.181 0.029148 *  
## MaritalStatus            7.045e-01  8.184e-02   8.608  < 2e-16 ***
## MonthlyIncome           -1.742e-06  1.183e-06  -1.472 0.141037    
## NumCompaniesWorked       1.063e-01  2.338e-02   4.546 5.47e-06 ***
## PercentSalaryHike       -8.919e-04  2.369e-02  -0.038 0.969961    
## StockOptionLevel        -7.073e-02  6.573e-02  -1.076 0.281922    
## TotalWorkingYears       -5.599e-02  1.588e-02  -3.525 0.000423 ***
## TrainingTimesLastYear   -1.659e-01  4.402e-02  -3.768 0.000165 ***
## YearsAtCompany           2.149e-02  2.272e-02   0.946 0.344300    
## YearsSinceLastPromotion  1.746e-01  2.555e-02   6.833 8.33e-12 ***
## YearsWithCurrManager    -1.848e-01  2.752e-02  -6.714 1.89e-11 ***
## EnvironmentSatisfaction -3.180e-01  5.010e-02  -6.347 2.20e-10 ***
## JobSatisfaction         -3.491e-01  5.070e-02  -6.885 5.77e-12 ***
## WorkLifeBalance         -3.805e-01  7.575e-02  -5.024 5.06e-07 ***
## JobInvolvement           4.441e-02  7.776e-02   0.571 0.567900    
## PerformanceRating        2.224e-02  2.388e-01   0.093 0.925790    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 2577.3  on 2939  degrees of freedom
## Residual deviance: 2167.5  on 2918  degrees of freedom
## AIC: 2211.5
## 
## Number of Fisher Scoring iterations: 5

上面回归结果显示:年龄、月收入、总工作年限、在现任主管下工作年数、环境满意度、工作满意度以及工作生活平衡度均与员工离职表现出显著的负相关关系,而婚姻状况、工作过的公司数量和自上次晋升以来的年数与员工离职呈显著正相关关系,这与实际情况相符。从相关系数图已知,在所有自变量中有些自变量之间存在很大的相关性,但在logistc模型中却包含了所有的21个自变量,且大部分变量的影响不显著,因此,为使得模型更加简洁,下面将用LASSO方法进行变量筛选和回归分析。

LASSO

LASSO在普通回归的损失函数的基础上增加了个β的约束,它使用绝对值的一阶惩罚函数,即强制系数绝对值之和小于某个固定值,使得在一定条件下一些系数会变为0,起到变量筛选的作用,是一种处理具有复共线性数据的有偏估计。其数学表达式为:\[min┬(β_0∈R,β∈R^p )(1/n) ∑(y_i-β_0-x_i^T β)2 \] \[subject to ||β||_1≤t\]

data=trian
data=as.matrix(data)
y=data[,1]
x=data[,-1]
cvfit=cv.glmnet(x,y,family="binomial",type.measure="class")
coefs0=coef(cvfit,s="lambda.min")
len0=length(coefs0@i)-1
coefs=coef(cvfit,s="lambda.1se")
len=length(coefs@i)-1
plot(cvfit)

从上图中可看出当λ取平均交叉验证误差最小时的λ值时所对应的自变量个数为17个,模型对变量的筛选效果不明显,而当允许误差在一个标准差范围内时自变量个数迅速下降为15个,此时的误差与最小误差相差值小于0.05,所以选择后者对应的λ值进行建模,回归结果为:

## 22 x 1 sparse Matrix of class "dgCMatrix"
##                                     1
## (Intercept)              1.259226e+00
## Age                     -3.618911e-02
## BusinessTravel           .           
## DistanceFromHome        -5.099703e-04
## Education               -9.698336e-03
## Gender                   1.059994e-01
## JobLevel                -5.413671e-02
## MaritalStatus            5.996414e-01
## MonthlyIncome           -6.072424e-07
## NumCompaniesWorked       6.733585e-02
## PercentSalaryHike        .           
## StockOptionLevel         .           
## TotalWorkingYears       -3.328128e-02
## TrainingTimesLastYear   -1.090482e-01
## YearsAtCompany           .           
## YearsSinceLastPromotion  1.252682e-01
## YearsWithCurrManager    -1.347039e-01
## EnvironmentSatisfaction -2.512137e-01
## JobSatisfaction         -2.798169e-01
## WorkLifeBalance         -2.840198e-01
## JobInvolvement           .           
## PerformanceRating        .

从回归结果可明显看出,在使用 LASSO方法下建立的逻辑回归模型明显起到了降维的效果,将logistic回归中不显著的变量通通剔除,使得自变量个数从21个下降到了15个,极大程度简化了模型。

预测

probability=predict(glm1,newdata=test,type="response")
pre_test=cbind(test,probability)
pre_test=transform(pre_test,predict=ifelse(probability<=0.5,0,1))
t_test=table(pre_test$Attrition,pre_test$predict)
accuracy1=(t_test[1,1]+t_test[2,2])/sum(t_test)
t_testLA=table(Attr=test$Attrition,pre=predict(cvfit, newx=as.matrix(test[,-1]), s = "lambda.min", type = "class"))   #预测
accuracy2=(t_testLA[1,1]+t_testLA[2,2])/sum(t_testLA)
data.frame(mehord=c("Logistic","LASSO"),accuracy_rate=c(accuracy1,accuracy2))
##     mehord accuracy_rate
## 1 Logistic     0.8394558
## 2    LASSO     0.8374150

上表说明LASSO模型在所选λ条件下对数据进行降维后的确增加了模型的误差,损失了一部分信息,因此准确率相比使用所有变量的logistic回归模型稍低。

小结

通过建立逻辑回归模型分析得,年龄越大离职的可能性越低,随着年龄的增长人们越来越倾向于稳定的生活,更换工作可能会使生活变得更糟糕,因此年龄大的一般不会随意的选择更换已经稳定的工作。而且人们一般在年轻的时候大多还不知道自己所追寻的目标,会不断尝试新的工作,所以他们的离职倾向会相对较高。同样的,单身人群的生活相对不太稳定,而离婚和已婚人群由于需要赡养小孩父母等需要相对稳定的生活和工作,所以单身人群的离职倾向相对较高。 工资与离职呈负相关关系。很显然这是必定的,工资是人们工作的最重要的目的之一,工资低离职倾向自然高。 工作过的公司数目与离职呈正相关关系。工作过的公司数目越多说明离职次数越多,离职可能性越高。 总的工作年限与离职呈负相关关系。总的工作时间越长说明对未来的发展方向越明确,离职可能性越低。 培训次数越多,在现任主管下工作的时间越长对公司的了解和感情越深,离职可能性越低。 自上次晋升以来的时间越长说明工作质量越低,没有什么突出表现或者遭受了其他不公平待遇,员工对未来的期盼就越低,便失去了继续留在公司的意愿。 环境满意度和工作满意度都直接反映了员工对这家公司和这份工作的满意程度,满意程度越低,想离职的意愿就越强烈,因此环境满意度和工作满意度都与离职呈负相关关系。

员工收入分布

收入的总体分布情况

ggplot(data=employee,aes(x=MonthlyIncome))+
  geom_histogram(binwidth=5000)

从图中可看出该公司员工的主要收入集中在25000-70000卢比之间,且收入分布呈现多个峰值,将该公司职员按峰值进行收入水平划分,可分为低收入人群、中低收入人群、中等收入人群、中高收入人群和高收入人群,在每类收入人群中人们的收入均呈近似现出正态分布。

收入在部门间的分布情况

ggplot(data=Employee1,aes(x=Department,y=MonthlyIncome))+
  geom_boxplot()

可以看出研发部门的工资要比其他两个部门高,其离群值也更多,即高收入人群更多,而人力资源部的工资较低,这也可以解释为什么人力资源部的员工离职率最高。

收入在不同受教育水平的分布情况

ggplot(data=Employee1,aes(x=Education,y=MonthlyIncome))+
  geom_boxplot()

可以看出,各学位等级的收入水平相差不大,更好的学历不一定有更好的收入,说明学历并不是决定收入的最重要的因素。

收入在不同贡献程度的分布

employee$JobInvolvement=factor(employee$JobInvolvement,levels=1:4)
ggplot(data=employee,aes(x=JobInvolvement,y=MonthlyIncome))+
  geom_boxplot()

可以看出,贡献程度低的收入也低,但是贡献程度最高的收入却并没有比其他人一般多,这就是为什么核心人才容易流失的原因之一。

员工出勤情况分析

根据员工的考勤表计算出了每一天员工出勤情况,并作以下分析。

intime=read.csv("in_time.csv")
date=read.csv("time.csv")
in_pro1=intime%>%map_dbl(function(df) 1-mean(is.na(df)))
in_pro2=data.frame(pro=in_pro1,Date=1:262)%>%filter(pro!=1)
date_rate=data.frame(date=as_date(date$date),rate=in_pro2$pro)
date_rate=date_rate%>%filter(rate!=0)
ggplot(data=date_rate,aes(date))+
  geom_line(aes(y=rate))

从全年员工出勤表中很难看出员工出勤率的分布规律,但考虑到实际情况,本文将从星期与出勤的关系进行分析。

df=date_rate%>%mutate(wday=wday(date,label=T))
ggplot(df,aes(wday))+
  geom_boxplot(aes(y=rate))

在一周中,星期一的出勤率比其他时候要低。对星期与出勤率构建模型结果如下,从残差图可知,除星期以外还有其他因素也对员工出勤率有影响。

mod=lm(rate~wday,data=df)
df=df%>%add_residuals(mod)
df%>%ggplot(aes(date,resid))+
  geom_ref_line(h=0)+
  geom_line(color="grey50")+
  geom_smooth(se=T,span=0.2)
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'

总结与建议

##总结 员工离职的主要原因表现为以下几点: 公司对员工的付出不予以肯定,从员工的贡献程度与收入之间的关系可以看出,公司对待贡献程度大的员工与贡献一般的员工五差别对待,这无疑会使优秀员工对当下工作不满而辞职离开; 公司对员工的培养不够重视,从图3-2的柱状图中可以看出大部分员工一年都只接受了两到三次培训,接受五六次培训的人少之又少; 刚刚工作或者生活还不够稳定的年轻人在工作上也表现得很不稳定。 ## 建议 公司想要留住员工可以从以下几点考虑: 提供公平的薪酬福利,差别化对待员工,使员工的付出有相应的回报;重视员工的培育,有针对性地设计培训内容,提升新生代员工的岗位知识,最大限度挖掘员工的潜力;加强企业文化建设,企业文化是企业不可复制的企业灵魂,成功的企业文化如巨大的磁石吸引着大批人才。