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.
Diccionario de datos.
Listar datos del dataset
glimpse(rotacion)
Rows: 1,470
Columns: 24
$ Rotación <chr> "Si", "No", "Si", "No", "No", "No", "No", …
$ Edad <dbl> 41, 49, 37, 33, 27, 32, 59, 30, 38, 36, 35…
$ `Viaje de Negocios` <chr> "Raramente", "Frecuentemente", "Raramente"…
$ Departamento <chr> "Ventas", "IyD", "IyD", "IyD", "IyD", "IyD…
$ Distancia_Casa <dbl> 1, 8, 2, 3, 2, 2, 3, 24, 23, 27, 16, 15, 2…
$ Educación <dbl> 2, 1, 2, 4, 1, 2, 3, 1, 3, 3, 3, 2, 1, 2, …
$ Campo_Educación <chr> "Ciencias", "Ciencias", "Otra", "Ciencias"…
$ Satisfacción_Ambiental <dbl> 2, 3, 4, 4, 1, 4, 3, 4, 4, 3, 1, 4, 1, 2, …
$ Genero <chr> "F", "M", "M", "F", "M", "M", "F", "M", "M…
$ Cargo <chr> "Ejecutivo_Ventas", "Investigador_Cientifi…
$ Satisfación_Laboral <dbl> 4, 2, 3, 3, 2, 4, 1, 3, 3, 3, 2, 3, 3, 4, …
$ Estado_Civil <chr> "Soltero", "Casado", "Soltero", "Casado", …
$ Ingreso_Mensual <dbl> 5993, 5130, 2090, 2909, 3468, 3068, 2670, …
$ Trabajos_Anteriores <dbl> 8, 1, 6, 1, 9, 0, 4, 1, 0, 6, 0, 0, 1, 0, …
$ Horas_Extra <chr> "Si", "No", "Si", "Si", "No", "No", "Si", …
$ Porcentaje_aumento_salarial <dbl> 11, 23, 15, 11, 12, 13, 20, 22, 21, 13, 13…
$ Rendimiento_Laboral <dbl> 3, 4, 3, 3, 3, 3, 4, 4, 4, 3, 3, 3, 3, 3, …
$ Años_Experiencia <dbl> 8, 10, 7, 8, 6, 8, 12, 1, 10, 17, 6, 10, 5…
$ Capacitaciones <dbl> 0, 3, 3, 3, 3, 2, 3, 2, 2, 3, 5, 3, 1, 2, …
$ Equilibrio_Trabajo_Vida <dbl> 1, 3, 3, 3, 3, 2, 2, 3, 3, 2, 3, 3, 2, 3, …
$ Antigüedad <dbl> 6, 10, 0, 8, 2, 7, 1, 1, 9, 7, 5, 9, 5, 2,…
$ Antigüedad_Cargo <dbl> 4, 7, 0, 7, 2, 7, 0, 0, 7, 7, 4, 5, 2, 2, …
$ Años_ultima_promoción <dbl> 0, 1, 0, 3, 2, 3, 0, 0, 1, 7, 0, 0, 4, 1, …
$ Años_acargo_con_mismo_jefe <dbl> 5, 7, 0, 0, 2, 6, 0, 0, 8, 7, 3, 8, 3, 2, …
El el dataset se cuenta con la siguiente distribución de variales categóricas y cuantitativas:
Variables categóricas:
1. Rotación: (Sí/No) – Variable de destino, binaria (categórica).
2. Viaje de Negocios: (Frecuentemente, Raramente, Nunca) – Categórica.
3. Departamento: (Ventas, IyD, etc.) – Categórica.
4. Estado Civil: (Casado, Soltero, Divorciado) – Categórica.
5. Horas Extra: (Sí/No) – Binaria (categórica).
6. Genero: (F/M) – Categórica.
7. Campo_Educación: (Ciencias, Otra, Salud, etc.) – Categórica.
8. Cargo: (Ejecutivo_Ventas, Investigador_Cientifico, etc.) – Categórica.
Variables cuantitativas:
1. Edad: Numérica, continua.
2. Distancia_Casa: Numérica, continua.
3. Educación: Numérica (1, 2, 3, etc.) – Categórica ordinal, se tratará como cuantitativa.
4. Satisfacción_Ambiental: Numérica (1-4) – Ordinal.
5. Ingreso_Mensual: Numérica, continua.
6. Trabajos_Anteriores: Numérica, discreta.
7. Porcentaje_aumento_salarial: Numérica, continua.
8. Rendimiento_Laboral: Numérica, discreta (puntuación).
9. Años_Experiencia: Numérica, continua.
10. Capacitaciones: Numérica, discreta (número de capacitaciones).
11. Equilibrio_Trabajo_Vida: Numérica, ordinal.
12. Antigüedad: Numérica, continua.
13. Antigüedad_Cargo: Numérica, continua.
14. Años_ultima_promoción: Numérica, continua.
15. Años_acargo_con_mismo_jefe: Numérica, continua.
Validar si hay valores faltantes
colSums(is.na(datos_rotacion))
Rotación Edad
0 0
Viaje de Negocios Departamento
0 0
Distancia_Casa Educación
0 0
Campo_Educación Satisfacción_Ambiental
0 0
Genero Cargo
0 0
Satisfación_Laboral Estado_Civil
0 0
Ingreso_Mensual Trabajos_Anteriores
0 0
Horas_Extra Porcentaje_aumento_salarial
0 0
Rendimiento_Laboral Años_Experiencia
0 0
Capacitaciones Equilibrio_Trabajo_Vida
0 0
Antigüedad Antigüedad_Cargo
0 0
Años_ultima_promoción Años_acargo_con_mismo_jefe
0 0
Estadísticos descriptivos
summary(rotacion)
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
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).
Hipótesis : Los empleados que trabajan más horas extra tienen una mayor probabilidad de rotación. El exceso de trabajo causa fatiga y una menor satisfacción, lo que incrementa la rotación.
Hipótesis : Los empleados en cargos de nivel inferior tienen mayor probabilidad de rotación, ya que perciben menos oportunidades de crecimiento.
Hipótesis : Los empleados casados tienen menos probabilidad de rotación que los solteros. La búsqueda de estabilidad suele ser más importante para quienes tienen responsabilidades familiares.
Hipótesis : A menor ingreso mensual, mayor probabilidad de rotación. Los empleados con salarios bajos tenderán a rotar en busca de mejores oportunidades.
Hipótesis : Empleados jóvenes, por debajo de los 30 años podrían estar más enfocados en buscar oportunidades de crecimiento y por tanto presenten mayor rotación, empleados de 30 a 50 años podrían estar más enfocados en un balance vida trabajo y su rotación dependerá de oportunidades que brinden este beneficio, mientras que empleados por encima de 50 años presenten la menor rotación considerando que prefieran la estabilidad laboral
Hipótesis : A mayor antigüedad mayor probabilidad de rotación dependiendo del cargo, si se trata de cargos operativos se puede presentar mayor rotación en empleados con poca antigüedad, también se considera que empleados que llevan mucho tiempo en un cargo pueden sentirse estancados y estar más abiertos a nuevas oportunidades, o dependiendo del cargo puede ser que hayan encontrado estabilidad laboral y no roten. Empleados con poca antigüedad no son tan tendientes a cambiar de puesto pronto.
Realiza un análisis univariado (caracterización) de la información contenida en la base de datos rotacion.
g1 = ggplot(datos_rotacion, aes(x = Ingreso_Mensual)) + geom_histogram(fill="royalblue", binwidth = 500) + theme_gray() + ggtitle("Ingreso Mensual")
g2 = ggplot(datos_rotacion, aes(x = Edad)) + geom_histogram(fill="royalblue", binwidth = 1) + theme_gray() + ggtitle("Edad")
g3 = ggplot(datos_rotacion, aes(x = Antigüedad_Cargo)) + geom_histogram(fill="royalblue", binwidth = 1) + theme_gray() + ggtitle("Antigüedad en el cargo") + scale_x_continuous(limits = c(0, 10), breaks = seq(0, 10, by = 1))
g4 = ggplot(datos_rotacion, aes(x = Horas_Extra)) + geom_bar(fill="#0F8FA5") + theme_gray() + ggtitle("Horas Extra")
g5 = ggplot(datos_rotacion, aes(x = Estado_Civil)) + geom_bar(fill="#0F8FA5") + theme_gray() + ggtitle("Estado Civil")
g6 = ggplot(datos_rotacion, aes(x = Cargo)) + geom_bar(fill="#0F8FA5") + theme_gray() + ggtitle("Cargo") +
theme(axis.text.x = element_text(angle = 45, hjust = 1, size = 8), # Reducir el tamaño de la fuente
axis.title.x = element_blank(), # Opcional: eliminar el título del eje x si es innecesario
plot.margin = margin(10, 10, 10, 10)) # Ajustar el margen
# Combinar los gráficos en una cuadrícula
grid.arrange(g1, g2, g3, g4, g5, g6, ncol = 3, nrow = 2)
# Boxplot para la variable Edad
p1 <- ggplot(datos_rotacion, aes( y = Edad)) +
geom_boxplot(fill = "lightblue", color = "darkblue") +
ggtitle("Edad") + ylab("Valores") + theme_minimal()
# Boxplot para la variable Antigüedad_Cargo
p2 <- ggplot(datos_rotacion, aes( y = Antigüedad_Cargo)) +
geom_boxplot(fill = "lightgreen", color = "darkgreen") +
ggtitle("Antigüedad Cargo") + ylab("Valores") + theme_minimal()
# Boxplot para la variable Ingreso_Mensual
p3 <- ggplot(datos_rotacion, aes( y = Ingreso_Mensual)) +
geom_boxplot(fill = "lightcoral", color = "darkred") +
ggtitle("Ingreso Mensual") + ylab("Valores") + theme_minimal()
# Mostrar los tres gráficos en una fila
grid.arrange(p1, p2, p3, ncol = 3)
Porcentaje de empleados que trabajan horas extra
tabla_horas_extra <- table(datos_rotacion$Horas_Extra)
porcentajes_horas_extra <- prop.table(tabla_horas_extra) * 100
tabla_final_extra <- data.frame(Opción = names(tabla_horas_extra),
Frecuencia = as.numeric(tabla_horas_extra),
Porcentaje = round(as.numeric(porcentajes_horas_extra), 2))
# Mostrar la tabla final
tabla_final_extra
Opción Frecuencia Porcentaje
1 No 1054 71.7
2 Si 416 28.3
Porcentaje de empleados según estado civil
tabla_estado <- table(datos_rotacion$Estado_Civil)
porcentajes_estado <- prop.table(tabla_estado) * 100
tabla_final_estado <- data.frame(Opción = names(tabla_estado),
Frecuencia = as.numeric(tabla_estado),
Porcentaje = round(as.numeric(porcentajes_estado), 2))
# Mostrar la tabla final
tabla_final_estado
Opción Frecuencia Porcentaje
1 Casado 673 45.78
2 Divorciado 327 22.24
3 Soltero 470 31.97
Porcentaje años antigüedad en el cargo
tabla_antiguedad <- table(datos_rotacion$Antigüedad_Cargo)
porcentajes_antiguedad <- prop.table(tabla_antiguedad) * 100
tabla_final_antiguedad <- data.frame(Opción = names(tabla_antiguedad),
Frecuencia = as.numeric(tabla_antiguedad),
Porcentaje = round(as.numeric(porcentajes_antiguedad), 2))
# Mostrar la tabla final
tabla_final_antiguedad
Opción Frecuencia Porcentaje
1 0 244 16.60
2 1 57 3.88
3 2 372 25.31
4 3 135 9.18
5 4 104 7.07
6 5 36 2.45
7 6 37 2.52
8 7 222 15.10
9 8 89 6.05
10 9 67 4.56
11 10 29 1.97
12 11 22 1.50
13 12 10 0.68
14 13 14 0.95
15 14 11 0.75
16 15 8 0.54
17 16 7 0.48
18 17 4 0.27
19 18 2 0.14
Porcentaje empleados por cargo
tabla_cargo <- table(datos_rotacion$Cargo)
porcentajes_cargo <- prop.table(tabla_cargo) * 100
tabla_final_cargo <- data.frame(Opción = names(tabla_cargo),
Frecuencia = as.numeric(tabla_cargo),
Porcentaje = round(as.numeric(porcentajes_cargo), 2))
# Mostrar la tabla final
tabla_final_cargo
Opción Frecuencia Porcentaje
1 Director_Investigación 80 5.44
2 Director_Manofactura 145 9.86
3 Ejecutivo_Ventas 326 22.18
4 Gerente 102 6.94
5 Investigador_Cientifico 292 19.86
6 Recursos_Humanos 52 3.54
7 Representante_Salud 131 8.91
8 Representante_Ventas 83 5.65
9 Tecnico_Laboratorio 259 17.62
Concluyendo, la falta de aumento significativo en el ingreso y el tiempo sin promociones son factores que pueden incrementar la rotación para ciertos grupos, de igual manera puede ocurrir con los cargos operativos que tienen que trabajar horas extra, y por último los solteros son los que más riesgo pueden tener de rotación.
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.
Se realiza el análisis vibariado de variables categóricas
ggplot(datos_rotacion, aes(x = Horas_Extra, fill = factor(Rotación))) +
geom_bar(position = "fill") +
scale_fill_manual(values = c("No" = "lightblue", "Si" = "coral")) +
theme_minimal() +
labs(x = "Horas Extra", y = "Proporción", fill = "Rotación") +
ggtitle("Distribución de Rotación por Horas extra")
ggplot(datos_rotacion, aes(x = Estado_Civil, fill = factor(Rotación))) +
geom_bar(position = "fill") +
scale_fill_manual(values = c("No" = "lightblue", "Si" = "coral")) +
theme_minimal() +
labs(x = "Estado civil", y = "Proporción", fill = "Rotación") +
ggtitle("Distribución de Rotación por Estado civil")
ggplot(datos_rotacion, aes(x = Cargo, fill = factor(Rotación))) +
geom_bar(position = "fill") +
scale_fill_manual(values = c("No" = "lightblue", "Si" = "coral")) +
theme_minimal() +
labs(x = "Cargo", y = "Proporción", fill = "Rotación") +
ggtitle("Distribución de Rotación por Cargo") +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
Ahora se realiza el análisis vibariado de variables cuantitativas
ggplot(rotacion, aes(x = Rotación, y = Antigüedad_Cargo, fill= Rotación)) +
geom_boxplot() +
labs(title = "Distribución de Rotación según Antigüedad en el cargo",
x = "Rotación",
y = "Antigüedad en el cargo") +
scale_fill_manual(values = c("Si" = "coral", "No" = "lightblue"))
ggplot(rotacion, aes(x = Rotación, y = Edad, fill= Rotación)) +
geom_boxplot() +
labs(title = "Distribución de Rotación según Edad",
x = "Rotación",
y = "Edad") +
scale_fill_manual(values = c("Si" = "coral", "No" = "lightblue"))
ggplot(rotacion, aes(x = Rotación, y = Ingreso_Mensual, fill= Rotación)) +
geom_boxplot() +
labs(title = "Distribución de Rotación según Ingreso Mensual",
x = "Rotación",
y = "Ingreso Mensual") +
scale_fill_manual(values = c("Si" = "coral", "No" = "lightblue"))
Análisis
datos_rotacion$Rotación <- ifelse(datos_rotacion$Rotación == "Si", 1, 0)
print(head(datos_rotacion, 3))
# A tibble: 3 × 24
Rotación Edad `Viaje de Negocios` Departamento Distancia_Casa Educación
<dbl> <dbl> <chr> <chr> <dbl> <dbl>
1 1 41 Raramente Ventas 1 2
2 0 49 Frecuentemente IyD 8 1
3 1 37 Raramente IyD 2 2
# ℹ 18 more variables: Campo_Educación <chr>, Satisfacción_Ambiental <dbl>,
# Genero <chr>, Cargo <chr>, Satisfación_Laboral <dbl>, Estado_Civil <chr>,
# Ingreso_Mensual <dbl>, Trabajos_Anteriores <dbl>, Horas_Extra <chr>,
# Porcentaje_aumento_salarial <dbl>, Rendimiento_Laboral <dbl>,
# Años_Experiencia <dbl>, Capacitaciones <dbl>,
# Equilibrio_Trabajo_Vida <dbl>, Antigüedad <dbl>, Antigüedad_Cargo <dbl>,
# Años_ultima_promoción <dbl>, Años_acargo_con_mismo_jefe <dbl>
Se usarán las variables seleccionadas (Antigüedad en el cargo, Edad, Ingreso Mensual, Horas Extra, Cargo, Estado civil) como predictoras para modelar la rotación.
# Ajustar el modelo de regresión logística
modelo_rotacion <- glm(Rotación ~ Antigüedad_Cargo + Edad + Ingreso_Mensual +
Horas_Extra + Cargo + Estado_Civil,
data = datos_rotacion, family = binomial)
# Ver el resumen del modelo
summary(modelo_rotacion)
Call:
glm(formula = Rotación ~ Antigüedad_Cargo + Edad + Ingreso_Mensual +
Horas_Extra + Cargo + Estado_Civil, family = binomial, data = datos_rotacion)
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) -3.562e+00 1.034e+00 -3.446 0.000569 ***
Antigüedad_Cargo -9.828e-02 2.768e-02 -3.551 0.000384 ***
Edad -2.669e-02 1.025e-02 -2.604 0.009221 **
Ingreso_Mensual 4.698e-05 4.641e-05 1.012 0.311393
Horas_ExtraSi 1.551e+00 1.628e-01 9.525 < 2e-16 ***
CargoDirector_Manofactura 1.169e+00 8.896e-01 1.314 0.188970
CargoEjecutivo_Ventas 2.241e+00 8.462e-01 2.648 0.008086 **
CargoGerente 7.258e-01 8.659e-01 0.838 0.401888
CargoInvestigador_Cientifico 1.946e+00 9.358e-01 2.079 0.037622 *
CargoRecursos_Humanos 2.833e+00 9.591e-01 2.953 0.003142 **
CargoRepresentante_Salud 1.226e+00 8.940e-01 1.371 0.170442
CargoRepresentante_Ventas 3.199e+00 9.647e-01 3.316 0.000914 ***
CargoTecnico_Laboratorio 2.725e+00 9.331e-01 2.920 0.003500 **
Estado_CivilDivorciado -3.206e-01 2.330e-01 -1.376 0.168843
Estado_CivilSoltero 8.042e-01 1.734e-01 4.637 3.54e-06 ***
---
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: 1058.1 on 1455 degrees of freedom
AIC: 1088.1
Number of Fisher Scoring iterations: 6
Conclusión : El modelo muestra que las variables que más influyen en la rotación son Horas Extra, Cargo, Estado Civil y Edad, todas con resultados significativos y que mayormente confirman las hipótesis planteadas. La única excepción relevante es la variable Antigüedad en el cargo, que muestra una relación inversa a lo esperado.
Se calcula el estadistico Wald chi-square para evaluar la significancia individual de cada predictor del modelo.
# Obtener los coeficientes y errores estándar del modelo
coeficientes <- coef(summary(modelo_rotacion))
# Calcular el estadístico Wald
wald_stat <- (coeficientes[, "Estimate"] / coeficientes[, "Std. Error"])^2
# Mostrar los estadísticos Wald
wald_stat
(Intercept) Antigüedad_Cargo
11.8743240 12.6067689
Edad Ingreso_Mensual
6.7794994 1.0247583
Horas_ExtraSi CargoDirector_Manofactura
90.7320241 1.7256289
CargoEjecutivo_Ventas CargoGerente
7.0144034 0.7026694
CargoInvestigador_Cientifico CargoRecursos_Humanos
4.3220475 8.7229421
CargoRepresentante_Salud CargoRepresentante_Ventas
1.8790481 10.9939152
CargoTecnico_Laboratorio Estado_CivilDivorciado
8.5267280 1.8931897
Estado_CivilSoltero
21.5017043
Con estos indicadores se puede evaluar la significancia individual de cada variable en el modelo de regresión logísitca. Cuanto mayor el valor, mayor la evidencia que la variable es significativa en la predicción.
Cálculo de los p-valores
Ahora se calculan los p-valores para confirmar la significancia estadística de los coeficientes del modelo.
# Calcular los p-valores para cada estadístico Wald
p_values_wald <- 1 - pchisq(wald_stat, df = 1)
# Mostrar los p-valores
p_values_wald
(Intercept) Antigüedad_Cargo
5.691312e-04 3.843523e-04
Edad Ingreso_Mensual
9.221075e-03 3.113930e-01
Horas_ExtraSi CargoDirector_Manofactura
0.000000e+00 1.889701e-01
CargoEjecutivo_Ventas CargoGerente
8.085657e-03 4.018882e-01
CargoInvestigador_Cientifico CargoRecursos_Humanos
3.762163e-02 3.142305e-03
CargoRepresentante_Salud CargoRepresentante_Ventas
1.704424e-01 9.141150e-04
CargoTecnico_Laboratorio Estado_CivilDivorciado
3.499683e-03 1.688426e-01
Estado_CivilSoltero
3.535143e-06
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.
# Crear la partición de los datos (70% entrenamiento, 30% prueba)
set.seed(42)
indices_entrenamiento <- createDataPartition(datos_rotacion$Rotación, p = 0.7, list = FALSE)
# Conjuntos de entrenamiento y prueba
datos_entrenamiento <- datos_rotacion[indices_entrenamiento, ]
datos_prueba <- datos_rotacion[-indices_entrenamiento, ]
# Ajustar el modelo logístico usando el conjunto de entrenamiento
modelo_logistico <- glm(Rotación ~ Antigüedad_Cargo + Edad + Ingreso_Mensual +
Horas_Extra + Cargo + Estado_Civil,
data = datos_entrenamiento, family = binomial)
# Mostrar los resultados del modelo
summary(modelo_logistico)
Call:
glm(formula = Rotación ~ Antigüedad_Cargo + Edad + Ingreso_Mensual +
Horas_Extra + Cargo + Estado_Civil, family = binomial, data = datos_entrenamiento)
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) -3.771e+00 1.183e+00 -3.187 0.00144 **
Antigüedad_Cargo -7.819e-02 3.352e-02 -2.333 0.01967 *
Edad -4.170e-02 1.343e-02 -3.104 0.00191 **
Ingreso_Mensual 9.899e-05 5.809e-05 1.704 0.08838 .
Horas_ExtraSi 1.661e+00 2.010e-01 8.263 < 2e-16 ***
CargoDirector_Manofactura 1.208e+00 9.860e-01 1.225 0.22065
CargoEjecutivo_Ventas 2.300e+00 9.100e-01 2.528 0.01148 *
CargoGerente 8.848e-01 9.083e-01 0.974 0.33002
CargoInvestigador_Cientifico 2.178e+00 1.042e+00 2.091 0.03654 *
CargoRecursos_Humanos 3.155e+00 1.088e+00 2.899 0.00374 **
CargoRepresentante_Salud 7.707e-01 1.016e+00 0.759 0.44789
CargoRepresentante_Ventas 3.525e+00 1.083e+00 3.257 0.00113 **
CargoTecnico_Laboratorio 3.106e+00 1.039e+00 2.990 0.00279 **
Estado_CivilDivorciado -2.075e-01 2.809e-01 -0.739 0.46000
Estado_CivilSoltero 8.887e-01 2.179e-01 4.078 4.55e-05 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
(Dispersion parameter for binomial family taken to be 1)
Null deviance: 879.08 on 1028 degrees of freedom
Residual deviance: 703.08 on 1014 degrees of freedom
AIC: 733.08
Number of Fisher Scoring iterations: 6
Evaluar el poder predictivo del modelo con base en la curva ROC y el AUC en el set de datos de prueba.
Esto generará probabilidades entre 0 y 1 que indican la probabilidad que un empleado rote.
# Predecir las probabilidades de rotación en el conjunto de prueba
predicciones <- predict(modelo_logistico, newdata = datos_prueba, type = "response")
# Generar la curva ROC
roc_obj <- roc(datos_prueba$Rotación, predicciones)
Setting levels: control = 0, case = 1
Setting direction: controls < cases
# Calcular el AUC
auc_valor <- auc(roc_obj)
# Mostrar el AUC
print(auc_valor)
Area under the curve: 0.7513
# Graficar la curva ROC
plot(roc_obj, col = "blue", main = paste("Curva ROC (AUC =", round(auc_valor, 2), ")"))
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).
Para formular una estrategia para disminuir la rotación en la empresa con base en los resultados del modelo de regresión logística y las variables significativas identificadas, se deben considerar los factores clave que tienen un impacto directo en la rotación.