一、分析背景
人力资源分析数据集汇聚了对大量员工的信息数据统计,包括企业因素(如部门)、员工行为相关因素(如参与过项目数、每月工作时长、薪资水平等)、以及工作相关因素(如绩效评估、工伤事故),这些因素都有很好的分析价值。
年底,xxx公司盘点过去一年工作时,发现公司在HR(人力资源)方面的工作不尽人意,具体表现为:多次出现重要的员工意外离职的情况,部分员工积极性不高,员工的培训不及时,人力部门对员工整体情况了解不到位……
本文将基于科赛网得到人力资源数据集,https://www.kesci.com/home/dataset/5a1fa61ed0178b641c3fa93c/document,通过数据分析解决上述问题,帮助HR部门产生更多的洞见。
二、分析任务
2.1 数据理解
源数据集包含10个不同字段,共14999条员工数据记录
2.2 问题分析
- 探索有价值的数据分析结果
- 员工生存分析,寻找员工离职的首先因素
- 基于对于HR团队有价值的信息,制作一个全面体现HR信息的BI仪表盘
三、数据概览
## 加载包
library(dplyr)
library(ggplot2)
library(Rmisc) # multiplot() 分割绘图区域
#导入数据集
data<-read.csv('员工数据.csv')
#查看数据的内容摘要
summary(data)
#展示数据的结构摘要
str(data)
#展示部分数据
head(data)
员工满意度这一字段的存在缺失值,后续需要进一步进行数据的清洗;
四、数据整理和转换
用平均数对缺失值进行补值:
data[is.na(data$员工满意度),'员工满意度']<-mean(data$员工满意度,na.rm = TRUE)
head(data,15)
将相关数据类型转换成因子类型,便于后续进一步做分析
# 将数据类型转换成便于后续分析的类型
data$职位变动<-as.factor(data$职位变动)
data$离职<-as.factor(data$离职)
data$过去5年是否有升职<-as.factor(data$过去5年是否有升职)
str(data)
创建新的特征变量(列):总工作时长&员工平均项目数
# 创建新的特征变量(列)-总工作时长&员工平均项目数
new.data<-data%>%
mutate('总工作时长'= 平均每月工作小时 * 12 * 在公司工作年限,'年均项目数' = 项目数/在公司工作年限)%>%
as.data.frame
# 查看数据
str(new.data)
五、数据探索性分析
探索员工对公司满意度、绩效评估和月均工作时长与是否离职的关系
# 绘制对公司满意度与是否离职的箱线图
box_sat <- ggplot(new.data, aes(x = 离职, y = 员工满意度, fill = 离职)) +
geom_boxplot() +
theme_bw() + # 一种ggplot的主题
labs(x = '离职', y = '员工满意度') # 设置横纵坐标标签
box_sat
# 绘制绩效评估与是否离职的箱线图
box_eva <- ggplot(new.data, aes(x = 离职, y = 最后一次绩效评估, fill = 离职)) +
geom_boxplot() +
theme_bw() +
labs(x = '离职', y = '最后一次绩效评估')
box_eva
# 绘制平均月工作时长与是否离职的箱线图
box_mon <- ggplot(new.data, aes(x = 离职, y = 平均每月工作小时, fill = 离职)) +
geom_boxplot() +
theme_bw() +
labs(x = '离职', y = '平均每月工作小时')
box_mon
# 绘制员工在公司工作年限与是否离职的箱线图
box_time <- ggplot(new.data, aes(x = 离职, y = 在公司工作年限, fill = 离职)) +
geom_boxplot() +
theme_bw() +
labs(x = '离职', y = '在公司工作年限')
box_time
# 合并这些图形在一个绘图区域,cols = 2的意思就是排版为一行二列
multiplot(box_sat, box_eva, box_mon, box_time, cols = 2)
总结:
通过探索员工对公司满意度、绩效评估和月均工作时长与是否离职的关系,可以得出离职员工的特点:
- 对公司满意度较低,大多集中在0.4左右;
- 绩效评估较高,在0.8以上的较为集中; (
- 平均余额工作时长较高,一多半超过了平均水平(200小时);
- 工作年限在4年左右
探索参与项目个数、五年内有没有升职和薪资与离职的关系
# 绘制参与项目个数与是否离职的百分比堆积条形图
bar_pro <- ggplot(new.data, aes(x = as.factor(new.data$项目数), fill = 离职)) +
geom_bar(position = 'fill') + # position = 'fill'即绘制百分比堆积条形图
theme_bw() +
labs(x = '项目数', y = '离职')
bar_pro
# 绘制5年内是否升职与是否离职的百分比堆积条形图
bar_5years <- ggplot(new.data, aes(x = 过去5年是否有升职, fill = 离职)) +
geom_bar(position = 'fill') +
theme_bw() +
labs(x = '过去5年是否有升职', y = '离职')
bar_5years
# 绘制薪资与是否离职的百分比堆积条形图
bar_salary <- ggplot(new.data, aes(x = 薪资水平, fill = 离职)) +
geom_bar(position = 'fill') +
theme_bw() +
labs(x = '薪资水平', y = '离职')
bar_salary
# 合并这些图形在一个绘图区域,cols = 3的意思就是排版为一行三列
multiplot(bar_pro, bar_5years, bar_salary, cols = 3)
通过探索参与项目个数、五年内有没有升职和薪资与离职的关系,可以得出以下分析结果:
- 参与项目数越多的员工离职率越大(去除项目数为2的样本)
- 五年内没有晋升的员工的离职率比较大
- 薪资越高离职率越低
绘制职务序列与是否离职的百分比堆积条形图
bar_salary <- ggplot(new.data, aes(x = 职务序列, fill = 离职)) +
geom_bar(position = 'fill') +
theme_bw() +
labs(x = '职务序列', y = '离职')
bar_salary
整体来看,不同职务序列的员工离职比例大体相当,不过管理类、科研这些相对的核心岗位离职比例更低。
绘制不同职务序列的员工满意度的箱线图
box_eva <- ggplot(new.data, aes(x = 职务序列, y = 员工满意度,
fill = 职务序列)) +
geom_boxplot() +
theme_bw() +
labs(x = '职务序列', y = '员工满意度')
box_eva
整体来看,不同职务序列的员工满意度的分布大体相当,不过HR、财务类的员工打分相对较低。
探索员工总工作时长、年均项目数和离职的关系
# 员工总工作时长
box_total_time <- ggplot(new.data, aes(x = 离职, y = 总工作时长, fill = 离职)) +
geom_boxplot() +
theme_bw() +
labs(x = '离职', y = '总工作时长')
box_total_time
# 年均项目数数分布
box_avg_pro <- ggplot(new.data, aes(x = 离职, y = 年均项目数, fill = 离职)) +
geom_boxplot() +
theme_bw() +
labs(x = '离职', y = '年均项目数')
box_avg_pro
六、统计分析与建模
# 步骤1:生成表格,体现不同年限员工流失率
new.data$离职<-as.integer(new.data$离职) # 转换数据类型为整型
library(dplyr)
data.Turnover <- new.data %>%
group_by(在公司工作年限) %>% # 按工作年限进行分组
arrange(在公司工作年限) %>% # 按工作年限升序排列
dplyr::summarise(该年限离职员工数=sum(离职==2), 该年限员工总数=n()) %>% # 对分组后的工作年限进行离职人数和所有人数的汇总
mutate(该年限及以上所有员工数=rev(cumsum(rev(该年限员工总数)))) %>% # 新增列“该年限及该年限以上所有人数”
mutate(该年限员工流失率=该年限离职员工数/该年限及以上所有员工数) %>% # 新增列“该年限员工流失率”
select(在公司工作年限, 该年限离职员工数, 该年限员工总数, 该年限及以上所有员工数, 该年限员工流失率)%>% # 只保留表格的特定列
as.data.frame
# 步骤2:将体现不同年限员工流失率的表格可视化,找出流失率最高对应的年限
#install.packages("ggplot2")
library(ggplot2)
g <- ggplot(data.Turnover, aes(在公司工作年限,该年限员工流失率)) # 绘制散点图-流失率与工作年限的关系
g + geom_point() +
geom_line() +
theme_bw()+
labs(x = "在公司工作年限") +
labs(y = "该年限员工流失率") +
labs(title = "员工流失率与工作年限的关系")
流失率最高的工作年限是 5 年
# 步骤3:做流失驱动力分析,寻找员工在流失率最高的年份离职的主要因素
data.5year <- new.data %>%
filter(在公司工作年限 >= '5') %>% # 筛选工作年限为 5 的数据
mutate(是否在第五年流失 = ifelse(在公司工作年限=='5' & 离职==2,1,0)) # 新增列“是否在第五年流失”
summary(data.5year)
# 步骤4:线性回归,了解各因素对员工流失的影响
lm_fit <- lm(是否在第五年流失 ~ 项目数+平均每月工作小时+工作事故+过去5年是否有升职+职务序列+薪资水平+职位变动+员工满意度+最后一次绩效评估, data=data.5year)
library("car")
vif(lm_fit) # GVIF 均小于10,不存在共线性的干扰
# 挑选模型输入自变量
library(olsrr)
model <- lm(是否在第五年流失 ~ 项目数+平均每月工作小时+工作事故+过去5年是否有升职+职务序列+薪资水平+职位变动+员工满意度+最后一次绩效评估,data= data.5year)
k <- ols_step_all_possible(model)
print(k)
k[k$adjr==max(k$adjr),]
# 将调整R2最大的变量输入到线性回归模型
lm_fit <- lm(是否在第五年流失 ~ 项目数+平均每月工作小时+工作事故+过去5年是否有升职+薪资水平+职位变动+员工满意度+最后一次绩效评估, data.5year)
summary(lm_fit)
使用线性回归对第五年员工离职的首要因素进行分析,可得线性回归结果为:
是否在第五年流失 = 1.31+ 0.76 * 最后一次绩效评估 + 0.30 * 员工满意度 + 0.10 * 薪资水平low + 0.07 * 项目数 + 0.05 *薪资水平medium - 0.11 * 工作事故 - 0.11 * 过去5年是否有升职1 - 0.22 * 职位变动1
七、分析结论与建议
结论:
- 员工满意度和薪资水平成正相关,薪资越高满意度越高,离职率也越低;
- 绩效评估高、员工满意度低、薪资水平低的员工非常容易离职;
- 平均月工作时长较长,超过平均水平(200小时)较容易离职;
- 参与项目数越多的员工离职率相对越大;
- 工作4-6年的员工的离职率相对较高。
建议:
- HR部门要重点关注绩效评估高、员工满意度低、薪资水平低的这部分员工的晋升情况、满意度和心理状况。
- 针对工作时间长、工作压力大的员工,及时进行工作量调整,合理安排工作计划;
- 项目数多可能意味着对该员工的工作要求更高,部门负责人是否根据员工能力给予了相应的足够的支持,也是需要关注的因素;
- 对应4-6年的骨干员工要多加关注,可根据实际情况,做出相应的奖励和提拔,以增加员工的满意度,提升此类员工的留存率。