員工離職分析預測
一刽脖、摘要
通過員工離職情況數據來分析數據集內哪些特征變量會對員工離職造成影響疮胖,以及其背后可能的原因溜嗜,并利用邏輯回歸和決策樹算法構建預測模型火俄。
員工對公司的滿意度工三、崗位類別迁酸、以及優(yōu)秀人才能否得到滿意的薪酬和晉升空間咽弦,都是影響離職與否的主要因素。
二胁出、分析背景
員工離職型型,似乎已經成為每一家企業(yè)都要面對的問題,優(yōu)秀人才的離職會對公司的運營產生巨大的負面影響全蝶。一家大型企業(yè)希望能搞清楚為什么企業(yè)內的一些優(yōu)秀員工會選擇離職闹蒜,此外,還希望能利用收集的員工數據建立一個預測模型以便提前預測哪些優(yōu)秀員工有離職傾向抑淫。
三绷落、分析過程
數據理解
分析所用數據集 HR_comma_sep 來源于kaggle網站,為某公司員工的離職數據始苇,包含有14999個樣本以及10個特征砌烁,這10個特征分別為:
satisfaction_level(員工對公司滿意度)
last_evaluation(最新考核評估)
number_project(參與過項目數)
average_montly_hours(平均每月工作時長)
time_spend_company(工作年限)
Work_accident(是否發(fā)生過工作事故)
promotion_last_5years(過去5年是否晉升)
posts(崗位類別)
salary(薪資水平)
left(是否離職)。
本次分析著重針對數據集中的各個特征變量對員工是否離職的影響進行分析催式。
數據處理
各個特征的描述性統計如下表所示函喉, 全部14999個記錄中所有變量值都是齊全的沒有空值,而且各個變量的范圍都是合理的荣月,與實際環(huán)境相符管呵,數據質量很高因而不需要進行數據清洗的處理。
特征工程
這部分的工作主要是對posts(崗位類別)與salary(薪資水平)這兩個字符型特征變量進行處理哺窄,即需要將字符型數據轉換成數值型數據捐下。
特征salary共有l(wèi)ow、medium萌业、high3個類別坷襟,并且這3個類型是有順序結構的,故分別將其轉換為數值1生年、2婴程、3。
特征posts共有IT晶框、RandD排抬、accounting、hr等10個類別授段,這10個類型不具有像特征salary有順序結構蹲蒲,故應將其轉換onehot變量。
分析過程
該公司員工的離職總體情況如何侵贵?
下圖是離職員工的占比情況届搁,離職員工人數共3571人,占總員工數的23.81%。
員工對公司的滿意度是否影響了其離職卡睦?
對公司是否滿意無疑是影響員工去留的主要因素之一宴胧,員工的離職往往可以從過往對公司的滿意度評分中看出端倪。
對比員工對公司的滿意度評分表锻,離職員工的評分明顯偏低恕齐,中位數為0.41,比在職員工0.69的評分中位數低40%瞬逊,差距非常明顯显歧。此外,有至少25%的離職員工評分在0.2以下的低水平确镊。
離職員工是否屬于工作表現較好的員工士骤?
一個公司的優(yōu)秀員工,如果認為公司的待遇或職位與自身能力不匹配蕾域,發(fā)展通道受限拷肌,他們就很有可能選擇離職,那么是否離職員工的工作表現總體上就會好于在職員工呢旨巷?
下圖顯示了在職與離職員工在最近一次員工考核評分的情況對比巨缘。可以看出有一半的離職員工的考核評分在0.8以上的優(yōu)秀水平契沫,離職員工的評分總體上看起來確實要好于在職員工带猴。
員工的工作經驗和離職有關系嗎?
員工的工作經驗豐富程度由其參與過的項目數量直接決定懈万,而參與項目數量不同的員工群體的離職占比的確存在差異。
從下圖統計的各個群體的離靶病、在職人數可以看到会通,離職人數最多的群體是參與過2個項目的員工,達到1567人娄周,離職占比65.6%涕侈。參與過7個項目的員工雖然離職人數僅有256人,排在倒數第二煤辨,但是離職占比卻達到了100%裳涛,此外參與過6個項目的員工離職占比也在55.8%,公司工作經驗最為豐富的員工流失十分嚴重众辨!其他參與項目數量在3到5個的員工的離職人數占比則都處于較低水平端三。
造成這種差異的原因可能在于公司沒有能提供可預見的晉升空間,從而造成經驗豐富的員工更愿意選擇另謀高就來拓展自己的職業(yè)空間鹃彻,而只參與過2個項目的員工大量離職則更可能是由于其自身未能適應公司的管理制度或企業(yè)文化導致郊闯。
每月工作時長
高強度的工作強度會造成壓力過大,進而產生各種心理或生理上的問題,這也是導致員工離職的主要原因之一团赁。
下圖對在育拨、離職兩類員工的平均每月工作小時數進行了對比,離職員工的總體水平要高于在職員工欢摄。離職員工的工作時長中位數為224小時熬丧,比在職員工的198小時高出11.6%,以每月22個工作日計算怀挠,離職員工平均每天工作10個小時以上锹引,工作強度較大。
在公司工作幾年的員工更容易離職唆香?
下圖統計的是不同工作年限員工的離職情況嫌变,很明顯離職的主要集中在工作年限為3至6年的員工,工作2年的新員工離職率很低僅為1.6%躬它,而7年及以上的員工離職率為零腾啥。結合離職員工在參與項目數量上的分布情況,可看出離職的很大一部分屬于公司內中生代且工作經驗豐富的員工冯吓。
發(fā)生過工作事故是否會增加員工離職的可能性倘待?
從下圖未發(fā)生過工作事故和曾發(fā)生過工作事故的員工離職情況可以看到,曾發(fā)生過工作事故的員工離職的人數和比例都要遠低于未發(fā)生過工作事故的員工组贺,因此凸舵,發(fā)生過工作事故并不會增加員工離職的可能性。
職位晉升情況
沒有清晰的晉升渠道和空間是導致員工離職的重要因素失尖,從下圖離職員工在過去5年是否得到晉升的分布來看啊奄,差距非常明顯,高達99.5%的離職員工在過去五年未能得到晉升掀潮。雖然得到晉升的員工本身很少菇夸,但其離職比例僅為6.0%,遠低于未能晉升員工的24.2%仪吧。
薪酬
下圖是離職員工在不同薪酬等級員工的分布情況庄新,低等級的離職人數和占比均為最高,中級次之薯鼠,高級的離職率最低僅為6.6%择诈,可見薪酬是決定員工去留的又一大重要因素。
哪種崗位的員工更容易離職呢出皇?
各個崗位的離職占比如下圖所示羞芍,占比都比較接近,進一步對每個崗位類別進行卡方檢驗恶迈,各個類別的檢驗顯著性如表格所示涩金,其中統計差異最大的是‘hr’谱醇、‘management’、‘RanD’三個崗位步做,結合‘hr’離職占比較高副渴,而‘management’、‘RanD’較低的特點全度,可看出擔任‘hr’崗位的員工比其他崗位更趨向于離職煮剧,而‘management’、‘RanD’兩個崗位的員工則更趨于留下将鸵,其他崗位沒有明顯的趨向勉盅。
構建模型
分別用邏輯回歸和決策樹算法對數據集進行建模,并調整至最佳參數顶掉,其中邏輯回歸算法的預測準確率為82.2%草娜,決策樹算法的準確率為98.3%。兩種算法的ROC曲線如下圖所示痒筒,右側的決策樹AUC值較大宰闰,優(yōu)于左側的邏輯回歸,故最終選擇決策樹作為員工離職預測的算法簿透。(詳細代碼見后附代碼)
所構建的模型除了能預測員工是否會離職移袍,還能給出離職的概率大小,人力資源部門可根據結果對預測概率較高的員工優(yōu)先采取挽留措施老充。
四葡盗、分析總結
1、該公司員工的總體離職率為23.81%啡浊。
2觅够、離職員工的對公司的滿意度評分明顯低于在職員工,對公司是否滿意是影響員工去留的主要因素之一虫啥。
3蔚约、離職員工的評分總體上看起來確實要好于在職員工,有一半的離職員工的考核評分在0.8以上的優(yōu)秀水平涂籽,這些員工在就業(yè)市場會更受企業(yè)歡迎,更容易得到更高的薪酬或更好的工作環(huán)境砸抛,因而離職可能性較高评雌。
4、離職員工平均每月工作時間的總體水平要高于在職員工直焙。平均計算每天工作10個小時以上景东,高強度的工作強度會造成壓力過大,進而產生各種心理或生理上的問題奔誓,這也是導致員工離職的主要原因之一斤吐。
5搔涝、曾發(fā)生過工作事故的員工離職的人數和比例都要遠低于未發(fā)生過工作事故的員工,故發(fā)生過工作事故并不會增加員工離職的可能性和措。
6庄呈、薪酬在低等級的離職人數和占比均為最高,中級次之派阱,高級的離職率最低诬留,薪酬是決定員工去留的又一大重要因素。
7贫母、參與項目數量最多的員工是離職率最高文兑,而工作年限3至6年又是離職員工最為集中的范圍,他們是公司內的中生代且工作經驗豐富腺劣,但是高達99.5%的離職員工在過去五年未能得到晉升绿贞,說明公司不能為這部分屬于中生代且工作經驗豐富的員工提供滿意的薪酬或可預見的晉升空間,從而導致這些員工選擇另謀高就橘原。
8籍铁、擔任‘hr’崗位的員工比其他崗位更趨向于離職,可能與公司內優(yōu)秀人才流失嚴重導致人力資源工作壓力較大的原因有關靠柑。
9寨辩、可利用所構建的決策樹模型給出的員工離職的概率,對相應員工提前采取針對性的挽留措施歼冰。
五靡狞、參考信息
卡方檢驗:通常用在檢驗某個特征變量(分類變量)是不是和因變量(分類變量)有顯著相關關系。
六隔嫡、數據來源
https://www.kaggle.com/jiangzuo/hr-comma-sep/version/1
七甸怕、Python代碼
導入需要的工具庫
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
讀取數據集
data = pd.read_csv(r'D:\360安全瀏覽器下載\hr-comma-sep\HR_comma_sep.csv')
進行描述性統計
data.describe()
將特征salary轉換為數值型變量
from sklearn.preprocessing import OrdinalEncoder
OE = OrdinalEncoder()
data['salary'] = OE.fit_transform(data['salary'])
將特征posts轉換為onehot變量,并與原數據集拼接
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)
生成特征變量和標簽變量
X = data.drop(['left','posts'],axis=1)
Y = data['left']
計算離職、在職員工人數的占比腮恩。
data['left'].value_counts()/data['left'].count()
構建參與不同項目數量梢杭、工作年限、5年內是否晉升秸滴、是否發(fā)生過工作事故武契、薪酬等級、崗位類別的離荡含、在職員工人數的透視表咒唆,并計算各個數量的離、在職員工占比释液。
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')
將特征和標簽數據集劃分為訓練和測試數據集全释。
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)
初步考察邏輯回歸模型的預測效果
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)迭代邏輯回歸模型的正則化參數來選擇最佳參數,得到最佳正則化參數為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='準確率')
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='準確率')
plt.legend()
plt.show()
print(max(error),(error.index(max(error))+1)*0.0001)
循環(huán)迭代邏輯回歸模型的最大迭代次數來選擇最佳參數误债,得到最佳次數為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='準確率')
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='準確率')
plt.legend()
plt.show()
print(max(error),(error.index(max(error))+1))
評估得到的邏輯回歸模型妄迁,準確率為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)
用決策樹模型擬合訓練數據李命,并用測試數據集評估其預測效果登淘,準確率為98.3%
from sklearn.tree import DecisionTreeClassifier as DTC
DTC1 = DTC().fit(X_train,Y_train)
DTC1.score(X_test,Y_test)
用正確率評估分類模型并不客觀,更合適的使用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()