全文阅读路线:

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的离职概率也很大。


推荐阅读:
查看原文 >>
相关文章