一、分析目的
数据源自kaggle,通过分析了解员工离职的原因,为降低员工离职率的举措提供数据支撑。
图网侵删
二、数据处理
1.数据预览
data = pandas.read_csv('F:\pythonlearn\Spyder\littlefly_dataana\\test\\HR_comma_sep.csv')
#预览数据
data.head()
默认预览数据前5行
可大体看清数据基本情况。
#数据基本情况
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)员工满意度分析
员工满意度-1
员工满意度-2
前述分析中,我们得出员工满意度越低、离职率越高的结论。那么满意度如何与其他因素作用呢?
由上图可知:
- 满意度高、受教育水平高的员工离职率依然很高,反映出优秀人才流动性大的特点。
- 满意度没有改变参与项目数量、受教育水平高、工龄、工时、是否晋升、薪水水平对离职的影响(即,满意度高也无法削弱上述因素带来的负面影响)。
所以,对员工离职与否,“满意度”不是决定性因素。
2)受教育水平分析
受教育水平-1
受教育水平-2
上述图片清楚地反映出,对于员工来说:
- 受教育水平越高、月工作时长越长,离职率越高。
- 受教育水平越高、参与项目数越多,离职率越高,参与多=达7个项目的员工离职率达到100%。
- 受教育水平越高、工龄越短的员工离职率越高。
- 受教育水平越高、晋升越少的员工离职率越高。
- 普遍来说受教育水平越高、薪水越低的员工离职率越高,但薪水最高、受教育水平最高的员工离职率也很高,即对高受教育水平员工来说,薪水超过一定程度后,并不会降低离职率。
所以,对于优质人才,应当合理分配其工作任务和项目数,避免工时过长、项目过多,薪水适宜,并适当适时给予晋升机会以降低其离职率。
2)工龄分析
工龄-1
工龄-2
由图可知,
- 相对来说,工龄越低、满意度越低,离职率越高。
- 工龄越低、受教育水平越高,离职率越高。
- 工龄越低、工作时长越长,离职率越高。
- 工龄越低的员工没有晋升越容易离职。
- 工龄低的员工,增加薪水可以降低离职率,工龄高的员工受薪水影响较小(即增减薪水“无所谓”)。
所以,对于新入职或入职不超过3、5年的员工,特别是受教育程度较高的新员工,应当重点关注其满意度是否正常、薪水是否合理、工作时长是否过长,以减少人员流失。
网友评论