一、分析目的
数据源自kaggle,通过分析了解员工离职的原因,为降低员工离职率的举措提供数据支撑。
二、数据处理
1.数据预览
data = pandas.read_csv('F:\pythonlearn\Spyder\littlefly_dataana\\test\\HR_comma_sep.csv')
#预览数据
data.head()
可大体看清数据基本情况。
#数据基本情况
data.info()
#基本统计信息
data.describe()
可看出各个字段的计数、平均值、标准差、最小值、最大值等。
三、数据分析
3.1总体情况
import matplotlib
import matplotlib.pyplot as plt
onJob = data[data['left'] == 0]
leftJob = data[data['left']== 1]
print('未离职员工数: {},所占比例:{}'.format(len(onJob),len(onJob)/len(data)))
print('离职员工数: {},所占比例:{}'.format(len(leftJob),len(leftJob)/len(data)))
#统计离职员工数量、在职员工数量
staffNum = data.left.value_counts()
staffNumbers = pandas.DataFrame({'在职':[staffNum[0]],'离职':[staffNum[1]]})
#画一个在职、离职比例饼图
plt.figure(figsize = (15,15))
font = {
'family':'SimHei',
'size':20}
matplotlib.rc('font',**font)
plt.axis('equal')
plt.pie(
staffNum,
labels = ['在职','离职'],
autopct = '%.2f%%'
)
plt.show()
此公司未离职员工数11428,占比76.19%,离职员工数3571,占比23.81%。
3.2分布情况
#用countplot查看分布情况
import seaborn as sns
plt.figure()
sns.countplot(x='left',data = data, hue = 'number_project')
sns.countplot(x='left',data = data, hue = 'time_spend_company')
sns.countplot(x='left',data = data, hue = 'Work_accident')
sns.countplot(x='left',data = data, hue = 'promotion_last_5years')
sns.countplot(x='left',data = data, hue = 'departments')
sns.countplot(x='left',data = data, hue = 'salary')
#last_evaluation、satisfaction_level、average_montly_hours因变量过多,需要分组分析
#last_evaluation的分组及分布分析average_montly_hours
bins = [
min(data.last_evaluation), 0.53,0.7,0.87,max(data.last_evaluation)] #根据 std、min、max分组
labels = [
'low','medium','high','very high']
data['group of last_evaluation'] = pandas.cut(
data.last_evaluation,bins,right = True,labels = labels)
sns.countplot(x='left',data = data, hue = 'group of last_evaluation')
#satisfaction_level的分组及分布分析
bins = [
min(data.satisfaction_level), 0.3,0.5,0.7,max(data.satisfaction_level)]
labels = [
'very unsatisfied','unsatisfied','satisfied','very satisfied']
data['group of satisfaction_level'] = pandas.cut(
data.satisfaction_level,bins,right = True,labels = labels)
sns.countplot(x='left',data = data, hue = 'group of satisfaction_level')
#average_montly_hours的分组及分布分析
bins = [ min(data.average_montly_hours),156.00,200.00,245.00,max(data.average_montly_hours)]
labels = [ 'short','formal','long','too long']
data['group of average_montly_hours'] = pandas.cut(
data.average_montly_hours,bins,right = True,labels = labels)
sns.countplot(x='left',data = data, hue = 'group of average_montly_hours')
注:下文图中横轴left为0,表示未离职,left为1表示离职。
1、员工参与项目数与是否离职的分布
分布图没有考虑各项人数比例,反映了正常的离职率(右低左高)。其中只有参与项目数量为2和6、7的员工,离职的比在职的多,也就是说,员工过多、过少的参与项目都可能导致离职的情况发生。
2、员工工龄与是否离职的分布
我们可以看到7年及以上工龄的员工(后三种颜色右边为0)基本没有离职,只有工龄为5年的员工离职人数超过在职人数。可见工龄长于6年的员工,由于种种原因,其“忠诚度”较高。而员工进入公司工作的第五5年是一个较为“危险”的年份,也许是该企业的“5年之痒”,应当重点关注该阶段的员工满意度、职业晋升等情况,以顺利过渡。
3.工作事故离职分布
从图中可看出,工作是个对员工离职的影响较小,可推测该企业处理工作事故的方式有可取之处。
4.员工晋升离职分布
分布图无法明显看出晋升对离职是否有影响。
5.各部门离职情况分布
可大致看出各部门的离职情况,但分布图无法横向对比。
6.各等级薪资与离职分布
可明显看出,薪资越高离职人数越少。证明为了减少离职率,提升员工福利待遇是一个可行的手段。
7.各等级满意度的员工离职分布
首先该企业员工的满意度还不错,大多数员工的满意度较高。满意度低、非常低的员工离职人数最多,可见提升员工满意度是防止人员流失的关键环节。
8.各受教育水平的员工离职分布
可大致看出,中等受教育程度的员工离职率是最低的。而受教育程度低和受教育程度极高的员工离职人数都比较多,应当对这两类员工给予特别关注,寻找关键原因。
9.月工作时长离职分布
上图清晰地表明了,月工作时长正常的员工离职率最低。而工时过低、过高的员工离职人数最多。证明恰当的工作任务分配是非常重要的。
3.3盒形图单因素分析
#单因素分析 - 盒形图
plt.figure()
#离职与员工满意度的关系
plt.subplot(2,2,1)
sns.boxplot(x = 'left', y = 'satisfaction_level', data = data)
#离职与员工受教育程度的关系
plt.subplot(2,2,2)
sns.boxplot(x = 'left', y = 'last_evaluation', data = data)
#离职与员工月工作时长的关系
plt.subplot(2,2,3)
sns.boxplot(x = 'left', y = 'average_montly_hours', data = data)
#离职与员工参与项目数的关系
plt.subplot(2,2,4)
sns.boxplot(x = 'left', y = 'number_project', data = data)
#离职与员工参与员工工龄的关系
sns.boxplot(x = 'left', y = 'time_spend_company', data = data)
#离职与员工工作事故的关系
sns.boxplot(x = 'left', y = 'Work_accident', data = data)
#离职与过去五年内晋升的关系
sns.boxplot(x = 'left', y = 'promotion_last_5years', data = data)
#离职与员工所在部门的关系
sns.boxplot(x = 'left', y = 'departments', data = data)
#离职与员工工资的关系
sns.boxplot(x = 'left', y = 'salary', data = data)
1、员工离职与满意度的关系
附盒形图的阅读方法:最上、下方两根线代表最大值、最小值,盒子中间的线代表数据的中位数,盒子上下边框线代表数据的四分位数。整个盒子表示数据的主体。
上图反映出离职员工的满意度普遍较低。
2、员工离职与受教育水平的关系
与分布分析一致,离职员工的受教育水平有极低也有极高的。离职员工的受教育水平相差较大,整体而言受教育程度偏高,反映出该企业优秀人才流失较为严重。
3、员工离职与月工作时长的关系
与分布分析一致,上图表明未离职员工的工作时长趋于正常,整体而言离职员工的工作时长过高。
4、员工离职与项目参与数的关系
与分布分析一致,上图表明离职员工参与的项目数过高或过低,而未离职员工的3~4个项目参与量是较为合理的。
5、员工离职与工龄的关系
反映出工作3~5年的员工离职率较高。
6、员工离职与薪资的关系
上图反映出低薪水的离职率较高。
7、员工离职与部门的关系
上图反映出,财务部门、人力部门和科技部的离职率较高。
3.4离职率-条形图单因素分析
#代码过多只具列代表性的满意度(需分组分析)与薪水
#满意度与离职率
bins = [
min(data.satisfaction_level), 0.3,0.5,0.7,max(data.satisfaction_level)]
labels = [
'very unsatisfied','unsatisfied','satisfied','very satisfied']
data['group of satisfaction_level'] = pandas.cut(
data.satisfaction_level,bins,right = True,labels = labels)
var = data[data['left'] == 1]
result_satisf = var.groupby(
by = ['group of satisfaction_level'])['left'].agg({
'该满意度的离职人数':numpy.size})
result = data.groupby(
by = ['group of satisfaction_level'])['left'].agg({
'该满意度的人数':numpy.size})
#各等满意度水平离职人数
left_Percent_satisf = result_satisf['该满意度的离职人数']/result['该满意度的人数']
left_Percent_satisf = left_Percent_satisf.to_frame(name=None)
left_Percent_satisf.columns = ['离职率']
#数据排序
_sort_satisf = left_Percent_satisf.sort_values(
by = '离职率',ascending = False)
index_3 = numpy.arange(
_sort_satisf.离职率.size)
plt.barh(index_3, _sort_satisf.离职率,)
plt.yticks(index_3,_sort_satisf.index,fontsize = 20)
plt.show()
#薪水与离职率
result_salary = var.groupby(
by = ['salary'])['left'].agg({
'该等级薪水离职人数':numpy.size})
result = data.groupby(
by = ['salary'])['left'].agg({
'该等级薪水人数':numpy.size})
#各等级薪水离职人数
left_Percent_salary = result_salary['该等级薪水离职人数']/result['该等级薪水人数']
left_Percent_salary = left_Percent_salary.to_frame(name=None)
left_Percent_salary.columns = ['离职率']
#数据排序
_sort_salary = left_Percent_salary.sort_values(
by = '离职率',ascending = False)
index_2 = numpy.arange(
_sort_salary.离职率.size)
plt.barh(index_2, _sort_salary.离职率,color = 'rgb')
plt.yticks(index_2,_sort_salary.index,fontsize = 20)
plt.show()
1、各部门离职率
可见各部门离职率如上图,离职率由高到低分别为:人力部、财务部、科技部、支持部、销售部、市场部、IT部门、产品部、研发部、管理部。对于离职率过高的部门,因进一步分析关键原因。
2、薪水与离职率
再次证明薪水越低离职率越高。
3、满意度的离职率
再次证明,满意度越低离职率越高。
4、各受教育水平的离职率
离职率最高的是受教育水平较低的员工,其次是受教育水平最高的员工。对于优秀人才的流失应当引起足够重视。
5、工作时长的离职率
离职率最高的是工作时间过长的员工,而工作时长过短的员工离职率也很高,就数据显示而言,月工作时长调整为正常程度有利于降低员工的离职率。
6、项目参与数与离职率
由图可见,项目数为3~5最为适宜,而项目数为2、7,即参与项目数过多或过少则离职率增加。
7、工龄与离职率
与前述分析一致,工龄5年的员工离职率过高,应当重点关注。
8、工作事故与离职率
上图显示,出现工作事故的员工离职率反而远远低于未出现工作事故的员工,说明良好的工作事故处理方式可能会增加员工的忠诚度。
9、晋升与离职率
上图显示五年内没有晋升的员工离职率约为有晋升员工的4倍以上。可见为员工提供合理的职业发展空间是十分必要的。
3.5多因素分析
根据上述分析,工作事故对离职的影响不大故剔除,而部门数据不适合量化分析也剔除。
#多因素分析
sns.pairplot(data, hue= 'left', vars = ['satisfaction_level', 'last_evaluation', 'average_montly_hours','number_project','time_spend_company','Work_accident','promotion_last_5years', #'departments', #'salary'
])
注:黄色为离职,蓝色为未离职
1、概览
2、关键因素分析
1)员工满意度分析
前述分析中,我们得出员工满意度越低、离职率越高的结论。那么满意度如何与其他因素作用呢?
由上图可知:
- 满意度高、受教育水平高的员工离职率依然很高,反映出优秀人才流动性大的特点。
- 满意度没有改变参与项目数量、受教育水平高、工龄、工时、是否晋升、薪水水平对离职的影响(即,满意度高也无法削弱上述因素带来的负面影响)。
所以,对员工离职与否,“满意度”不是决定性因素。
2)受教育水平分析
上述图片清楚地反映出,对于员工来说:
- 受教育水平越高、月工作时长越长,离职率越高。
- 受教育水平越高、参与项目数越多,离职率越高,参与多=达7个项目的员工离职率达到100%。
- 受教育水平越高、工龄越短的员工离职率越高。
- 受教育水平越高、晋升越少的员工离职率越高。
- 普遍来说受教育水平越高、薪水越低的员工离职率越高,但薪水最高、受教育水平最高的员工离职率也很高,即对高受教育水平员工来说,薪水超过一定程度后,并不会降低离职率。
所以,对于优质人才,应当合理分配其工作任务和项目数,避免工时过长、项目过多,薪水适宜,并适当适时给予晋升机会以降低其离职率。
2)工龄分析
由图可知,
- 相对来说,工龄越低、满意度越低,离职率越高。
- 工龄越低、受教育水平越高,离职率越高。
- 工龄越低、工作时长越长,离职率越高。
- 工龄越低的员工没有晋升越容易离职。
- 工龄低的员工,增加薪水可以降低离职率,工龄高的员工受薪水影响较小(即增减薪水“无所谓”)。
所以,对于新入职或入职不超过3、5年的员工,特别是受教育程度较高的新员工,应当重点关注其满意度是否正常、薪水是否合理、工作时长是否过长,以减少人员流失。