1. Selección de variables categóricas y cuantitativas

Luego de hacer una revisión de la literatura disponible, donde se han realizado análisis de intención de renunciar, o Intention to Quit en inglés, como la presentada en Biswas, et al 2023 las variables que tuvieron un mayor valor fueron:

Categóricas: Satisfación laboral, Equilibrio trabajo-vida y Satisfacción ambiente laboral. Numéricas: Ingreso mensual, Años de experiencia y Porcentaje de aumento salarial.

La satisfacción laboral tiene una relación negativa con la rotación, a mayor satisfacción laboral una menor probabilidad de rotar de puesto.

2. Análisis univariado

Para realizar un análisis general de las variables, se sacaron algunas cifras generales para las variables cuantitativas:

str(datosRotacion)
## tibble [1,470 × 24] (S3: tbl_df/tbl/data.frame)
##  $ Rotación                   : chr [1:1470] "Si" "No" "Si" "No" ...
##  $ Edad                       : num [1:1470] 41 49 37 33 27 32 59 30 38 36 ...
##  $ Viaje de Negocios          : chr [1:1470] "Raramente" "Frecuentemente" "Raramente" "Frecuentemente" ...
##  $ Departamento               : chr [1:1470] "Ventas" "IyD" "IyD" "IyD" ...
##  $ Distancia_Casa             : num [1:1470] 1 8 2 3 2 2 3 24 23 27 ...
##  $ Educación                  : num [1:1470] 2 1 2 4 1 2 3 1 3 3 ...
##  $ Campo_Educación            : chr [1:1470] "Ciencias" "Ciencias" "Otra" "Ciencias" ...
##  $ Satisfacción_Ambiental     : num [1:1470] 2 3 4 4 1 4 3 4 4 3 ...
##  $ Genero                     : chr [1:1470] "F" "M" "M" "F" ...
##  $ Cargo                      : chr [1:1470] "Ejecutivo_Ventas" "Investigador_Cientifico" "Tecnico_Laboratorio" "Investigador_Cientifico" ...
##  $ Satisfación_Laboral        : num [1:1470] 4 2 3 3 2 4 1 3 3 3 ...
##  $ Estado_Civil               : chr [1:1470] "Soltero" "Casado" "Soltero" "Casado" ...
##  $ Ingreso_Mensual            : num [1:1470] 5993 5130 2090 2909 3468 ...
##  $ Trabajos_Anteriores        : num [1:1470] 8 1 6 1 9 0 4 1 0 6 ...
##  $ Horas_Extra                : chr [1:1470] "Si" "No" "Si" "Si" ...
##  $ Porcentaje_aumento_salarial: num [1:1470] 11 23 15 11 12 13 20 22 21 13 ...
##  $ Rendimiento_Laboral        : num [1:1470] 3 4 3 3 3 3 4 4 4 3 ...
##  $ Años_Experiencia           : num [1:1470] 8 10 7 8 6 8 12 1 10 17 ...
##  $ Capacitaciones             : num [1:1470] 0 3 3 3 3 2 3 2 2 3 ...
##  $ Equilibrio_Trabajo_Vida    : num [1:1470] 1 3 3 3 3 2 2 3 3 2 ...
##  $ Antigüedad                 : num [1:1470] 6 10 0 8 2 7 1 1 9 7 ...
##  $ Antigüedad_Cargo           : num [1:1470] 4 7 0 7 2 7 0 0 7 7 ...
##  $ Años_ultima_promoción      : num [1:1470] 0 1 0 3 2 3 0 0 1 7 ...
##  $ Años_acargo_con_mismo_jefe : num [1:1470] 5 7 0 0 2 6 0 0 8 7 ...
summary(datosRotacion)
##    Rotación              Edad       Viaje de Negocios  Departamento      
##  Length:1470        Min.   :18.00   Length:1470        Length:1470       
##  Class :character   1st Qu.:30.00   Class :character   Class :character  
##  Mode  :character   Median :36.00   Mode  :character   Mode  :character  
##                     Mean   :36.92                                        
##                     3rd Qu.:43.00                                        
##                     Max.   :60.00                                        
##  Distancia_Casa     Educación     Campo_Educación    Satisfacción_Ambiental
##  Min.   : 1.000   Min.   :1.000   Length:1470        Min.   :1.000         
##  1st Qu.: 2.000   1st Qu.:2.000   Class :character   1st Qu.:2.000         
##  Median : 7.000   Median :3.000   Mode  :character   Median :3.000         
##  Mean   : 9.193   Mean   :2.913                      Mean   :2.722         
##  3rd Qu.:14.000   3rd Qu.:4.000                      3rd Qu.:4.000         
##  Max.   :29.000   Max.   :5.000                      Max.   :4.000         
##     Genero             Cargo           Satisfación_Laboral Estado_Civil      
##  Length:1470        Length:1470        Min.   :1.000       Length:1470       
##  Class :character   Class :character   1st Qu.:2.000       Class :character  
##  Mode  :character   Mode  :character   Median :3.000       Mode  :character  
##                                        Mean   :2.729                         
##                                        3rd Qu.:4.000                         
##                                        Max.   :4.000                         
##  Ingreso_Mensual Trabajos_Anteriores Horas_Extra       
##  Min.   : 1009   Min.   :0.000       Length:1470       
##  1st Qu.: 2911   1st Qu.:1.000       Class :character  
##  Median : 4919   Median :2.000       Mode  :character  
##  Mean   : 6503   Mean   :2.693                         
##  3rd Qu.: 8379   3rd Qu.:4.000                         
##  Max.   :19999   Max.   :9.000                         
##  Porcentaje_aumento_salarial Rendimiento_Laboral Años_Experiencia
##  Min.   :11.00               Min.   :3.000       Min.   : 0.00   
##  1st Qu.:12.00               1st Qu.:3.000       1st Qu.: 6.00   
##  Median :14.00               Median :3.000       Median :10.00   
##  Mean   :15.21               Mean   :3.154       Mean   :11.28   
##  3rd Qu.:18.00               3rd Qu.:3.000       3rd Qu.:15.00   
##  Max.   :25.00               Max.   :4.000       Max.   :40.00   
##  Capacitaciones  Equilibrio_Trabajo_Vida   Antigüedad     Antigüedad_Cargo
##  Min.   :0.000   Min.   :1.000           Min.   : 0.000   Min.   : 0.000  
##  1st Qu.:2.000   1st Qu.:2.000           1st Qu.: 3.000   1st Qu.: 2.000  
##  Median :3.000   Median :3.000           Median : 5.000   Median : 3.000  
##  Mean   :2.799   Mean   :2.761           Mean   : 7.008   Mean   : 4.229  
##  3rd Qu.:3.000   3rd Qu.:3.000           3rd Qu.: 9.000   3rd Qu.: 7.000  
##  Max.   :6.000   Max.   :4.000           Max.   :40.000   Max.   :18.000  
##  Años_ultima_promoción Años_acargo_con_mismo_jefe
##  Min.   : 0.000        Min.   : 0.000            
##  1st Qu.: 0.000        1st Qu.: 2.000            
##  Median : 1.000        Median : 3.000            
##  Mean   : 2.188        Mean   : 4.123            
##  3rd Qu.: 3.000        3rd Qu.: 7.000            
##  Max.   :15.000        Max.   :17.000
## Frequencies  
## datosRotacion$Campo_Educación  
## Type: Character  
## 
##                     Freq   % Valid   % Valid Cum.   % Total   % Total Cum.
## ----------------- ------ --------- -------------- --------- --------------
##          Ciencias    606     41.22          41.22     41.22          41.22
##       Humanidades     27      1.84          43.06      1.84          43.06
##          Mercadeo    159     10.82          53.88     10.82          53.88
##              Otra     82      5.58          59.46      5.58          59.46
##             Salud    464     31.56          91.02     31.56          91.02
##          Tecnicos    132      8.98         100.00      8.98         100.00
##              <NA>      0                               0.00         100.00
##             Total   1470    100.00         100.00    100.00         100.00

## Frequencies  
## datosRotacion$Cargo  
## Type: Character  
## 
##                                 Freq   % Valid   % Valid Cum.   % Total   % Total Cum.
## ----------------------------- ------ --------- -------------- --------- --------------
##        Director_Investigación     80      5.44           5.44      5.44           5.44
##          Director_Manofactura    145      9.86          15.31      9.86          15.31
##              Ejecutivo_Ventas    326     22.18          37.48     22.18          37.48
##                       Gerente    102      6.94          44.42      6.94          44.42
##       Investigador_Cientifico    292     19.86          64.29     19.86          64.29
##              Recursos_Humanos     52      3.54          67.82      3.54          67.82
##           Representante_Salud    131      8.91          76.73      8.91          76.73
##          Representante_Ventas     83      5.65          82.38      5.65          82.38
##           Tecnico_Laboratorio    259     17.62         100.00     17.62         100.00
##                          <NA>      0                               0.00         100.00
##                         Total   1470    100.00         100.00    100.00         100.00

## Frequencies  
## datosRotacion$Rotación  
## Type: Character  
## 
##               Freq   % Valid   % Valid Cum.   % Total   % Total Cum.
## ----------- ------ --------- -------------- --------- --------------
##          No   1233     83.88          83.88     83.88          83.88
##          Si    237     16.12         100.00     16.12         100.00
##        <NA>      0                               0.00         100.00
##       Total   1470    100.00         100.00    100.00         100.00

## Frequencies  
## datosRotacion$Estado_Civil  
## Type: Character  
## 
##                    Freq   % Valid   % Valid Cum.   % Total   % Total Cum.
## ---------------- ------ --------- -------------- --------- --------------
##           Casado    673     45.78          45.78     45.78          45.78
##       Divorciado    327     22.24          68.03     22.24          68.03
##          Soltero    470     31.97         100.00     31.97         100.00
##             <NA>      0                               0.00         100.00
##            Total   1470    100.00         100.00    100.00         100.00

## Frequencies  
## datosRotacion$Departamento  
## Type: Character  
## 
##                Freq   % Valid   % Valid Cum.   % Total   % Total Cum.
## ------------ ------ --------- -------------- --------- --------------
##          IyD    961     65.37          65.37     65.37          65.37
##           RH     63      4.29          69.66      4.29          69.66
##       Ventas    446     30.34         100.00     30.34         100.00
##         <NA>      0                               0.00         100.00
##        Total   1470    100.00         100.00    100.00         100.00

3. Análisis bivariado

viviendaSinNa = (datosRotacion[,c('Años_ultima_promoción','Años_acargo_con_mismo_jefe','Antigüedad_Cargo','Antigüedad','Años_Experiencia','Porcentaje_aumento_salarial','Trabajos_Anteriores','Ingreso_Mensual','Distancia_Casa','Edad','Rotación')])  


DatosSeleccionadosRotacion = (datosRotacion[,c('Satisfación_Laboral','Equilibrio_Trabajo_Vida','Satisfacción_Ambiental','Porcentaje_aumento_salarial','Años_Experiencia','Ingreso_Mensual','Rotación')])  


DatosSeleccionadosRotacion$Rotación <- replace (DatosSeleccionadosRotacion$Rotación, DatosSeleccionadosRotacion$Rotación %in% c("Si","No"), c("1","0"))

DatosSeleccionadosRotacion$Rotación <- as.numeric(as.character(DatosSeleccionadosRotacion$Rotación))

rotadionSinNa = na.omit(viviendaSinNa)

#create pairs plot
pairs.panels(viviendaSinNa)

La mayoría de las variables tienen una correlación muy cercana a 0 con rotación, esto debido a que al estar codificadas con 0 y 1 la línea queda casi recta y no hay una tendencia clara.

Luego del análisis general, se realizó la separación de las variables y la codifiación de rotación como 1 para sí y 0 para no. Adicionalmente se eliminaron los registros con datos vacíos.

DatosSeleccionadosRotacion = (datosRotacion[,c('Satisfación_Laboral','Equilibrio_Trabajo_Vida','Satisfacción_Ambiental','Porcentaje_aumento_salarial','Años_Experiencia','Ingreso_Mensual','Rotación')])  

DatosSeleccionadosRotacion$Rotación <- replace (DatosSeleccionadosRotacion$Rotación, DatosSeleccionadosRotacion$Rotación %in% c("Si","No"), c(1,0))

DatosSeleccionadosRotacion$Rotación <- as.numeric(as.character(DatosSeleccionadosRotacion$Rotación))

rotadionSinNa = na.omit(DatosSeleccionadosRotacion)

summary(DatosSeleccionadosRotacion)
##  Satisfación_Laboral Equilibrio_Trabajo_Vida Satisfacción_Ambiental
##  Min.   :1.000       Min.   :1.000           Min.   :1.000         
##  1st Qu.:2.000       1st Qu.:2.000           1st Qu.:2.000         
##  Median :3.000       Median :3.000           Median :3.000         
##  Mean   :2.729       Mean   :2.761           Mean   :2.722         
##  3rd Qu.:4.000       3rd Qu.:3.000           3rd Qu.:4.000         
##  Max.   :4.000       Max.   :4.000           Max.   :4.000         
##  Porcentaje_aumento_salarial Años_Experiencia Ingreso_Mensual    Rotación  
##  Min.   :11.00               Min.   : 0.00    Min.   : 1009   Min.   :0.0  
##  1st Qu.:12.00               1st Qu.: 6.00    1st Qu.: 2911   1st Qu.:0.0  
##  Median :14.00               Median :10.00    Median : 4919   Median :0.5  
##  Mean   :15.21               Mean   :11.28    Mean   : 6503   Mean   :0.5  
##  3rd Qu.:18.00               3rd Qu.:15.00    3rd Qu.: 8379   3rd Qu.:1.0  
##  Max.   :25.00               Max.   :40.00    Max.   :19999   Max.   :1.0
str(DatosSeleccionadosRotacion)
## tibble [1,470 × 7] (S3: tbl_df/tbl/data.frame)
##  $ Satisfación_Laboral        : num [1:1470] 4 2 3 3 2 4 1 3 3 3 ...
##  $ Equilibrio_Trabajo_Vida    : num [1:1470] 1 3 3 3 3 2 2 3 3 2 ...
##  $ Satisfacción_Ambiental     : num [1:1470] 2 3 4 4 1 4 3 4 4 3 ...
##  $ Porcentaje_aumento_salarial: num [1:1470] 11 23 15 11 12 13 20 22 21 13 ...
##  $ Años_Experiencia           : num [1:1470] 8 10 7 8 6 8 12 1 10 17 ...
##  $ Ingreso_Mensual            : num [1:1470] 5993 5130 2090 2909 3468 ...
##  $ Rotación                   : num [1:1470] 1 0 1 0 1 0 1 0 1 0 ...

4. Entrenamiento del modelo

Se realizó un modelo general lineal usando las variables categóricas como factores:

# Dividir la base de datos en conjuntos de entrenamiento y prueba
set.seed(123)  # Para reproducibilidad
training_indices <- createDataPartition(DatosSeleccionadosRotacion$Rotación, p = 0.7, list = FALSE)
datos_entrenamiento <- DatosSeleccionadosRotacion[training_indices, ]
datos_prueba <- DatosSeleccionadosRotacion[-training_indices, ]

# Entrenar el modelo
modelo_logit <- glm(Rotación ~ Ingreso_Mensual+ factor(Satisfación_Laboral) + factor(Equilibrio_Trabajo_Vida) + factor(Satisfacción_Ambiental) + Porcentaje_aumento_salarial +Años_Experiencia, family = binomial(link = "logit"), data = datos_entrenamiento) -> modelo_logit

summary(modelo_logit) 
## 
## Call:
## glm(formula = Rotación ~ Ingreso_Mensual + factor(Satisfación_Laboral) + 
##     factor(Equilibrio_Trabajo_Vida) + factor(Satisfacción_Ambiental) + 
##     Porcentaje_aumento_salarial + Años_Experiencia, family = binomial(link = "logit"), 
##     data = datos_entrenamiento)
## 
## Coefficients:
##                                    Estimate Std. Error z value Pr(>|z|)
## (Intercept)                      -2.096e-01  4.502e-01  -0.466    0.641
## Ingreso_Mensual                  -2.308e-05  2.084e-05  -1.107    0.268
## factor(Satisfación_Laboral)2     -1.961e-01  1.997e-01  -0.982    0.326
## factor(Satisfación_Laboral)3     -1.243e-01  1.785e-01  -0.696    0.486
## factor(Satisfación_Laboral)4      6.530e-02  1.792e-01   0.364    0.716
## factor(Equilibrio_Trabajo_Vida)2  1.725e-01  3.240e-01   0.532    0.594
## factor(Equilibrio_Trabajo_Vida)3 -8.899e-02  3.073e-01  -0.290    0.772
## factor(Equilibrio_Trabajo_Vida)4  7.221e-02  3.532e-01   0.204    0.838
## factor(Satisfacción_Ambiental)2   2.961e-01  2.030e-01   1.459    0.145
## factor(Satisfacción_Ambiental)3   2.482e-01  1.826e-01   1.359    0.174
## factor(Satisfacción_Ambiental)4   1.682e-01  1.833e-01   0.917    0.359
## Porcentaje_aumento_salarial       3.099e-03  1.729e-02   0.179    0.858
## Años_Experiencia                  1.676e-02  1.303e-02   1.286    0.198
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 1427.9  on 1029  degrees of freedom
## Residual deviance: 1417.6  on 1017  degrees of freedom
## AIC: 1443.6
## 
## Number of Fisher Scoring iterations: 4

Para cada uno de los coeficiente, se obtuvo la exponencial:

coef_base <- exp(coef(modelo_logit));coef_base
##                      (Intercept)                  Ingreso_Mensual 
##                        0.8108819                        0.9999769 
##     factor(Satisfación_Laboral)2     factor(Satisfación_Laboral)3 
##                        0.8219665                        0.8831075 
##     factor(Satisfación_Laboral)4 factor(Equilibrio_Trabajo_Vida)2 
##                        1.0674764                        1.1882580 
## factor(Equilibrio_Trabajo_Vida)3 factor(Equilibrio_Trabajo_Vida)4 
##                        0.9148507                        1.0748833 
##  factor(Satisfacción_Ambiental)2  factor(Satisfacción_Ambiental)3 
##                        1.3445697                        1.2816732 
##  factor(Satisfacción_Ambiental)4      Porcentaje_aumento_salarial 
##                        1.1831335                        1.0031035 
##                 Años_Experiencia 
##                        1.0169046

Con respecto a las variables numéricas, la más representativas es años de experiencia, por cada año aumenta en 1% la oportunidad de rotación

Con respecto a las variables categórticas, los empleados con insatisfacción ambiental tienen 34% más oportunidad de rotar.

Adicionalmente, los empleados con satisfacción laboral, disminuyen en un 12% la oportunidad de rotar.

5. Evaluación poder predictivo ROC

Se realizó la evaluación del modelo usando el valor AUC y la curva ROC:

valor_pronosticado <- predict(modelo_logit,datos_prueba,type = "response")

curva_ROC <- roc(datos_prueba$Rotación, valor_pronosticado)
## Setting levels: control = 0, case = 1
## Setting direction: controls < cases
auc<- round(auc(curva_ROC, levels =c(0,1), direction = "<"),4) # 0.9177

ggroc(curva_ROC, colour = "#FF7F00", size=1)+
ggtitle(paste0("Curva ROC ", "(AUC = ", auc, ")"))+
xlab("Especificidad")+
ylab("Sensibilidad")  

El valor del AUC es bajo, con un 0.54 y la curva no logra acumular una gran cantidad de senbilidad. Por este motivo es mejor utilizar otras variables para mejorar el modelo y tener un mejor rendimiento.

6. Conclusiones

La retención del personal es un problema multifactorial y es necesario seguir trabajando en la construcción de modelos que permitan tener una mejor predicción de la rotación al interior de esta empresa en particular. Con los datos que hay hasta el momento, la recomendación es mejorar la satisfacción laboral de los empleados y la insatisfacción del medio ambiente, que ocasionan la mayor cantidad de impacto al respecto.

Bibliografía

Biswas, A. K., Seethalakshmi, R., Mariappan, P., & Bhattacharjee, D. (2023). An ensemble learning model for predicting the intention to quit among employees using classification algorithms. Decision Analytics Journal, 9, 100335.