Problema: Rotación de cargo

Este análisis busca comprender los factores que influyen en la rotación de los empleados entre distintos cargos (si el trabajador ha sido cambiado de departamento) a partir de datos históricos. Se plantea desarrollar un modelo de regresión logistica para determinar la probabilidad que un empleado cambie de cargo.

Exploración de datos

df

La base de datos contiene un total de 1470 registros (empleados) con las siguientes 24 variables Rotación, Edad, Viaje de Negocios, Departamento, Distancia_Casa, Educación, Campo_Educación, Satisfacción_Ambiental, Genero, Cargo, Satisfación_Laboral, Estado_Civil, Ingreso_Mensual, Trabajos_Anteriores, Horas_Extra, Porcentaje_aumento_salarial, Rendimiento_Laboral, Años_Experiencia, Capacitaciones, Equilibrio_Trabajo_Vida, Antigüedad, Antigüedad_Cargo, Años_ultima_promoción, Años_acargo_con_mismo_jefe.

1. Selección de variables

A partir de revisión bilbiográfica se ha decidio utilizar las siguientes variables:

  1. Edad: los empleados más jóvenes tienden a ser más móviles y a cambiar de empleo con mayor frecuencia, mientras que los empleados más veteranos tienden a ser más estables en sus puestos. Referencia: Kyndt, E., et al. (2009). “Employee Retention: Organizational and Personal Perspectives.”

  2. Distancia_Casa: La distancia desde el hogar al trabajo puede influir en el deseo del empleado de cambiar de departamento o incluso de empresa. Estudios muestran que los empleados con trayectos largos tienen mayor probabilidad de experimentar estrés y fatiga, lo que aumenta la rotación. Referencia: Kluger, A. N. (1998). “Commute variability and strain.”

  3. Ingreso_Mensual: El nivel salarial influye directamente en la retención de empleados. Una baja satisfacción con el salario suele correlacionarse con una mayor rotación. Referencia: Trevor, C. O., et al. (1997). “Voluntary turnover and job performance: Curvilinearity and the moderating influences of salary growth and promotions.”

  4. Satisfacción_Ambiental: La satisfacción con el ambiente de trabajo (incluyendo las relaciones con colegas y la cultura de la empresa) es un predictor importante de la rotación. Referencia: Schneider, B., et al. (2003). “Understanding organizational climate and culture.”

  5. Estado_Civil: Los empleados casados tienden a tener menores tasas de rotación en comparación con los solteros, ya que pueden valorar más la estabilidad laboral. Referencia: Hom, P. W., et al. (1995). “Employee turnover research: A retrospective and prospective analysis.”

  6. Horas_Extra: Los empleados que trabajan muchas horas extra pueden experimentar agotamiento y estrés, lo que puede aumentar su intención de cambiar de departamento o de dejar la organización por completo. La carga excesiva de trabajo se asocia frecuentemente con un mayor deseo de buscar nuevas oportunidades laborales. Referencia: Niharika, D. & Suar, D. (2010). “Work–life balance practices and their impact on employee performance.”

df1 <- df %>%
  select(Rotación, Edad, Distancia_Casa, Ingreso_Mensual, Satisfacción_Ambiental, Estado_Civil, Horas_Extra)
head(df1)

Exploración de datos

A continuación se realiza una revisión de la clasificación de tipo de las variables seleccionadas.

sapply(df1, class)
##               Rotación                   Edad         Distancia_Casa 
##            "character"              "numeric"              "numeric" 
##        Ingreso_Mensual Satisfacción_Ambiental           Estado_Civil 
##              "numeric"              "numeric"            "character" 
##            Horas_Extra 
##            "character"

A partir de la revisión se cambia el tipo de la variable Satisfacción_Ambiental.

df1$Satisfacción_Ambiental <- as.factor(df1$Satisfacción_Ambiental)

Por otro lado, se etiqueta la variable “Rotación” donde “Si”=1 y “No”=0.

df1$Rotación <- ifelse(df1$Rotación == "Si", 1, 0)
head(df1)

2. Análisis univariado

Rotación - Variable respuesta

df_table = as.data.frame(table(df1$Rotación))
kable(df_table)
Var1 Freq
0 1233
1 237
ggplot(df1, aes(x = Rotación)) +
  geom_bar(fill = "skyblue") +
  labs(title = "Distribución de la Variable Rotación", x = "Rotación", y = "Frecuencia") +
  theme_minimal()

El 83% de las personas de la base de datos no ha rotado de cargo, lo que implica un sesgo importante al momento de realizar proyecciones a partir de esta base. Normalmente se debe balancear la muestra, sin embargo para esta ocasión este procedimiento no será realizado.

Edad

df_summary <- data.frame(Estadística = names(summary(df1$Edad)), 
                         Valor = as.numeric(summary(df1$Edad)))
kable(df_summary, col.names = c("Estadística", "Valor"))
Estadística Valor
Min. 18.00000
1st Qu. 30.00000
Median 36.00000
Mean 36.92449
3rd Qu. 43.00000
Max. 60.00000
kable(sd(df1$Edad, na.rm = TRUE))
x
9.135938
ggplot(df1, aes(x = Edad)) +
  geom_histogram(fill = "skyblue", bins = 30) +
  labs(title = "Histograma de la Variable Edad", x = "Edad", y = "Frecuencia") +
  theme_minimal()

### Revisar si se agrupan

En la base se encuentran personas desde 18 hasta 60 años, con un promedio de 36,9 y una distribución con forma relativamente normal.

Distancia_Casa

df_summary_ingreso <- data.frame(Estadística = names(summary(df1$Ingreso_Mensual)), 
                                 Valor = as.numeric(summary(df1$Ingreso_Mensual)))
kable(df_summary_ingreso, col.names = c("Estadística", "Valor"))
Estadística Valor
Min. 1009.000
1st Qu. 2911.000
Median 4919.000
Mean 6502.931
3rd Qu. 8379.000
Max. 19999.000
kable(sd(df1$Distancia_Casa, na.rm = TRUE))
x
8.106864
ggplot(df1, aes(x = Distancia_Casa)) +
  geom_histogram(fill = "skyblue", bins = 30) +
  labs(title = "Histograma de la Distancia de Casa en Kms", x = "Kms", y = "Frecuencia") +
  theme_minimal()

### Revisar si se agrupan

La distacia de la casa al trabajo de las personas de la base se encuentran entre 1 kilometro y casi 20 kilometros, con un promedio de 6,5 kilometros. Un alto porcentaje vive a menos de 10 kms.

Ingreso_Mensual

df_summary_ingreso <- data.frame(Estadística = names(summary(df1$Ingreso_Mensual)), 
                                 Valor = as.numeric(summary(df1$Ingreso_Mensual)))
kable(df_summary_ingreso, col.names = c("Estadística", "Valor"))
Estadística Valor
Min. 1009.000
1st Qu. 2911.000
Median 4919.000
Mean 6502.931
3rd Qu. 8379.000
Max. 19999.000
kable(sd(df1$Ingreso_Mensual, na.rm = TRUE))
x
4707.957
ggplot(df1, aes(x = Ingreso_Mensual)) +
  geom_histogram(fill = "skyblue", bins = 30) +
  labs(title = "Histograma de la Variable Ingreso Mensual", x = "Ingreso Mensual", y = "Frecuencia") +
  theme_minimal()

Los ingresos mensuales varian desde usd $1.009 hasta usd $19.999 con un promedio de usd $4.919 y una desviación estandar de usd $4.707.

Satisfacción_Ambiental

table(df1$Satisfacción_Ambiental)
## 
##   1   2   3   4 
## 284 287 453 446
ggplot(df1, aes(x = Satisfacción_Ambiental)) +
  geom_bar(fill = "skyblue") +
  labs(title = "Distribución de la Variable Satisfacción Ambiental", x = "Satisfacción Ambiental", y = "Frecuencia") +
  theme_minimal()

En el ambiente laboral el 39% lo cataloga como “Muy insatisfecho” o “Insatisfecho”, el 31% como “Satisfecho” y el 30% como “Muy satisfecho”.

Estado_Civil

table(df1$Estado_Civil)
## 
##     Casado Divorciado    Soltero 
##        673        327        470
ggplot(df1, aes(x = Estado_Civil)) +
  geom_bar(fill = "lightblue") +
  labs(title = "Distribución de la Variable Estado Civil", x = "Estado Civil", y = "Frecuencia") +
  theme_minimal()

De la población total el 46% es casado, el 22% divorciado y el restante 32% soltero.

Horas_Extra

table(df1$Horas_Extra)
## 
##   No   Si 
## 1054  416
ggplot(df1, aes(x = Horas_Extra)) +
  geom_bar(fill = "lightblue") +
  labs(title = "Distribución de la Variable Horas Extra", x = "Horas Extra", y = "Frecuencia") +
  theme_minimal()

El 72% de los empleados de la base no realizan horas extra.

3. Análisis bivariado

Análisis de “Rotación” vs. “Edad”

modelo_edad <- glm(Rotación ~ Edad, data = df1, family = binomial())

summary(modelo_edad)
## 
## Call:
## glm(formula = Rotación ~ Edad, family = binomial(), data = df1)
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)    
## (Intercept)  0.20637    0.30597   0.674      0.5    
## Edad        -0.05225    0.00870  -6.006  1.9e-09 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 1298.6  on 1469  degrees of freedom
## Residual deviance: 1259.1  on 1468  degrees of freedom
## AIC: 1263.1
## 
## Number of Fisher Scoring iterations: 4
ggplot(rotacion, aes(x = factor(Rotación), y = Edad)) +
  geom_boxplot(fill = "lightblue") +
  labs(title = "Relación entre Rotación y Edad", x = "Rotación", y = "Edad") +
  theme_minimal()

La variable Edad es un predictor significativo de la rotación de empleados. El coeficiente negativo sugiere que a medida que los empleados son mayores, es menos probable que roten.

En el boxplot se refuerza la conclusión obtenida del análisis de regresión logística: la edad está negativamente relacionada con la rotación, es decir, los empleados más jóvenes tienden a rotar más, mientras que los empleados mayores tienden a quedarse en los cargos que ya tienen.

Análisis de “Rotación” vs. “Distancia_Casa”

modelo_distancia <- glm(Rotación ~ Distancia_Casa, data = df1, family = binomial())

summary(modelo_distancia)
## 
## Call:
## glm(formula = Rotación ~ Distancia_Casa, family = binomial(), 
##     data = df1)
## 
## Coefficients:
##                 Estimate Std. Error z value Pr(>|z|)    
## (Intercept)    -1.890051   0.111382 -16.969  < 2e-16 ***
## Distancia_Casa  0.024710   0.008312   2.973  0.00295 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 1298.6  on 1469  degrees of freedom
## Residual deviance: 1290.0  on 1468  degrees of freedom
## AIC: 1294
## 
## Number of Fisher Scoring iterations: 4
ggplot(rotacion, aes(x = factor(Rotación), y = Distancia_Casa)) +
  geom_boxplot(fill = "lightgreen") +
  labs(title = "Relación entre Rotación y Distancia a Casa", x = "Rotación", y = "Distancia a Casa") +
  theme_minimal()

La variable Distancia_Casa es un predictor significativo de la rotación. El coeficiente positivo sugiere que a medida que la distancia entre la casa y el trabajo aumenta, también lo hace la probabilidad de que un empleado rote.

El gráfico apoya la conclusión obtenida en el análisis de regresión logística: a mayor distancia entre la casa y el trabajo, mayor es la probabilidad de rotación. Los empleados que viven más lejos tienen más probabilidades de rotar, posiblemente debido a que el desplazamiento puede generar insatisfacción o fatiga, lo que les impulsa a buscar otras oportunidades más cercanas o con mejores condiciones.

Análisis de “Rotación” vs. “Ingreso_Mensual”

modelo_ingreso <- glm(Rotación ~ Ingreso_Mensual, data = df1, family = binomial())

summary(modelo_ingreso)
## 
## Call:
## glm(formula = Rotación ~ Ingreso_Mensual, family = binomial(), 
##     data = df1)
## 
## Coefficients:
##                   Estimate Std. Error z value Pr(>|z|)    
## (Intercept)     -9.291e-01  1.292e-01  -7.191 6.43e-13 ***
## Ingreso_Mensual -1.271e-04  2.162e-05  -5.879 4.12e-09 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 1298.6  on 1469  degrees of freedom
## Residual deviance: 1253.1  on 1468  degrees of freedom
## AIC: 1257.1
## 
## Number of Fisher Scoring iterations: 5
ggplot(rotacion, aes(x = factor(Rotación), y = Ingreso_Mensual)) +
  geom_boxplot(fill = "lightcoral") +
  labs(title = "Relación entre Rotación e Ingreso Mensual", x = "Rotación", y = "Ingreso Mensual") +
  theme_minimal()

Ingreso_Mensual es un factor significativo que influye en la rotación de los empleados. A medida que el Ingreso_Mensual aumenta, la probabilidad de que un empleado rote (o deje la empresa) disminuye, como lo indica el coeficiente negativo.

En el boxplot se visualiza claramente la relación negativa entre Ingreso Mensual y Rotación: los empleados con salarios más bajos tienden a rotar más, mientras que aquellos con salarios más altos tienden a quedarse.

Análisis de “Rotación” vs. “Satisfacción_Ambiental”

modelo_satisfaccion <- glm(Rotación ~ Satisfacción_Ambiental, data = df1, family = binomial())

summary(modelo_satisfaccion)
## 
## Call:
## glm(formula = Rotación ~ Satisfacción_Ambiental, family = binomial(), 
##     data = df1)
## 
## Coefficients:
##                         Estimate Std. Error z value Pr(>|z|)    
## (Intercept)              -1.0799     0.1364  -7.917 2.43e-15 ***
## Satisfacción_Ambiental2  -0.6560     0.2144  -3.060  0.00221 ** 
## Satisfacción_Ambiental3  -0.7617     0.1931  -3.944 8.01e-05 ***
## Satisfacción_Ambiental4  -0.7816     0.1946  -4.017 5.90e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 1298.6  on 1469  degrees of freedom
## Residual deviance: 1278.0  on 1466  degrees of freedom
## AIC: 1286
## 
## Number of Fisher Scoring iterations: 4
ggplot(rotacion, aes(x = Satisfacción_Ambiental, fill = factor(Rotación))) +
  geom_bar(position = "fill") +
  labs(title = "Relación entre Rotación y Satisfacción Ambiental", x = "Satisfacción Ambiental", y = "Proporción") +
  theme_minimal()

La variable Satisfacción_Ambiental es un predictor significativo de la rotación de empleados. A medida que aumenta la satisfacción ambiental, la probabilidad de rotación disminuye. En otras palabras, los empleados más satisfechos con su ambiente laboral tienen menos probabilidades de dejar la empresa.

De nuevo el gráfico refuerza la interpretación del modelo de regresión logística que a medida que la satisfacción ambiental aumenta, la probabilidad de rotación disminuye. Los empleados que están más satisfechos con su ambiente de trabajo tienen una menor tendencia a dejar la empresa.

Análisis de “Rotación” vs. “Estado_Civil”

modelo_estado_civil <- glm(Rotación ~ Estado_Civil, data = df1, family = binomial())

summary(modelo_estado_civil)
## 
## Call:
## glm(formula = Rotación ~ Estado_Civil, family = binomial(), 
##     data = df1)
## 
## Coefficients:
##                        Estimate Std. Error z value Pr(>|z|)    
## (Intercept)             -1.9476     0.1166 -16.699  < 2e-16 ***
## Estado_CivilDivorciado  -0.2395     0.2175  -1.101    0.271    
## Estado_CivilSoltero      0.8772     0.1575   5.571 2.54e-08 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 1298.6  on 1469  degrees of freedom
## Residual deviance: 1254.6  on 1467  degrees of freedom
## AIC: 1260.6
## 
## Number of Fisher Scoring iterations: 4
ggplot(rotacion, aes(x = Estado_Civil, fill = factor(Rotación))) +
  geom_bar(position = "fill") +
  labs(title = "Relación entre Rotación y Estado Civil", x = "Estado Civil", y = "Proporción") +
  theme_minimal()

El Estado Civil es un predictor significativo de la rotación, pero solo para el grupo de empleados solteros ya que tienen una mayor probabilidad de rotación en comparación con los casados.

No hay suficiente evidencia para concluir que los empleados divorciados tienen un comportamiento de rotación significativamente diferente a los casados.

La interprestación del modelo se refuerza con el gráfica, mostrando que los empleados solteros tienen una mayor probabilidad de rotación en comparación con los casados y divorciados. Los empleados casados y divorciados muestran un comportamiento de rotación similar, con proporciones bajas de rotación.

Análisis de “Rotación” vs. “Horas_Extra”

modelo_horas_extra <- glm(Rotación ~ Horas_Extra, data = df1, family = binomial())

summary(modelo_horas_extra)
## 
## Call:
## glm(formula = Rotación ~ Horas_Extra, family = binomial(), data = df1)
## 
## Coefficients:
##               Estimate Std. Error z value Pr(>|z|)    
## (Intercept)    -2.1496     0.1007 -21.338   <2e-16 ***
## Horas_ExtraSi   1.3274     0.1466   9.056   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 1298.6  on 1469  degrees of freedom
## Residual deviance: 1217.2  on 1468  degrees of freedom
## AIC: 1221.2
## 
## Number of Fisher Scoring iterations: 4
ggplot(rotacion, aes(x = Horas_Extra, fill = factor(Rotación))) +
  geom_bar(position = "fill") +
  labs(title = "Relación entre Rotación y Horas Extra", x = "Horas Extra", y = "Proporción") +
  theme_minimal()

La variable Horas_Extra es un predictor altamente significativo de la rotación de empleados. Los empleados que realizan horas extra tienen una mayor probabilidad de rotación en comparación con aquellos que no realizan horas extra.

Finalmente el gráfico confirma la interpretación del modelo de regresión logística que los empleados que realizan horas extra tienen una mayor probabilidad de rotación en comparación con aquellos que no las realizan.

4. Estimación del Modelo Logit

set.seed(123)
split <- sample.split(df1$Rotación, SplitRatio = 0.7)
train_set <- subset(df1, split == TRUE)
test_set <- subset(df1, split == FALSE)

#kable(nrow(train_set))  # Tamaño del set de entrenamiento
#kable(nrow(test_set))   # Tamaño del set de prueba

Set de entrenamiento

head(train_set)

Set de prueba

head(test_set)
modelo_logistico <- glm(Rotación ~ Edad + Distancia_Casa + Ingreso_Mensual + 
                          Satisfacción_Ambiental + Estado_Civil + Horas_Extra,
                        data = train_set, family = binomial())

summary(modelo_logistico)
## 
## Call:
## glm(formula = Rotación ~ Edad + Distancia_Casa + Ingreso_Mensual + 
##     Satisfacción_Ambiental + Estado_Civil + Horas_Extra, family = binomial(), 
##     data = train_set)
## 
## Coefficients:
##                           Estimate Std. Error z value Pr(>|z|)    
## (Intercept)             -5.205e-01  4.448e-01  -1.170 0.241958    
## Edad                    -2.037e-02  1.150e-02  -1.771 0.076613 .  
## Distancia_Casa           2.870e-02  1.097e-02   2.617 0.008869 ** 
## Ingreso_Mensual         -1.295e-04  3.068e-05  -4.222 2.42e-05 ***
## Satisfacción_Ambiental2 -1.005e+00  2.856e-01  -3.517 0.000437 ***
## Satisfacción_Ambiental3 -8.964e-01  2.482e-01  -3.612 0.000304 ***
## Satisfacción_Ambiental4 -1.048e+00  2.570e-01  -4.080 4.51e-05 ***
## Estado_CivilDivorciado  -2.923e-01  2.751e-01  -1.062 0.288055    
## Estado_CivilSoltero      8.245e-01  2.029e-01   4.063 4.84e-05 ***
## Horas_ExtraSi            1.458e+00  1.909e-01   7.636 2.24e-14 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 909.34  on 1028  degrees of freedom
## Residual deviance: 766.82  on 1019  degrees of freedom
## AIC: 786.82
## 
## Number of Fisher Scoring iterations: 5

Analisis de parámetros

Lo primero es aclarar que en el modelo logit se evalúa la oportunidad de que ocurra un evento. En el caso analizado, el evento a evaluar es que un empleado cambie de cargo en el próximo período. Los valores positivos en los parámetros del modelo implican que, al aumentar los valores de las variables, es más probable que el trabajador cambie de cargo.

El primer coeficiente es el intercepto, que tiene un valor de pequeño, lo que indica que, en ausencia de cambios en las otras variables, la probabilidad de que ocurra un cambio de cargo es baja. La variable Edad presenta un coeficiente negativo, lo que sugiere que, por cada año adicional de edad, la probabilidad de que un empleado cambie de cargo disminuye. En cuanto a la variable Distancia_Casa, el coeficiente es positiva, lo que indica que, por cada kilómetro adicional entre el lugar de trabajo y el hogar, la probabilidad de cambio de cargo aumenta. Respecto al Ingreso_Mensual, el coeficiente es negativo, lo que implica que, a medida que aumenta el ingreso mensual de un empleado, es menos probable que cambie de cargo.

En lo referente a las variables categóricas, los coeficientes relacionados con la Satisfacción Ambiental son negativos, lo que refleja que, a medida que aumenta la satisfacción ambiental, las probabilidades de cambio de cargo disminuyen. El coeficiente para Estado Civil (Soltero) es positivo, lo cual indica que los solteros presentan mayor probabilidad de cambiar de cargo en comparación con los casados, por otra parte el coeficiente para Estado Civil (Divorciado) es negativo, lo que refleja que los divorciados presentan una menor probabilidad de rotar que los casados. Por ultimo, la variable Horas Extra tiene un coeficiente de 1.458, lo que indica que los empleados que trabajan horas extra tienen una mayor probabilidad de cambiar de cargo.

De las variables analizadas, resultan significativas trabajando con un nivel de confianza de 95%: distancia, ingreso, satisfacción ambiental, estado civil de solteros y horas extra. Mientras que las variables: edad, estado civil divorciado e intercepto no resultan significativas.

Variación probabilistica de los interceptos

odds_ratios <- exp(coef(modelo_logistico))

odds_ratio_table <- data.frame(
  Exponencial = odds_ratios,
  Oportunidad_Rotación = (1 - odds_ratios)*(100)
)

kable(odds_ratio_table)
Exponencial Oportunidad_Rotación
(Intercept) 0.5942252 40.5774804
Edad 0.9798378 2.0162227
Distancia_Casa 1.0291183 -2.9118321
Ingreso_Mensual 0.9998705 0.0129518
Satisfacción_Ambiental2 0.3662119 63.3788081
Satisfacción_Ambiental3 0.4080367 59.1963292
Satisfacción_Ambiental4 0.3505136 64.9486420
Estado_CivilDivorciado 0.7465639 25.3436090
Estado_CivilSoltero 2.2806885 -128.0688527
Horas_ExtraSi 4.2971230 -329.7122970

Para analizar cómo las variables seleccionadas influyen en la oportunidad de que una persona rote o no de cargo, se observa lo siguiente:

  • Un año adicional en la edad reduce la oportunidad de rotación en aproximadamente un 2%. En cuanto a la variable de distancia respecto a la casa, por cada kilómetro adicional recorrido, la oportunidad de cambiar de trabajo aumenta en un 3%. Cada incremento en una unidad del ingreso mensual reduce la oportunidad de cambiar de cargo en un 0.012%.

  • Respecto a las variables categóricas, se observa que al pasar de un nivel de satisfacción ambiental de 1 a 2, 3 o 4, la oportunidad de rotación se reduce en un 63%, 59% y 65%, respectivamente. En cuanto al estado civil, una persona soltera tiene un 128% más de oportunidades de cambiar de trabajo en comparación con una persona casada. Por último, aquellos que realizan horas extra tienen un 329% más de oportunidades de cambiar de cargo en un período próximo en comparación con quienes no realizan horas extra.

5. ROC y el AUC

Matriz de confusión

# Realizar predicciones
predicciones <- predict(modelo_logistico, newdata = test_set, type = "response")
predicciones_binarias <- ifelse(predicciones > 0.5, 1, 0)


matriz_confusion <- table(Real = test_set$Rotación, Predicho = predicciones_binarias)
kable(matriz_confusion)
0 1
0 366 4
1 54 17
# Acceder a los valores de la matriz de confusión
TN <- matriz_confusion[1, 1]  # Verdaderos Negativos
FP <- matriz_confusion[1, 2]  # Falsos Positivos
FN <- matriz_confusion[2, 1]  # Falsos Negativos
TP <- matriz_confusion[2, 2]  # Verdaderos Positivos

# Calcular las métricas
precision <- (TP + TN) / (TP + TN + FP + FN)
sensibilidad <- TP / (TP + FN)
especificidad <- TN / (TN + FP)
valor_predictivo_positivo <- TP / (TP + FP)

cat("Precisión (Accuracy):", round(precision, 4), "\n")
## Precisión (Accuracy): 0.8685
cat("Sensibilidad (Recall):", round(sensibilidad, 4), "\n")
## Sensibilidad (Recall): 0.2394
cat("Especificidad:", round(especificidad, 4), "\n")
## Especificidad: 0.9892
cat("Valor Predictivo Positivo (Precision):", round(valor_predictivo_positivo, 4), "\n")
## Valor Predictivo Positivo (Precision): 0.8095

Al realizar una matriz de confusión sobre los datos de prueba, se observa lo siguiente: el modelo realizó correctamente 366 predicciones de “no rotación”, mientras que en 54 casos predijo “no rotación” cuando en realidad sí hubo rotación. Por otro lado, en las predicciones de “rotación”, el modelo acertó en 17 casos, pero cometió 4 errores, prediciendo “rotación” cuando no la hubo.

De la matriz de confusión y las métricas obtenidas, se observa que el modelo presenta una precisión del 87% y una especificidad del 99%, lo que demuestra su eficacia para predecir los casos de no rotación. No obstante, la sensibilidad es únicamente del 24%, lo que resalta una baja capacidad para predecir los casos en que es probable que ocurra rotación. Por último, una precisión del 81% indica que, cuando el modelo predice rotación, es muy probable que esta efectivamente ocurra. En términos generales, el modelo es bueno realizando predicciones; sin embargo, muestra limitaciones al momento de captar la mayoría de los casos que presentarán rotación.

ROC

predicciones <- predict(modelo_logistico, newdata = test_set, type = "response")
roc_curve <- roc(test_set$Rotación, predicciones)
plot(roc_curve, col = "blue", main = "Curva ROC - Modelo Logístico")
legend("bottomright", legend = paste("AUC =", round(auc(roc_curve), 2)), col = "blue", lwd = 2)

La curva ROC obtenida refleja que está alejada de la diagonal de la gráfica, lo cual es un buen resultado, ya que dicha diagonal representa el comportamiento de un clasificador aleatorio.

AUC

auc(roc_curve)
## Area under the curve: 0.7965

El área bajo la curva presenta un valor de 0.79, lo que permite afirmar que el modelo tiene una buena capacidad para clasificar la probabilidad de que un trabajador cambie de cargo. Considerando que un AUC de 1 corresponde a un modelo perfecto y un AUC de 0.5 indica una clasificación prácticamente aleatoria, se puede afirmar que un AUC de 0.8 es un buen valor.

6. Predicciones

Para analizar el modelo se plantea un escenario con un caso hipotetico de un empleado de 29 años

individuo <- data.frame(Edad = 29,  
                         Distancia_Casa = 28,   
                         Ingreso_Mensual = 7500,
                         Satisfacción_Ambiental = '4',
                         Estado_Civil = 'Soltero',
                         Horas_Extra = 'Si')

prediccion <- predict(modelo_logistico, individuo, type = "response")


if (prediccion > 0.5) {
  mensaje <- "Es probable que el empleado rote de cargo."
} else {
  mensaje <- "No es probable que el empleado rote de cargo."
}

print(paste("Probabilidad de rotación:", prediccion))
## [1] "Probabilidad de rotación: 0.488779229985453"
print(mensaje)
## [1] "No es probable que el empleado rote de cargo."

7. Conclusiones

Como resultado del análisis realizado, se plantea una estrategia para que la empresa pueda evitar una alta rotación de personal. En primer lugar, es necesario mantener un nivel salarial competitivo, adicionalmente, resulta importante asegurar un buen ambiente laboral, sin embargo, no es necesario asegurar el nivel mas alto de bienestar con asegurar un nivel dos de conformidad se obtiene casi el mismo resultado que con los niveles 3 y 4. Respecto a la distancia de las viviendas de los trabajadores, se recomienda contratar personas que vivan cerca del trabajo o pensar en un modelo de trabajo como la virtualidad, en el cual no sea necesario desplazarse. En cuanto a la contratación de empleados solteros, se debe buscar que estos tengan otros factores que generen mayor lealtad al trabajo. Se puede considerar ofrecer beneficios extralegales, como un buen plan de salud. Por último, es necesario controlar el nivel de horas extra de los trabajadores para evitar casos de burnout, lo cual puede resultar en que busquen un nuevo cargo. Para esto, se podría plantear un límite de horas extra mensuales que puede realizar un trabajador. Las únicas variables a las que no se les presenta una recomendación son la edad y el estado civil divorciado, dado que no presentaron niveles de significancia para un nivel de confianza del 95%.