精华内容
下载资源
问答
  • 员工离职预测

    2017-10-16 14:35:00
    员工离职预测 library(dplyr)library(psych)library(ggplot2) library(randomForest) str(train) 'data.frame': 1100 obs. of 31 variables: $ X...Age : int 37 54 34 39 28 24 29 ...

    员工离职预测

    library(dplyr)
    library(psych)
    library(ggplot2)

    library(randomForest)

    
    

    str(train)

    'data.frame':    1100 obs. of  31 variables:
     $ X...Age                 : int  37 54 34 39 28 24 29 36 33 34 ...
     $ Attrition               : int  0 0 1 0 1 0 0 0 0 0 ...
     $ BusinessTravel          : Factor w/ 3 levels "Non-Travel","Travel_Frequently",..: 3 2 2 3 2 3 3 3 3 3 ...
     $ Department              : Factor w/ 3 levels "Human Resources",..: 2 2 2 2 2 3 2 3 2 2 ...
     $ DistanceFromHome        : int  1 1 7 1 1 4 9 2 4 2 ...
     $ Education               : int  4 4 3 1 3 1 5 2 4 4 ...
     $ EducationField          : Factor w/ 6 levels "Human Resources",..: 2 2 2 2 4 4 5 4 4 6 ...
     $ EmployeeNumber          : int  77 1245 147 1026 1111 1445 455 513 305 1383 ...
     $ EnvironmentSatisfaction : int  1 4 1 4 1 4 2 2 3 3 ...
     $ Gender                  : Factor w/ 2 levels "Female","Male": 2 1 2 1 2 1 2 2 1 1 ...
     $ JobInvolvement          : int  2 3 1 2 2 3 2 2 2 3 ...
     $ JobLevel                : int  2 3 2 4 1 2 1 3 1 2 ...
     $ JobRole                 : Factor w/ 9 levels "Healthcare Representative",..: 5 5 3 5 3 8 3 8 7 1 ...
     $ JobSatisfaction         : int  3 3 3 4 2 3 4 3 2 4 ...
     $ MaritalStatus           : Factor w/ 3 levels "Divorced","Married",..: 1 1 3 2 1 2 3 2 2 3 ...
     $ MonthlyIncome           : int  5993 10502 6074 12742 2596 4162 3983 7596 2622 6687 ...
     $ NumCompaniesWorked      : int  1 7 1 1 1 1 0 1 6 1 ...
     $ Over18                  : Factor w/ 1 level "Y": 1 1 1 1 1 1 1 1 1 1 ...
     $ OverTime                : Factor w/ 2 levels "No","Yes": 1 1 2 1 1 2 1 1 1 1 ...
     $ PercentSalaryHike       : int  18 17 24 16 15 12 17 13 21 11 ...
     $ PerformanceRating       : int  3 3 4 3 3 3 3 3 4 3 ...
     $ RelationshipSatisfaction: int  3 1 4 3 1 3 3 2 4 4 ...
     $ StandardHours           : int  80 80 80 80 80 80 80 80 80 80 ...
     $ StockOptionLevel        : int  1 1 0 1 2 2 0 2 0 0 ...
     $ TotalWorkingYears       : int  7 33 9 21 1 5 4 10 7 14 ...
     $ TrainingTimesLastYear   : int  2 2 3 3 2 3 2 2 3 2 ...
     $ WorkLifeBalance         : int  4 1 3 3 3 3 3 3 3 4 ...
     $ YearsAtCompany          : int  7 5 9 21 1 5 3 10 3 14 ...
     $ YearsInCurrentRole      : int  5 4 7 6 0 4 2 9 2 11 ...
     $ YearsSinceLastPromotion : int  0 1 0 11 0 0 2 9 1 4 ...
     $ YearsWithCurrManager    : int  7 4 6 8 0 3 2 0 1 11 ...
    describe(train)
                              vars    n    mean      sd median trimmed     mad  min   max range  skew kurtosis     se
    X...Age                     1 1100   37.00    9.04   36.0   36.51    8.90   18    60    42  0.44    -0.43   0.27
    Attrition                   2 1100    0.16    0.37    0.0    0.08    0.00    0     1     1  1.83     1.36   0.01
    BusinessTravel*             3 1100    2.62    0.66    3.0    2.77    0.00    1     3     2 -1.47     0.81   0.02
    Department*                 4 1100    2.26    0.52    2.0    2.25    0.00    1     3     2  0.23    -0.41   0.02
    DistanceFromHome            5 1100    9.43    8.20    7.0    8.36    7.41    1    29    28  0.91    -0.35   0.25
    Education                   6 1100    2.92    1.02    3.0    2.99    1.48    1     5     4 -0.30    -0.55   0.03
    EducationField*             7 1100    3.22    1.32    3.0    3.06    1.48    1     6     5  0.58    -0.65   0.04
    EmployeeNumber              8 1100 1028.16  598.92 1026.5 1027.04  782.81    1  2065  2064  0.02    -1.22  18.06
    EnvironmentSatisfaction     9 1100    2.73    1.10    3.0    2.78    1.48    1     4     3 -0.33    -1.21   0.03
    Gender*                    10 1100    1.59    0.49    2.0    1.62    0.00    1     2     1 -0.38    -1.86   0.01
    JobInvolvement             11 1100    2.73    0.71    3.0    2.74    0.00    1     4     3 -0.54     0.34   0.02
    JobLevel                   12 1100    2.05    1.11    2.0    1.89    1.48    1     5     4  1.04     0.40   0.03
    JobRole*                   13 1100    5.43    2.46    6.0    5.59    2.97    1     9     8 -0.34    -1.22   0.07
    JobSatisfaction            14 1100    2.73    1.11    3.0    2.79    1.48    1     4     3 -0.33    -1.24   0.03
    MaritalStatus*             15 1100    2.11    0.73    2.0    2.14    1.48    1     3     2 -0.18    -1.12   0.02
    MonthlyIncome              16 1100 6483.62 4715.29 4857.0 5639.41 3166.09 1009 19999 18990  1.38     1.04 142.17
    NumCompaniesWorked         17 1100    2.68    2.51    2.0    2.35    1.48    0     9     9  1.03    -0.02   0.08
    Over18*                    18 1100    1.00    0.00    1.0    1.00    0.00    1     1     0   NaN      NaN   0.00
    OverTime*                  19 1100    1.28    0.45    1.0    1.22    0.00    1     2     1  0.99    -1.02   0.01
    PercentSalaryHike          20 1100   15.24    3.63   14.0   14.85    2.97   11    25    14  0.79    -0.35   0.11
    PerformanceRating          21 1100    3.15    0.36    3.0    3.07    0.00    3     4     1  1.93     1.72   0.01
    RelationshipSatisfaction   22 1100    2.70    1.10    3.0    2.75    1.48    1     4     3 -0.29    -1.23   0.03
    StandardHours              23 1100   80.00    0.00   80.0   80.00    0.00   80    80     0   NaN      NaN   0.00
    StockOptionLevel           24 1100    0.79    0.84    1.0    0.67    1.48    0     3     3  0.95     0.34   0.03
    TotalWorkingYears          25 1100   11.22    7.83   10.0   10.27    5.93    0    40    40  1.15     0.99   0.24
    TrainingTimesLastYear      26 1100    2.81    1.29    3.0    2.74    1.48    0     6     6  0.50     0.49   0.04
    WorkLifeBalance            27 1100    2.75    0.70    3.0    2.76    0.00    1     4     3 -0.60     0.47   0.02
    YearsAtCompany             28 1100    7.01    6.22    5.0    5.94    4.45    0    37    37  1.81     4.01   0.19
    YearsInCurrentRole         29 1100    4.21    3.62    3.0    3.83    4.45    0    18    18  0.95     0.61   0.11
    YearsSinceLastPromotion    30 1100    2.23    3.31    1.0    1.49    1.48    0    15    15  1.94     3.30   0.10
    YearsWithCurrManager       31 1100    4.12    3.60    3.0    3.76    4.45    0    17    17  0.86     0.26   0.11

    #删除 常量

    name<-names(train)
    train<-train[name!="Over18" & name!="StandardHours" & name!="EmployeeNumber"]

    #重编码

    train$Gender<-as.integer(train$Gender)-1
    train$OverTime<-as.integer(train$OverTime)-1

    #Age 和 Attrition

     ggplot(train, aes(X...Age, fill = factor(Attrition))) + 
       geom_histogram(bins=30) +
       facet_grid(.~Gender)+
    labs(fill="Attrition")+ xlab("Age")+ylab("Total Count")

     

    #小结:

    train$X...Age[train$X...Age>=18 & train$X...Age <25]<-1
    train$X...Age[train$X...Age>=25 & train$X...Age <35]<-2
    train$X...Age[train$X...Age>=35 & train$X...Age <45]<-3
    train$X...Age[train$X...Age>=45 & train$X...Age <55]<-4
    train$X...Age[train$X...Age>=55 ]<-5

    #Department 和 JobLevel

    ggplot(train, aes(x = JobLevel, fill = as.factor(Attrition))) +
     geom_bar() +
     facet_wrap(~ Department)+
   
    xlab("Job Level")+

    ylab("Total Count")+

    labs(fill = "Attrition")

     

    train$Department<-as.character(train$Department)
    train$Department[train$Department=="Human Resources"]<-"1"
    train$Department[train$Department=="Sales"]<-"2"
    train$Department[train$Department=="Research & Development"]<-"3"
    train$Department<-as.integer(train$Department)

    #小结:不同部门相同级别之间存在明显差异,研发部门1,2级别和销售部1,2,3级别流动性较大。

    #Department 和 BusinessTravel

    ggplot(train, aes(x = BusinessTravel, fill = as.factor(Attrition))) +
       geom_bar() +
       facet_wrap(~ Department)+
       xlab("BusinessTravel")+
       ylab("Total Count")+
       labs(fill = "Attrition")

    train$BusinessTravel<-as.character(train$BusinessTravel)
    train$BusinessTravel[train$BusinessTravel=="Non-Travel"]<-"1"
    train$BusinessTravel[train$BusinessTravel=="Travel_Frequently"]<-"2"
    train$BusinessTravel[train$BusinessTravel=="Travel_Rarely"]<-"3"
    train$BusinessTravel<-as.integer(train$BusinessTravel)

    #小结:是否经常出差,并不是影响离职的关键因素,但偶然出差的员工离职率最高。研发部、销售部、人力资源部依次下降。

    #EducationField 和 Attrition

    ggplot(train,aes(EducationField,fill=as.factor(Attrition)))+
        geom_bar(stat="count",position="dodge")+
        xlab("EducationField")+
        ylab("Total Count")+
        labs(fill="Attrition")

    #小结:专业领域和离职之间无明显关系

    #MaritalStatus 和 Attrition

     ggplot(train,aes(MaritalStatus,fill=as.factor(Attrition)))+
         geom_bar(stat="count",position="dodge")+
         xlab("MaritalStatus")+
         ylab("Total Count")+
         labs(fill="Attrition")

    train$MaritalStatus<-as.character(train$MaritalStatus)
    train$MaritalStatus[train$MaritalStatus=="Divorced"]<-1
    train$MaritalStatus[train$MaritalStatus=="Married"]<-2
    train$MaritalStatus[train$MaritalStatus=="Single"]<-3
    train$MaritalStatus<-as.integer(train$MaritalStatus)

    #小结:婚姻情况和离职有一点关系

    #EnvironmentSatisfaction 和 Attrition

    ggplot(train, aes(x = EnvironmentSatisfaction, fill = as.factor(Attrition))) +
        geom_bar() +
        facet_wrap(~ JobLevel)+
        xlab("JobLevel")+
        ylab("Total Count")+
        labs(fill = "Attrition")

    #小结:满意度和离职之间无明显关系

     

    #MonthlyIncome 和 Attrition

    ggplot(train,aes(MonthlyIncome, fill = factor(Attrition))) +
      geom_density(alpha = 0.8)+
      labs(fill="Attrition")

    #小结:低收入者明显在职意向不稳定

    train$MonthlyIncome[train$MonthlyIncome<=3000]<-1
    train$MonthlyIncome[train$MonthlyIncome>3000 & train$MonthlyIncome<=6000]<-2
    train$MonthlyIncome[train$MonthlyIncome>6000 & train$MonthlyIncome<=9000]<-3
    train$MonthlyIncome[train$MonthlyIncome>9000 & train$MonthlyIncome<=12000]<-4
    train$MonthlyIncome[train$MonthlyIncome>12000 & train$MonthlyIncome<=17000]<-5
    train$MonthlyIncome[train$MonthlyIncome>17000]<-6

     

    #关联关系

    corrgram(train[,-c(7,12)],lower.panel=panel.pie,upper.panel=NULL)  


    #抽样

    set.seed(1)
    ind<-sample(2,nrow(train),replace=TRUE,prob=c(0.7,0.3))
    train.df<-train[ind==1,]
    test.df<-train[ind==2,]

     

    #随机森林

    rf<-randomForest(factor(Attrition)~.,data=train.df)
    varImpPlot(rf)

    #准确率

    prediction <- predict(rf,newdata=test.df,type="response")
    misClasificError <- mean(prediction != test.df$Attrition)
    print(paste('Accuracy',1-misClasificError))
    [1] "Accuracy 0.876506024096386"

     

    #逻辑回归

    gf<-glm(Attrition~.,data=train.df,family = binomial(link=logit))
    summary(gf)

    Call:
    glm(formula = Attrition ~ ., family = binomial(link = logit),
        data = train.df)

    Deviance Residuals:
        Min       1Q   Median       3Q      Max  
    -1.6113  -0.5048  -0.2459  -0.0860   3.4737  

    Coefficients:
                                   Estimate Std. Error z value Pr(>|z|)    
    (Intercept)                    -1.31753    3.58064  -0.368 0.712903    
    X...Age                        -0.36136    0.17640  -2.049 0.040508 *  
    BusinessTravel                  0.05908    0.20110   0.294 0.768928    
    Department                      0.39070    0.93431   0.418 0.675820    
    DistanceFromHome                0.05274    0.01486   3.550 0.000386 ***
    Education                      -0.17039    0.12279  -1.388 0.165239    
    EducationFieldLife Sciences    -0.43924    1.20639  -0.364 0.715785    
    EducationFieldMarketing         0.14995    1.25574   0.119 0.904948    
    EducationFieldMedical          -0.55928    1.20602  -0.464 0.642835    
    EducationFieldOther             0.07420    1.32247   0.056 0.955256    
    EducationFieldTechnical Degree  0.62904    1.22665   0.513 0.608084    
    EnvironmentSatisfaction        -0.50299    0.11646  -4.319 1.57e-05 ***
    Gender                          0.49495    0.26618   1.859 0.062965 .  
    JobInvolvement                 -0.67266    0.17777  -3.784 0.000154 ***
    JobLevel                       -0.18383    0.39279  -0.468 0.639777    
    JobRoleHuman Resources          2.92472    2.10883   1.387 0.165474    
    JobRoleLaboratory Technician    2.11121    0.82806   2.550 0.010785 *  
    JobRoleManager                  2.09557    1.12796   1.858 0.063193 .  
    JobRoleManufacturing Director   1.22695    0.84649   1.449 0.147211    
    JobRoleResearch Director        1.49258    1.17894   1.266 0.205501    
    JobRoleResearch Scientist       1.44543    0.82801   1.746 0.080868 .  
    JobRoleSales Executive          2.17131    1.20040   1.809 0.070479 .  
    JobRoleSales Representative     3.29933    1.28712   2.563 0.010367 *  
    JobSatisfaction                -0.63089    0.11767  -5.361 8.26e-08 ***
    MaritalStatus                   0.94530    0.25146   3.759 0.000170 ***
    MonthlyIncome                  -0.03459    0.24924  -0.139 0.889628    
    NumCompaniesWorked              0.13934    0.05418   2.572 0.010119 *  
    OverTime                        2.18546    0.27520   7.941 2.00e-15 ***
    PercentSalaryHike              -0.05939    0.05572  -1.066 0.286492    
    PerformanceRating               0.86885    0.55923   1.554 0.120266    
    RelationshipSatisfaction       -0.33278    0.11625  -2.863 0.004201 **
    StockOptionLevel                0.01585    0.21361   0.074 0.940835    
    TotalWorkingYears              -0.04047    0.04220  -0.959 0.337593    
    TrainingTimesLastYear          -0.15291    0.10058  -1.520 0.128425    
    WorkLifeBalance                -0.21648    0.16944  -1.278 0.201398    
    YearsAtCompany                  0.07885    0.05340   1.477 0.139745    
    YearsInCurrentRole             -0.13861    0.06449  -2.149 0.031612 *  
    YearsSinceLastPromotion         0.14022    0.05867   2.390 0.016857 *  
    YearsWithCurrManager           -0.11790    0.06483  -1.819 0.068956 .  
    ---
    Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

    (Dispersion parameter for binomial family taken to be 1)

        Null deviance: 717.22  on 767  degrees of freedom
    Residual deviance: 457.00  on 729  degrees of freedom
    AIC: 535

    Number of Fisher Scoring iterations: 6

    #准确率

    prediction <- predict(gf,newdata=test.df,type="response")
    prediction <- ifelse(prediction > 0.5,1,0)
    misClasificError <- mean(prediction != test.df$Attrition)
    print(paste('Accuracy',1-misClasificError))
    [1] "Accuracy 0.858433734939759"

     

    转载于:https://www.cnblogs.com/aongao/p/7662270.html

    展开全文
  • 员工离职预测-数据集

    2021-03-30 20:18:41
    员工离职预测-数据集
  • 员工离职预测数据集 https://dongfangyou.blog.csdn.net/article/details/109398904
  • 本文针对企业员工的一些特征来判断员工是否离职,利用RapidMiner软件构建员工离职预测模型,分析影响员工离职的重要因素,比如员工月收入,是否加班,是否出差等,预测企业员工是否具有离职倾向,为企业提前做出判断...
  • 员工离职预测 逻辑回归 import numpy as np import pandas as pd from sklearn.preprocessing import LabelEncoder#中文编码为数字 import seaborn as sns#热力图 import matplotlib.pyplot as plt from sklearn....
    import numpy as np
    import pandas as pd
    from sklearn.preprocessing import LabelEncoder#中文编码为数字
    import seaborn as sns#热力图
    import matplotlib.pyplot as plt
    from sklearn.model_selection import train_test_split,GridSearchCV#数据集分割,调参
    from sklearn.metrics import accuracy_score#评分标准
    from sklearn.linear_model import LogisticRegression#逻辑回归模型
    

    导入数据

    train=pd.read_csv('./pfm_train.csv')
    test=pd.read_csv('./pfm_test.csv')
    

    查看数据

    train.head()
    
    Age Attrition BusinessTravel Department DistanceFromHome Education EducationField EmployeeNumber EnvironmentSatisfaction Gender ... RelationshipSatisfaction StandardHours StockOptionLevel TotalWorkingYears TrainingTimesLastYear WorkLifeBalance YearsAtCompany YearsInCurrentRole YearsSinceLastPromotion YearsWithCurrManager
    0 37 0 Travel_Rarely Research & Development 1 4 Life Sciences 77 1 Male ... 3 80 1 7 2 4 7 5 0 7
    1 54 0 Travel_Frequently Research & Development 1 4 Life Sciences 1245 4 Female ... 1 80 1 33 2 1 5 4 1 4
    2 34 1 Travel_Frequently Research & Development 7 3 Life Sciences 147 1 Male ... 4 80 0 9 3 3 9 7 0 6
    3 39 0 Travel_Rarely Research & Development 1 1 Life Sciences 1026 4 Female ... 3 80 1 21 3 3 21 6 11 8
    4 28 1 Travel_Frequently Research & Development 1 3 Medical 1111 1 Male ... 1 80 2 1 2 3 1 0 0 0

    5 rows × 31 columns

    LabelEncoder对非数字格式列编码

    dtypes_list=train.dtypes.values#取出各列的数据类型
    columns__list=train.columns#取出各列列名
    #循环遍历每一列找出非数字格式进行编码
    for i in  range(len(columns__list)):
        if dtypes_list[i]=='object':#判断类型
            lb=LabelEncoder()#导入LabelEncoder模型
            lb.fit(train[columns__list[i]])#训练
            train[columns__list[i]]=lb.transform(train[columns__list[i]])#编码
            test[columns__list[i]]=lb.transform(test[columns__list[i]])#同样对测试集编码
    

    查看LabelEncoder编码过后的数据也是全数字类型

    test.head()
    
    Age BusinessTravel Department DistanceFromHome Education EducationField EmployeeNumber EnvironmentSatisfaction Gender JobInvolvement ... RelationshipSatisfaction StandardHours StockOptionLevel TotalWorkingYears TrainingTimesLastYear WorkLifeBalance YearsAtCompany YearsInCurrentRole YearsSinceLastPromotion YearsWithCurrManager
    0 40 0 1 9 4 4 1449 3 1 3 ... 3 80 2 11 2 4 8 7 0 7
    1 53 2 1 7 2 3 1201 4 0 3 ... 2 80 1 26 6 3 7 7 4 7
    2 42 2 1 2 4 4 477 1 1 2 ... 2 80 0 14 6 3 1 0 0 0
    3 34 1 0 11 3 1 1289 3 1 2 ... 4 80 2 14 5 4 10 9 1 8
    4 32 2 1 1 1 1 134 4 1 3 ... 4 80 0 1 2 3 1 0 0 0

    5 rows × 30 columns

    判断特征值是否唯一,唯一删掉

    unique_list=[]
    #遍历找出唯一的列名
    for i in  range(train.shape[1]):
        if train[columns__list[i]].nunique()==1:#nunique()查看每一列是不是唯一的如果唯一返回值为1
            unique_list.append(columns__list[i])
    unique_list
    
    ['Over18', 'StandardHours']
    

    删除唯一列

    train.drop(unique_list,axis=1,inplace=True)
    test.drop(unique_list,axis=1,inplace=True)
    

    删除员工号,随机数据影响分类

    train.drop('EmployeeNumber',axis=1,inplace=True)
    test.drop('EmployeeNumber',axis=1,inplace=True)
    

    查看各列相关性

    corr=train.corr()
    corr.head()
    
    Age Attrition BusinessTravel Department DistanceFromHome Education EducationField EnvironmentSatisfaction Gender JobInvolvement ... PerformanceRating RelationshipSatisfaction StockOptionLevel TotalWorkingYears TrainingTimesLastYear WorkLifeBalance YearsAtCompany YearsInCurrentRole YearsSinceLastPromotion YearsWithCurrManager
    Age 1.000000 -0.175393 0.024270 -0.017185 0.007081 0.198558 -0.010160 0.011803 -0.029794 0.066528 ... -0.029613 0.063489 -0.002413 0.682879 -0.051702 -0.001042 0.328651 0.231842 0.230587 0.212540
    Attrition -0.175393 1.000000 0.015483 0.053364 0.088563 -0.046494 0.009994 -0.097003 0.016750 -0.122722 ... 0.046762 -0.051749 -0.138498 -0.187922 -0.043395 -0.048794 -0.143697 -0.163059 -0.071760 -0.158558
    BusinessTravel 0.024270 0.015483 1.000000 -0.040937 -0.040339 -0.041300 0.027817 -0.013328 -0.033992 0.019014 ... -0.033435 -0.036396 0.001352 0.031168 0.030902 -0.003512 -0.010005 0.002011 -0.041603 -0.021887
    Department -0.017185 0.053364 -0.040937 1.000000 0.013349 -0.006280 0.012247 -0.021766 -0.034053 -0.040219 ... -0.020124 -0.025962 -0.007854 -0.027084 0.051085 0.048179 0.017601 0.059544 0.019319 0.032234
    DistanceFromHome 0.007081 0.088563 -0.040339 0.013349 1.000000 0.011437 -0.016882 -0.010308 0.023493 0.012333 ... 0.021042 0.018112 0.050356 0.001287 -0.041208 -0.050950 0.000044 0.019317 -0.002760 0.008852

    5 rows × 28 columns

    各列相关性热力图

    sns.heatmap(corr,xticklabels=corr.columns.values,yticklabels=corr.columns.values)
    plt.show()#黑色负相关
    

    热力图

    查看热力图StockOptionLevel与MaritalStatus成负相关,删除其中一列

    train.drop('StockOptionLevel',axis=1,inplace=True)
    test.drop('StockOptionLevel',axis=1,inplace=True)
    

    分箱离散化MonthlyIncome,分类需要MonthlyIncome

    train.MonthlyIncome=pd.cut(train.MonthlyIncome,bins=10)
    test.MonthlyIncome=pd.cut(test.MonthlyIncome,bins=10)
    
    label=train.Attrition#提取离职标签
    train.drop('Attrition',inplace=True,axis=1)#删除标签
    

    one-hot编码:将离散型特征的每一种取值都看成一种状态

    train=pd.get_dummies(train)
    test=pd.get_dummies(test)
    

    分割训练集

    y_train,y_test,x_train,x_test=train_test_split(label,train)
    

    未调参的模型

    log=LogisticRegression()#导入模型
    log.fit(x_train,y_train)#训练
    accuracy_score(log.predict(x_test),y_test)#评分
    
    0.8327272727272728
    

    调参后的模型

    model=LogisticRegression()
    C=[0.01,0.1,1,10,100,1000]#逻辑回归正则化强度
    penalty=['l1','l2']#逻辑回归惩罚项参数
    param_grid=dict(C=C,penalty=penalty)#GridSearchCV需要传入字典类型参数
    model_gcv=GridSearchCV(model,param_grid,cv=3,scoring='roc_auc')#调参模型
    model_gcv.fit(x_train,y_train)#训练
    
    GridSearchCV(cv=3, error_score='raise',
           estimator=LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,
              intercept_scaling=1, max_iter=100, multi_class='ovr', n_jobs=1,
              penalty='l2', random_state=None, solver='liblinear', tol=0.0001,
              verbose=0, warm_start=False),
           fit_params=None, iid=True, n_jobs=1,
           param_grid={'C': [0.01, 0.1, 1, 10, 100, 1000], 'penalty': ['l1', 'l2']},
           pre_dispatch='2*n_jobs', refit=True, return_train_score='warn',
           scoring='roc_auc', verbose=0)
    

    查看最好参数

    model_gcv.best_params_
    
    {'C': 1, 'penalty': 'l1'}
    
    model_gcv.best_score_
    
    0.8265055902793318
    
    accuracy_score(model_gcv.predict(x_test),y_test)
    
    0.8327272727272728
    

    对测试集预测

    predict_test = model_gcv.predict(test)
    
    pd.DataFrame(predict_test, columns=['result']).to_csv('./test_pre.csv',
                                                          index=False)
    

    字段意思

    (1)Age:员工年龄
    (2)Attrition:员工是否已经离职,1表示已经离职,2表示未离职,这是目标预测值;
    (3)BusinessTravel:商务差旅频率,Non-Travel表示不出差,Travel_Rarely表示不经常出差,Travel_Frequently表示经常出差;
    (4)Department:员工所在部门,Sales表示销售部,Research & Development表示研发部,Human Resources表示人力资源部;
    (5)DistanceFromHome:公司跟家庭住址的距离,从1到29,1表示最近,29表示最远;
    (6)Education:员工的教育程度,从1到5,5表示教育程度最高;
    (7)EducationField:员工所学习的专业领域,Life Sciences表示生命科学,Medical表示医疗,Marketing表示市场营销,Technical Degree表示技术学位,Human Resources表示人力资源,Other表示其他;
    (8)EmployeeNumber:员工号码;
    (9)EnvironmentSatisfaction:员工对于工作环境的满意程度,从1到4,1的满意程度最低,4的满意程度最高;
    (10)Gender:员工性别,Male表示男性,Female表示女性;
    (11)JobInvolvement:员工工作投入度,从1到4,1为投入度最低,4为投入度最高;
    (12)JobLevel:职业级别,从1到5,1为最低级别,5为最高级别;
    (13)JobRole:工作角色:Sales Executive是销售主管,Research Scientist是科学研究员,Laboratory Technician实验室技术员,Manufacturing Director是制造总监,Healthcare Representative是医疗代表,Manager是经理,Sales Representative是销售代表,Research Director是研究总监,Human Resources是人力资源;
    (14)JobSatisfaction:工作满意度,从1到4,1代表满意程度最低,4代表满意程度最高;
    (15)MaritalStatus:员工婚姻状况,Single代表单身,Married代表已婚,Divorced代表离婚;
    (16)MonthlyIncome:员工月收入,范围在1009到19999之间;
    (17)NumCompaniesWorked:员工曾经工作过的公司数;
    (18)Over18:年龄是否超过18岁;
    (19)OverTime:是否加班,Yes表示加班,No表示不加班;
    (20)PercentSalaryHike:工资提高的百分比;
    (21)PerformanceRating:绩效评估;
    (22)RelationshipSatisfaction:关系满意度,从1到4,1表示满意度最低,4表示满意度最高;
    (23)StandardHours:标准工时;
    (24)StockOptionLevel:股票期权水平;
    (25)TotalWorkingYears:总工龄;
    (26)TrainingTimesLastYear:上一年的培训时长,从0到6,0表示没有培训,6表示培训时间最长;
    (27)WorkLifeBalance:工作与生活平衡程度,从1到4,1表示平衡程度最低,4表示平衡程度最高;
    (28)YearsAtCompany:在目前公司工作年数;
    (29)YearsInCurrentRole:在目前工作职责的工作年数
    (30)YearsSinceLastPromotion:距离上次升职时长
    (31)YearsWithCurrManager:跟目前的管理者共事年数;

    展开全文
  • 员工离职预测一. 题目描述二. 数据说明三. 步骤实现1.导入并查看2.数据探索性分析3.数据处理4.模型分析5.结果分析(1) 可视化的结果分析(2)特征选择结果分析(3)多模型交叉验证结果分析 一. 题目描述 员工是否准备...

    一. 题目描述

    员工是否准备离职是困扰用人单位的问题,其关系到单位业务的开展及新人员的招聘,及时的分析出有离职倾向的员工成为关键的因素。数据主要包括影响员工离职的各种因素(工资、出差、工作环境满意度、工作投入度、是否加班、是否升职、工资提升比例等)以及员工是否已经离职的对应记录。

    二. 数据说明

    数据分为训练数据和测试数据,分别保存在pfm_train.csv和pfm_test.csv两个文件中。 其中训练数据主要包括1100条记录,31个字段,主要字段说明如下:
    在这里插入图片描述

    三. 步骤实现

    1.导入并查看

    首先进行观察使用的数据是csv文件格式,其中自变量30个,因变量为1个(是否离职)。数据集字符型字段有7个(BusinessTravel/Department/EducationField/Gender/JobRole/MaritalStatus/Over18/OverTime)数值型字段有24个。
    导入需要的库

    import pandas as pd
    import numpy as np
    import seaborn as sns
    from sklearn.model_selection import train_test_split,cross_val_score
    from sklearn.ensemble import RandomForestClassifier
    from sklearn.tree import DecisionTreeClassifier
    from sklearn.neighbors import KNeighborsClassifier
    from sklearn import svm
    from sklearn.linear_model import LogisticRegression
    from sklearn.metrics import accuracy_score
    from sklearn import metrics 
    

    导入数据

    pd.set_option('display.max_columns',None)
    pd.set_option('display.max_rows',None)
    data_train = pd.read_csv('pfm_train.csv')
    # 训练集总共1100条数据
    data_test = pd.read_csv('pfm_test.csv')
    # 测试集总共350条数据
    data = pd.concat([data_train,data_test],axis = 0)
    

    查看基本信息

    data.head()
    data.info()
    data.describe()
    

    在这里插入图片描述
    删除常量

    data.drop('EmployeeNumber',axis=1)
    data.drop('Over18',axis=1)
    data.drop('StandardHours',axis=1)
    

    2.数据探索性分析

    #-*- coding: utf-8 -*-
    from matplotlib import pyplot as plt
    plt.rcParams['font.sans-serif']=['SimHei'] 
    plt.title('人力资源总体情况')
    labels = [u'离职',u'在职'] 
    sizes = [data['Attrition'].value_counts()[1], data['Attrition'].value_counts()[0]] 
    colors = ['c','pink'] 
    patches,text1,text2 = plt.pie(sizes,labels=labels,colors=colors,autopct = '%3.2f%%', 
                                  shadow = False, 
                                  startangle =90, 
                                  pctdistance = 0.6) 
    plt.legend(loc="upper right",fontsize=10,bbox_to_anchor=(1.1,1.05),borderaxespad=0.3)
    plt.axis('equal')
    plt.show()
    print('离职人员:',data['Attrition'].value_counts()[1])
    print('在职人员:',data['Attrition'].value_counts()[0])
    #离职人员178人,占比16.18%;在职人员922人,占比83.82%
    

    在这里插入图片描述
    #各个职位中离职和未离职人数占比——柱状图

    data_JobRole=pd.crosstab(data.JobRole,data.Attrition)
    data_JobRole.div(data_JobRole.sum(1).astype(float), axis=0).plot(kind='bar', stacked=True)
    

    在这里插入图片描述

    plt.figure(figsize=(10, 10))
    data_Attrition_JobRole =data.groupby('JobRole').Attrition.count()
    plt.pie(data_Attrition_JobRole, labels=data_Attrition_JobRole.index, autopct="%1.2f%%",
                 startangle=90)
    plt.legend()
    

    在这里插入图片描述

    3.数据处理

    def resetAge(name):
        if (name < 24) & (name > 18) & (name == 58):
            return 1
        elif (name == 18) & (name == 48) & (name == 54) & (name == 57) & (name > 58) :
            return 0
        else:
            return 2
    
    
    def resetSalary(s):
        if s>0 & s<3725:
            return 0
        elif s>=3725 & s<11250:
            return 1
        else:
            return 2
    
    
    def resetPerHike(s):
        if s >= 22 & s < 25:
            return 0
        elif (s >= 11 & s < 14) | (s > 14 & s < 22):
            return 1
        else:
            return 2
    
    
    data['PercentSalaryHike'] = data['PercentSalaryHike'].apply(resetPerHike)
    data['MonthlyIncome'] = data['MonthlyIncome'].apply(resetSalary)
    data['Age'] = data['Age'].apply(resetAge)
    
    numerical_cols = data.select_dtypes(exclude = 'object').columns
    categorical_cols = data.select_dtypes(include = 'object').columns
    feature_cols=[col for col in numerical_cols if col not in ['EmployeeNumber','Over18','StandardHours']]
    x_data=pd.concat([data[feature_cols],data[categorical_cols]],axis=1)
    y_data=data['Attrition']
    x_data=pd.get_dummies(x_data)
    

    查看数据之间相关性

    corr=x_data.corr()
    corr
    

    热力图进行表示

    plt.figure(figsize=(16, 16))
    sns.heatmap(corr,xticklabels=corr.columns.values,yticklabels=corr.columns.values)
    plt.show()
    

    在这里插入图片描述
    也可以直接根据皮尔逊相关系数选择与要预测的属性列Attrition相关性最高的10个属性

    features = data.corr()['Attrition'].abs().sort_values(ascending=False)[:11]
    features.drop('Attrition', axis=0, inplace=True)
    features = features.index
    features
    
    

    在这里插入图片描述

    4.模型分析

    进行编码并删除无用变量

    cata_result = pd.DataFrame()
    for i in data.columns:
        if data[i].dtype == 'O':
            cata = pd.DataFrame()
            cata = pd.get_dummies(data[i], prefix=i)
            cata_result = pd.concat([cata_result, cata], axis=1)
    
    for i in data.columns:
        if data[i].dtype == 'O':
            data = data.drop(i, axis=1)
    
    data = pd.concat([data, cata_result], axis=1)
    

    代入模型

    sep = 1100
    X = data.iloc[0:sep,:].drop('Attrition',axis = 1)
    y = data.iloc[0:sep,:]['Attrition']
    data_test_use = data.iloc[sep:,:]
    data_test_use1 = data_test_use.drop('Attrition',axis=1)
    
    X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.25,random_state=2)
    
    model = {'LR': LogisticRegression(), 'svm': svm.SVC(), 'RMF': RandomForestClassifier(random_state=10, warm_start=True,
                                                                                         n_estimators=26,
                                                                                         max_depth=6,
                                                                                         max_features='sqrt'),
             'CART': DecisionTreeClassifier(), 'KNN': KNeighborsClassifier()}
             
    for i in model:
        model[i].fit(X,y)
        score = cross_val_score(model[i],X,y,cv=5,scoring='accuracy')
        print("%s:%.3f(%.3f)"%(i,score.mean(),score.std()))
    
    

    逻辑回归效果最好
    在这里插入图片描述
    训练集准确度能达到90%,测试集能达到86.9%

    5.结果分析

    (1) 可视化的结果分析

    从三个满意度进行分析
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    由图分析得,离职的员工对工作环境和关系的满意度出现了较低的评分,但中位数相当,故不作为决定性影响因素,而公司满意度出现了明显特征:离职员工的评分整体偏低,且离职人员对公司满意度整体波动较大。故公司满意度对员工离职的影响较大。
    在这里插入图片描述

    在这里插入图片描述

    从性别上来看男性偏多。从年龄上看,离职的人比在职的人整体年龄偏低,并且 24之前和58岁的人员流动很大,而在年龄分段之内离职倾向不大,趋于缓和,部分的特数值没有离职人员。
    在这里插入图片描述
    在这里插入图片描述

    从受教育程度上来看,受教育程度最高的,离职率越低,受教育程度低的,离职率高,而受教育程度中等的差别不大。从月收入来看,表现出明显的月收入低的人,离职的波动越大。
    在这里插入图片描述
    在这里插入图片描述

    在职的人群中,不加班的占大多数,离职的人群中,加班所占比例较大。工作与生活平衡程度较低和较高的时候都容易出现离职现象

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    数据集中在0-4年,第2,3年离职的人数较多;距离上次升职时间为3年,跟目前管理之共事3年,出现离职现象较多。
    在这里插入图片描述
    在这里插入图片描述
    研发部门的人离职率低,出差频率中等偏高的人更容易离职。

    总体来说,离职人员约占总人数的16%,离职员工的月收入比在职员工偏低,,大学专业和出差频率两项有明显的影响,经常出差的人流动性大。男性员工离职的更多,单身职员的离职的概率比较大,职业角色里,代理销售的人员流动大。可以刻画出形象,离职的人特征偏向单身男性代理销售,经常出差且月收入偏低,对公司满意度较低。

    (2)特征选择结果分析

    特征选择是从多维度的特征中选取出表征明显的特征显得非常的重要。特征选择主要可以从数据相关性角度和信息增益的角度来考虑。皮尔森相关系数也称皮尔森积矩相关系数,是一种线性相关系数,是最常用的一种相关系数。记为r,用来反映两个变量X和Y的线性相关程度,r值介于-1到1之间,绝对值越大表明相关性越强。通过计算,影响程度最高的分别为工作年限,年龄,职业级别,三个工作年限,月收入,股票期权,工作满意度和参与度。

    (3)多模型交叉验证结果分析

    预测并分类我们首先可以想到逻辑回归,根据输出,在不调参情况下,首选的逻辑回归具有较好的准确率。接着比较朴素贝叶斯和逻辑回归。由于逻辑回归和朴素贝叶斯分类器都采用了极大似然法进行参数估计,所以它们会被经常用来对比。.两者比较明显的不同之处在于,逻辑回归属于判别式模型,而朴素贝叶斯属于生成式模型。具体来说,两者的目标虽然都是最大化后验概率,但是逻辑回归是直接对后验概率P(Y|X)进行建模,而朴素贝叶斯是对联合概率P(X,Y)进行建模,所以说两者的出发点是不同的。朴素贝叶斯分类器要求“属性条件独立假设”即,对于已知类别的样本x,假设x的所有属性是相互独立的。这就导致了两点与逻辑回归的不同之处:朴素贝叶斯的限制条件比逻辑回归更加严格,意味着逻辑回归的应用范围更广。

    展开全文
  • 数据挖掘竞赛-员工离职预测训练赛

    千次阅读 2019-04-06 13:00:07
    员工离职预测赛。

    员工离职预测

    简介

    DC的一道回归预测题。是比较基础的分类问题,主要对逻辑回归算法的使用。核心思路为属性构造+逻辑回归

    过程

    数据获取

    报名参与比赛即可获得数据集的百度网盘地址,这个比赛时间很久,随时可以报名。

    数据探索

    • 无关项
      • EmployeeNumber为编号,对建模是干扰项,删除即可。
      • StandardHours和Over18全数据集固定值,没有意义,删除。
      • 相关性高
    • 相关图

      可以发现,有两项相关性极高,删除其中一个MonthlyIncome。

    数据预处理

    • one-hot编码
      • 对几个固定几个取字符串值的特征进行one-hot编码
    • 属性构造
      • 特征数目较少,暴力拼接不同属性,构造新属性

    数据挖掘建模

    既是回归赛又是分类题,很明显就是使用逻辑回归(LR)模型。但是还是使用未调参的几个基础模型进行交叉验证,发现LR较高,加上其他模型调参麻烦,就没有多加研究。

    # 多模型交叉验证
    from sklearn.linear_model import LogisticRegression
    from sklearn.svm import SVC
    from sklearn.tree import DecisionTreeClassifier
    from sklearn.ensemble import RandomForestClassifier, AdaBoostClassifier, GradientBoostingClassifier
    import sklearn.neural_network as sk_nn
    from sklearn.model_selection import cross_val_score
    models = {
       'LR': LogisticRegression(solver='liblinear', penalty='l2', C=1),
       'SVM': SVC(C=1, gamma='auto'),
       'DT': DecisionTreeClassifier(),
       'RF' : RandomForestClassifier(n_estimators=100),
       'AdaBoost': AdaBoostClassifier(n_estimators=100),
       'GBDT': GradientBoostingClassifier(n_estimators=100),
       'NN': sk_nn.MLPClassifier(activation='relu',solver='adam',alpha=0.0001,learning_rate='adaptive',learning_rate_init=0.001, max_iter=1000)  
    }
    
    for k, clf in models.items():
       print("the model is {}".format(k))
       scores = cross_val_score(clf, x_train, y_train, cv=10)
       print(scores)
       print("Mean accuracy is {}".format(np.mean(scores)))
       print("*" * 100)
    

    对LR模型进行网格搜索调参,发现默认参数即可有不错的平台验证率。

    # 网格搜索调参
    from sklearn.model_selection import GridSearchCV
    from sklearn.linear_model import LogisticRegression
    penaltys = ['l1', 'l2']
    Cs = np.arange(1, 10, 0.1)
    parameters = dict(penalty=penaltys, C=Cs )
    lr_penalty= LogisticRegression(solver='liblinear')
    grid= GridSearchCV(lr_penalty, parameters,cv=10)
    grid.fit(x_train,y_train)
    grid.cv_results_
    print(grid.best_score_)
    print(grid.best_params_) 
    

    补充说明

    其实XgBoost和RF可能效果更好一些,但是由于一些原因,没有深究,有兴趣的可以进一步研究,最高的貌似研究有0.92以上通过率了。具体数据集和代码可以在我的Github找到,result.csv即为提交文件。附上提交时的平台分数和排名(22/1808)。

    展开全文
  • DataCastle员工离职预测数据竞赛个人总结 赛题链接 赛题任务: 给定影响员工离职的因素和员工是否离职的记录,建立模型预测有可能离职的员工。 数据字段: (1)Age:员工年龄 ; (2)Label:员工是否已经离职,1...
  • DC算法竞赛——员工离职预测

    千次阅读 2019-09-22 11:48:03
    员工离职预测 一、概述 1、项目来源:https://www.dcjingsai.com/static_page/cmpList.html 2、字段信息如下: 训练数据主要包括1100条记录,31个字段,主要字段说明如下: (1)Age:员工年龄 (2)Attrition:员工...
  • 机器学习-员工离职预测训练赛

    千次阅读 2019-02-18 12:46:37
    【数据来源】DC竞赛的员工离职预测训练赛 一共两个csv表格,pfm_train.csv训练(1100行,31个字段),pfm_test.csv测试集(350行,30个字段) 【字段说明】 Age:员工年龄 Attrition:员工是否已经离职,1表示...
  • 一,概述1,项目数据来源:https://tianchi.aliyun.com/dataset/dataDetail?dataId=45742,数据分析工具:本次案在例中,我所需要做的便是通过已有的信息进行预测员工未来的动向,即判断该员工未来是否会离职。...
  • 员工离职预测(logistic)(R语言)

    千次阅读 2019-02-25 14:53:00
    员工离职预测(logistic) 出于工作需要及个人兴趣,学习数据分析及R语言是差不多2年前,第一篇更新的文章为m久前做的员工离职预测,当时做这个项目的主要是为了学习logistic算法,数据来源为DC竞赛平台,本文章...
  • 本文作者用数据分析法对一家公司的员工离职原因展开了分析预测,与大家分享。一、概述项目数据来源:https://tianchi.aliyun.com/dataset/dataDetail?dataId=4574数据分析工具:本次案在例中,我所需要做的便是通过...
  • R语言-决策树-员工离职预测训练赛

    千次阅读 2017-09-11 10:50:00
    题目:员工离职预测训练赛 网址:http://www.pkbigdata.com/common/cmpt/员工离职预测训练赛_竞赛信息.html 要求: 数据主要包括影响员工离职的各种因素(工资、出差、工作环境满意度、工作投入度、是否加班、...
  • 题目:员工离职预测训练赛 网址:http://www.pkbigdata.com/common/cmpt/员工离职预测训练赛_竞赛信息.html 要求: 数据主要包括影响员工离职的各种因素(工资、出差、工作环境满意度、工作投入度、是否加班、...
  • 题目:员工离职预测训练赛 网址:http://www.pkbigdata.com/common/cmpt/员工离职预测训练赛_竞赛信息.html 要求: 数据主要包括影响员工离职的各种因素(工资、出差、工作环境满意度、工作投入度、是否加班、...
  • 最近一直觉得,其实机器学习的门槛...本文用的数据集是kaggle上的员工离职数据集,大家可以自行下载,下面是用R选择逻辑回归算法建模预测的过程。首先加载数据hrdata 看数据结构,预测变量是left,就是员工是否离职s...
  • 公司从招聘到培训一名员工,每个环节都需花费不少的资源,而一个员工的离职多多少少会给公司带来损失,为了了解员工离职的原因并预测潜在的离职对象,IBM 公布了他们真实的员工信息并提出以下问题陈述: “预测员工...
  • 天池竞赛员工离职训练赛
  • R:员工离职预测实战

    千次阅读 2018-03-04 13:43:49
    通过分析数据,了解影响员工辞职的因素有哪些,以及最主要的原因,预测哪些优秀员工离职。变量说明:&lt;textarea readonly="readonly" name="code" class="python"&gt; ##...
  • kaggle-员工离职预测

    2020-08-03 17:31:54
    cv.fit(X_train, Y_train) print(lr_cv.C_) 用最优值在验证集上进行预测 LR = LogisticRegression(solver='saga', penalty='l2', C=25.52908068) print(LR.fit(X_train, Y_train)) print("训练集准确率: ", LR.score...

空空如也

空空如也

1 2 3 4 5 ... 19
收藏数 365
精华内容 146
关键字:

员工离职预测