CDA数据分析师前言:大数据使企业能够确定变量并预测自己公司的员工离职率。》——《哈佛商业评论》August2017《员工流失分析是评估公司员工流失率的过程,目的是预测未来的员工流失率,减少员工流失率。》——《福布斯》2016年3月一、背景介绍1、数据来源本项目数据集来自DataCastle训练赛。数据及代码链接:https://pan.baidu.com/s/1--beIhOAQNqo7KYpuX69ZA密码:ca1s2数据说明本次比赛使用的数据取自IBMWatsonAnalytics分析平台共享的样本数据,我们只选取了其中的一个子集,并对数据做了一些预处理,使数据更符合逻辑回归分析模型的要求数据主要包括影响员工离职的各种因素(薪酬、出差、工作环境满意度、工作投入度、加班、晋升、加薪比例等)以及是否离职的相应记录员工离职了,数据分为训练数据和测试数据,分别存放在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。头()2。数据信息探索http://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('性别和年龄vsAttrtion');4.2工作级别、部门和离职图f,ax=plt.subplots(1,2,figsize=(20,8))sns.countplot('JobLevel',hue='Attrition',data=train,ax=ax[0])ax[0].set_title('JobLevelvsAttrition')sns.countplot('Department',hue='Attrition',data=train,ax=ax[1])ax[1].set_title('部门与损耗');4.3月收入与离职图f,ax=plt.subplots(1,2,figsize=(20,8))sns.distplot(train[train['Attrition']==1].MonthlyIncome,ax=ax[0])ax[0].set_title('MonthlyIncomevsAttrition=1')sns.distplot(train[train['Attrition']==0].MonthlyIncome,ax=ax[1])ax[1].set_title('MonthlyIncomevsAttrition=0');4.4婚姻状况、性别与离职的关系sns.factorplot('MaritalStatus','Attrition',data=train,col='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('BusinessTravel','Attrition',data=train,ax=ax[1])ax[1].set_title('BusinessTravelvsAttrition')plt.close(2);从上图可以看出,离职人员的特征包括年龄小、男性多、单身、月收入低、加班等。三、数据预处理1、字符型变量数值型sklearn只允许数值型变量进入建模,因此需要提前将特征变量数字化,为后续建模做准备。filteroutcharactervariablescol=[]foriintrain.columns:iftrain.loc[:,i].dtype=='object':col.append(i)从sklearn导入数据类型转换的相关模块。预处理importOrdinalEncodertrain.loc[:,col]=OrdinalEncoder().fit_transform(train.loc[:,col])train.loc[:,col].head()2.相关性检验Logistic回归属于广义线性回归,要求自变量之间的独立性,所以这里我们使用皮尔逊相关系数来检验自变量之间的相关性,进一步筛选相关性高的特征。sns.heatmap(train.corr(),annot=True)#train.corr()-->相关矩阵fig=plt.gcf()fig.set_size_inches(20,20);其中,月收入与工作级别的相关性为强正相关,这里我们保留工作级别,删除月收入这个自变量。3.分类变量one-hotencoding为什么要用one-hotencoding?通过one-hotencoding将离散的特征映射到欧几里得空间,因为在回归、分类、聚类等机器学习算法中,特征间距离的计算或者相似度的计算非常重要,而我们常用的距离或者相似度的计算是欧氏空间中的相似度计算,余弦相似度的计算是基于欧氏空间的。使用one-hot编码的优缺点?优点:one-hotencoding解决了分类器不易处理属性数据的问题,也在一定程度上起到了扩展特征的作用。它的值只有0和1,不同的类型存储在垂直空间。缺点:当类别数量很多时,特征空间变得非常大。这种情况一般可以使用PCA降维。而onehotencoding+PCA的组合在实践中也非常有用。X=train.loc[:,train.columns!='Attrition']Y=train.loc[:,'Attrition']X_onehot=X.drop(['Age','NumCompaniesWorked','PercentSalaryHike','TotalWorkingYears','YearsAtCompany','YearsInCurrentRole','YearsSinceLastPromotion','YearsWithCurrManager'],axis=1)fromsklearn.preprocessingimportOneHotEncoderX_onehot=OneHotEncoder().fit_transform(X_onehot)X_onehot=X_onehot.toarray()X_other=[:,['Age','NumCompaniesWorked','PercentSalaryHike','TotalWorkingYears','YearsAtCompany','YearsInCurrentRole','YearsSinceLastPromotion','YearsWithCurrManager']]X_other.shapeX=pd.concat([pd.DataFrame(X_onehot),X_other],axis=1)X.shape4.模型学习1.划分训练集和验证集fromsklearn.model_selectionimporttrain_test_splitXtrain,Xtest,Ytrain,Ytest=train_test_split(X,Y,test_size=0.2,random_state=42)Xtrain.shape2。逻辑回归模型构建fromsklearn.linear_modelimportLogisticRegressionLR=LogisticRegression().fit(Xtrain,Ytrain)LR.score(Xtest,Ytest)初步模型结果为0.84,需要进一步调参。3.模型评估fromsklearn.metricsimportrecall_scorerecall_score(Ytest,LR.predict(Xtest))1类样本的召回率略低,只有0.42。可以考虑是否做样本不平衡处理。5.模型调整参数fromsklearn.model_selectionimportGridSearchCVparams={'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_)print(gd.best_params_)LR_o=LogisticRegression(penalty='l1',C=1.2000000000000002).fit(Xtrain,Ytrain)LR_o.score(Xtest,Ytest)调参效果不错,训练集准确率提升到0.88,验证集准确率也达到了0.85。6.预测分析模型建立后,需要读入测试集,进行预测。这里需要注意的是,测试集需要和训练集一样对待:包括删除变量、转换数据类型、one-hotencoding。test=test.drop(['EmployeeNumber','Over18','MonthlyIncome'],axis=1)过滤掉字符变量col=[]foriintest.columns:iftest.loc[:,i].dtype=='object':col.append(i)fromsklearn.preprocessingimportOrdinalEncodertest.loc[:,col]=OrdinalEncoder().fit_transform(test.loc[:,col])test.loc[:,col]].head()test_onehot=test.drop(['Age','NumCompaniesWorked','PercentSalaryHike','TotalWorkingYears','YearsAtCompany','YearsInCurrentRole','YearsSinceLastPromotion','YearsWithCurrManager'],axis=1)来自sklearn.preprocessingimportOneHotEncodertest_onehot=OneHotEncoder().fit_transform(test_onehot)test_onehot=test_onehot.toarray()test_other=test.loc[:,['Age','NumCompaniesWorked','PercentSalaryHike','TotalWorkingYears','YearsAtCompany','YearsInCurrentRole','YearsSinceLastPromotion','YearsWithCurrManager']]test_other.shapeX=pd.concat([pd.DataFrame(test_onehot),test_other],axis=1)X.shapesolution=pd.DataFrame({'result':LR_o.predict(X)})solutionsolution解决方案由我们的adjuste测试型号得到测试集预测的最终结果后,我们可以将其上传到竞赛平台,与真实值进行对比。本课件中的代码结果在测试集中的预测准确率为0.91428。预测结果意义重大,可用于实际业务中的辅助决策。7.总结通过测试集的观察,公司员工离职情况可以总结为:当前离职率为11.82%;由于企业培养人才需要大量成本,为防止人才再次流失,应注意解决人才流失的问题,即留人。另外,如果在招人的时候注意一些问题,也可以在一定程度上减少人才流失。所以这里我们可以把对策分为两种,一种是留人,一种是招人。人为对策。留人策略建立良好的薪酬体系建立清晰的晋升机制完善奖惩机制,使能干的人也能实现更多元化的福利,提高员工对公司的忠诚度重视企业文化建设,树立共同价值观鼓励员工自我提升…………………………………………………………………………………………………………………………………………………………………………………………招聘措施明确公司招聘需求,员工能力应匹配职位要求,而不是为指标招聘。承诺需要建立完整的兑现政策,迎接优秀流失人才的回归……更多优质内容,您可以前往:当前疫情放缓,也是提升自我和提升自我的好时机为未来积蓄能量——蓄势待发!
