全文閱讀路線:

1. 數據理解2. 數據概覽3. 數據清洗4. 建立模型

5. 數據預測

1. 數據理解

在此項目中,我們通過已有的相關數據指標來分析預測員工的辭職概率,即判斷該員工近期是否會離職。

原數據表部分截圖

satisfaction_level: 該員工對公司的滿意度(取值為0-1)

last_evaluation: 該員工的最新績效評估(取值為0-1)number_project: 該員工總共完成的項目數(整數)average_monthly_hours: 平均每月工作時長(整數)

time_spend_company: 在職年數(整數)

work_accident:是否出現過工作事故(0表示未出現過,1表示出現過事故)left:是否已經離職(0表示仍在職,1表示已離職)

promotion_last_5years:在過去的5年中是否得到過升職(0:未升職,1:升職過)

sales:工作崗位(崗位名稱)salary:薪資水平(共三檔:low、medium、high)

2. 數據概覽

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

#導入數據集
df = pd.read_csv(r"F:Setsemployeedata.csv")
df.head().T #顯示前五行,並轉置顯示

df.describe().T #數據集描述,並轉置顯示

數據集一共14999行有效記錄,10列屬性。

#重命名列名
df.rename(columns={satisfaction_level:滿意度, last_evaluation:最新績效評估,
number_project:項目數,average_montly_hours:平均每月工時,
time_spend_company:在職時長,Work_accident:工作事故,
left:是否離職,promotion_last_5years:是否升職,
sales:崗位,salary:薪資水平}, inplace = True)
df.head()

3. 數據清洗

#各屬性的相關性
%matplotlib inline
plt.rcParams[font.sans-serif]=[SimHei] #正常顯示中文標籤
plt.rcParams[axes.unicode_minus]=False #用來正常顯示負號
df_corr=df.corr()
plt.figure(figsize=(10,10))
sns.heatmap(df_corr,annot=True,square=True,cmap="YlGnBu")
#顯示相關係數 #正方形 #黃綠藍
plt.title(各屬性相關性矩陣熱圖)

輸出各屬性與因變數「是否離職」相關性,並排序

「最新績效評估」與「是否離職」的相關性過小,可在建模時剔除該列數據。

#已離職員工對公司的滿意度和最新績效評估
plt.subplots(figsize=(6,4))
plt.plot(df[滿意度][df[是否離職]==1],
df[最新績效評估][df[是否離職]==1],
ro,alpha=0.2)
plt.xlabel(滿意度,fontsize=20) #設定字體大小
plt.ylabel(最新績效評估,fontsize=20)
plt.title(已離職員工,fontsize=20)

由上圖,我們可以發現,在只考慮「最新績效評估」和「滿意度」的情況下,離職者可主要分為三類:

  • 最新績效評估較高,但對公司滿意度低。該類離職者可能是由於不滿足於所在崗位,可定義為「失落者」;
  • 最新績效評估低,對公司滿意度偏低。該類離職者可能是被迫離職,可定義為「失敗者」;
  • 最新績效評估高,對公司滿意度也高。該類離職者可能是由於能力出眾被其它公司挖走,可定義為「成功者」。

##在職員工對公司的滿意度和最新績效評估
plt.subplots(figsize=(6,4))
plt.plot(df[滿意度][df[是否離職]==0],
df[最新績效評估][df[是否離職]==0],
go,alpha=0.2)
plt.xlabel(滿意度,fontsize=20)
plt.ylabel(最新績效評估,fontsize=20)
plt.title(在職員工,fontsize=20)

4. 建立模型

#導入包
from sklearn.model_selection import train_test_split #數據拆分
from sklearn.metrics import mean_squared_error #均方誤差
from sklearn.cross_validation import cross_val_score #交叉驗證
from sklearn.tree import DecisionTreeClassifier #決策樹
from sklearn.ensemble import RandomForestClassifier #隨機森林

# 分類變數轉換為啞變數
X= pd.get_dummies(df.drop([是否離職,最新績效評估],axis=1))
y=df[是否離職]

二八拆分

下面,調用決策樹演算法,並獲得演算法模型的精確度得分,7輪交叉驗證得分及預測結果與實際值的均方誤差。

決策樹

下面,調用隨機森林演算法,並獲得演算法模型的精確度得分,7輪交叉驗證得分及預測結果與實際值的均方誤差。

隨機森林

通過比較得分可發現,隨機森林演算法比決策樹演算法的精確度更高。

#特徵排名及其分數
for i in range(X.shape[1]):
print(%d.feature %d %s(%f)%(i+1,indices[i],
X.columns[indices[i]],
rmf.feature_importances_[indices[i]]))

from sklearn.grid_search import GridSearchCV #網格搜索
param_grid={max_depth:np.arange(1,50)} #最大深度

grid=GridSearchCV(rmf,param_grid,cv=7)
grid.fit(X_train,y_train)

5. 數據預測

now_stay = df[df[是否離職] == 0] #選取在職員工數據
now_stay = pd.get_dummies(now_stay) #轉換為啞變數
now_stay_information = now_stay.drop([是否離職,最新績效評估], axis=1)
now_stay_label = now_stay[是否離職]
predict = rmf.predict_proba(now_stay_information) #進行預測
print(sum(predict[:, 1] == 1)) #預測必定會離職的員工數量
now_stay[maybe leave company]=predict[:,1] #將預測值添加進入原預測數據
print(now_stay[now_stay[maybe leave company]>=0.5].sort_values(
maybe leave company,ascending=False))
#篩選離職概率大於0.5的員工記錄,並從按離職概率大到小排序
now_stay[now_stay[maybe leave company]>=0.5].sort_values(
maybe leave company,
ascending=False).to_csv(
rC:UsersAdministratorDesktoppredict.csv)
#導出到CSV文件

經Excel整理後部分表格數據

預測結果分析:

共28名員工有可能會離職,其中員工編號為 7732 和 5149 最有可能離職,員工編號為 6466 和 2261的離職概率也很大。


推薦閱讀:
查看原文 >>
相關文章