员工一言不合就离职怎么办?我用Python写了个员工流失预测模型( 二 )


员工一言不合就离职怎么办?我用Python写了个员工流失预测模型

文章插图
职位晋升
从条形图可以看出,在过去5年内获得未晋升的员工离职率为24.2%,比获得晋升的员工高4倍 。设定良好的晋升通道可以很好的防止员工流失 。
员工一言不合就离职怎么办?我用Python写了个员工流失预测模型

文章插图
薪资水平
可明显看出,薪资越高离职人数越少 。证明为了减少离职率,提升员工福利待遇是一个可行的手段 。
员工一言不合就离职怎么办?我用Python写了个员工流失预测模型

文章插图
不同部门
可见各部门离职率如上图,离职率由高到低,前三位分别是:人力部、财务部、科技部 。之后依次是:支持部、销售部、市场部、IT部门、产品部、研发部、管理部 。对于离职率过高的部门,应进一步分析关键原因 。
员工一言不合就离职怎么办?我用Python写了个员工流失预测模型

文章插图
04
数据预处理
由于在建模时不接受类别型变量,我们主要对数据做以下处理,以方便后续建模分析:
# 数据转换df['salary'] = df['salary'].map({"low": 0, "medium": 1, "high": 2})# 哑变量df_dummies = pd.get_dummies(df,prefix='sales')df_dummies.head()
员工一言不合就离职怎么办?我用Python写了个员工流失预测模型

文章插图
05
建模分析
我们使用决策树和随机森林进行模型建置,首先导入所需包:
from sklearn.model_selection import train_test_split, GridSearchCVfrom sklearn.tree import DecisionTreeClassifierfrom sklearn.ensemble import RandomForestClassifierfrom sklearn.metrics import classification_report, f1_score, roc_curve, plot_roc_curve
然后划分训练集和测试集,采用分层抽样方法划分80%数据为训练集,20%数据为测试集 。
x = df_dummies.drop('left', axis=1)y = df_dummies['left']X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.2, stratify=y, random_state=2020)print(X_train.shape, X_test.shape, y_train.shape, y_test.shape)
决策树
员工一言不合就离职怎么办?我用Python写了个员工流失预测模型

文章插图
我们使用决策树进行建模,设置特征选择标准为gini,树的深度为5 。输出分类的评估报告:
# 训练模型clf = DecisionTreeClassifier(criterion='gini', max_depth=5, random_state=25)clf.fit(X_train, y_train)train_pred = clf.predict(X_train)test_pred = clf.predict(X_test)print('训练集:', classification_report(y_train, train_pred))print('-' * 60) print('测试集:', classification_report(y_test, test_pred))
训练集:precisionrecallf1-scoresupport00.980.990.98914210.970.930.952857accuracy0.9811999macro avg0.970.960.9711999weighted avg0.980.980.9711999------------------------------------------------------------测试集:precisionrecallf1-scoresupport00.980.990.98228610.970.930.95714accuracy0.983000macro avg0.970.960.973000weighted avg0.980.980.983000
假设我们关注的是1类(即离职类)的F1-score,可以看到训练集的分数为0.95,测试集分数为0.95 。
# 重要性imp = pd.DataFrame([*zip(X_train.columns,clf.feature_importances_)], columns=['vars', 'importance'])imp.sort_values('importance', ascending=False)imp = imp[imp.importance!=0]imp
员工一言不合就离职怎么办?我用Python写了个员工流失预测模型

文章插图
在属性的重要性排序中,员工满意度最高,其次是最新的绩效考核、参与项目数、每月工作时长 。