kaggle数据分析实践项目练习——人力资源分析

kaggle数据分析实践项目练习——人力资源分析

学习完《利用python进行数据分析》之后,学习了Numpy,pandas,matplotlib几个包的使用,于是着手准备在kaggle上找数据集进行练习。

在kaggle中找到了人力资源分析项目,看到不少人拿这个项目练手,本文将会分析为何公司的好员工过早离职?

我要做的是,哪些因素对员工的离职产生了大的影响。

数据来源:Human Resources Analytics | Kaggle

1、导入数据

##首先导入整理数据和数据可视化的包

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline

##导入数据到python中

df=pd.read_csv('I:\HR_comma_sep.csv')

2、检查和理解数据

通常,清理数据需要大量的工作,并且可能是一个非常繁琐的过程。这个数据集从是Kaggle上下载的数据,相对而言很干净,不含缺失值。但是,我仍然需要检查数据集,以确保所有其他内容都是可读的,并且观察值与特征名称适当地匹配。

##检查是否有缺失值

df.isnull().any()
satisfaction_level       False
last_evaluation          False
number_project           False
average_montly_hours     False
time_spend_company       False
Work_accident            False
left                     False
promotion_last_5years    False
sales                    False
salary                   False
dtype: bool

##适当改名,方便选取列

df = df.rename(columns={'satisfaction_level': 'satisfaction_level', 
                        'last_evaluation': 'last_evaluation',
                        'number_project': 'number_project',
                        'average_montly_hours': 'average_montly_hours',
                        'time_spend_company': 'time_spend_company',
                        'Work_accident': 'Work_accident',
                        'promotion_last_5years': 'promotion',
                        'sales' : 'department',
                        'left' : 'left'
                        })

##由于“部门”和“薪金”的功能是明确的,我将把它转换为数值,以便更好地分析。

##分别查看department列和salary列唯一值有多少个
df1=pd.Series(df['department']).unique()
df2=pd.Series(df['salary']).unique()

##把两列的值转化为数值

df['department'].replace(list(pd.Series(df['department']).unique()),np.arange(10),inplace=True)
df['salary'].replace(list(pd.Series(df['salary']).unique()),[0,1,2],inplace=True)

##把left列移到表的前面,方便分析

front=df['left']
df.drop(labels='left',axis=1,inplace=True)
df.insert(0,'left',front)
df.head()

##查看数据形状和结构

df.shape
(14999, 10)
df.dtypes
left                      int64
satisfaction_level      float64
last_evaluation         float64
number_project            int64
average_montly_hours      int64
time_spend_company        int64
Work_accident             int64
promotion                 int64
department                int64
salary                    int64
dtype: object

整理好后,首先对数据变量进行说明:

  • left:是否离职
  • satisfaction_level:满意度
  • last_evaluation:绩效评估
  • number_project:完成项目数
  • average_montly_hours:平均每月工作时间
  • time_spend_company:为公司服务的年限
  • work_accident:是否有工作事故
  • promotion:过去5 年是否有升职
  • salary:薪资水平

##看一下整体数据,大概有76%的人留下了,24%的人离开了

left_rate=df.left.value_counts()/14999
0    0.761917
1    0.238083
Name: left, dtype: float64

3、对数据进行探索分析

1)、初步分析

##对left列进行聚合运算,描述性分析

left_summary=df.groupby('left')
left_summary.mean()
format=lambda x: '%.2f'%x
df.describe().applymap(format)

2)、相关性分析

(+)number_project&average_montly_hours&last_evaluation

(-)left&satisfaction_level&salary

sns.heatmap(corr,xticklabels=corr.columns.values,yticklabels=corr.columns.values);
sns.plt.title('Heatmap of Correlation Matrix')

从热图上看,有大的正(+)相关性的有,完成项目数(number_project)和平均月度工作时间(average_montly_hours),它们分别和绩效评估有较大的正相关,这可能意味着花了更多时间和做了更多项目的员工得到了高度评价。但是,绩效评估与响应变量转换之间几乎没有相关关系,也就是说绩效评估的高度评价没有转换到薪资水平和升职上来,只是得到了好的评价而已,对于负(-)关系,离职率、满意度和薪水是高度相关的。我们假设员工在不太满意投入产出比的情况下往往会离开公司。

3)、变量分析

##department  vs  left
depart_left_table=pd.crosstab(index=df['department'],columns=df['left'])
##职位:'sales', 'accounting', 'hr', 'technical', 'support', 'management','IT', 'product_mng', 'marketing', 'RandD'
depart_left_table.plot(kind='bar',figsize=(5,5),stacked=True)
##department  vs  salary
depart_salary_table=pd.crosstab(index=df['department'],columns=df['salary'])
depart_salary_table.plot(kind="bar",figsize=(5,5),stacked=True)
##salary  vs left
salary_left_table=pd.crosstab(index=df['salary'],columns=df['left'])
salary_left_table.plot(kind='bar',figsize=(5,5),stacked=True)
##promotion  vs  left
promotion_left_table=pd.crosstab(index=df['promotion'],columns=df['left'])
promotion_left_table.plot(kind='bar',figsize=(5,5),stacked=True)
##number_project  vs  left
project_left_table=pd.crosstab(index=df['number_project'],columns=df['left'])
project_left_table.plot(kind='bar',figsize=(5,5),stacked=True)
df.loc[(df['left']==1),'number_project'].plot(kind='hist',normed=1,bins=15,stacked=False,alpha=1)
##time_spend_company  vs  left
company_left_table=pd.crosstab(index=df['time_spend_company'],columns=df['left'])
company_left_table.plot(kind='bar',figsize=(5,5),stacked=True)
df.loc[(df['left']==1),'time_spend_company'].plot(kind='hist',normed=1,bins=10,stacked=False,alpha=1)
##average_montly_hours  vs  left
hours_left_table=pd.crosstab(index=df['average_montly_hours'],columns=df['left'])
fig=plt.figure(figsize=(10,5))
letf=sns.kdeplot(df.loc[(df['left']==0),'average_montly_hours'],color='b',shade=True,label='no left')
left=sns.kdeplot(df.loc[(df['left']==1),'average_montly_hours'],color='r',shade=True,label='left')
##last_evaluation  vs  left
evaluation_left_table=pd.crosstab(index=df['last_evaluation'],columns=df['left'])
fig=plt.figure(figsize=(10,5))
left=sns.kdeplot(df.loc[(df['left']==0),'last_evaluation'],color='b',shade=True,label='no left')
left=sns.kdeplot(df.loc[(df['left']==1),'last_evaluation'],color='r',shade=True,label='left')
##satisfaction_level  vs  left  
satis_left_table=pd.crosstab(index=df['satisfaction_level'],columns=df['left'])
fig=plt.figure(figsize=(10,5))
left=sns.kdeplot(df.loc[(df['left']==0),'satisfaction_level'],color='b',shade=True,label='no left')
left=sns.kdeplot(df.loc[(df['left']==1),'satisfaction_level'],color='r',shade=True,label='left')
##last_evaluation  vs  satisfaction_level
df1=df[df['left']==1]
fig, ax = plt.subplots(figsize=(10,10))
pd.scatter_matrix(df1[['satisfaction_level','last_evaluation']],color='k',ax=ax)
plt.savefig('scatter.png',dpi=1000,bbox_inches='tight')
  • department vs left

职位分别是:'sales', 'accounting', 'hr', 'technical', 'support', 'management','IT', 'product_mng', 'marketing', 'RandD'

公司职位基本对应业务支持,技术,和销售。大多数部门的离职率相似,也就管理层和研发低一些,但管理层离职率最低。这可能意味着地位较高的人倾向于不离开。

  • department vs salary

可以看出管理层的薪资最高,离职率最低

  • salary vs left

很形象的看出,离职的员工薪资几乎都在低到中等水平,很少有高新的员工离开公司。

  • promotion vs left

在离职的员工中几乎都没有得到升职。

  • number_project vs left

本图显示超过一半的员工只有2个项目就离开了公司,但同样有从4-7个项目统计的员工离开。我们可以猜测一下,也许这意味着,项目数量在2或更少的员工工作不够,或者没有被高度重视,从而离开了公司?6个项目以上员工会过度劳累,从而离开公司?3个项目的员工离职率最低。

  • time_spend_company vs left

离职员工在离职前大部分在公司已经工作了3-6年,在公司工作7-10年的员工没有人离开。

  • average_montly_hours vs left

是一个很明显的双峰分布,说明员工平均每月工作时间少的(低于150小时)和工作时间多的(高于250小时)的员工离职率最高。

所以一般离开公司的员工要么工作时间少的,要么过度工作的。

  • last_evaluation vs left

又是一个双峰分布,表现糟糕的和表现出色的出现了离职的两个峰值,根据前边的分析,效绩评估出色的员工,公司没有相应的转化到升职和薪资上。0.6-0.8之间有比较好的员工留存。

  • satisfaction_level vs left

出现了三个峰值,满意度低于0.1的员工基本离职,满意度在0.3-0.5之间离开的员工又到达一个峰值,满意度在0.8左右时,又出现了一个峰值,这些是满意度较高的员工,这些员工可能找到了更好的工作机会,离职不是对公司不满,这些员工对公司是有比较高的满意度的。

  • last_evaluation vs satisfaction_level

在绩效评估与满意度的散射矩阵中,可以看到有三个不同的集群。

集群1:满意度低于0.2,绩效评估大于0.75,这可以很好地表明离开公司的员工都是好员工,但对自己的工作感到不满意,当你受到高度评价的时候,这个集群应该代表着“过度劳累”的员工。

集群2:满意度在0.35~0.45之间,绩效评估在0.58以下,这可以被看作是雇员受到了不太好的评价,这可能意味着这些员工表现不好,所以员工自己的满意度也不好,这个集群代表着表现不佳的员工。

集群3:满意度在0.7~1之间,评价大于0.8,这可能意味着这个集群的员工是最理想的,他们热爱他们的工作,公司对他们的表现评价很高,这个类别的员工离开可能是因为他们找到了另一个工作机会。

4、总结

员工离职概述:

离职员工工作时间大部分是~6hours /天(工作)和~10小时/天(劳累);

大部分离职员工薪资都在low~medium这一档,薪资水平低;

离职员工,几乎都没有得到升职;

大多数离职员工的评价分数在0.6以下和0.8以上;

离职员工大多数有2个项目,但同样有4-7个项目的员工离开,3个项目的员工离职率最低;

完成项目数,每月平均工作时间,绩效评估有正相关关系。意味着你工作越多,得到的评价就越高;

离职率、满意度与薪酬呈负相关关系。这意味着较低的满意度和工资产生了较高的离职率;

公司需要考虑的问题:

1、失去优秀员工会让公司产生多大损失?招新人和优秀老员工之间的成本与变现孰轻孰重?

2、什么原因产生了较低的满意度?

3、为什么离开的员工平均比没有离开的员工得到更高的评价,甚至是项目数量的增加?低评价的员工不应该更倾向于离开公司吗?

优秀员工看中的是良好的待遇,和更好的职业发展,这些因素都直接影响员工的主观感受,公司给予了员工高的评价,但没有相应转化到薪资和升职的变量中,即使一部分离职的优秀员工给予了公司不错的满意度,但依然不能阻挡他们会追寻更好的工作机会。

发布于 2017-10-21