员工离职太正常不过了!但是如何用Python来预测离职率呢?叼爆
大数据使企业能够确定变量,预测自家公司的员工离职率。”——《哈佛商业评论》2017年8月
“员工流失分析就是评估公司员工流动率的过程,目的是预测未来的员工离职状况,减少员工流失情况。”——《福布斯》2016年3月
进群:548377875 即可获取数十套PDF哦!
import pandas as pd
hr = pd.read_csv('HR.csv')
col_names = hr.columns.tolist()
print("Column names:")
print(col_names)
print(" Sample data:")
hr.head()
我们的数据相当干净,没有缺失值:
hr.isnull().any()
数据包含了14999名员工和10个特征:
hr.shape
(14999, 10)
“left”列为结果变量,值为1或0,1代表员工离开了公司,0代表没有离开。
我们发现数据中有3571名员工离职,有11428名员工没有离职。
然后我们进一步查看这两个类别下的数字所蕴含的意义:
hr.groupby('left').mean()
几个观察结果:
留在公司的员工的平均满意程度要高于离职的员工
留在公司的员工的平均每月工作时长要多于离职的员工
出现工作事故的员工比没有出现工作事故的员工离开公司的意愿要低
过去五年中得到升职的员工比过去五年中没有升职的员工离开公司的意愿要低
数据可视化
我们将数据进行可视化,从而获取数据及重要特征的更清晰的展现。
员工的工作部分和离职频率的条形图
%matplotlib inline
import matplotlib.pyplot as plt
pd.crosstab(hr.department,hr.left).plot(kind='bar')
plt.title('Turnover Frequency for Department')
plt.xlabel('Department')
plt.ylabel('Frequency of Turnover')
plt.savefig('department_bar_chart')
我们可以看到,员工的薪资水平和离职频率有很大关系,因此薪资水平也可以作为预测结果的一个很好指标。
通常,直方图是我们在探索数据时用于分析数值变量的最有用的工具之一。
数值变量的直方图
为分类变量创建虚变量
数据集中有两个分类变量(department,salary),在用它们进行建模前需要将它们转换为虚变量。
cat_vars=['department','salary']
for var in cat_vars:
cat_list='var'+'_'+var
cat_list = pd.get_dummies(hr[var], prefix=var)
hr1=hr.join(cat_list)
hr=hr1
等创建完虚变量后,还需要移除实际的分类变量。
为分类变量创建虚变量后的列名:
hr.drop(hr.columns[[8, 9]], axis=1, inplace=True)
hr.columns.values
我们使用特征选择方法帮我们决定哪些变量非常重要,能够以很高的准确率预测员工的流动状况。现在X中一共有18个列,那么选为10个呢?
from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression
model = LogisticRegression()
rfe = RFE(model, 10)
rfe = rfe.fit(hr[X], hr[y])
print(rfe.support_)
print(rfe.ranking_)
[True True False False True True True True False True True False
False False False True True False]
[1 1 3 9 1 1 1 1 5 1 1 6 8 7 4 1 1 2]
逻辑回归准确率:0.771
随机森林
from sklearn.ensemble import RandomForestClassifier
rf = RandomForestClassifier()
rf.fit(X_train, y_train)
RandomForestClassifier(bootstrap=True, class_weight=None, criterion=’gini’, max_depth=None, max_features=’auto’, max_leaf_nodes=None, min_impurity_split=1e-07, min_samples_leaf=1, min_samples_split=2, min_weight_fraction_leaf=0.0, n_estimators=10, n_jobs=1, oob_score=False, random_state=None, verbose=0, warm_start=False)
print('Random Forest Accuracy: {:.3f}'.format(accuracy_score(y_test, rf.predict(X_test))))
随机森林准确率:0.978
10折交叉验证平均准确率:0.977
平均准确率仍然和随机森林模型的准确率非常接近,所以我们可以总结出模型的泛化能力很好。
精确度和召回率
我们构建混淆矩阵来可视化由分类器生成的预测值,并评估分类的准确率。
随机森林
逻辑回归
print(classification_report(y_test, logreg.predict(X_test)))
svc_y_pred = svc.predict(X_test)
svc_cm = metrics.confusion_matrix(svc_y_pred, y_test, [1,0])
sns.heatmap(svc_cm, annot=True, fmt='.2f',xticklabels = ["Left", "Stayed"] , yticklabels = ["Left", "Stayed"] )
plt.ylabel('True class')
plt.xlabel('Predicted class')
plt.title('Support Vector Machine')
plt.savefig('support_vector_machine')
当一名员工离职时,我们的分类器能正确预测的概率是多少呢?这种衡量方法被称为“召回率”,快速看一下这些图表可以发现随机森林的效果最好。在上面所有的离职情况中,随机森林从1038种离职情况中正确地检索出998种情况。这表明离职“召回率”达到95%(991/1038),远好于逻辑回归(26%)和支持向量机(85%)。
ROC曲线是另一种用于衡量二元分类器的常用工具。它是一条点状线,表示一个完全随机分类器的受试者工作特征曲线;一个性能良好的分类器会尽可能的远离这条线(朝左上角)。
总结
文章到这里就结束了,本文我们通过一个人力资源数据集,用Python搭建了几个机器学习模型,最终确定随机森林模型的准确率最高,最适合预测员工离职。
不过我就不列出模型预测哪些员工会离职了,毕竟这并非我们的主要目的。记住一点,我们的算法不会人人适用。虽然员工离职率分析能帮我们制定更合理的人力资源管理决策,但不要过度依赖模型的预测结果。