赛题来自:datacastle
任务
从给定的影响员工离职的因素和员工是否离职的记录,建立一个逻辑回归模型预测有可能离职的员工
数据
数据主要包括影响员工离职的各种因素(工资、出差、工作环境满意度、工作投入度、是否加班、是否升职、工资提升比例等)以及员工是否已经离职的对应记录。
主要字段说明
- Age:员工年龄
- Attrition:员工是否已经离职,1表示已经离职,2表示未离职,这是目标预测值;
- BusinessTravel:商务差旅频率,Non-Travel表示不出差,Travel_Rarely表示不经常出差,Travel_Frequently表示经常出差;
- Department:员工所在部门,Sales表示销售部,Research & Development表示研发部,Human Resources表示人力资源部;
- DistanceFromHome:公司跟家庭住址的距离,从1到29,1表示最近,29表示最远;
- Education:员工的教育程度,从1到5,5表示教育程度最高;
- EducationField:员工所学习的专业领域,Life Sciences表示生命科学,Medical表示医疗,Marketing表示市场营销,Technical Degree表示技术学位,Human Resources表示人力资源,Other表示其他;
- EmployeeNumber:员工号码;
- EnvironmentSatisfaction:员工对于工作环境的满意程度,从1到4,1的满意程度最低,4的满意程度最高;
- Gender:员工性别,Male表示男性,Female表示女性;
- JobInvolvement:员工工作投入度,从1到4,1为投入度最低,4为投入度最高;
- JobLevel:职业级别,从1到5,1为最低级别,5为最高级别;
- JobRole:工作角色:Sales Executive是销售主管,Research Scientist是科学研究员,Laboratory Technician实验室技术员,Manufacturing Director是制造总监,Healthcare Representative是医疗代表,Manager是经理,Sales Representative是销售代表,Research Director是研究总监,Human Resources是人力资源;
- JobSatisfaction:工作满意度,从1到4,1代表满意程度最低,4代表满意程度最高;
- MaritalStatus:员工婚姻状况,Single代表单身,Married代表已婚,Divorced代表离婚;
- MonthlyIncome:员工月收入,范围在1009到19999之间;
- NumCompaniesWorked:员工曾经工作过的公司数;
- Over18:年龄是否超过18岁;
- OverTime:是否加班,Yes表示加班,No表示不加班;
- PercentSalaryHike:工资提高的百分比;
- PerformanceRating:绩效评估;
- RelationshipSatisfaction:关系满意度,从1到4,1表示满意度最低,4表示满意度最高;
- StandardHours:标准工时;
- StockOptionLevel:股票期权水平;
- TotalWorkingYears:总工龄;
- TrainingTimesLastYear:上一年的培训时长,从0到6,0表示没有培训,6表示培训时间最长;
- WorkLifeBalance:工作与生活平衡程度,从1到4,1表示平衡程度最低,4表示平衡程度最高;
- YearsAtCompany:在目前公司工作年数;
- YearsInCurrentRole:在目前工作职责的工作年数
- YearsSinceLastPromotion:距离上次升职时长
- YearsWithCurrManager:跟目前的管理者共事年数;
测试数据主要包括350条记录,30个字段,跟训练数据的不同是测试数据并不包括员工是否已经离职的记录;
通过由训练数据所建立的模型以及所给的测试数据,得出测试数据相应的员工是否已经离职的预测。
预处理
这里还是借助google colab 平台来练习
import pandas as pd
data = pd.read_csv('pfm_train.csv')
data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1100 entries, 0 to 1099
Data columns (total 31 columns):
Age 1100 non-null int64
Attrition 1100 non-null int64
BusinessTravel 1100 non-null object
Department 1100 non-null object
DistanceFromHome 1100 non-null int64
Education 1100 non-null int64
EducationField 1100 non-null object
EmployeeNumber 1100 non-null int64
EnvironmentSatisfaction 1100 non-null int64
Gender 1100 non-null object
JobInvolvement 1100 non-null int64
JobLevel 1100 non-null int64
JobRole 1100 non-null object
JobSatisfaction 1100 non-null int64
MaritalStatus 1100 non-null object
MonthlyIncome 1100 non-null int64
NumCompaniesWorked 1100 non-null int64
Over18 1100 non-null object
OverTime 1100 non-null object
PercentSalaryHike 1100 non-null int64
PerformanceRating 1100 non-null int64
RelationshipSatisfaction 1100 non-null int64
StandardHours 1100 non-null int64
StockOptionLevel 1100 non-null int64
TotalWorkingYears 1100 non-null int64
TrainingTimesLastYear 1100 non-null int64
WorkLifeBalance 1100 non-null int64
YearsAtCompany 1100 non-null int64
YearsInCurrentRole 1100 non-null int64
YearsSinceLastPromotion 1100 non-null int64
YearsWithCurrManager 1100 non-null int64
dtypes: int64(23), object(8)
memory usage: 266.5+ KB
可以看到没有缺失值
这里有数值特征还有类别特征,需要把类别特征统一为数值型,这里先看看不同特征对应的离职率,以观察特征的相关性
1、年龄分布
data[['Age','Attrition']].groupby(['Age']).mean().plot.bar()
可以看到十几二十的年轻人比四十多岁的中年人较容易离职
2、出差频率分布
data[['BusinessTravel','Attrition']].groupby(['BusinessTravel']).mean().plot.bar()
这里看到出差越多离职的概率越大
其他特征也可以同样获得分布图
接下来是去除相关性不大(该属性下不同的值离职率差别不大)的特征,保留剩余的特征利用逻辑回归、神经网络、决策树来判别。代码待补充~