python统计分析之HR如何更好察觉员工的潜在离职因素前言:大数据使企业能够确定变量,预测自家公司的员工离职率。”——《哈佛商业评论》2 017年8月“员工流失分析就是评估公司员工流动率的过程,目的是预测未来的员工离职状况,减少员工流失情况。”——《福布斯》2016 年3月一、背景介绍1.数据来源本项目数据集来自DataCastle训练赛。数据及代码链接:https://pan.baidu.c om/s/1--beIhOAQNqo7KYpuX69ZA密码:ca1s2.数据说明比赛所用到的数据取自于IBMWatson Analytics分析平台分享的样例数据。我们只选取了其中的子集,并对数据做了一些预处理使数据更加符合逻辑回归分析模型的要求。数据 主要包括影响员工离职的各种因素(工资、出差、工作环境满意度、工作投入度、是否加班、是否升职、工资提升比例等)以及员工是否已经离职的 对应记录。数据分为训练数据和测试数据,分别保存在pfmtrain.csv和pfmtest.csv两个文件中。3.分析目的测试数 据主要包括350条记录,30个字段,跟训练数据的不同是测试数据并不包括员工是否已经离职的记录,学员需要通过由训练数据所建立的模型以 及所给的测试数据,得出测试数据相应的员工是否已经离职的预测。二、数据探索性分析1.数据读取pd.set_option(''max _columns'',50)train=pd.read_csv(''pfm_train.csv'')train.head()test =pd.read_csv(''pfm_test.csv'')test.head()2.数据信息探索train.info()3. 删除无用特征train[''Over18''].value_counts()#只包含一种属性train=train.drop( [''EmployeeNumber'',''Over18''],axis=1)#删除无用特征4.描述性统计4.1年龄、性别与是否离 职关系图f,ax=plt.subplots(1,2,figsize=(18,8))sns.violinplot("Gender", "Age",hue="Attrition",data=train,split=True,ax=ax[0])ax[0].set_ title(''GenderandAgevsAttrtion'');4.2工作水平、部门与是否离职关系图f,ax=plt.s ubplots(1,2,figsize=(20,8))sns.countplot(''JobLevel'',hue=''Attritio n'',data=train,ax=ax[0])ax[0].set_title(''JobLevelvsAttrition'')sn s.countplot(''Department'',hue=''Attrition'',data=train,ax=ax[1])ax[1 ].set_title(''DepartmentvsAttrition'');4.3月收入与离职情况关系图f,ax=plt.su bplots(1,2,figsize=(20,8))sns.distplot(train[train[''Attrition'']== 1].MonthlyIncome,ax=ax[0])ax[0].set_title(''MonthlyIncomevsAttri tion=1'')sns.distplot(train[train[''Attrition'']==0].MonthlyIncome,a x=ax[1])ax[1].set_title(''MonthlyIncomevsAttrition=0'');4.4婚姻状况、 性别与是否离职关系图sns.factorplot(''MaritalStatus'',''Attrition'',data=train,c ol=''Gender'');4.5出差情况与是否离职关系图f,ax=plt.subplots(1,2,figsize=(20,8) )sns.barplot(''BusinessTravel'',''Attrition'',data=train,ax=ax[0])ax[ 0].set_title(''BusinessTravelvsAttrition'')sns.factorplot(''Busine ssTravel'',''Attrition'',data=train,ax=ax[1])ax[1].set_title(''Busine ssTravelvsAttrition'')plt.close(2);综上图可以看出,离职人员特征包括偏年轻化,男性稍多,单身, 月收入较低,加班等。三、数据预处理1.字符型变量数值化sklearn只允许数值类型变量进入模型学,所以需要提前将字符型变量数值化 ,为后续建模做准备。#筛选出字符型的变量col=[]foriintrain.columns:iftrain.loc [:,i].dtype==''object'':col.append(i)#导入相关模块进行数据类型转换fromsklearn .preprocessingimportOrdinalEncodertrain.loc[:,col]=OrdinalEnc oder().fit_transform(train.loc[:,col])train.loc[:,col].head()2.相 关性检验逻辑回归属于广义线性回归,对自变量间的独立性有所要求,所以在这里我们使用皮尔逊相关系数对自变量进行相关性检验,对相关性较高 的特征进行进一步筛选。sns.heatmap(train.corr(),annot=True)#train.corr()-->c orrelationmatrixfig=plt.gcf()fig.set_size_inches(20,20);其中月收入与职位 级别相关性呈强正相关关系,在这里我们保留职位级别,将月收入自变量删除。3.分类变量独热编码为什么使用独热编码?将离散特征通过on e-hot编码映射到欧式空间,是因为,在回归,分类,聚类等机器学习算法中,特征之间距离的计算或相似度的计算是非常重要的,而我们常用 的距离或相似度的计算都是在欧式空间的相似度计算,计算余弦相似性,基于的就是欧式空间。使用独热编码的优缺点?优点:独热编码解决了分类 器不好处理属性数据的问题,在一定程度上也起到了扩充特征的作用。它的值只有0和1,不同的类型存储在垂直的空间。缺点:当类别的数量很多 时,特征空间会变得非常大。在这种情况下,一般可以用PCA来减少维度。而且onehotencoding+PCA这种组合在实际中也 非常有用。X=train.loc[:,train.columns!=''Attrition'']Y=train.loc[:,'' Attrition'']X_onehot=X.drop([''Age'',''NumCompaniesWorked'',''Percent SalaryHike'',''TotalWorkingYears'',''YearsAtCompany'',''YearsInCurrentR ole'',''YearsSinceLastPromotion'',''YearsWithCurrManager''],axis=1)f romsklearn.preprocessingimportOneHotEncoderX_onehot=OneHotEn coder().fit_transform(X_onehot)X_onehot=X_onehot.toarray()X_oth er=X.loc[:,[''Age'',''NumCompaniesWorked'',''PercentSalaryHike'',''Tot alWorkingYears'',''YearsAtCompany'',''YearsInCurrentRole'',''YearsSinc eLastPromotion'',''YearsWithCurrManager'']]X_other.shapeX=pd.conc at([pd.DataFrame(X_onehot),X_other],axis=1)X.shape四、模型学习1.划分训练集和 验证集fromsklearn.model_selectionimporttrain_test_splitXtrain,Xte st,Ytrain,Ytest=train_test_split(X,Y,test_size=0.2,random_state =42)Xtrain.shape2.逻辑回归模型构建fromsklearn.linear_modelimportLogis ticRegressionLR=LogisticRegression().fit(Xtrain,Ytrain)LR.score (Xtest,Ytest)初步模型结果为0.84,还需待进一步调参。3.模型评估fromsklearn.metricsimp ortrecall_scorerecall_score(Ytest,LR.predict(Xtest))1类样本召回率略低,只有 0.42。可以考虑是否要做样本不均衡性处理。五、模型调参fromsklearn.model_selectionimportG ridSearchCVparams={''penalty'':[''l1'',''l2''],''C'':np.arange(1,10,0. 1)}gd=GridSearchCV(LogisticRegression(solver=''liblinear''),param _grid=params,cv=10)gd.fit(Xtrain,Ytrain)print(gd.best_score_)prin t(gd.best_params_)LR_o=LogisticRegression(penalty=''l1'',C=1.2000 000000000002).fit(Xtrain,Ytrain)LR_o.score(Xtest,Ytest)调参结果不错,训练集 准确率提升到了0.88,验证集准确率也达到了0.85.六、预测分析模型建立完成之后,就需要读入测试集并进行预测。这里注意,需要对测 试集按照训练集进行相同处理:包括删除变量、转换数据类型、独热编码等操作。test=test.drop([''EmployeeNu mber'',''Over18'',''MonthlyIncome''],axis=1)#筛选出字符型的变量col=[]forii ntest.columns:iftest.loc[:,i].dtype==''object'':col.append(i)f romsklearn.preprocessingimportOrdinalEncodertest.loc[:,col]= OrdinalEncoder().fit_transform(test.loc[:,col])test.loc[:,col].he ad()test_onehot=test.drop([''Age'',''NumCompaniesWorked'',''PercentS alaryHike'',''TotalWorkingYears'',''YearsAtCompany'',''YearsInCurrentRo le'',''YearsSinceLastPromotion'',''YearsWithCurrManager''],axis=1)f romsklearn.preprocessingimportOneHotEncodertest_onehot=OneHo tEncoder().fit_transform(test_onehot)test_onehot=test_onehot.to array()test_other=test.loc[:,[''Age'',''NumCompaniesWorked'',''Perce ntSalaryHike'',''TotalWorkingYears'',''YearsAtCompany'',''YearsInCurren tRole'',''YearsSinceLastPromotion'',''YearsWithCurrManager'']]test_o ther.shapeX=pd.concat([pd.DataFrame(test_onehot),test_other],ax is=1)X.shapesolution=pd.DataFrame({''result'':LR_o.predict(X)})so lutionsolution是通过我们已经调整好的模型对测试集做预测的最终结果。得到结果之后,我们就可以上传至竞赛平台与真实值进行 对比了。本课件中的代码结果在测试集中预测准确率达0.91428,预测结果显著并可以为实际业务进行辅助决策。七、总结通过对测试集的观 察,该公司的员工离职现状可以总结如下:当前离职率为11.82%;由于企业培养人才是需要大量的成本,为了防止人才再次流失,因此应当注重解决人才的流失问题,也就是留人,另外如果在招人时注意某些问题,也能在一定程度上减少人才流失.因此,这里可将对策分为两种,一种是留人对策,一种是招人对策。留人对策建立良好的薪酬制度建立明朗的晋升机制完善奖惩机制,能者多劳,也应多得实现福利多样化,增加员工对企业的忠诚度重视企业文化建设,树立共同的价值观鼓励员工自我提升………………招人对策明确企业招聘需求,员工的能力应当与岗位需求相匹配,而不是为指标而招与应聘者坦诚相见,不得为了指标而诓骗应聘者招聘期间给予的相关承诺需要建立完备的兑现政策欢迎优秀流失人才回归…………CDA数据分析师(CDA.cn)——真本事,心舒适! |
|