En una organización, se busca comprender y prever los factores que influyen en la rotación de empleados entre distintos cargos. La empresa ha recopilado datos históricos sobre el empleo de sus trabajadores, incluyendo variables como la antigüedad en el cargo actual, el nivel de satisfacción laboral, el salario actual, edad y otros factores relevantes. La gerencia planea desarrollar un modelo de regresión logística que permita estimar la probabilidad de que un empleado cambie de cargo en el próximo período y determinar cuales factores indicen en mayor proporción a estos cambios.
Con esta información, la empresa podrá tomar medidas proactivas para retener a su talento clave, identificar áreas de mejora en la gestión de recursos humanos y fomentar un ambiente laboral más estable y tranquilo. La predicción de la probabilidad de rotación de empleados ayudará a la empresa a tomar decisiones estratégicas informadas y a mantener un equipo de trabajo comprometido y satisfecho en sus roles actuales.
A continuación se describen los pasos que la gerencia ha propuesto para el análisis:
Seleccione 3 variables categóricas (distintas de rotación) y 3 variables cuantitativas, que se consideren estén relacionadas con la rotación. Nota: Debes justificar porque estas variables están relacionadas y que tipo de relación se espera entre ellas (Hipótesis).
Solución:
Para seleccionar las tres variables categóricas y las tres variables cuantitativas que se analizarán en los próximos apartados, se llevó a cabo una revisión de estudios previos relevantes. Este análisis permitió identificar las variables con mayor asociación para la predicción de la rotación de empleados. Con base en estos hallazgos, se seleccionaron las siguientes variables:
Variables categóricas:
a. Viaje de Negocios:
b. Satisfacción Ambiental:
c. Horas Extra:
Variables numéricas:
d. Distancia a la Casa:
e. Edad:
f. Trabajos Anteriores:
Realiza un análisis univariado (caracterización) de la información contenida en la base de datos rotacion.
Solución:
El proceso inicia con el carge de de la base de datos rotacion a partir de la libreria paqueteMETODOS.
library(paqueteMETODOS)
data("rotacion")
rotacion = rotacion
La base de datos data, filtrada según las variables seleccionadas en el apartado anterior, presenta la siguiente estructura:
data = rotacion[,c(1,3,8,15,5,2,14)]
data$Satisfacción_Ambiental=as.character(data$Satisfacción_Ambiental)
st_options(
dfSummary.custom.2 =
expression(
paste(
"Q1 - Q3 :",
round(
quantile(column_data, probs = .25, type = 2,
names = FALSE, na.rm = TRUE), digits = 1
), " - ",
round(
quantile(column_data, probs = .75, type = 2,
names = FALSE, na.rm = TRUE), digits = 1
)
)
)
)
dfSummary(data,
valid.col = FALSE,
style = "grid",
plain.ascii = FALSE,
headings = FALSE,
graph.magnif = 0.75,
tmp.img.dir = "/tmp"
)
| No | Variable | Stats / Values | Freqs (% of Valid) | Graph | Missing |
|---|---|---|---|---|---|
| 1 | Rotación [character] |
1. No 2. Si |
1233 (83.9%) 237 (16.1%) |
0 (0.0%) |
|
| 2 | Viaje de Negocios [character] |
1. Frecuentemente 2. No_Viaja 3. Raramente |
277 (18.8%) 150 (10.2%) 1043 (71.0%) |
0 (0.0%) |
|
| 3 | Satisfacción_Ambiental [character] |
1. 1 2. 2 3. 3 4. 4 |
284 (19.3%) 287 (19.5%) 453 (30.8%) 446 (30.3%) |
0 (0.0%) |
|
| 4 | Horas_Extra [character] |
1. No 2. Si |
1054 (71.7%) 416 (28.3%) |
0 (0.0%) |
|
| 5 | Distancia_Casa [numeric] |
Mean (sd) : 9.2 (8.1) min < med < max: 1 < 7 < 29 IQR (CV) : 12 (0.9) Q1 - Q3 : 2 - 14 |
29 distinct values | 0 (0.0%) |
|
| 6 | Edad [numeric] |
Mean (sd) : 36.9 (9.1) min < med < max: 18 < 36 < 60 IQR (CV) : 13 (0.2) Q1 - Q3 : 30 - 43 |
43 distinct values | 0 (0.0%) |
|
| 7 | Trabajos_Anteriores [numeric] |
Mean (sd) : 2.7 (2.5) min < med < max: 0 < 2 < 9 IQR (CV) : 3 (0.9) Q1 - Q3 : 1 - 4 |
0 : 197 (13.4%) 1 : 521 (35.4%) 2 : 146 ( 9.9%) 3 : 159 (10.8%) 4 : 139 ( 9.5%) 5 : 63 ( 4.3%) 6 : 70 ( 4.8%) 7 : 74 ( 5.0%) 8 : 49 ( 3.3%) 9 : 52 ( 3.5%) |
0 (0.0%) |
De acuerdo con el resumen estadístico anterior, se observa que la base de datos contiene 1,470 registros (filas) y 7 variables (columnas). La caracterización de la base de datos es la siguiente:
a. Rotación: Variable cualitativa nominal.
b. Viaje de Negocios: Variable cualitativa nominal.
c. Satisfacción Ambiental: Variable cualitativa ordinal.
d. Horas Extra: Variable cualitativa nominal.
e. Distancia Casa: Variable cuantitativa continua.
f. Edad: Variable cuantitativa continua.
g. Trabajos anteriores: Variable cuantitativa discreta.
Tambien, se verificó gráficamente la presencia de valores atípicos en las variables numericas. Esta evaluación visual permite identificar observaciones que se desvían significativamente del patrón general de los datos, lo que puede afectar la calidad del análisis general.
data_num = data[,c(5,6,7)]
par(mfrow = c(1, 3))
par(mar = c(1, 3, 2, 1))
for (i in seq_along(data_num)) {
boxplot(data_num[[i]], main = colnames(data_num)[i],
col = "lightblue", las = 2, cex.axis = 0.8)
}
A partir del análisis, se concluye que las variables
Distancia_Casa y Edad no muestran la presencia de
valores atípicos, lo que indica una distribución homogénea. En
contraste, la variable Trabajos_Anteriores presenta un único
valor atípico correspondiente a 9 trabajos.
Realiza un análisis de bivariado en donde la variable respuesta sea rotacion codificada de la siguiente manera (y=1 es si rotación, y=0 es no rotación). Con base en estos resultados identifique cuales son las variables determinantes de la rotación e interpretar el signo del coeficiente estimado. Compare estos resultados con la hipotesis planteada en el punto 2.
Solución:
Se realizó la codificación de la variable Rotación, asignando el valor 1 cuando hubo rotación y 0 en caso contrario.
data$Rotación <- ifelse(data$Rotación == "Si", 1, 0)
data$Rotación <- as.factor(data$Rotación)
A continuación se presenta el análisis bivariado de la variable dependiente rotación respecto a las variables seleccionadas, comparando los resultados con las hipótesis planteadas previamente.
a. Viaje de Negocios: El análisis de regresión logística mostró que la variable Viaje de Negocios tiene un efecto significativo sobre la rotación laboral. Los coeficientes encontrados son negativos y significativos (p < 0.05), lo que indica que, en comparación con los empleados que viajan frecuentemente, los que no viajan o lo hacen raramente tienen una menor oportunidad de rotación. Este resultado está en línea con la hipótesis planteada, que sugería que los empleados que no viajan o lo hacen raramente tendrían menor rotación debido a un menor agotamiento y mejor balance entre el trabajo y la vida personal.
set.seed(123)
modelo = glm(Rotación ~ `Viaje de Negocios`, data = data, family = "binomial")
summary(modelo)
##
## Call:
## glm(formula = Rotación ~ `Viaje de Negocios`, family = "binomial",
## data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -1.1034 0.1389 -7.943 1.98e-15 ***
## `Viaje de Negocios`No_Viaja -1.3389 0.3315 -4.039 5.36e-05 ***
## `Viaje de Negocios`Raramente -0.6346 0.1638 -3.873 0.000107 ***
## ---
## 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: 1274.8 on 1467 degrees of freedom
## AIC: 1280.8
##
## Number of Fisher Scoring iterations: 5
Por otro lado, se evaluó la asociación entre Rotación y Viaje de Negocios mediante la prueba de chi-cuadrado, obteniendo un p-valor de 5.609e-06. Este resultado, significativamente menor que 0.05, confirma la asociación identificada previamente en la regresión logística, lo que sugiere que los viajes de trabajo influyen de manera importante en la decisión de los empleados de cambiar de empleo.
tabla_contingencia <- table(data$Rotación, data$`Viaje de Negocios`)
test_chi2 <- chisq.test(tabla_contingencia)
test_chi2
##
## Pearson's Chi-squared test
##
## data: tabla_contingencia
## X-squared = 24.182, df = 2, p-value = 5.609e-06
b. Satisfacción Ambiental: La Satisfacción Ambiental también demostró tener un efecto relevante en la rotación. Se observaron coeficientes negativos significativos para las categorías de menor satisfacción (p < 0.05), lo que indica que a medida que la satisfacción con el entorno de trabajo disminuye, la oportunidad de rotación aumenta. Estos resultados concuerdan con la hipótesis inicial, que preveía una mayor propensión a rotar entre aquellos empleados insatisfechos con su ambiente laboral.
set.seed(123)
modelo = glm(Rotación ~ Satisfacción_Ambiental , data = data, family = "binomial")
summary(modelo)
##
## Call:
## glm(formula = Rotación ~ Satisfacción_Ambiental, family = "binomial",
## data = data)
##
## 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
De otro lado, la prueba de chi-cuadrado arroja un p-valor de 5.123e-05, lo que indica una asociación significativa entre Rotación y Satisfacción Ambiental, confirmando la relación observada en la regresión logística, sugiriendo que la satisfacción laboral impacta directamente en la decisión de los empleados de cambiar de trabajo. Mejorar las condiciones ambientales en el lugar de trabajo podría ser clave para reducir la rotación.
tabla_contingencia <- table(data$Rotación, data$Satisfacción_Ambiental)
test_chi2 <- chisq.test(tabla_contingencia)
test_chi2
##
## Pearson's Chi-squared test
##
## data: tabla_contingencia
## X-squared = 22.504, df = 3, p-value = 5.123e-05
c. Horas Extra: La variable Horas Extra mostró un fuerte impacto en la rotación, con un coeficiente positivo y un p-value extremadamente bajo (p < 2e-16), lo que sugiere que aquellos empleados que trabajan horas extra tienen una mayor oportunidad de dejar la empresa. Este resultado es coherente con la hipótesis inicial, que planteaba que trabajar horas adicionales aumenta el riesgo de rotación debido al agotamiento y estrés acumulados.
set.seed(123)
modelo = glm(Rotación ~ Horas_Extra , data = data, family = "binomial")
summary(modelo)
##
## Call:
## glm(formula = Rotación ~ Horas_Extra, family = "binomial", data = data)
##
## 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
Asi mismo, la prueba de chi-cuadrado presenta un p-valor inferior a 2.2e-16, lo que indica una relación extremadamente significativa entre Rotación y Horas Extra. Este resultado confirma la asociación observada en la regresión logística, lo que sugiere que la cantidad de horas extra trabajadas influye considerablemente en la decisión de los empleados de dejar la empresa.
tabla_contingencia <- table(data$Rotación, data$Horas_Extra)
test_chi2 <- chisq.test(tabla_contingencia)
test_chi2
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: tabla_contingencia
## X-squared = 87.564, df = 1, p-value < 2.2e-16
d. Distancia a la Casa: En cuanto a la Distancia a la Casa, el coeficiente estimado de 0.02471 (p = 0.00295) indica que existe una relación positiva entre la distancia al hogar y la rotación. Este resultado es coherente con la hipótesis planteada, ya que se esperaba que empleados que vivieran más lejos tendrían una mayor oportunidad de rotación debido al estrés y fatiga derivados de largos desplazamientos. El p-value menor a 0.01 refuerza la confiabilidad de este resultado.
set.seed(123)
modelo = glm(Rotación ~ Distancia_Casa , data = data, family = "binomial")
summary(modelo)
##
## Call:
## glm(formula = Rotación ~ Distancia_Casa, family = "binomial",
## data = data)
##
## 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
e. Edad: El análisis de la variable Edad reveló un coeficiente negativo con un p-value altamente significativo (p = 1.9e-09), lo que sugiere que los empleados más jóvenes tienen una mayor oportunidad de rotación en comparación con los empleados de mayor edad. Esto coincide con la hipótesis planteada, que sugería que los empleados jóvenes tienden a buscar nuevas oportunidades y cambios en su carrera, mientras que los de mayor edad prefieren la estabilidad.
set.seed(123)
modelo = glm(Rotación ~ Edad , data = data, family = "binomial")
summary(modelo)
##
## Call:
## glm(formula = Rotación ~ Edad, family = "binomial", data = data)
##
## 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
f. Trabajos anteriores: Finalmente, la variable Trabajos Anteriores presentó un coeficiente positivo, lo que indica una ligera tendencia hacia una mayor oportunidad de rotación entre aquellos con más empleos previos. Sin embargo, el p-value de 0.096 sugiere que este resultado no es estadísticamente significativo al nivel de 0.05, por lo que, aunque el signo del coeficiente es coherente con la hipótesis planteada, la evidencia estadística no es lo suficientemente fuerte para concluir que el número de trabajos anteriores sea un factor determinante en la rotación.
set.seed(123)
modelo = glm(Rotación ~ Trabajos_Anteriores , data = data, family = "binomial")
summary(modelo)
##
## Call:
## glm(formula = Rotación ~ Trabajos_Anteriores, family = "binomial",
## data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -1.77652 0.10636 -16.703 <2e-16 ***
## Trabajos_Anteriores 0.04565 0.02742 1.665 0.096 .
## ---
## 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: 1295.9 on 1468 degrees of freedom
## AIC: 1299.9
##
## Number of Fisher Scoring iterations: 4
Realice una partición en los datos de forma aleatoria donde 70% sea un set para entrenar el modelo y 30% para prueba. Estime un modelo logístico con la muestra del 70%. Muestre los resultados.
Solución:
set.seed(123)
train = sample(1:1470,1470*0.7)
data$`Viaje de Negocios`=as.factor(data$`Viaje de Negocios`)
data$Satisfacción_Ambiental=as.factor(data$Satisfacción_Ambiental)
data$Horas_Extra=as.factor(data$Horas_Extra)
modelo_train = glm(Rotación ~ `Viaje de Negocios`+Satisfacción_Ambiental+Horas_Extra+Distancia_Casa+Edad+Trabajos_Anteriores,
data = data, family = "binomial", subset = train)
summary(modelo_train)
##
## Call:
## glm(formula = Rotación ~ `Viaje de Negocios` + Satisfacción_Ambiental +
## Horas_Extra + Distancia_Casa + Edad + Trabajos_Anteriores,
## family = "binomial", data = data, subset = train)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 1.63739 0.48028 3.409 0.000651 ***
## `Viaje de Negocios`No_Viaja -1.32590 0.41909 -3.164 0.001557 **
## `Viaje de Negocios`Raramente -0.73027 0.21372 -3.417 0.000633 ***
## Satisfacción_Ambiental2 -0.72001 0.28424 -2.533 0.011305 *
## Satisfacción_Ambiental3 -0.93082 0.25586 -3.638 0.000275 ***
## Satisfacción_Ambiental4 -0.98723 0.25804 -3.826 0.000130 ***
## Horas_ExtraSi 1.39834 0.19212 7.278 3.38e-13 ***
## Distancia_Casa 0.02580 0.01115 2.314 0.020666 *
## Edad -0.08761 0.01243 -7.048 1.81e-12 ***
## Trabajos_Anteriores 0.10477 0.03792 2.763 0.005727 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 896.03 on 1028 degrees of freedom
## Residual deviance: 752.56 on 1019 degrees of freedom
## AIC: 772.56
##
## Number of Fisher Scoring iterations: 5
Con los resultados obtenidos, se presenta la siguiente ecuación de regresión logística, que describe la influencia de diversas variables sobre la probabilidad de rotación de los empleados:
\(Logit(P(Rotacion))=1.63739−1.32590(No Viaja)−0.73027(Viaje Raramente) \\ −0.72001(Satisfaccion Ambiental 2) −0.93082(Satisfaccion Ambiental 3) \\ −0.98723(Satisfaccion Ambiental 4)+1.39834(Horas Extra)+0.02580(Distancia a Casa) \\ −0.08761(Edad)+0.10477(Trabajos Anteriores)\)
Para lograr una interpretación adecuada de los coeficientes, se procede a exponenciarlos, lo que permite entender su relación con la variable dependiente, rotación:
kable(round(exp(coef(modelo_train)),2))
| x | |
|---|---|
| (Intercept) | 5.14 |
Viaje de NegociosNo_Viaja |
0.27 |
Viaje de NegociosRaramente |
0.48 |
| Satisfacción_Ambiental2 | 0.49 |
| Satisfacción_Ambiental3 | 0.39 |
| Satisfacción_Ambiental4 | 0.37 |
| Horas_ExtraSi | 4.05 |
| Distancia_Casa | 1.03 |
| Edad | 0.92 |
| Trabajos_Anteriores | 1.11 |
A partir de esto, se procede a interpretar los coeficientes de la siguiente manera:
a. Intercepto (\(\beta_0\)):
b. Viaje de Negocios No_Viaja (\(\beta_1\)):
c. Viaje de Negocios Raramente (\(\beta_2\)):
d. Satisfacción Ambiental 2 (\(\beta_3\))
e. Satisfacción Ambiental 3 (\(\beta_4\))
f. Satisfacción Ambiental 4 (\(\beta_5\))
g. Horas_ExtraSi (\(\beta_6\)):
h. Distancia_Casa (\(\beta_7\)):
i. Edad (\(\beta_8\)):
j. Trabajos_Anteriores (\(\beta_9\)):
Evaluar el poder predictivo del modelo con base en la curva ROC y el AUC en el set de datos de prueba.
Solución:
Inicialmente, se evaluó la capacidad de clasificación del modelo utilizando una matriz de confusión, con el objetivo de determinar las clasificaciones correctas para cada clase y también los errores de clasificación. Se identificaron los falsos positivos, es decir, empleados que no rotaron pero fueron clasificados como si lo hubieran hecho, y los falsos negativos, es decir, empleados que rotaron pero fueron clasificados como si no lo hubieran hecho.
predicciones_bin <- ifelse(test = modelo_train$fitted.values > 0.5, yes = 1, no = 0)
matriz_confusion <- table(modelo_train$model$Rotación, predicciones_bin,
dnn = c("observaciones", "predicciones"))
matriz_confusion
## predicciones
## observaciones 0 1
## 0 858 9
## 1 136 26
Desde una perspectiva gráfica, se obtiene lo siguiente:
mosaic(matriz_confusion, shade = T, colorize = T,
gp = gpar(fill = matrix(c("green3", "red2", "red2", "green3"), 2, 2)))
El modelo muestra una buena capacidad para clasificar correctamente los verdaderos negativos, es decir, los empleados que no rotaron según las variables predictoras seleccionadas. Además, los verdaderos positivos están bien representados. Sin embargo, aunque los falsos positivos son relativamente pocos, existe una mayor proporción de falsos negativos, lo que indica una oportunidad de mejora en la identificación de empleados que podrían rotar pero que el modelo no logra reconocer correctamente.
TP = matriz_confusion[2, 2]
FP = matriz_confusion[1, 2]
FN = matriz_confusion[2, 1]
TN = matriz_confusion[1, 1]
Exactitud = (TP + TN) / (TP + TN + FP + FN)
Tasa_error = (FP + FN)/(TP + TN + FP + FN)
precision = TP / (TP + FP)
sensibilidad = TP / (TP + FN)
especificidad = TN / (TN + FP)
valor_predictivo_negativo = TN / (TN + FN)
resultados <- data.frame(
Métrica = c("Exactitud", "Tasa de error", "Precisión", "Sensibilidad (Recall)",
"Especificidad", "Valor Predictivo Negativo"),
Valor = c(Exactitud, Tasa_error, precision, sensibilidad,
especificidad, valor_predictivo_negativo)
)
kable(resultados, format = "markdown", digits = 4)
| Métrica | Valor |
|---|---|
| Exactitud | 0.8591 |
| Tasa de error | 0.1409 |
| Precisión | 0.7429 |
| Sensibilidad (Recall) | 0.1605 |
| Especificidad | 0.9896 |
| Valor Predictivo Negativo | 0.8632 |
En cuanto a las métricas de evaluación, el modelo presenta un buen desempeño general, con una exactitud del 85.91%, lo cual indica que clasifica correctamente la mayoría de los casos. Además, la tasa de error es del 14.09%, lo cual es aceptable, aunque presenta margen de mejora.
La especificidad del 98.96% destaca la excelente capacidad del modelo para identificar a los empleados que no rotan, minimizando la cantidad de falsos positivos (es decir, clasificar incorrectamente a empleados como rotadores cuando en realidad no lo son). Esta alta especificidad resulta valiosa para evitar intervenciones innecesarias en empleados que no presentan riesgo de rotación. Asimismo, el valor predictivo negativo del 86.32% muestra que la mayoría de las predicciones de “no rotación” son acertadas.
Por otro lado, la precisión del 74.29% indica que, cuando el modelo predice que un empleado rotará, tiene una probabilidad moderada de ser correcto. Sin embargo, la sensibilidad es baja (16.05%), lo cual implica que el modelo no identifica adecuadamente a la mayoría de los empleados que efectivamente rotan, lo cual representa una limitación importante si el objetivo es prevenir la pérdida de talento en la empresa.
Este desequilibrio en las métricas (alta especificidad y baja sensibilidad) probablemente se deba a un desbalance de clases en los datos, donde la proporción de empleados que no rotan es mucho mayor que la de aquellos que sí lo hacen. Como resultado, el modelo tiende a predecir principalmente “no rotación” para minimizar la tasa de error, comprometiendo su capacidad para identificar correctamente a los empleados con alta probabilidad de rotar.
test = data[-train,]
predicciones = predict(modelo_train, test,type = "response")
curva_ROC = roc(test$Rotación, predicciones)
auc = round(auc(curva_ROC, levels =c(0,1), direction = "<"),4)
ggroc(curva_ROC, colour = "#FF7F00", size=1)+
ggtitle(paste0("Curva ROC ", "(AUC = ", auc, ")"))+
xlab("Especificidad")+
ylab("Sensibilidad")
Finalmente, el AUC superior a 0.5 refuerza la capacidad discriminatoria del modelo, indicando que es eficaz en la clasificación tanto de los empleados que rotan como de aquellos que no rotan. Un valor de AUC mayor a 0.7 se consideraría un buen indicador de rendimiento.
En las conclusiones adicione una discución sobre cuál sería la estrategia para disminuir la rotación en la empresa (con base en las variables que resultaron significativas en el punto 3).
Solución:
A partir del análisis del modelo de regresión logística, se identificó que las variables Viaje de negocios, Satisfacción ambiental, Horas extra, Distancia casa, Edad, y Trabajos anteriores son estadísticamente significativas para predecir la probabilidad de rotación laboral en la empresa. Estas variables juegan un papel crucial en la explicación de los factores que influyen en la rotación de empleados. Para mejorar el rendimiento del modelo y obtener predicciones más precisas, se recomienda realizar un rebalanceo de las clases mediante el sobremuestreo de la clase minoritaria (rotación) o el submuestreo de la clase mayoritaria (no rotación). Además, ajustar el umbral de clasificación disminuyéndolo podría aumentar la sensibilidad a los casos de rotación, lo que incrementaría el recall a costa de una posible reducción en la especificidad.
Con base en las variables identificadas como significativas, se pueden implementar diversas estrategias para reducir la rotación laboral:
Reducción de viajes de negocios: Los empleados que viajan con frecuencia presentan una mayor probabilidad de rotación. Para mitigar este factor, se podría reducir la cantidad de viajes o implementar políticas que disminuyan su impacto, tales como días de descanso adicionales, compensaciones monetarias, o beneficios específicos para los empleados que se desplazan con regularidad.
Mejorar la satisfacción ambiental: Los niveles más bajos de satisfacción ambiental se asocian con una mayor probabilidad de rotación. Para abordar este aspecto, la empresa debería centrarse en mejorar las condiciones del ambiente de trabajo, lo cual podría incluir mejoras en la infraestructura, las relaciones laborales y la ergonomía de los espacios. Además, fomentar una cultura laboral positiva podría incrementar la satisfacción y disminuir el deseo de los empleados de dejar la empresa.
Control de horas extra: El análisis mostró que la realización de horas extra está vinculada a un aumento en la rotación. Limitar las horas extras y proporcionar incentivos, descansos compensatorios, o políticas de flexibilidad horaria podría ayudar a mejorar la satisfacción de los empleados y disminuir la rotación.
Iniciativas para empleados con una gran distancia al trabajo: La distancia entre el hogar y el lugar de trabajo también influye en la rotación. Para retener a estos empleados, la empresa podría considerar opciones como el teletrabajo parcial, el ajuste de horarios flexibles para evitar horas pico de tráfico, o incluso ofrecer algún tipo de apoyo para el transporte.
Programas de retención para empleados jóvenes: Los empleados más jóvenes tienden a rotar con mayor frecuencia. Para contrarrestar esto, la empresa podría implementar programas de mentoría, ofrecer oportunidades de desarrollo profesional y establecer planes de carrera bien definidos. Estas estrategias no solo fomentarían la retención, sino que también contribuirían a la formación de líderes dentro de la empresa.