員工離職分析預(yù)測(cè)(Python實(shí)現(xiàn))

員工離職分析預(yù)測(cè)

一、摘要

通過(guò)員工離職情況數(shù)據(jù)來(lái)分析數(shù)據(jù)集內(nèi)哪些特征變量會(huì)對(duì)員工離職造成影響,以及其背后可能的原因,并利用邏輯回歸和決策樹(shù)算法構(gòu)建預(yù)測(cè)模型。
員工對(duì)公司的滿意度、崗位類別、以及優(yōu)秀人才能否得到滿意的薪酬和晉升空間,都是影響離職與否的主要因素。

二、分析背景

員工離職,似乎已經(jīng)成為每一家企業(yè)都要面對(duì)的問(wèn)題,優(yōu)秀人才的離職會(huì)對(duì)公司的運(yùn)營(yíng)產(chǎn)生巨大的負(fù)面影響。一家大型企業(yè)希望能搞清楚為什么企業(yè)內(nèi)的一些優(yōu)秀員工會(huì)選擇離職,此外,還希望能利用收集的員工數(shù)據(jù)建立一個(gè)預(yù)測(cè)模型以便提前預(yù)測(cè)哪些優(yōu)秀員工有離職傾向。

三、分析過(guò)程

數(shù)據(jù)理解

分析所用數(shù)據(jù)集 HR_comma_sep 來(lái)源于kaggle網(wǎng)站,為某公司員工的離職數(shù)據(jù),包含有14999個(gè)樣本以及10個(gè)特征,這10個(gè)特征分別為:
satisfaction_level(員工對(duì)公司滿意度)
last_evaluation(最新考核評(píng)估)
number_project(參與過(guò)項(xiàng)目數(shù))
average_montly_hours(平均每月工作時(shí)長(zhǎng))
time_spend_company(工作年限)
Work_accident(是否發(fā)生過(guò)工作事故)
promotion_last_5years(過(guò)去5年是否晉升)
posts(崗位類別)
salary(薪資水平)
left(是否離職)。
本次分析著重針對(duì)數(shù)據(jù)集中的各個(gè)特征變量對(duì)員工是否離職的影響進(jìn)行分析。

數(shù)據(jù)處理

各個(gè)特征的描述性統(tǒng)計(jì)如下表所示, 全部14999個(gè)記錄中所有變量值都是齊全的沒(méi)有空值,而且各個(gè)變量的范圍都是合理的,與實(shí)際環(huán)境相符,數(shù)據(jù)質(zhì)量很高因而不需要進(jìn)行數(shù)據(jù)清洗的處理。


image.png

特征工程

這部分的工作主要是對(duì)posts(崗位類別)與salary(薪資水平)這兩個(gè)字符型特征變量進(jìn)行處理,即需要將字符型數(shù)據(jù)轉(zhuǎn)換成數(shù)值型數(shù)據(jù)。
特征salary共有l(wèi)ow、medium、high3個(gè)類別,并且這3個(gè)類型是有順序結(jié)構(gòu)的,故分別將其轉(zhuǎn)換為數(shù)值1、2、3。
特征posts共有IT、RandD、accounting、hr等10個(gè)類別,這10個(gè)類型不具有像特征salary有順序結(jié)構(gòu),故應(yīng)將其轉(zhuǎn)換onehot變量。

分析過(guò)程

該公司員工的離職總體情況如何?

下圖是離職員工的占比情況,離職員工人數(shù)共3571人,占總員工數(shù)的23.81%。


離職人數(shù)占比.png

員工對(duì)公司的滿意度是否影響了其離職?

對(duì)公司是否滿意無(wú)疑是影響員工去留的主要因素之一,員工的離職往往可以從過(guò)往對(duì)公司的滿意度評(píng)分中看出端倪。
對(duì)比員工對(duì)公司的滿意度評(píng)分,離職員工的評(píng)分明顯偏低,中位數(shù)為0.41,比在職員工0.69的評(píng)分中位數(shù)低40%,差距非常明顯。此外,有至少25%的離職員工評(píng)分在0.2以下的低水平。


image.png

離職員工是否屬于工作表現(xiàn)較好的員工?

一個(gè)公司的優(yōu)秀員工,如果認(rèn)為公司的待遇或職位與自身能力不匹配,發(fā)展通道受限,他們就很有可能選擇離職,那么是否離職員工的工作表現(xiàn)總體上就會(huì)好于在職員工呢?
下圖顯示了在職與離職員工在最近一次員工考核評(píng)分的情況對(duì)比??梢钥闯鲇幸话氲碾x職員工的考核評(píng)分在0.8以上的優(yōu)秀水平,離職員工的評(píng)分總體上看起來(lái)確實(shí)要好于在職員工。


image.png

員工的工作經(jīng)驗(yàn)和離職有關(guān)系嗎?

員工的工作經(jīng)驗(yàn)豐富程度由其參與過(guò)的項(xiàng)目數(shù)量直接決定,而參與項(xiàng)目數(shù)量不同的員工群體的離職占比的確存在差異。
從下圖統(tǒng)計(jì)的各個(gè)群體的離、在職人數(shù)可以看到,離職人數(shù)最多的群體是參與過(guò)2個(gè)項(xiàng)目的員工,達(dá)到1567人,離職占比65.6%。參與過(guò)7個(gè)項(xiàng)目的員工雖然離職人數(shù)僅有256人,排在倒數(shù)第二,但是離職占比卻達(dá)到了100%,此外參與過(guò)6個(gè)項(xiàng)目的員工離職占比也在55.8%,公司工作經(jīng)驗(yàn)最為豐富的員工流失十分嚴(yán)重!其他參與項(xiàng)目數(shù)量在3到5個(gè)的員工的離職人數(shù)占比則都處于較低水平。
造成這種差異的原因可能在于公司沒(méi)有能提供可預(yù)見(jiàn)的晉升空間,從而造成經(jīng)驗(yàn)豐富的員工更愿意選擇另謀高就來(lái)拓展自己的職業(yè)空間,而只參與過(guò)2個(gè)項(xiàng)目的員工大量離職則更可能是由于其自身未能適應(yīng)公司的管理制度或企業(yè)文化導(dǎo)致。


image.png

每月工作時(shí)長(zhǎng)

高強(qiáng)度的工作強(qiáng)度會(huì)造成壓力過(guò)大,進(jìn)而產(chǎn)生各種心理或生理上的問(wèn)題,這也是導(dǎo)致員工離職的主要原因之一。
下圖對(duì)在、離職兩類員工的平均每月工作小時(shí)數(shù)進(jìn)行了對(duì)比,離職員工的總體水平要高于在職員工。離職員工的工作時(shí)長(zhǎng)中位數(shù)為224小時(shí),比在職員工的198小時(shí)高出11.6%,以每月22個(gè)工作日計(jì)算,離職員工平均每天工作10個(gè)小時(shí)以上,工作強(qiáng)度較大。


image.png

在公司工作幾年的員工更容易離職?

下圖統(tǒng)計(jì)的是不同工作年限員工的離職情況,很明顯離職的主要集中在工作年限為3至6年的員工,工作2年的新員工離職率很低僅為1.6%,而7年及以上的員工離職率為零。結(jié)合離職員工在參與項(xiàng)目數(shù)量上的分布情況,可看出離職的很大一部分屬于公司內(nèi)中生代且工作經(jīng)驗(yàn)豐富的員工。


image.png

發(fā)生過(guò)工作事故是否會(huì)增加員工離職的可能性?

從下圖未發(fā)生過(guò)工作事故和曾發(fā)生過(guò)工作事故的員工離職情況可以看到,曾發(fā)生過(guò)工作事故的員工離職的人數(shù)和比例都要遠(yuǎn)低于未發(fā)生過(guò)工作事故的員工,因此,發(fā)生過(guò)工作事故并不會(huì)增加員工離職的可能性。


image.png

職位晉升情況

沒(méi)有清晰的晉升渠道和空間是導(dǎo)致員工離職的重要因素,從下圖離職員工在過(guò)去5年是否得到晉升的分布來(lái)看,差距非常明顯,高達(dá)99.5%的離職員工在過(guò)去五年未能得到晉升。雖然得到晉升的員工本身很少,但其離職比例僅為6.0%,遠(yuǎn)低于未能晉升員工的24.2%。


image.png

薪酬

下圖是離職員工在不同薪酬等級(jí)員工的分布情況,低等級(jí)的離職人數(shù)和占比均為最高,中級(jí)次之,高級(jí)的離職率最低僅為6.6%,可見(jiàn)薪酬是決定員工去留的又一大重要因素。


image.png

哪種崗位的員工更容易離職呢?

各個(gè)崗位的離職占比如下圖所示,占比都比較接近,進(jìn)一步對(duì)每個(gè)崗位類別進(jìn)行卡方檢驗(yàn),各個(gè)類別的檢驗(yàn)顯著性如表格所示,其中統(tǒng)計(jì)差異最大的是‘hr’、‘management’、‘RanD’三個(gè)崗位,結(jié)合‘hr’離職占比較高,而‘management’、‘RanD’較低的特點(diǎn),可看出擔(dān)任‘hr’崗位的員工比其他崗位更趨向于離職,而‘management’、‘RanD’兩個(gè)崗位的員工則更趨于留下,其他崗位沒(méi)有明顯的趨向。


image.png

image.png

構(gòu)建模型

分別用邏輯回歸和決策樹(shù)算法對(duì)數(shù)據(jù)集進(jìn)行建模,并調(diào)整至最佳參數(shù),其中邏輯回歸算法的預(yù)測(cè)準(zhǔn)確率為82.2%,決策樹(shù)算法的準(zhǔn)確率為98.3%。兩種算法的ROC曲線如下圖所示,右側(cè)的決策樹(shù)AUC值較大,優(yōu)于左側(cè)的邏輯回歸,故最終選擇決策樹(shù)作為員工離職預(yù)測(cè)的算法。(詳細(xì)代碼見(jiàn)后附代碼)
所構(gòu)建的模型除了能預(yù)測(cè)員工是否會(huì)離職,還能給出離職的概率大小,人力資源部門可根據(jù)結(jié)果對(duì)預(yù)測(cè)概率較高的員工優(yōu)先采取挽留措施。


image.png

image.png

四、分析總結(jié)

1、該公司員工的總體離職率為23.81%。
2、離職員工的對(duì)公司的滿意度評(píng)分明顯低于在職員工,對(duì)公司是否滿意是影響員工去留的主要因素之一。
3、離職員工的評(píng)分總體上看起來(lái)確實(shí)要好于在職員工,有一半的離職員工的考核評(píng)分在0.8以上的優(yōu)秀水平,這些員工在就業(yè)市場(chǎng)會(huì)更受企業(yè)歡迎,更容易得到更高的薪酬或更好的工作環(huán)境,因而離職可能性較高。
4、離職員工平均每月工作時(shí)間的總體水平要高于在職員工。平均計(jì)算每天工作10個(gè)小時(shí)以上,高強(qiáng)度的工作強(qiáng)度會(huì)造成壓力過(guò)大,進(jìn)而產(chǎn)生各種心理或生理上的問(wèn)題,這也是導(dǎo)致員工離職的主要原因之一。
5、曾發(fā)生過(guò)工作事故的員工離職的人數(shù)和比例都要遠(yuǎn)低于未發(fā)生過(guò)工作事故的員工,故發(fā)生過(guò)工作事故并不會(huì)增加員工離職的可能性。
6、薪酬在低等級(jí)的離職人數(shù)和占比均為最高,中級(jí)次之,高級(jí)的離職率最低,薪酬是決定員工去留的又一大重要因素。
7、參與項(xiàng)目數(shù)量最多的員工是離職率最高,而工作年限3至6年又是離職員工最為集中的范圍,他們是公司內(nèi)的中生代且工作經(jīng)驗(yàn)豐富,但是高達(dá)99.5%的離職員工在過(guò)去五年未能得到晉升,說(shuō)明公司不能為這部分屬于中生代且工作經(jīng)驗(yàn)豐富的員工提供滿意的薪酬或可預(yù)見(jiàn)的晉升空間,從而導(dǎo)致這些員工選擇另謀高就。
8、擔(dān)任‘hr’崗位的員工比其他崗位更趨向于離職,可能與公司內(nèi)優(yōu)秀人才流失嚴(yán)重導(dǎo)致人力資源工作壓力較大的原因有關(guān)。
9、可利用所構(gòu)建的決策樹(shù)模型給出的員工離職的概率,對(duì)相應(yīng)員工提前采取針對(duì)性的挽留措施。

五、參考信息

卡方檢驗(yàn):通常用在檢驗(yàn)?zāi)硞€(gè)特征變量(分類變量)是不是和因變量(分類變量)有顯著相關(guān)關(guān)系。

六、數(shù)據(jù)來(lái)源

https://www.kaggle.com/jiangzuo/hr-comma-sep/version/1

七、Python代碼

導(dǎo)入需要的工具庫(kù)

import numpy as np
import pandas as pd 
import matplotlib.pyplot as plt

讀取數(shù)據(jù)集

data = pd.read_csv(r'D:\360安全瀏覽器下載\hr-comma-sep\HR_comma_sep.csv')

進(jìn)行描述性統(tǒng)計(jì)

data.describe()

將特征salary轉(zhuǎn)換為數(shù)值型變量

from sklearn.preprocessing import OrdinalEncoder
OE = OrdinalEncoder()
data['salary'] = OE.fit_transform(data['salary'])

將特征posts轉(zhuǎn)換為onehot變量,并與原數(shù)據(jù)集拼接

from sklearn.preprocessing import OneHotEncoder
OHE = OneHotEncoder(categories='auto').fit(data['posts'].to_frame())
result = OHE.transform(data['posts'].to_frame())
result = pd.DataFrame(result.toarray())
result.columns = ['IT', 'RandD', 'accounting', 'hr', 'management', 'marketing',
        'product_mng', 'sales', 'support', 'technical']
data = pd.concat([data,result],axis=1)

生成特征變量和標(biāo)簽變量

X = data.drop(['left','posts'],axis=1)
Y = data['left']

計(jì)算離職、在職員工人數(shù)的占比。

data['left'].value_counts()/data['left'].count()

構(gòu)建參與不同項(xiàng)目數(shù)量、工作年限、5年內(nèi)是否晉升、是否發(fā)生過(guò)工作事故、薪酬等級(jí)、崗位類別的離、在職員工人數(shù)的透視表,并計(jì)算各個(gè)數(shù)量的離、在職員工占比。

pd.pivot_table(data,index='left',columns='number_project',values='posts',aggfunc='count')
pd.pivot_table(data,index='left',columns='time_spend_company',values='posts',aggfunc='count')
pd.pivot_table(data,index='left',columns='promotion_last_5years',values='posts',aggfunc='count')
pd.pivot_table(data,index='left',columns='Work_accident',values='posts',aggfunc='count')
pd.pivot_table(data,index='left',columns='salary',values='posts',aggfunc='count')
pd.pivot_table(data,index='left',columns='posts',values='Work_accident',aggfunc='count')

將特征和標(biāo)簽數(shù)據(jù)集劃分為訓(xùn)練和測(cè)試數(shù)據(jù)集。

from sklearn.model_selection import train_test_split
X_train,X_test,Y_train,Y_test = train_test_split(X,Y,test_size=0.3)

初步考察邏輯回歸模型的預(yù)測(cè)效果

from sklearn.linear_model import LogisticRegression as LR
LR1 = LR(random_state=20).fit(X_train,Y_train)
print(LR1.score(X_train,Y_train),LR1.score(X_test,Y_test))

循環(huán)迭代邏輯回歸模型的正則化參數(shù)來(lái)選擇最佳參數(shù),得到最佳正則化參數(shù)為C=0.0013

from sklearn.model_selection import cross_val_score
for i in np.linspace(0.01,0.21,20):
  error.append(cross_val_score(LR(solver='liblinear',C=i,random_state=30),X_train,Y_train,cv=10).mean())
plt.plot(np.linspace(0.001,0.021,20),error,label='準(zhǔn)確率')
plt.legend()
plt.show()
print(max(error),(error.index(max(error))+1)*0.001)
error=[]
for i in np.linspace(0.0001,0.0021,20):
    error.append(cross_val_score(LR(solver='liblinear',C=i,random_state=30),X_train,Y_train,cv=10).mean())
plt.plot(np.linspace(0.0001,0.0021,20),error,label='準(zhǔn)確率')
plt.legend()
plt.show()
print(max(error),(error.index(max(error))+1)*0.0001)

循環(huán)迭代邏輯回歸模型的最大迭代次數(shù)來(lái)選擇最佳參數(shù),得到最佳次數(shù)為21。

error=[]
for i in range(1,201,20):
    error.append(cross_val_score(LR(solver='liblinear',C=0.0013,random_state=30,max_iter=i),X_train,Y_train,cv=10).mean())
plt.plot(range(1,201,20),error,label='準(zhǔn)確率')
plt.legend()
plt.show()
print(max(error),(error.index(max(error))*20)+1)
error=[]
for i in range(1,31):
    error.append(cross_val_score(LR(solver='liblinear',C=0.0013,random_state=30,max_iter=i),X_train,Y_train,cv=10).mean())
plt.plot(range(1,31),error,label='準(zhǔn)確率')
plt.legend()
plt.show()
print(max(error),(error.index(max(error))+1))

評(píng)估得到的邏輯回歸模型,準(zhǔn)確率為82.2%。

LR1 = LR(solver='liblinear',C=0.0013,random_state=30,max_iter=12).fit(X_train,Y_train)
LR1.score(X_test,Y_test)

用決策樹(shù)模型擬合訓(xùn)練數(shù)據(jù),并用測(cè)試數(shù)據(jù)集評(píng)估其預(yù)測(cè)效果,準(zhǔn)確率為98.3%

from sklearn.tree import DecisionTreeClassifier as DTC
DTC1 = DTC().fit(X_train,Y_train)
DTC1.score(X_test,Y_test)

用正確率評(píng)估分類模型并不客觀,更合適的使用ROC曲線和AUC值。

import scikitplot as skplt
Y_pred_proba_LR = pd.DataFrame(LR1.predict_proba(X_test))
Y_pred_proba_DTC = pd.DataFrame(DTC1.predict_proba(X_test))
skplt.metrics.plot_roc(Y_test,Y_pred_proba_LR,classes_to_plot=1,plot_micro=False,plot_macro=False)
skplt.metrics.plot_roc(Y_test,Y_pred_proba_DTC,classes_to_plot=1,plot_micro=False,plot_macro=False)
plt.show()
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容