员工离职原因数据分析|python

一、分析目的

数据源自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年的员工,特别是受教育程度较高的新员工,应当重点关注其满意度是否正常、薪水是否合理、工作时长是否过长,以减少人员流失。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容