Python員工離職預測

這個練習是kaggle上的案例,原來已有天善智能上的鄔書豪老師分享了用R語言做的代碼,我將根據他的思路改成了Python代碼的實現過程,旨在學習數據分析的思路和加深代碼的熟練度。

這個測試的背景具有實際意義:是某大公司希望了解到員工離職的原因是什麼,另外也想知道未來哪些員工最有可能會提出離職,可以對此做好應對策略。

該數據分析的總體流程主要有先是對數據進行說明和理解,第二步進行探索性描述性分析,第三步進行建模(原文中主要通過決策樹和樸素貝葉斯),第四步進行模型的評估。

一、變數說明

二、探索性分析

1基本統計量觀察

import pandas as pdndf=pd.read_csv(D:quitHR_comma_sep.csv)ndf.describe()n

通過describe獲取基本統計量可以有個直觀的大致認識(主要看mean平均值):

left(離職率)平均大約在24%,對公司滿意度在62%,績效在72%,平均參加過3.8個項目,員工每月平均工作市場200小時

2探索離職與未離職員工在各指標上的異同

import seaborn as snsnimport matplotlib.pyplot as pltn%matplotlib inlinen#調用figure創建一個繪圖對象,並且使它成為當前的繪圖對象,同時用figsize定義繪圖對象大小nplt.figure(figsize=(10,8)) n#plt.subplot即畫子圖,221表示拆成兩行兩列,第一個位置nsns.boxplot(x=left,y=satisfaction_level,data=df,ax=plt.subplot(221))nsns.boxplot(x=left,y=average_montly_hours,data=df,ax=plt.subplot(222))nsns.boxplot(x=left,y=last_evaluation,data=df,ax=plt.subplot(223))nsns.boxplot(x=left,y=time_spend_company,data=df,ax=plt.subplot(224))n

通過這段代碼將四個變數與離職率的關係可視化的呈現出來了(前面定義中已經說了0為未離職,1為已離職),則可以得到離職員工特點:

1滿意度方面較低,大多集中在0.4左右

2月度工作時間較長,超過225小時

3績效評價較高,平均約在0.8

4工作年限在4年左右

關於箱線圖的看法,分別是最上最下為最大最小值,箱體上下兩個邊界為上下四分位數,箱體中間的黑線為中位數。

2探索參與項目個數,五年內有沒有升職和薪資與離職之間的關係

方法同上,鞏固seaborn繪圖代碼,採用countplot

plt.figure(figsize=(15,8))nsns.countplot(x=number_project,hue=left,data=df,ax=plt.subplot(131))nsns.countplot(x=promotion_last_5years,hue=left,data=df,ax=plt.subplot(132))nsns.countplot(x=salary,hue=left,data=df,ax=plt.subplot(133))n

得出結論:1不考慮項目數為2的情況的話,參加項目數越多的人群中,離職比率越高

2 5年內沒升職的離職比例高

3 工資越高,離職比率越低

三、模型預測

這裡根據要求是預測老員工的離職情況,這裡原作者定義了老員工是績效>=0.7或工作年限大於等於4年,或項目數大於5個,故先通過pandas進行篩選。

from sklearn import treenfrom sklearn.model_selection import train_test_splitnfrom sklearn import preprocessingnfrom sklearn import metricsnimport numpy as npnnew=df.loc[(df[last_evaluation]>=0.7)|(df[time_spend_company]>=4)|(df[number_project]>5)]nfeatures=[salary,sales]nle=preprocessing.LabelEncoder()nfor feature in features:n le=le.fit(df[feature])n new[feature]=le.transform(new[feature])nX=new.drop(left,axis=1)ny=new[left]ndt=tree.DecisionTreeClassifier()nX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.3,random_state=1234)ndt.fit(X_train,y_train)ny_predict = dt.predict(X_test)nprint(metrics.confusion_matrix(y_test,y_predict))n

結果顯示如下:

[[2257 78]

[ 27 570]]

這裡引入了混淆矩陣來作為衡量模型的一個準則:

對於這個預測來說,通過兩個比率來描述準確性:

查准率:真正例/(真正例+假正例)=570/(570+27)=95.5%(體現預測的離職人數的準確率)

查全率:真正例/(真正例+假反例)=570/(570+78)=88.0%(體現預測的離職人數是否完全)

同樣地,還用了樸素貝葉斯進行建模:

from sklearn.naive_bayes import GaussianNBnnb=GaussianNB()nnb.fit(X_train,y_train)ny_predict = nb.predict(X_test)nprint(metrics.confusion_matrix(y_test,y_predict))n

查准率為:514/(514+83)=86.1%

查全率為:514/(514+236)=68.5%

四、模型評估

這裡主要根據ROC和AUC,不過這一塊的統計概念和圖形繪製還不是很熟練,等待後續學習更新。。

不過基於查准率和查全率我們已經可以看到,在這個數據集上,採用決策樹的效果要好於樸素貝葉斯

推薦閱讀:

Django學習筆記一:搭建簡易博客
[19] Python集合與字典
使用Celery
Python進階課程筆記(四)

TAG:Python | Python入门 | Kaggle |