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.
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.
A partir de revisión bilbiográfica se ha decidio utilizar las siguientes variables:
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.”
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.”
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.”
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.”
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.”
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)A continuación se realiza una revisión de la clasificación de tipo de las variables seleccionadas.
## 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.
Por otro lado, se etiqueta la variable “Rotación” donde “Si”=1 y “No”=0.
| 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.
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 |
| 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()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.
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 |
| 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()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.
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 |
| 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.
##
## 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”.
##
## 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.
##
## 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.
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.
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.
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.
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.
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.
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 pruebaSet de entrenamiento
Set de prueba
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
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.
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.
# 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
## Sensibilidad (Recall): 0.2394
## Especificidad: 0.9892
## 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.
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.
## 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.
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"
## [1] "No es probable que el empleado rote de cargo."
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%.