前言
员工离职,似乎已经成为每一家企业都要面对的问题,特别是优秀人才离职的问题会让领导特别头疼。今天我们就通过kaggle上某一家企业员工离职的真实数据来对离职率进行分析建模,并对预测结果显示要离职的员工提出挽留建议。
目录
1. 数据来源及背景
2. 明确分析目的
3. 数据探索分析
4. 数据预处理
5. 可视化分析
6. 特征工程
7. 逻辑回归模型
8. 朴素贝叶斯模型
9. 模型评估之ROC曲线
正文
1. 数据来源及背景
数据来源: https://www.kaggle.com/jiangzuo/hr-comma-sep/version/1
数据背景: 该数据集是指某公司员工的离职数据, 其包含14999个样本以及10个特征, 这10个特征分别为: 员工对公司满意度, 最新考核评估, 项目数, 平均每月工作时长, 工作年限, 是否出现工作事故, 是否离职, 过去5年是否升职, 岗位, 薪资水平.
2. 明确分析目的
该数据集讨论的是公司员工离职的问题, 那么, 我们首先需要对影响员工离职的因素进行分析:
将上述影响因素与现有的数据相结合来提出问题,进而明确我们的分析目的:
1) 员工对公司满意度平均水平如何?员工的最新考核情况又是如何?员工所参加项目数是怎样?员工平均每月工作时长以及平均工作年限分别是多少?
2) 当前离职率是多少?工作事故发生率?过去5年升职率?薪资水平又如何?共有多少种岗位?
3) 是否离职和其他9个特征的关系如何?
4) 根据现有数据, 如何对某个员工是否离职进行预测?
5) 针对当前的员工离职情况,企业该如何对待呢?
3. 数据探索分析
1) 查看前2行和后2行数据
import pandas as pd df = pd.read_csv(r'D:\Data\HR_comma_sep.csv') pd.set_option('display.max_rows', 4) df
数据维度14999行×10列, 除过岗位和薪资水平是字符型外, 其余均是数字 (具体是什么类型还需要进一步确定).
2) 查看数据类型等信息
df.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 14999 entries, 0 to 14998 Data columns (total 10 columns): satisfaction_level 14999 non-null float64 last_evaluation 14999 non-null float64 number_project 14999 non-null int64 average_montly_hours 14999 non-null int64 time_spend_company 14999 non-null int64 Work_accident 14999 non-null int64 left 14999 non-null int64 promotion_last_5years 14999 non-null int64 sales 14999 non-null object salary 14999 non-null object dtypes: float64(2), int64(6), object(2) memory usage: 1.1+ MB
前两个特征为64位浮点型, 后两个为字符型, 其余为64位整型, 且均无缺失值.
3). 描述性统计
df.describe() df.describe(include=['O']).T
1) 员工对公司满意度平均水平如何?员工的最新考核情况又是如何?员工所参加项目数是怎样?员工平均每月工作时长以及平均工作年限分别是多少?
员工对公司的满意度: 范围 0.09~1, 中位数0.640, 均值0.613, 总体来说员工对公司较满意
最新考核评估: 范围 0.36~1, 中位数0.720, 均值0.716, 员工考核平均水平中等偏上.
项目数: 范围 2~7个, 中位数4, 均值3.8, 平均参加项目数为4个
平均每月工作时长: 范围96~310小时, 中位数200, 均值201
工作年限: 范围2~10年, 中位数3, 均值3.5
2) 当前离职率是多少?工作事故发生率?过去5年升职率?薪资水平又如何?共有多少种岗位?
当前离职率为23.81%
工作事故发生率14.46%.
过去5年升职率2.13%.
薪资水平共有3个等级, 最多的是低等, 多达7316人.
员工岗位有10种, 其中最多的是销售, 多达4140人.
4. 数据预处理
没有缺失值, 因此不用处理缺失值.
1. 异常值
通过箱线图查看异常值.
import seaborn as sns fig, ax = plt.subplots(1,5, figsize=(12, 2)) sns.boxplot(x=df.columns[0], data=df, ax=ax[0]) sns.boxplot(x=df.columns[1], data=df, ax=ax[1]) sns.boxplot(x=df.columns[2], data=df, ax=ax[2]) sns.boxplot(x=df.columns[3], data=df, ax=ax[3]) sns.boxplot(x=df.columns[4], data=df, ax=ax[4])
除了工作年限外, 其他均无异常值. 该异常值也反映了该公司员工中以年轻人为主
5. 可视化分析
在这里通过可视化的形式对第三个问题“是否离职和其他9个特征的关系如何?”进行回答.
1. 人力资源总体情况
from pyecharts import Pie attr = ["离职", "在职"] v1 =[df.left.value_counts()[1], df.left.value_counts()[0]] pie = Pie("该公司人力资源总体情况", title_pos='center') pie.add( "", attr, v1, radius=[35, 65], label_text_color=None, is_label_show=True, legend_orient="vertical", legend_pos="left", ) pie.render()
离职3571人, 在职11428人, 离职率为23.81%
2. 对公司满意度与是否离职的关系
from pyecharts import Boxplot #字段重命名 df.columns=['satisfaction', 'evaluation', 'project', 'hours', 'years_work','work_accident', 'left', 'promotion', 'department', 'salary<