員工離職分析預測(Python實現)

員工離職分析預測

一刽脖、摘要

通過員工離職情況數據來分析數據集內哪些特征變量會對員工離職造成影響疮胖,以及其背后可能的原因溜嗜,并利用邏輯回歸和決策樹算法構建預測模型火俄。
員工對公司的滿意度工三、崗位類別迁酸、以及優(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)境相符管呵,數據質量很高因而不需要進行數據清洗的處理。


image.png

特征工程

這部分的工作主要是對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%。


離職人數占比.png

員工對公司的滿意度是否影響了其離職卡睦?

對公司是否滿意無疑是影響員工去留的主要因素之一宴胧,員工的離職往往可以從過往對公司的滿意度評分中看出端倪。
對比員工對公司的滿意度評分表锻,離職員工的評分明顯偏低恕齐,中位數為0.41,比在職員工0.69的評分中位數低40%瞬逊,差距非常明顯显歧。此外,有至少25%的離職員工評分在0.2以下的低水平确镊。


image.png

離職員工是否屬于工作表現較好的員工士骤?

一個公司的優(yōu)秀員工,如果認為公司的待遇或職位與自身能力不匹配蕾域,發(fā)展通道受限拷肌,他們就很有可能選擇離職,那么是否離職員工的工作表現總體上就會好于在職員工呢旨巷?
下圖顯示了在職與離職員工在最近一次員工考核評分的情況對比巨缘。可以看出有一半的離職員工的考核評分在0.8以上的優(yōu)秀水平契沫,離職員工的評分總體上看起來確實要好于在職員工带猴。


image.png

員工的工作經驗和離職有關系嗎?

員工的工作經驗豐富程度由其參與過的項目數量直接決定懈万,而參與項目數量不同的員工群體的離職占比的確存在差異。
從下圖統計的各個群體的離靶病、在職人數可以看到会通,離職人數最多的群體是參與過2個項目的員工,達到1567人娄周,離職占比65.6%涕侈。參與過7個項目的員工雖然離職人數僅有256人,排在倒數第二煤辨,但是離職占比卻達到了100%裳涛,此外參與過6個項目的員工離職占比也在55.8%,公司工作經驗最為豐富的員工流失十分嚴重众辨!其他參與項目數量在3到5個的員工的離職人數占比則都處于較低水平端三。
造成這種差異的原因可能在于公司沒有能提供可預見的晉升空間,從而造成經驗豐富的員工更愿意選擇另謀高就來拓展自己的職業(yè)空間鹃彻,而只參與過2個項目的員工大量離職則更可能是由于其自身未能適應公司的管理制度或企業(yè)文化導致郊闯。


image.png

每月工作時長

高強度的工作強度會造成壓力過大,進而產生各種心理或生理上的問題,這也是導致員工離職的主要原因之一团赁。
下圖對在育拨、離職兩類員工的平均每月工作小時數進行了對比,離職員工的總體水平要高于在職員工欢摄。離職員工的工作時長中位數為224小時熬丧,比在職員工的198小時高出11.6%,以每月22個工作日計算怀挠,離職員工平均每天工作10個小時以上锹引,工作強度較大。


image.png

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

下圖統計的是不同工作年限員工的離職情況嫌变,很明顯離職的主要集中在工作年限為3至6年的員工,工作2年的新員工離職率很低僅為1.6%躬它,而7年及以上的員工離職率為零腾啥。結合離職員工在參與項目數量上的分布情況,可看出離職的很大一部分屬于公司內中生代且工作經驗豐富的員工冯吓。


image.png

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

從下圖未發(fā)生過工作事故和曾發(fā)生過工作事故的員工離職情況可以看到,曾發(fā)生過工作事故的員工離職的人數和比例都要遠低于未發(fā)生過工作事故的員工组贺,因此凸舵,發(fā)生過工作事故并不會增加員工離職的可能性。


image.png

職位晉升情況

沒有清晰的晉升渠道和空間是導致員工離職的重要因素失尖,從下圖離職員工在過去5年是否得到晉升的分布來看啊奄,差距非常明顯,高達99.5%的離職員工在過去五年未能得到晉升掀潮。雖然得到晉升的員工本身很少菇夸,但其離職比例僅為6.0%,遠低于未能晉升員工的24.2%仪吧。


image.png

薪酬

下圖是離職員工在不同薪酬等級員工的分布情況庄新,低等級的離職人數和占比均為最高,中級次之薯鼠,高級的離職率最低僅為6.6%择诈,可見薪酬是決定員工去留的又一大重要因素。


image.png

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

各個崗位的離職占比如下圖所示羞芍,占比都比較接近,進一步對每個崗位類別進行卡方檢驗恶迈,各個類別的檢驗顯著性如表格所示涩金,其中統計差異最大的是‘hr’谱醇、‘management’、‘RanD’三個崗位步做,結合‘hr’離職占比較高副渴,而‘management’、‘RanD’較低的特點全度,可看出擔任‘hr’崗位的員工比其他崗位更趨向于離職煮剧,而‘management’、‘RanD’兩個崗位的員工則更趨于留下将鸵,其他崗位沒有明顯的趨向勉盅。


image.png

image.png

構建模型

分別用邏輯回歸和決策樹算法對數據集進行建模,并調整至最佳參數顶掉,其中邏輯回歸算法的預測準確率為82.2%草娜,決策樹算法的準確率為98.3%。兩種算法的ROC曲線如下圖所示痒筒,右側的決策樹AUC值較大宰闰,優(yōu)于左側的邏輯回歸,故最終選擇決策樹作為員工離職預測的算法簿透。(詳細代碼見后附代碼)
所構建的模型除了能預測員工是否會離職移袍,還能給出離職的概率大小,人力資源部門可根據結果對預測概率較高的員工優(yōu)先采取挽留措施老充。


image.png

image.png

四葡盗、分析總結

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()
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末形帮,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子周叮,更是在濱河造成了極大的恐慌辩撑,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件仿耽,死亡現場離奇詭異合冀,居然都是意外死亡,警方通過查閱死者的電腦和手機项贺,發(fā)現死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進店門君躺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人开缎,你說我怎么就攤上這事棕叫。” “怎么了奕删?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵俺泣,是天一觀的道長完残。 經常有香客問我伏钠,道長,這世上最難降的妖魔是什么谨设? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任熟掂,我火速辦了婚禮,結果婚禮上扎拣,老公的妹妹穿的比我還像新娘赴肚。我一直安慰自己,他們只是感情好二蓝,可當我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布尊蚁。 她就那樣靜靜地躺著,像睡著了一般侣夷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上仑乌,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天百拓,我揣著相機與錄音琴锭,去河邊找鬼。 笑死衙传,一個胖子當著我的面吹牛决帖,可吹牛的內容都是我干的。 我是一名探鬼主播蓖捶,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼地回,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了俊鱼?” 一聲冷哼從身側響起刻像,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎并闲,沒想到半個月后细睡,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡帝火,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年溜徙,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片犀填。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡蠢壹,死狀恐怖,靈堂內的尸體忽然破棺而出九巡,到底是詐尸還是另有隱情图贸,我是刑警寧澤,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布比庄,位于F島的核電站求妹,受9級特大地震影響,放射性物質發(fā)生泄漏佳窑。R本人自食惡果不足惜制恍,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望神凑。 院中可真熱鬧净神,春花似錦、人聲如沸溉委。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瓣喊。三九已至坡慌,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間藻三,已是汗流浹背洪橘。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工跪者, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人熄求。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓渣玲,卻偏偏與公主長得像,于是被迫代替她去往敵國和親弟晚。 傳聞我的和親對象是個殘疾皇子忘衍,可洞房花燭夜當晚...
    茶點故事閱讀 45,685評論 2 360