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.
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
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 ...
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.
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.
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.
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.