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

作者: 殷大侠 | 来源:发表于2017-12-10 19:04 被阅读2316次

    一、分析目的

    数据源自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年的员工,特别是受教育程度较高的新员工,应当重点关注其满意度是否正常、薪水是否合理、工作时长是否过长,以减少人员流失。

    相关文章

      网友评论

        本文标题:员工离职原因数据分析|python

        本文链接:https://www.haomeiwen.com/subject/enfeixtx.html