
员工离职预测(一、数据准本+可视化分析)
目前社会上呈现出一种公司招不到人,大批失业人员的矛盾现象,且大部分公司的离职率居高不下,很多入职没多久就辞职,所花费的培训招聘等资源都浪费了。为了弄清楚公司员工离职原因,通过某一家企业员工离职的真实数据来对离职率进行分析建模。本项目主要功能包括:1.数据预处理:机器学习基本概念、数据的读取方式、了解数据的基本信息、处理缺失值、可视化分析。2.文本特征选择与处理:通过pandas方法获取对应特征和标
第一次写博客,欢迎各位大佬指正!
数据集:通过网盘分享的文件:员工离职预测-数据
链接: https://pan.baidu.com/s/1_HRjgi8kddClgYwTBjradA 提取码: veb9
目录
一、项目简介
目前社会上呈现出一种公司招不到人,大批失业人员的矛盾现象,且大部分公司的离职率居高不下,很多入职没多久就辞职,所花费的培训招聘等资源都浪费了。为了弄清楚公司员工离职原因,通过某一家企业员工离职的真实数据来对离职率进行分析建模。
本项目主要功能包括:
1.数据预处理:机器学习基本概念、数据的读取方式、了解数据的基本信息、处理缺失值、可视化分析。
2.文本特征选择与处理:通过pandas方法获取对应特征和标签、降维、数据基本划分、特征缩放、卡方检验。
3、模型训练与评估:逻辑回归预测、逻辑评估、svm预测、svm评估、决策树预测、决策树评估、基于决策树的bagging的算法预测、基于随机森林优化预测。
二、代码实现
2.1.数据准备
1.导入数据(这里导入的文件格式是.csv,如果是.xlsx文件只需要将pd.read_csv改为pd.read_excel)
# 读取训练集数据
train_data = pd.read_csv(r'D:\data\HR_comma_sep.csv')
train_data
2.查看前五行数据
train_data.head(5)
3.查看后五行数据
train_data.tail(5)
因变量 | 变量名 | 变量名翻译 |
自变量 | left | 是否已经离职 |
satisfaction_level | 对公司的满意度 | |
last_evaluation | 绩效评估 | |
number_project | 参加过的项目 | |
average_montly_hours | 平均每月工作的时长 | |
time_spend_company | 工作年限 | |
Work_accident | 是否发生过工作差错 | |
promotion_last_5years | 五年内是否升职 | |
sales | 职业 | |
salary | 薪资水平 |
4.查看数据描述性统计
train_data.describe()
这些描述性统计数据可以帮助我们初步了解员工的工作情况和离职相关因素的分布情况,为进一步的离职预测模型构建和分析提供基础。例如,满意度水平较低、工作时间较长、晋升机会少等因素可能与离职有一定的关联,后续可以通过更深入的数据分析和建模来确定这些因素对离职的具体影响程度和关系。
5.查看数据基本信息
train_data.info()
可以从图中看出,0-7的数据类型都是float和int型,sales和salary是object型,所以要对这两个标签进行转换,再看没有缺失值,所以不用对缺失值进行填充。
2.2 可视化分析
1.缺失值可视化
我们也可以通过可视化分析,直观的查看数据集是否有缺失值。可以看出,没有缺失值。
#查看缺失值,可以从矩阵图看出没有缺失值
msno.matrix(train_data.sample(train_data.shape[0]), figsize=(16, 16), width_ratios=(15, 1))
plt.rcParams['font.sans-serif']=['SimHei'] #这两行用来显示汉字
plt.rcParams['axes.unicode_minus'] = False
plt.show()
2.满意度与离职之间的关系
sns.boxplot(y=train_data['satisfaction_level'],x=train_data['left'])
plt.title('满意度与离职之间的关系')
plt.show()
横坐标:left,表示员工是否离职,其中0代表未离职,1代表离职。
纵坐标:satisfaction_level
,表示员工的满意度水平,范围从0
到1
。
蓝色箱子(未离职):箱子的中间横线(中位数)大约在0.6到0.8之间。箱子的上下边缘(上四分位和下四分位数)分别大约在0.8和0.4左右,箱子上方和下方的线条(whiskers,须),分别延伸到最大值和最小值,最大值接近1,最小值接近0.2,说明未离职员工的满意度范围较广,但大部分集中在0.4到0.8之间。
分析橙色箱子(离职)的方式相同。
从这张箱线图可以看出,总体上未离职员工的满意度水平高于离职员工,说明满意度与离职之间可能存在一定的负相关关系,即满意度越高,员工离职的可能性相对越低。但这只是一个初步的观察,还需要进一步确定两者之间的具体关系和影响程度。
3. 绩效评估与离职之间的关系
sns.boxplot(y=train_data['last_evaluation'],x=train_data['left'])
plt.title('绩效评估与离职之间的关系')
plt.show()
绩效评估与离职之间的关系不是很明显,但是离职员工的最低考核得分比在职员工高且中位数也比在职员工高,说明离职的员工大部分还都是比较优秀的员工,这样的话,企业更应该重视员工的离职情况,避免人才流失。
4. 平均每月工作时长与离职之间的关系
sns.boxplot(y=train_data['average_montly_hours'],x=train_data['left'])
plt.title('平均每月工作时长与离职之间的关系')
plt.show()
离职员工的平均工作时长也是明显大于在职员工,说明员工离职的原因可能是工作时间过长,导致压力大。企业需要控制工作时长,避免人才流失。
5.薪资等级与离职率之间的关系
low_salary_dimission_rate = train_data[train_data['salary']=='low']['left'].value_counts().values.tolist()[1]/sum(train_data[train_data['salary']=='low']['left'].value_counts().values.tolist())
mid_salary_dimission_rate = train_data[train_data['salary']=='medium']['left'].value_counts().values.tolist()[1]/sum(train_data[train_data['salary']=='medium']['left'].value_counts().values.tolist())
high_salary_dimission_rate = train_data[train_data['salary']=='high']['left'].value_counts().values.tolist()[1]/sum(train_data[train_data['salary']=='high']['left'].value_counts().values.tolist())
dimission_rate = pd.DataFrame()
dimission_rate = pd.DataFrame(columns=['离职率'],index=['低','中','高'],data=[low_salary_dimission_rate,mid_salary_dimission_rate,high_salary_dimission_rate])
dimission_rate.plot(kind='barh')
plt.title('薪资等级与离职率之间的关系')
plt.show()
从柱状图可以看出来,工资低的离职比较高,所以企业应该要给员工加薪或者加一些福利政策,用来留住人才。
6.职业对离职的影响
# 首先,我们需要将 'sales' 列中的数据转换为二进制变量,表示是否为销售部门的员工
train_data['is_sales'] = train_data['sales'].apply(lambda x: 1 if x == 'sales' else 0)
# 计算销售部门和非销售部门离职和未离职的员工数量
sales_not_left = (train_data['is_sales'] == 1) & (train_data['left'] == 0)
sales_left = (train_data['is_sales'] == 1) & (train_data['left'] == 1)
non_sales_not_left = (train_data['is_sales'] == 0) & (train_data['left'] == 0)
non_sales_left = (train_data['is_sales'] == 0) & (train_data['left'] == 1)
# 创建一个条形图来展示这些信息
sns.barplot(x=['Sales, Not Left', 'Sales, Left', 'Non-Sales, Not Left', 'Non-Sales, Left'],
y=[sales_not_left.sum(), sales_left.sum(), non_sales_not_left.sum(), non_sales_left.sum()])
plt.title('职业(销售)对离职的影响')
plt.xlabel('职业与离职情况')
plt.ylabel('员工数量')
plt.show()
横坐标
表示职业与离职情况,分别为:
Sales, Not Left
:销售职业且未离职的员工。Sales, Left
:销售职业且离职的员工。Non-Sales, Not Left
:非销售职业且未离职的员工。Non-Sales, Left
:非销售职业且离职的员工。
从图中可以看出:非销售职业的员工数量总体上远多于销售职业的员工数量,无论是离职还是未离职的情况。在销售职业中,未离职的员工数量明显多于离职的员工数量。
在非销售职业中,未离职的员工数量也多于离职的员工数量,但差距相对销售职业来说较小。
上面的图初步展示了销售和非销售职业与离职情况之间的关系,下面分析各个职业离职情况,进一步分析职业与离职情况的关系。
# 创建一个交叉表来展示每个职业类别的离职和未离职的员工数量
pivot_table = pd.pivot_table(train_data, values='left', index='sales', aggfunc='sum')
# 可视化交叉表
sns.heatmap(pivot_table, annot=True, fmt="d", cmap='coolwarm')
plt.title('不同职业与离职情况的交叉表')
plt.show()
销售部门的离职率最高,这可能需要公司管理层的关注,以了解离职原因并采取相应措施。技术部门也有相对较高的离职人数,这可能与工作压力、职业发展机会或市场对技术人才的需求有关。其他部门的离职人数相对较少,但IT和RandD部门的未离职人数较多,可能表明这些部门的员工相对稳定。
7.参加过的项目数对离职的影响
sns.boxplot(y=train_data['number_project'],x=train_data['left'])
plt.title('参加过的项目数与离职之间的关系')
plt.show()
离职员工参与的项目数量中位数也高于未离职员工,这可能意味着参与更多项目的员工更有可能离职,这可能与工作负担、职业发展机会等因素有关。
8.工作年限对离职的影响
sns.boxplot(y=train_data['time_spend_company'],x=train_data['left'])
plt.title('工作年限与离职之间的关系')
plt.show()
离职员工的工作年限中位数高于未离职员工,这可能表明在公司工作较长时间的员工更倾向于离职。
9.是否发生过过错对离职的影响
# 计算每个类别的频数
accident_not_left = (train_data['Work_accident'] == 0) & (train_data['left'] == 0)
accident_left = (train_data['Work_accident'] == 1) & (train_data['left'] == 1)
not_accident_not_left = (train_data['Work_accident'] == 0) & (train_data['left'] == 1)
not_accident_left = (train_data['Work_accident'] == 1) & (train_data['left'] == 0)
# 创建条形图
sns.barplot(x=['No Accident, Not Left', 'Accident, Left', 'No Accident, Left', 'Accident, Not Left'],
y=[accident_not_left.sum(), accident_left.sum(), not_accident_not_left.sum(), not_accident_left.sum()])
plt.title('是否发生过过错与离职之间的关系')
plt.show()
蓝色:没有发生过工作事故且没有离职的员工数量。
橙色:发生过工作事故且离职的员工数量
绿色:没有发生工作事故但离职的员工数量
红色:发生过工作事故但没有离职的员工数量
从图中可以看出,发生工作事故并不是员工离职的主要原因,即使发生了事故,大多数员工(红色条形)仍然选择留下。
10.五年内是否升职对离职的影响
# 计算每个类别的频数
not_promoted_not_left = (train_data['promotion_last_5years'] == 0) & (train_data['left'] == 0)
promoted_not_left = (train_data['promotion_last_5years'] == 1) & (train_data['left'] == 0)
not_promoted_left = (train_data['promotion_last_5years'] == 0) & (train_data['left'] == 1)
promoted_left = (train_data['promotion_last_5years'] == 1) & (train_data['left'] == 1)
# 创建条形图
sns.barplot(x=['Not Promoted, Not Left', 'Promoted, Not Left', 'Not Promoted, Left', 'Promoted, Left'],
y=[not_promoted_not_left.sum(), promoted_not_left.sum(), not_promoted_left.sum(), promoted_left.sum()])
plt.title('五年内是否升职与离职之间的关系')
plt.show()
蓝色:在五年内没有获得升职机会且没有离职的员工
橙色:在五年内获得升职且没有离职的员工
绿色:在五年内没有获得升职但离职的员工数量
红色:在五年内获得升职但离职的员工数量
升职似乎与员工留存有很强的正相关性。获得升职的员工更有可能留在公司。公司可以考虑增加晋升机会,以提高员工的满意度和留存率。
更多推荐
所有评论(0)