分析目的
通过分析了解员工离职原因。
数据采集
数据源:员工信息csv文件
数据读取:
import pandas as pd
from pandas import DataFrame
from pandas import read_csv
import matplotlib
import matplotlib.pyplot as plt
file_path = 'D:/study/HR_comma_sep.csv'
process_data = pd.read_csv(file_path, encoding='utf-8', sep=',')
数据处理
预览数据
数据基本信息
process_data.info()
通过基本信息了解到数据集有14999行,10个字段,没有空值。
字段 | 含义 |
---|---|
satisfaction_level | 满意度 |
last_evaluation | 员工考核 |
number_project | 项目数 |
average_montly_hours | 平均每月工作时间 |
time_spend_company | 工龄 |
Work_accident | 工作事故 |
left | 是否离职(0:在职,1离职) |
promotion_last_5years | 过去五年是否有晋升 |
sales | 部门 |
salary | 薪资水平 |
数据分析
1.首先看下几个数值类型的字段的描述性统计分析
describe_df = process_data.describe()
可以得知对公司的平均满意度为 0.61283,员工考核的平均值为0.7161,平均每月工作时长的平均值为201小时。
2.观察各字段之间相关程度
corr_data = process_data.corr()
通过线性相关系数值,可以看出员工考核与员工的项目数,员工考核与和平均每月工作成中度正相关。
离职和满意度成中度负相关。
3.查看公司员工分布总体情况并用饼图展示
process_data['left'].value_counts()
plt.clf()
left_count_rate = process_data['left'].value_counts()/process_data['left'].count()
left_count_rate.plot.pie(labels=['在职', '离职'],autopct = '%.2f%%')
plt.axis('equal')
title = '在职,离职员工比例'
plt.title(title)
plt.show()
plt.savefig(title+'.png', dpi=100)
从图可知,该公司在职员工占比76.19%,离职员工占比23.81%
4.查看公司个部门人数分布情况
sales_value_counts = process_data['sales'].value_counts()
5.查看薪资分布情况
salary_value_counts = process_data['salary'].value_counts()
根据部门和薪资人数分布,可看出该公司销售部门人数最多,近一半的员工处于低薪水平。
6.分析各部门离职率,柱形图展示
# 离职员工表
left_df = process_data[process_data['left'] == 1]
# 柱形图展示 部门离职率
left_sales_rate = left_df['sales'].value_counts()/sales_value_counts
left_sales_rate.plot(kind='bar', color=bar_color)
plt.title('各部门离职率')
plt.show()
plt.savefig('各部门离职率.png', dpi=100)
7.分析不同薪资水平与离职的关系,柱形图表示
plt.clf()
left_salary_rate = left_df['salary'].value_counts()/salary_value_counts
left_salary_rate.plot(kind='bar', color=bar_color)
title = '不同薪资水平离职率'
plt.title(title)
plt.show()
plt.savefig(title+'.png', dpi=100)
可明显看出薪资水平高人数越少,薪资水平低,离职人数多。
8.分析满意度与离职之间的关系,直方图对比分析离职员工和在职员工的满意度分布
plt.clf()
plt.hist(process_data[process_data['left'] == 1]['satisfaction_level'], label='离职员工', color=left_color)
plt.hist(process_data[process_data['left'] == 0]['satisfaction_level'], label='在职员工', color=stay_color)
plt.xlabel('满意度')
plt.legend(['离职员工', '在职员工'])
plt.legend(loc='best')
plt.xlim(0, 1.05)
title = '在职离职员工满意度分布'
plt.title(title)
plt.tight_layout()
plt.show()
plt.savefig(title+'.png', dpi=100)
满意度低于0.4,(远低于平均满意度0.61)的员工,离职人数达到峰值。满意度处于0.6~1之间的在职员工,人数达到峰值。
9.分析员工考核与离职之间的关系
# 发现字段关系对比代码重复,故提取公共函数方式
#不同属性字段与离职的关系
def analyze_column_with_left(column_name: str, title: str, xlabel: str, df: DataFrame):
plt.clf()
plt.hist(df[df['left'] == 1][column_name], label='离职员工', color=left_color)
plt.hist(df[process_data['left'] == 0][column_name], label='在职员工', color=stay_color)
plt.xlabel(xlabel)
plt.legend(['离职员工', '在职员工'])
plt.legend(loc='best')
plt.xlim(0, df[column_name].max()+1)
plt.title(title)
plt.tight_layout()
plt.show()
plt.savefig(title + '.png', dpi=100)
# 分析员工考核和离职关系
analyze_column_with_left('last_evaluation', '在职离职员工考核分布', '员工考核', process_data)
通过上表可以看出考核低于0.6的员工离职人数达到峰值,考核在0.8-1.0之间离职人数达到峰值。
10.分析员工项目数与离职之间的关系
analyze_column_with_left('number_project', '在职离职员工项目数分布', '项目数', process_data)
通过上表可以看出项目数为2的离职人数达到峰值,项目数在6~7的人数达到峰值。参与3-4个项目的员工相对稳定。
11.分析员工平均每月工作时间与离职之间的关系
analyze_column_with_left('average_montly_hours', '在职离职员工平均每月工作时间', '平均每月工作时间', process_data)
通过上表可以看出平均月工作时间在125-160之间离职员工数达到一个峰值,平均月工作时间在250-300达到一个峰值。工作时间在140-260的员工比较稳定。
12.分析员工工龄与离职之间的关系
analyze_column_with_left('time_spend_company', '在职离职员工工龄分布', '员工工龄', process_data)
通过上表可以看出工龄在3-5年内的员工离职人数较多,工龄在7-10年的员工比较稳定,没有离职。
13.分析员工满意度与薪资水平的关系
low_satisfaction = process_data[process_data['salary'] == 'low']['satisfaction_level']
medium_satisfaction = process_data[process_data['salary'] == 'medium']['satisfaction_level']
high_satisfaction = process_data[process_data['salary'] == 'high']['satisfaction_level']
plt.clf()
low_satisfaction.plot(kind='kde', label='low')
medium_satisfaction.plot(kind='kde', label='medium')
high_satisfaction.plot(kind='kde',label='high')
plt.legend(['low', 'medium', 'high'])
plt.legend(loc='best')
plt.xlim(0, 1.2)
plt.ylim(0, 1.7)
title = '满意度—薪资水平对比'
plt.title(title)
plt.show()
plt.savefig(title + '.png', dpi=100)
通过上图可以看出,薪资越低对公司满意度越低,薪资越高对公司满意度越高。