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進階課程筆記(四)