#librerias
library(paqueteMODELOS)
library(dplyr)
library(knitr)
library(kableExtra)
library(DT)
library(summarytools)
library(formattable)
library(webshot2)
library(htmltools)
library(pastecs)       
library(pander)
library(ggplot2)
library(patchwork)
library(broom)
library(gridExtra)
library(grid)
library(pROC)
library(gt)
library(tidyr)

#carga de base
data("rotacion")

1 Contexto

En la organización se ha identificado la necesidad de comprender y anticipar los factores que influyen en la rotación de empleados entre distintos cargos. Para este propósito, la empresa dispone de datos históricos relacionados con el empleo de sus trabajadores, que incluyen variables como la antigüedad en el cargo, la edad, el nivel de satisfacción laboral, el salario y otros factores considerados relevantes.

El objetivo de este informe es estimar, mediante un modelo de regresión logística, la probabilidad de que un empleado cambie de cargo en el próximo período, así como identificar los factores con mayor incidencia en dichos cambios.

Con los resultados obtenidos, se espera que la organización pueda tomar medidas proactivas para retener el talento clave, identificar oportunidades de mejora en la gestión de recursos humanos y promover un entorno laboral más estable y satisfactorio para sus colaboradores.

A continuación, se describen los pasos propuestos para llevar a cabo el análisis:

  1. Selección de variables: Se seleccionarán seis variables (tres categóricas y tres cuantitativas) que se consideren relacionadas con la rotación.

  2. Análisis univariado: Se realizará un análisis univariado de la información contenida en la base de datos, con el fin de comprender la distribución de cada variable.

  3. Análisis bivariado: Se llevará a cabo un análisis bivariado en el cual la variable respuesta será la rotación. En este paso se identificarán las variables más determinantes y se contrastarán los resultados con las hipótesis planteadas.

  4. Estimación del modelo: Se procederá a la estimación de un modelo de regresión logística utilizando la variable de rotación y las seis variables seleccionadas.

  5. Evaluación del modelo: El modelo predictivo será evaluado a partir de métricas como la curva ROC y el valor AUC, lo que permitirá determinar su capacidad de clasificación.

  6. Predicciones: Se generarán predicciones sobre la probabilidad de que un empleado rote, definiendo un punto de corte que permita establecer si se debe intervenir para prevenir la rotación.

  7. Conclusiones: Se propondrán estrategias orientadas a disminuir la rotación de empleados, basadas en los factores significativos identificados en el análisis.

Para conocer los codigos utilizados en este informe, puede dirigirse al siguente link: https://rpubs.com/vcaicedo20/actividad3

2 Selección de variables

2.1 Cuantitativas

  • Antigüedad en el cargo ( Antigüedad)

La antigüedad laboral se reconoce como un factor clave en la rotación de empleados. De acuerdo con el Banco Interamericano de Desarrollo (BID), en América Latina los trabajadores presentan, en promedio, 7.6 años de permanencia en un mismo empleo. Los estudios señalan que las personas con menor tiempo de antigüedad en una organización tienden a ser más propensas a cambiar de puesto, especialmente en el caso de los jóvenes y de aquellos con menor nivel educativo.

Se utilizará la variable Antigüedad en lugar de Antigüedad_Cargo, ya que el objetivo del análisis es evaluar la probabilidad de que los empleados cambien de empresa, y no únicamente de cargo dentro de la misma organización. De esta manera, se busca identificar los factores que influyen en la rotación externa y prevenir la fuga de talento clave hacia otras compañías.

Hipótesis: A menor antigüedad, mayor probabilidad de rotación.

  • Edad del empleado (Edad)

Como se mencionó anteriormente, la edad constituye otro factor que influye en las prioridades laborales y en la estabilidad en el empleo. En América Latina, los trabajadores jóvenes presentan una mayor tasa de rotación, ya que suelen encontrarse en una etapa de búsqueda activa de oportunidades de crecimiento profesional más rápido y de mejores condiciones laborales (BID, 2014; ResearchGate, 2016).

Hipótesis: Empleados jóvenes tienen mayor probabilidad de rotación que los de mayor edad.

  • % de aumento en el salario (Porcentaje_aumento_salarial)

Los aumentos salariales constituyen un indicador de reconocimiento y valorización del desempeño de los empleados. Según Herzberg, en un artículo publicado en Harvard Business Review, existe una teoría de la motivación que establece que las recompensas económicas y el reconocimiento son factores que reducen la insatisfacción y fomentan la retención de los empleados en las organizaciones.

Para este análisis se utiliza la variable Porcentaje_aumento_salarial, ya que refleja una mejora relativa en la compensación del empleado y permite comparar la motivación y la retención entre diferentes cargos de manera más equitativa..

Hipótesis: A mayor porcentaje de aumento salarial reciente, menor probabilidad de rotación

2.2 Categóricas

  • Estado civil (Estado_Civil)

El estado civil puede influir en la rotación dentro de una organización. Según datos de la International Labour Organization (ILO), las personas solteras presentan mayores probabilidades de desempleo, especialmente las mujeres. No obstante, también se puede considerar que las personas solteras, al no tener compromisos matrimoniales o familiares, pueden estar más dispuestas a cambiar de empleo o incluso de ciudad, ya que no cuentan con responsabilidades que los aten a un lugar específico.

Hipótesis: Los empleados solteros tienen mayor probabilidad de rotación

  • Horas extra (Horas_Extras)

La Organización Internacional del Trabajo (OIT) ha destacado que las jornadas laborales prolongadas pueden generar estrés y fatiga en los empleados. Asimismo, estudios señalan que las horas extras no remuneradas son una práctica común en América Latina, lo que puede generar descontento y, en consecuencia, aumentar la rotación laboral (El País, 2024).

Hipótesis: Los empleados que realizan horas extra tienen mayor probabilidad de rotación.

  • Viajes de negocios (Viaje de Negocios)

Un estudio realizado por SAP reveló que la mayoría de los viajeros de negocios en América Latina estaría dispuesta a rechazar un viaje asignado por motivos relacionados con la salud y seguridad, factores sociales, medioambientales o de equilibrio entre la vida laboral y personal. Estos hallazgos sugieren que la frecuencia y las condiciones de los viajes de negocios pueden afectar la satisfacción laboral y, en consecuencia, incrementar la probabilidad de rotación dentro de la organización.

Hipótesis: Los empleados que realizan viajes de negocios frecuentes tienen mayor probabilidad de rotación

3 Análisis univariado

Una vez seleccionadas las variables, se procederá a crear un DataFrame (DF) que contenga únicamente la información relevante para el análisis, asegurando que la base de datos final incluya todas las variables necesarias para la estimación del modelo y los análisis posteriores.

3.1 Resumen de variables

rotacion_seleccion <- rotacion %>%
  select(Rotación, Antigüedad, Edad, Porcentaje_aumento_salarial,
         Estado_Civil, Horas_Extra, `Viaje de Negocios`) 

# Resumen tipo dfSummary (bonito)
dfSummary(rotacion_seleccion) %>%
  print(
    method = "render",   # renderiza en HTML
    headings = FALSE,    # quita encabezados repetidos
    style = "grid",      # estilo tipo tabla
    graph.col = FALSE,   # no mostrar gráficos de barras por columna
    graph.magnif = 0     # tamaño de gráficos 0 (no se muestran)
  )
No Variable Stats / Values Freqs (% of Valid) Valid Missing
1 Rotación [character]
1. No
2. Si
1233(83.9%)
237(16.1%)
1470 (100.0%) 0 (0.0%)
2 Antigüedad [numeric]
Mean (sd) : 7 (6.1)
min ≤ med ≤ max:
0 ≤ 5 ≤ 40
IQR (CV) : 6 (0.9)
37 distinct values 1470 (100.0%) 0 (0.0%)
3 Edad [numeric]
Mean (sd) : 36.9 (9.1)
min ≤ med ≤ max:
18 ≤ 36 ≤ 60
IQR (CV) : 13 (0.2)
43 distinct values 1470 (100.0%) 0 (0.0%)
4 Porcentaje_aumento_salarial [numeric]
Mean (sd) : 15.2 (3.7)
min ≤ med ≤ max:
11 ≤ 14 ≤ 25
IQR (CV) : 6 (0.2)
15 distinct values 1470 (100.0%) 0 (0.0%)
5 Estado_Civil [character]
1. Casado
2. Divorciado
3. Soltero
673(45.8%)
327(22.2%)
470(32.0%)
1470 (100.0%) 0 (0.0%)
6 Horas_Extra [character]
1. No
2. Si
1054(71.7%)
416(28.3%)
1470 (100.0%) 0 (0.0%)
7 Viaje de Negocios [character]
1. Frecuentemente
2. No_Viaja
3. Raramente
277(18.8%)
150(10.2%)
1043(71.0%)
1470 (100.0%) 0 (0.0%)

Generated by summarytools 1.1.4 (R version 4.4.2)
2025-09-22

# Descriptivos numéricos
descr_resumen <- descr(rotacion_seleccion, headings = FALSE)
pander(descr_resumen)
  Antigüedad Edad Porcentaje_aumento_salarial
Mean 7.008 36.92 15.21
Std.Dev 6.127 9.136 3.66
Min 0 18 11
Q1 3 30 12
Median 5 36 14
Q3 9 43 18
Max 40 60 25
MAD 4.448 8.896 2.965
IQR 6 13 6
CV 0.8742 0.2474 0.2406
Skewness 1.761 0.4123 0.8195
SE.Skewness 0.06382 0.06382 0.06382
Kurtosis 3.909 -0.411 -0.3073
N.Valid 1470 1470 1470
N 1470 1470 1470
Pct.Valid 100 100 100
#Histograma de Antigüedad
prom_antiguedad <- mean(rotacion_seleccion$Antigüedad, na.rm = TRUE)

g1 <- ggplot(rotacion_seleccion, aes(x = Antigüedad)) +
  geom_histogram(binwidth = 1, fill = "#0F6B99", color = "black") +
  geom_vline(xintercept = prom_antiguedad, color = "red", linetype = "dashed", size = 1) +
  annotate("text", x = prom_antiguedad + 1, 
           y = max(table(rotacion_seleccion$Antigüedad)), 
           label = paste("Promedio =", round(prom_antiguedad,1)), color = "red") +
  theme_minimal() +
  labs(title = "Distribución de Antigüedad", x = "Antigüedad (años)", y = "Cantidad")

#Histograma de Edad
g2 <- ggplot(rotacion_seleccion, aes(x = Edad)) +
  geom_histogram(binwidth = 5, fill = "#6B990F", color = "black") +
  theme_minimal() +
  labs(title = "Distribución de Edad", x = "Edad", y = "Cantidad")

#Boxplot de Porcentaje de Aumento Salarial
g3 <- ggplot(rotacion_seleccion, aes(y = Porcentaje_aumento_salarial, x = "")) +
  geom_boxplot(fill = "#6551CC") +
  theme_minimal() +
  labs(title = "Distribución del % de Aumento Salarial", y = "% Aumento")


# Combinar gráficas 
layout <- g1 / (g2 | g3)  

# Mostrar el layout
layout

# Estado Civil
estado_civil_tab <- rotacion_seleccion %>%
  count(Estado_Civil) %>%
  mutate(prop = n / sum(n) * 100)

# Horas Extra
horas_extra_tab <- rotacion_seleccion %>%
  count(Horas_Extra) %>%
  mutate(prop = n / sum(n) * 100)

# Viaje de Negocios
viaje_tab <- rotacion_seleccion %>%
  count(`Viaje de Negocios`) %>%
  mutate(prop = n / sum(n) * 100)
# paleta personalizada
colores_estado_civil <- c("Soltero" = "#85B22C", "Casado" = "#51A3CC", "Divorciado" = "#CC8E51")
colores_horas_extra <- c("Si" = "#0F6B99", "No" = "#B22C2C")
colores_viaje <- c("No_Viaja" = "#E57E7E", "Raramente" = "#6B990F", "Frecuentemente" = "#7EC3E5")

# Estado Civil
g1 <- ggplot(estado_civil_tab, aes(x = "", y = prop, fill = Estado_Civil)) +
  geom_col(width = 1, color = "white") +
  coord_polar(theta = "y") +
  geom_text(aes(label = paste0(round(prop,1), "%")), position = position_stack(vjust = 0.5)) +
  theme_void() +
  labs(title = "Distribución de Estado Civil") +
  scale_fill_manual(values = colores_estado_civil)

# ---------------------------
# Horas Extra
g2 <- ggplot(horas_extra_tab, aes(x = "", y = prop, fill = Horas_Extra)) +
  geom_col(width = 1, color = "white") +
  coord_polar(theta = "y") +
  geom_text(aes(label = paste0(round(prop,1), "%")), position = position_stack(vjust = 0.5)) +
  theme_void() +
  labs(title = "Distribución de Horas Extra") +
  scale_fill_manual(values = colores_horas_extra)

# ---------------------------
# Viaje de Negocios
g3 <- ggplot(viaje_tab, aes(x = "", y = prop, fill = `Viaje de Negocios`)) +
  geom_col(width = 1, color = "white") +
  coord_polar(theta = "y") +
  geom_text(aes(label = paste0(round(prop,1), "%")), position = position_stack(vjust = 0.5)) +
  theme_void() +
  labs(title = "Distribución de Viaje de Negocios") +
  scale_fill_manual(values = colores_viaje)

# Combinar gráficas horizontalmente
library(patchwork)
g1 | g2 | g3

Hallazgos Generales

  • El 89,9% de los empleados no rota, lo que indica que la rotación no es masiva, aunque tampoco pasa desapercibida: aproximadamente 1 de cada 6 empleados rota.

  • En promedio, los empleados permanecen en la empresa (independientemente del cargo) 7 años, con una mediana de 5 años. La distribución de la antigüedad es asimétrica positiva con un sesgo alto, lo que significa que la mayoría de empleados tiene pocos años de permanencia, aunque existe un grupo reducido que lleva muchos años vinculado.

  • La edad promedio es de 36 años, con una distribución simétrica, lo que sugiere una diversidad de edades sin valores extremos muy marcados.

  • El porcentaje promedio de aumento salarial es del 15%, con valores que oscilan entre el 11% y el 25%. Su distribución presenta un sesgo positivo (0,82), lo que indica que la mayoría de empleados recibe aumentos moderados, mientras que solo unos pocos alcanzan incrementos más altos.

  • En cuanto al estado civil, la mayoría de los empleados está casada (45,8%), seguida por los solteros (32%) y los divorciados (22,2%).

  • Aproximadamente el 28,3% de los empleados trabaja horas extra.

  • Finalmente, la mayoría presenta un bajo nivel de viajes de negocios: el 71% viaja raramente, aunque un 18% lo hace con frecuencia.

4 Análisis bivariado

Se llevará a cabo un análisis en el cual la variable respuesta será la rotación. En este paso se identificarán las variables más determinantes y se contrastarán los resultados con las hipótesis planteadas.

# Codificar la variable Rotación en 0/1
rotacion_seleccion$y <- ifelse(rotacion_seleccion$Rotación == "Si", 1, 0)

# Modelo bivariado: Antigüedad vs Rotación 
modelo_antig <- glm(y ~ Antigüedad, data = rotacion_seleccion, family = binomial) 

#Modelo bivariado: Edad vs Rotación 
modelo_edad <- glm(y ~ Edad, data = rotacion_seleccion, family = binomial) 

 # Modelo bivariado: % Aumento Salarial vs Rotación 

modelo_aum <- glm(y ~ Porcentaje_aumento_salarial, data = rotacion_seleccion, family = binomial) 

4.1 Antigüedad en el cargo ( Antigüedad)

# Crear rango de antigüedad
antig_range <- data.frame(Antigüedad = seq(min(rotacion_seleccion$Antigüedad),
                                           max(rotacion_seleccion$Antigüedad)))

# Predicciones del modelo
antig_range$prob <- predict(modelo_antig, newdata = antig_range, type = "response")

# Gráfica
ggplot() +
  geom_point(data = rotacion_seleccion, aes(x = Antigüedad, y = as.numeric(y == "Si")),
             alpha = 0.3, position = position_jitter(height = 0.02)) +
  geom_line(data = antig_range, aes(x = Antigüedad, y = prob), color = "#0F6B99", size = 1.2) +
  theme_minimal() +
  labs(title = "Probabilidad de Rotación según Antigüedad",
       x = "Antigüedad (años)",
       y = "Probabilidad de Rotación")

# Función para crear tabla del modelo
tabla_modelo <- function(modelo) {
  tidy(modelo) %>% 
    kable(digits = 3, caption = "Resumen del modelo logístico") %>%
    kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"))
}

#Tabla del modelo Antigüedad vs Rotación
tabla_modelo(modelo_antig)
Resumen del modelo logístico
term estimate std.error statistic p.value
(Intercept) -1.156 0.111 -10.378 0
Antigüedad -0.081 0.016 -5.068 0

A medida que la antigüedad del empleado aumenta, la probabilidad de rotación disminuye. Es decir, cada año adicional de permanencia en la empresa reduce la probabilidad relativa de rotación en aproximadamente 0,081.

El p-valor es prácticamente 0 (< 0,001), lo que indica que esta relación es altamente significativa. Esto proporciona evidencia estadística sólida de que la antigüedad influye en la rotación de los empleados.

Conclusión: el modelo muestra que los empleados con mayor antigüedad tienen menor probabilidad de rotar. Por cada año adicional de permanencia, la probabilidad de rotación disminuye aproximadamente un 8%, y esta relación es estadísticamente significativa.

4.2 Edad del empleado (Edad)

# Crear rango de edad
edad_range <- data.frame(Edad = seq(min(rotacion_seleccion$Edad),
                                    max(rotacion_seleccion$Edad)))

# Predicciones del modelo
edad_range$prob <- predict(modelo_edad, newdata = edad_range, type = "response")

# Gráfica
ggplot() +
  geom_point(data = rotacion_seleccion, 
             aes(x = Edad, y = as.numeric(y == "Si")),
             alpha = 0.3, position = position_jitter(height = 0.02)) +
  geom_line(data = edad_range, aes(x = Edad, y = prob), color = "#0F6B99", size = 1.2) +
  theme_minimal() +
  labs(title = "Probabilidad de Rotación según Edad",
       x = "Edad (años)",
       y = "Probabilidad de Rotación")

# Función para crear tabla del modelo
tabla_modelo <- function(modelo) {
  tidy(modelo) %>% 
    kable(digits = 3, caption = "Resumen del modelo logístico") %>%
    kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"))
}

#Tabla del modelo Antigüedad vs Rotación
tabla_modelo(modelo_edad)
Resumen del modelo logístico
term estimate std.error statistic p.value
(Intercept) 0.206 0.306 0.674 0.5
Edad -0.052 0.009 -6.006 0.0

A medida que aumenta la edad, la probabilidad de rotación disminuye. Esta relación es altamente significativa, ya que el valor de p es prácticamente 0, lo que indica que estadísticamente la edad influye en la rotación.

Conclusión: los empleados mayores tienden a rotar menos que los jóvenes, y por cada año adicional de edad, la probabilidad de rotación disminuye.

4.3 % de aumento en el salario (Porcentaje_aumento_salarial)

#Crear rango de % Aumento Salarial

aum_range <- data.frame(Porcentaje_aumento_salarial = seq(min(rotacion_seleccion$Porcentaje_aumento_salarial, na.rm = TRUE),
                                                          max(rotacion_seleccion$Porcentaje_aumento_salarial, na.rm = TRUE)))


#Predicciones del modelo

aum_range$prob <- predict(modelo_aum, newdata = aum_range, type = "response")


#Gráfica de probabilidad de rotación según % Aumento Salarial

ggplot() +
  geom_point(data = rotacion_seleccion, 
             aes(x = Porcentaje_aumento_salarial, y = as.numeric(y == "Si")),
             alpha = 0.3, position = position_jitter(height = 0.02)) +
  geom_line(data = aum_range, aes(x = Porcentaje_aumento_salarial, y = prob), color = "#0F6B99", size = 1.2) +
  theme_minimal() +
  labs(title = "Probabilidad de Rotación según % Aumento Salarial",
       x = "% Aumento Salarial",
       y = "Probabilidad de Rotación")

#Función para crear tabla bonita del modelo

tabla_modelo <- function(modelo) {
  tabla <- tidy(modelo)  # Convierte modelo en data.frame
  kable(tabla, digits = 3, caption = 'Resumen del modelo logístico') %>%
    kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"))
}


#Tabla del modelo % Aumento Salarial vs Rotación

tabla_modelo(modelo_aum)
Resumen del modelo logístico
term estimate std.error statistic p.value
(Intercept) -1.496 0.305 -4.910 0.000
Porcentaje_aumento_salarial -0.010 0.020 -0.517 0.605

El coeficiente es ligeramente negativo, lo que sugiere que a mayor aumento salarial, la probabilidad de rotación tiende a disminuir. Sin embargo, el valor de p es 0,605, lo que indica que esta relación no es estadísticamente significativa.

Conclusión: no existe evidencia suficiente para afirmar que los aumentos salariales tengan un impacto real en la rotación del personal.

4.4 Estado civil (Estado_Civil)

# ESTADO CIVIL vs ROTACIÓN

# Tabla de contingencia
tabla_ec <- table(rotacion_seleccion$Rotación, rotacion_seleccion$Estado_Civil)

# Chi-cuadrado
chi_ec <- chisq.test(tabla_ec)
chi_ec
## 
##  Pearson's Chi-squared test
## 
## data:  tabla_ec
## X-squared = 46.164, df = 2, p-value = 9.456e-11
# Modelo logístico
modelo_ec <- glm(y ~ Estado_Civil, data = rotacion_seleccion, family = binomial)

# Odds ratios
exp(coef(modelo_ec))
##            (Intercept) Estado_CivilDivorciado    Estado_CivilSoltero 
##              0.1426146              0.7870505              2.4040816
# Gráfico 
g <- ggplot(rotacion_seleccion, aes(x = Estado_Civil, fill = Rotación)) +
  geom_bar(position = "fill") +
  scale_y_continuous(labels = scales::percent_format()) +
  theme_minimal() +
  labs(title = "Proporción de Rotación según Estado Civil",
       y = "Proporción (%)", x = "Estado Civil", fill = "Rotación")

#  Tabla del modelo (convertida a tableGrob) 
tabla <- tabla_modelo(modelo_ec)  # tu función que genera kable
tabla_grob <- gridExtra::tableGrob(
  broom::tidy(modelo_ec),
  rows = NULL,
  theme = gridExtra::ttheme_default(
    core = list(fg_params=list(cex = 0.8)),
    colhead = list(fg_params=list(cex = 0.8))
  )
)

# Mostrar gráfico y tabla lado a lado
gridExtra::grid.arrange(g, tabla_grob, ncol = 2)

Existe una asociación significativa entre el estado civil y la rotación, lo que indica que el estado civil influye en la probabilidad de rotación. Para identificar qué categoría se asocia con mayor rotación, se ajustó un modelo logístico, el cual muestra que:

  • Los empleados solteros tienen una probabilidad significativamente mayor de rotación en comparación con los casados.

  • Los empleados divorciados no presentan diferencias significativas respecto a los casados.

Estos resultados confirman la hipótesis previamente planteada sobre la influencia del estado civil en la rotación del personal.

4.5 Horas extra (Horas_Extras)

# HORAS EXTRAS vs ROTACIÓN

# TABLA DE CONTINGENCIA
tabla_he <- table(rotacion_seleccion$Rotación, rotacion_seleccion$Horas_Extra)

# CHI-CUADRADO
chi_he <- chisq.test(tabla_he)
chi_he
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  tabla_he
## X-squared = 87.564, df = 1, p-value < 2.2e-16
# MODELO LOGÍSTICO
modelo_he <- glm(y ~ Horas_Extra, data = rotacion_seleccion, family = binomial)

# ODDS RATIOS
exp(coef(modelo_he))
##   (Intercept) Horas_ExtraSi 
##     0.1165254     3.7712488
# GRÁFICO
g_he <- ggplot(rotacion_seleccion, aes(x = Horas_Extra, fill = Rotación)) +
  geom_bar(position = "fill") +
  scale_y_continuous(labels = scales::percent_format()) +
  theme_minimal() +
  labs(title = "Proporción de Rotación según Horas Extra",
       y = "Proporción (%)", x = "Horas Extra", fill = "Rotación")

# TABLA DEL MODELO
tabla_grob_he <- gridExtra::tableGrob(
  broom::tidy(modelo_he),
  rows = NULL,
  theme = gridExtra::ttheme_default(
    core = list(fg_params=list(cex = 0.8)),
    colhead = list(fg_params=list(cex = 0.8))
  )
)

# MOSTRAR LADO A LADO
gridExtra::grid.arrange(g_he, tabla_grob_he, ncol = 2)

En la variable Horas Extra se encontró evidencia estadísticamente significativa de asociación con la rotación. La prueba de Chi-cuadrado de Pearson arrojó un valor de X2=87.56X^2 = 87.56X2=87.56, con 1 grado de libertad y un p-valor < 0.001, lo que indica que el hecho de realizar horas extra está relacionado con la decisión de permanecer o abandonar la organización.

El modelo de regresión logística confirma este hallazgo. El coeficiente estimado para la categoría (realiza horas extra) fue de 1.327, con un p-valor < 0.001, lo que implica un efecto positivo y significativo sobre la probabilidad de rotación. En términos de razones de momios (odds ratios), los empleados que realizan horas extra tienen 3.77 veces más probabilidades de rotación en comparación con aquellos que no realizan horas extra.

Finalmente, la evidencia gráfica respalda estos resultados: se observa que la proporción de empleados que presentan rotación es considerablemente mayor entre quienes trabajan horas extra, lo que sugiere que las jornadas prolongadas pueden incidir negativamente en la permanencia dentro de la organización.

4.6 Viajes de negocios (Viaje de Negocios)

# VIAJES DE NEGOCIOS vs ROTACIÓN

# TABLA DE CONTINGENCIA
tabla_vn <- table(rotacion_seleccion$Rotación, rotacion_seleccion$`Viaje de Negocios`)

# CHI-CUADRADO
chi_vn <- chisq.test(tabla_vn)
chi_vn
## 
##  Pearson's Chi-squared test
## 
## data:  tabla_vn
## X-squared = 24.182, df = 2, p-value = 5.609e-06
# MODELO LOGÍSTICO
modelo_vn <- glm(y ~ `Viaje de Negocios`, data = rotacion_seleccion, family = binomial)

# ODDS RATIOS
exp(coef(modelo_vn))
##                  (Intercept)  `Viaje de Negocios`No_Viaja 
##                    0.3317308                    0.2621298 
## `Viaje de Negocios`Raramente 
##                    0.5301701
# GRÁFICO
g_vn <- ggplot(rotacion_seleccion, aes(x = `Viaje de Negocios`, fill = Rotación)) +
  geom_bar(position = "fill") +
  scale_y_continuous(labels = scales::percent_format()) +
  theme_minimal() +
  labs(title = "Proporción de Rotación según Viaje de Negocios",
       y = "Proporción (%)", x = "Viaje de Negocios", fill = "Rotación")

# TABLA DEL MODELO
tabla_grob_vn <- gridExtra::tableGrob(
  broom::tidy(modelo_vn),
  rows = NULL,
  theme = gridExtra::ttheme_default(
    core = list(fg_params=list(cex = 0.7)),
    colhead = list(fg_params=list(cex = 0.7))
  )
)

# MOSTRAR LADO A LADO
gridExtra::grid.arrange(g_vn, tabla_grob_vn, ncol = 2)

En la variable Viaje de Negocios también se encontró evidencia estadísticamente significativa de asociación con la rotación. La prueba de Chi-cuadrado de Pearson arrojó un valor de X2=24.18X^2 = 24.18X2=24.18, con 2 grados de libertad y un p-valor < 0.001, lo que indica que la frecuencia de viajes de negocios está relacionada con la decisión de permanecer o abandonar la organización.

El modelo de regresión logística confirma esta relación. Al tomar como referencia a los empleados que viajan con frecuencia, se observa que:

  • Los empleados que no viajan por negocios tienen un coeficiente estimado de -1.339 (p < 0.001), con un odds ratio de 0.26, lo que significa que tienen una probabilidad significativamente menor de rotación frente a quienes viajan frecuentemente.

  • Los empleados que viajan raramente tienen un coeficiente de -0.635 (p < 0.001), con un odds ratio de 0.53, también con menor probabilidad de rotación respecto al grupo de referencia.

La gráfica respalda estos hallazgos: la proporción de rotación es más alta entre quienes realizan viajes de negocios frecuentes, mientras que quienes no viajan o lo hacen solo ocasionalmente presentan una menor incidencia de rotación.

En conclusión, los resultados sugieren que los viajes de negocios frecuentes incrementan la probabilidad de rotación, posiblemente debido a factores de desgaste físico, estrés o impacto en el equilibrio entre vida laboral y personal.

5 Estimación del modelo

Con el fin de evaluar de manera integral los factores que influyen en la probabilidad de rotación de los empleados, se estimó un modelo de regresión logística multivariado. Este modelo permite analizar simultáneamente el efecto de variables escogidas anteriormente.

Con esto, buscaremos identificar cuáles de estas vaariable tienen un impacto significativo en la decisión de los empleados de abandonar la organización y en qué dirección actúa dicho efecto. Para ello, se interpretan los coeficientes del modelo en términos de razones de odds (odds ratios), acompañadas de sus intervalos de confianza al 95% y valores p asociados. De esta manera, se facilita la comprensión del riesgo relativo de rotación en cada grupo de empleados.

# Asegurar que la variable Rotación esté en formato binario
rotacion_seleccion$Rotación <- factor(rotacion_seleccion$Rotación,
                                      levels = c("No", "Si")) 
# Modelo logístico multivariado

modelo_final <- glm(Rotación ~ Antigüedad + Edad + Porcentaje_aumento_salarial +
                      Estado_Civil + Horas_Extra + `Viaje de Negocios`,
                    data = rotacion_seleccion, family = binomial)


# 
#  Tabla de resultados (OR, IC95%, p-valor)

tabla_resultados <- tidy(modelo_final, conf.int = TRUE, exponentiate = TRUE) %>%
  mutate(term = recode(term,
                       "(Intercept)" = "Intercepto",
                       "Antigüedad" = "Antigüedad",
                       "Edad" = "Edad",
                       "Porcentaje_aumento_salarial" = "Aumento Salarial (%)",
                       "Estado_CivilDivorciado" = "Estado Civil: Divorciado",
                       "Estado_CivilSoltero" = "Estado Civil: Soltero",
                       "Horas_ExtraSi" = "Horas Extra: Sí",
                       "`Viaje de Negocios`No_Viaja" = "Viaje de Negocios: No viaja",
                       "`Viaje de Negocios`Raramente" = "Viaje de Negocios: Raramente")) %>%
  select(term, estimate, conf.low, conf.high, p.value) %>%
  rename(Variable = term,
         OR = estimate,
         `IC 95% Inferior` = conf.low,
         `IC 95% Superior` = conf.high,
         `p-valor` = p.value)

# Mostrar tabla 
tabla_resultados %>%
  gt() %>%
  fmt_number(columns = c(OR, `IC 95% Inferior`, `IC 95% Superior`), decimals = 2) %>%
  fmt_number(columns = `p-valor`, decimals = 4)
Variable OR IC 95% Inferior IC 95% Superior p-valor
Intercepto 1.02 0.39 2.68 0.9642
Antigüedad 0.94 0.91 0.97 0.0004
Edad 0.96 0.94 0.98 0.0000
Aumento Salarial (%) 0.99 0.95 1.03 0.7129
Estado Civil: Divorciado 0.77 0.49 1.19 0.2421
Estado Civil: Soltero 2.27 1.63 3.18 0.0000
Horas Extra: Sí 4.22 3.11 5.75 0.0000
Viaje de Negocios: No viaja 0.27 0.13 0.51 0.0002
Viaje de Negocios: Raramente 0.52 0.36 0.74 0.0002

Hallazgos

La antigüedad tiene un efecto significativo sobre la rotación: por cada año adicional en la organización, la probabilidad de rotación disminuye (OR = 0.95, p < 0.001).

La edad también presenta un efecto negativo sobre la rotación (OR = 0.96, p < 0.001), lo que indica que los empleados más jóvenes tienen una mayor probabilidad de abandonar la empresa.

Por otro lado, el porcentaje de aumento salarial no resulta estadísticamente significativo (p = 0.71), lo que sugiere que, en el contexto analizado, los incrementos en el sueldo no tienen un efecto claro sobre la retención de los empleados.

En cuanto a las variables categóricas, el estado civil influye de manera diferenciada en la rotación: los empleados solteros presentan más del doble de probabilidad de rotación en comparación con los casados (OR = 2.27, p < 0.001), confirmando la hipótesis planteada. En cambio, los divorciados no muestran diferencias estadísticamente significativas (p = 0.24).

Las horas extras muestran un efecto relevante: quienes realizan horas adicionales tienen más de cuatro veces la probabilidad de rotación en comparación con quienes no lo hacen (OR = 4.22, p < 0.001), lo que respalda la hipótesis formulada.

Finalmente, respecto a los viajes de negocios, se encontró que los empleados que no viajan (OR = 0.27, p < 0.001) y los que viajan raramente (OR = 0.52, p < 0.001) tienen una menor probabilidad de rotación en comparación con quienes viajan con frecuencia.

En resumen, el modelo confirma la relevancia de factores como la antigüedad, edad, estado civil, realización de horas extras y viajes frecuentes como determinantes de la rotación laboral.

6 Evaluación del modelo

A continuacion, se evaluara el modelo con el fin de conocer el desempe;o del mismo y determinar que tanta capacidad tiene el modelo de discriminar los empleados que rotan y lo que no.

# =========================
# 2. Probabilidades predichas
# =========================
prob_pred <- predict(modelo_final, type = "response")

# =========================
# 3. Calcular curva ROC
# =========================
roc_obj <- roc(rotacion_seleccion$Rotación, prob_pred)

# =========================
# 4. Graficar curva ROC
# =========================
plot(roc_obj, col = "blue", lwd = 2, main = "Curva ROC - Modelo de Rotación")
abline(a = 0, b = 1, lty = 2, col = "red")

# =========================
# 5. AUC
# =========================
auc_value <- auc(roc_obj)
auc_value
## Area under the curve: 0.7667

La evaluación del modelo mediante la curva ROC arrojó un AUC de 0.767, lo que indica que el modelo tiene una buena capacidad de discriminar entre empleados que rotan y los que permanecen en la empresa.

Esto significa que, en aproximadamente un 77% de los casos, el modelo asigna una probabilidad más alta de rotación a quienes efectivamente abandonan la empresa en comparación con quienes no lo hacen. La forma de la curva ROC sugiere que el modelo logra un buen equilibrio entre sensibilidad y especificidad, permitiendo identificar correctamente a los empleados con riesgo de rotación mientras se minimiza la clasificación errónea de los empleados estables.

En conclusión, el modelo es útil para anticipar la rotación y puede servir como herramienta de apoyo para diseñar estrategias de retención de talento, enfocadas en los grupos de mayor riesgo.

7 Predicciones

A continuacion vamos a realizar las predicciones para dos perfiles de empleados

library(dplyr)
library(kableExtra)


# Definir dos empleados hipotéticos

empleados_hipoteticos <- data.frame(
  Antigüedad = c(2, 10),                 
  Edad = c(25, 40),                      
  Porcentaje_aumento_salarial = c(5, 10),
  Estado_Civil = c("Soltero", "Casado"),       
  Horas_Extra = c("Si", "No"),
  check.names = FALSE
)

# Agregar la variable con nombre especial
empleados_hipoteticos$`Viaje de Negocios` <- c("Frecuentemente", "Raramente")

# Calcular probabilidad de rotación
empleados_hipoteticos$Probabilidad_Rotacion <- predict(modelo_final, 
                                                       newdata = empleados_hipoteticos, 
                                                       type = "response")

# Clasificación según corte
corte <- 0.5
empleados_hipoteticos$Clasificacion <- ifelse(empleados_hipoteticos$Probabilidad_Rotacion > corte, 
                                              "En riesgo", "Bajo riesgo")


# Convertir todo a carácter para cuadro

empleados_hipoteticos <- empleados_hipoteticos %>% mutate(across(everything(), as.character))


# Construir tabla 

tabla_comparativa <- data.frame(
  Característica = c("Antigüedad", "Edad", "Porcentaje aumento salarial", 
                     "Estado Civil", "Horas Extra", "Viaje de Negocios", 
                     "Probabilidad de rotación", "Clasificación"),
  `Empleado 1` = c(empleados_hipoteticos[1, "Antigüedad"],
                    empleados_hipoteticos[1, "Edad"],
                    empleados_hipoteticos[1, "Porcentaje_aumento_salarial"],
                    empleados_hipoteticos[1, "Estado_Civil"],
                    empleados_hipoteticos[1, "Horas_Extra"],
                    empleados_hipoteticos[1, "Viaje de Negocios"],
                    round(as.numeric(empleados_hipoteticos[1, "Probabilidad_Rotacion"]), 3),
                    empleados_hipoteticos[1, "Clasificacion"]),
  `Empleado 2` = c(empleados_hipoteticos[2, "Antigüedad"],
                    empleados_hipoteticos[2, "Edad"],
                    empleados_hipoteticos[2, "Porcentaje_aumento_salarial"],
                    empleados_hipoteticos[2, "Estado_Civil"],
                    empleados_hipoteticos[2, "Horas_Extra"],
                    empleados_hipoteticos[2, "Viaje de Negocios"],
                    round(as.numeric(empleados_hipoteticos[2, "Probabilidad_Rotacion"]), 3),
                    empleados_hipoteticos[2, "Clasificacion"])
)


# Mostrar tabla

kable(tabla_comparativa, format = "html", caption = "Comparación de empleados hipotéticos") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"),
                full_width = FALSE, position = "center")
Comparación de empleados hipotéticos
Característica Empleado.1 Empleado.2
Antigüedad 2 10
Edad 25 40
Porcentaje aumento salarial 5 10
Estado Civil Soltero Casado
Horas Extra Si No
Viaje de Negocios Frecuentemente Raramente
Probabilidad de rotación 0.753 0.051
Clasificación En riesgo Bajo riesgo

Empleado 1 tiene una probabilidad de rotación alta (0.753) y se clasifica como “En riesgo”. por otro lado el Empleado 2 tiene una probabilidad baja (0.051) y se clasifica como “Bajo riesgo”.

Esto indica que, según el modelo, los factores del perfil del empleado 1 lo hacen mucho más propenso a dejar la empresa que el empleado 2.

algunos factores que pueden influir :

8 Conclusiones

A partir de los resultados del modelo logístico multivariado, se pudo identificar un perfil de los empleados con mayor probabilidad de rotación dentro de la organización. Los hallazgos muestran que la rotación es más frecuente entre empleados jóvenes y con poca antigüedad en la empresa, lo que confirma la hipótesis de que quienes llevan menos tiempo en la organización y se encuentran en etapas iniciales de su vida laboral son más propensos a cambiar de empleo. Asimismo, los empleados solteros presentan un riesgo significativamente mayor de rotación en comparación con los casados, lo que coincide con la literatura que señala que la ausencia de responsabilidades familiares puede facilitar la movilidad laboral.

Otro factor determinante es la carga laboral: los empleados que realizan horas extras tienen más de cuatro veces la probabilidad de rotar en relación con quienes no lo hacen, lo que evidencia un vínculo entre las largas jornadas laborales, el desgaste y la decisión de abandonar la empresa. Finalmente, los resultados indican que los viajes de negocios frecuentes también incrementan la probabilidad de rotación, ya que los empleados que no viajan o lo hacen rara vez presentan significativamente menos riesgo de abandonar la organización.

En síntesis, el perfil de mayor probabilidad de rotación corresponde a empleados jóvenes, con poca antigüedad, solteros, que realizan horas extras y que viajan con frecuencia por motivos de trabajo.

En conclusión, el modelo desarrollado mostró un buen desempeño predictivo (AUC = 0.77), lo que lo convierte en una herramienta útil para identificar empleados en riesgo y orientar estrategias de retención. En este sentido, se recomienda priorizar acciones de gestión dirigidas a equilibrar la carga de trabajo, mejorar la experiencia de los empleados jóvenes y ofrecer alternativas que reduzcan el desgaste asociado a viajes frecuentes. Estas medidas no solo contribuirían a disminuir la rotación, sino también a fortalecer la estabilidad y el compromiso del talento en la organización.

9 Biografia