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:

Organización de datos

A continuación, se presentan las variables del conjunto de datos:

str(rotacion)
tibble [1,470 × 24] (S3: tbl_df/tbl/data.frame)
 $ Rotación                   : chr [1:1470] "Si" "No" "Si" "No" ...
 $ Edad                       : num [1:1470] 41 49 37 33 27 32 59 30 38 36 ...
 $ Viaje de Negocios          : chr [1:1470] "Raramente" "Frecuentemente" "Raramente" "Frecuentemente" ...
 $ Departamento               : chr [1:1470] "Ventas" "IyD" "IyD" "IyD" ...
 $ Distancia_Casa             : num [1:1470] 1 8 2 3 2 2 3 24 23 27 ...
 $ Educación                  : num [1:1470] 2 1 2 4 1 2 3 1 3 3 ...
 $ Campo_Educación            : chr [1:1470] "Ciencias" "Ciencias" "Otra" "Ciencias" ...
 $ Satisfacción_Ambiental     : num [1:1470] 2 3 4 4 1 4 3 4 4 3 ...
 $ Genero                     : chr [1:1470] "F" "M" "M" "F" ...
 $ Cargo                      : chr [1:1470] "Ejecutivo_Ventas" "Investigador_Cientifico" "Tecnico_Laboratorio" "Investigador_Cientifico" ...
 $ Satisfación_Laboral        : num [1:1470] 4 2 3 3 2 4 1 3 3 3 ...
 $ Estado_Civil               : chr [1:1470] "Soltero" "Casado" "Soltero" "Casado" ...
 $ Ingreso_Mensual            : num [1:1470] 5993 5130 2090 2909 3468 ...
 $ Trabajos_Anteriores        : num [1:1470] 8 1 6 1 9 0 4 1 0 6 ...
 $ Horas_Extra                : chr [1:1470] "Si" "No" "Si" "Si" ...
 $ Porcentaje_aumento_salarial: num [1:1470] 11 23 15 11 12 13 20 22 21 13 ...
 $ Rendimiento_Laboral        : num [1:1470] 3 4 3 3 3 3 4 4 4 3 ...
 $ Años_Experiencia           : num [1:1470] 8 10 7 8 6 8 12 1 10 17 ...
 $ Capacitaciones             : num [1:1470] 0 3 3 3 3 2 3 2 2 3 ...
 $ Equilibrio_Trabajo_Vida    : num [1:1470] 1 3 3 3 3 2 2 3 3 2 ...
 $ Antigüedad                 : num [1:1470] 6 10 0 8 2 7 1 1 9 7 ...
 $ Antigüedad_Cargo           : num [1:1470] 4 7 0 7 2 7 0 0 7 7 ...
 $ Años_ultima_promoción      : num [1:1470] 0 1 0 3 2 3 0 0 1 7 ...
 $ Años_acargo_con_mismo_jefe : num [1:1470] 5 7 0 0 2 6 0 0 8 7 ...

Se realizó el proceso de encoding para asignar una valor numérico a las variables cualitativas:

# Limpiar nombres de columnas para quitar tildes y pasar todo a snake_case
names(rotacion) <- names(rotacion) %>%
  stri_trans_general("Latin-ASCII") %>%  # Quita tildes
  tolower()                              # Todo en minúsculas

# Crear dataset limpio
rotacion_limpia <- rotacion %>%
  mutate(
    
# Variable objetivo
rotacion_binaria = ifelse(rotacion == "Si", 1, 0),

# Variables categóricas
rendimiento_laboral = factor(rendimiento_laboral, 
                                 levels = 1:4, 
                                 labels = c("Bajo", "Medio", "Alto", "Muy Alto")),

horas_extra = factor(horas_extra, levels = c("no", "si")),

equilibrio_trabajo_vida = factor(equilibrio_trabajo_vida, 
                                     levels = 1:4, 
                                     labels = c("Muy Bajo", "Bajo", "Medio", "Alto")),

educacion = factor(educacion,
                       levels = 1:5,
                       labels = c("Primaria", "Secundaria", "Tecnico/Tecnologo", "Pregrado", "Posgrado")),

satisfaccion_ambiental = factor(satisfaccion_ambiental,
                                    levels = 1:4,
                                    labels = c("Muy Insatisfecho", "Insatisfecho", "Satisfecho", "Muy Satisfecho")),

satisfacion_laboral = factor(satisfacion_laboral,
                                  levels = 1:4,
                                  labels = c("Muy Insatisfecho", "Insatisfecho", "Satisfecho", "Muy Satisfecho")),

# Variables numericas
distancia_casa = as.numeric(distancia_casa),
antiguedad_cargo = as.numeric(antiguedad_cargo),
trabajos_anteriores = as.numeric(trabajos_anteriores))
str(rotacion)
tibble [1,470 × 24] (S3: tbl_df/tbl/data.frame)
 $ rotacion                   : chr [1:1470] "Si" "No" "Si" "No" ...
 $ edad                       : num [1:1470] 41 49 37 33 27 32 59 30 38 36 ...
 $ viaje de negocios          : chr [1:1470] "Raramente" "Frecuentemente" "Raramente" "Frecuentemente" ...
 $ departamento               : chr [1:1470] "Ventas" "IyD" "IyD" "IyD" ...
 $ distancia_casa             : num [1:1470] 1 8 2 3 2 2 3 24 23 27 ...
 $ educacion                  : num [1:1470] 2 1 2 4 1 2 3 1 3 3 ...
 $ campo_educacion            : chr [1:1470] "Ciencias" "Ciencias" "Otra" "Ciencias" ...
 $ satisfaccion_ambiental     : num [1:1470] 2 3 4 4 1 4 3 4 4 3 ...
 $ genero                     : chr [1:1470] "F" "M" "M" "F" ...
 $ cargo                      : chr [1:1470] "Ejecutivo_Ventas" "Investigador_Cientifico" "Tecnico_Laboratorio" "Investigador_Cientifico" ...
 $ satisfacion_laboral        : num [1:1470] 4 2 3 3 2 4 1 3 3 3 ...
 $ estado_civil               : chr [1:1470] "Soltero" "Casado" "Soltero" "Casado" ...
 $ ingreso_mensual            : num [1:1470] 5993 5130 2090 2909 3468 ...
 $ trabajos_anteriores        : num [1:1470] 8 1 6 1 9 0 4 1 0 6 ...
 $ horas_extra                : chr [1:1470] "Si" "No" "Si" "Si" ...
 $ porcentaje_aumento_salarial: num [1:1470] 11 23 15 11 12 13 20 22 21 13 ...
 $ rendimiento_laboral        : num [1:1470] 3 4 3 3 3 3 4 4 4 3 ...
 $ anos_experiencia           : num [1:1470] 8 10 7 8 6 8 12 1 10 17 ...
 $ capacitaciones             : num [1:1470] 0 3 3 3 3 2 3 2 2 3 ...
 $ equilibrio_trabajo_vida    : num [1:1470] 1 3 3 3 3 2 2 3 3 2 ...
 $ antiguedad                 : num [1:1470] 6 10 0 8 2 7 1 1 9 7 ...
 $ antiguedad_cargo           : num [1:1470] 4 7 0 7 2 7 0 0 7 7 ...
 $ anos_ultima_promocion      : num [1:1470] 0 1 0 3 2 3 0 0 1 7 ...
 $ anos_acargo_con_mismo_jefe : num [1:1470] 5 7 0 0 2 6 0 0 8 7 ...

1. Selección de variables

Se seleccionaron seis variables independientes que podrían estar relacionadas con la rotación de cargo. Estas se clasifican según su nivel de medición: categóricas ordinales y cuantitativas.

Variables categóricas

rendimiento_laboral
- Codificación: 1 = Bajo, 2 = Medio, 3 = Alto, 4 = Muy Alto
- Justificación: Un menor rendimiento podría asociarse con desmotivación o con riesgo de reasignación.
- Hipótesis: A menor rendimiento laboral, mayor probabilidad de rotación.

satisfaccion_laboral
- Codificación: 1 = Muy insatisfecho, 2 = Insatisfecho, 3 = Satisfecho, 4 = Muy satisfecho
- Justificación: La percepción del trabajo influye directamente en la intención de permanecer o cambiar de cargo.
- Hipótesis: A menor satisfacción laboral, mayor probabilidad de rotación.

satisfacion_ambiental
- Codificación: 1 = Muy insatisfecho, 2 = Insatisfecho, 3 = Satisfecho, 4 = Muy satisfecho
- Justificación: Un entorno físico desfavorable puede aumentar la intención de cambio.
- Hipótesis: A menor satisfacción ambiental, mayor probabilidad de rotación.

Variables cuantitativas

distancia_casa
- Tipo: Cuantitativa continua (en kilómetros)
- Justificación: Las largas distancias afectan el bienestar y podrían incentivar la rotación.
- Hipótesis: A mayor distancia desde casa, mayor probabilidad de rotación.

trabajos_anteriores
- Tipo: Cuantitativa discreta
- Justificación: Las personas con mayor historial de cambio pueden tener mayor propensión a rotar.
- Hipótesis: A mayor número de trabajos anteriores, mayor probabilidad de rotación.

edad
- Tipo: Cuantitativa discreta
- Justificación: La edad puede influir en la estabilidad laboral; personas más jóvenes pueden buscar crecimiento.
- Hipótesis: A menor edad, mayor probabilidad de rotación.

2. Análisis univariado

Se realizó un análisis univariado de las variables seleccionadas, utilizando:

Gráficos de barras para variables categóricas.
Histogramas y resúmenes estadísticos para variables cuantitativas.
Análisis específico de la variable objetivo rotacion_binaria.

Variables categoricas

color_unico <- "#4B8BBE"

# Rendimiento Laboral
tabla_rendimiento <- rotacion_limpia %>% count(rendimiento_laboral)
knitr::kable(tabla_rendimiento, caption = "Frecuencia de Rendimiento Laboral")
Frecuencia de Rendimiento Laboral
rendimiento_laboral n
Alto 1244
Muy Alto 226
ggplot(tabla_rendimiento, aes(x = rendimiento_laboral, y = n)) +
  geom_col(fill = color_unico, width = 0.35) +
  geom_text(aes(label = n), vjust = -0.3, size = 5) +
  labs(title = "Rendimiento Laboral", y = "Frecuencia", x = "") +
  theme_minimal()

# Satisfacción Laboral
tabla_satisf_lab <- rotacion_limpia %>% count(satisfacion_laboral)
knitr::kable(tabla_satisf_lab, caption = "Frecuencia de Satisfacción Laboral")
Frecuencia de Satisfacción Laboral
satisfacion_laboral n
Muy Insatisfecho 289
Insatisfecho 280
Satisfecho 442
Muy Satisfecho 459
ggplot(tabla_satisf_lab, aes(x = satisfacion_laboral, y = n)) +
  geom_col(fill = color_unico, width = 0.35) +
  geom_text(aes(label = n), vjust = -0.3, size = 5) +
  labs(title = "Satisfaccion Laboral", y = "Frecuencia", x = "") +
  theme_minimal()

# Satisfacción Ambiental
tabla_satisf_amb <- rotacion_limpia %>% count(satisfaccion_ambiental)
knitr::kable(tabla_satisf_amb, caption = "Frecuencia de Satisfacción Ambiental")
Frecuencia de Satisfacción Ambiental
satisfaccion_ambiental n
Muy Insatisfecho 284
Insatisfecho 287
Satisfecho 453
Muy Satisfecho 446
ggplot(tabla_satisf_amb, aes(x = satisfaccion_ambiental, y = n)) +
  geom_col(fill = color_unico, width = 0.35) +
  geom_text(aes(label = n), vjust = -0.3, size = 5) +
  labs(title = "Satisfaccion Ambiental", y = "Frecuencia", x = "") +
  theme_minimal()

rendimiento_laboral

La mayoría de los empleados se encuentra clasificada en el nivel “Alto” de rendimiento, seguida por una proporción relevante en el nivel “Muy Alto”. Este patrón sugiere que, en general, la organización cuenta con un equipo de alto desempeño. Sin embargo, es pertinente analizar los casos de rotación incluso entre empleados con buen rendimiento, ya que podrían estar influenciados por otros factores organizacionales o personales.

satisfaccion_laboral

La distribución de esta variable muestra una tendencia hacia niveles altos de satisfacción, con las categorías “Satisfecho” y “Muy Satisfecho” concentrando la mayor parte de las respuestas. Esto refleja una percepción positiva del entorno laboral por parte de los empleados. No obstante, la presencia de una proporción no despreciable en los niveles de insatisfacción sugiere posibles focos de atención que podrían relacionarse con decisiones de rotación.

satisfaccion_ambiental

Se observa una concentración predominante en los niveles “Satisfecho” y “Muy Satisfecho”, lo que indica que la mayoría de los empleados percibe condiciones ambientales favorables en su lugar de trabajo. Sin embargo, cerca del 39% se ubica en niveles bajos de satisfacción, lo cual representa una oportunidad para mejorar el entorno físico y, con ello, mitigar posibles riesgos de rotación asociados a este factor.

Variables cuantitativas

# Distancia desde casa
summary(rotacion_limpia$distancia_casa)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  1.000   2.000   7.000   9.193  14.000  29.000 
ggplot(rotacion_limpia, aes(x = distancia_casa)) +
  geom_histogram(bins = 20, fill = color_unico, color = "white") +
  labs(title = "Distancia desde Casa", x = "Kilómetros", y = "Frecuencia") +
  theme_minimal()

# Trabajos Anteriores
summary(rotacion_limpia$trabajos_anteriores)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  0.000   1.000   2.000   2.693   4.000   9.000 
ggplot(rotacion_limpia, aes(x = trabajos_anteriores)) +
  geom_histogram(binwidth = 1, fill = color_unico, color = "white") +
  labs(title = "Trabajos Anteriores", x = "Cantidad", y = "Frecuencia") +
  theme_minimal()

# Edad
summary(rotacion_limpia$edad)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  18.00   30.00   36.00   36.92   43.00   60.00 
ggplot(rotacion_limpia, aes(x = edad)) +
  geom_histogram(bins = 20, fill = color_unico, color = "white") +
  labs(title = "Edad de los Empleados", x = "Edad (años)", y = "Frecuencia") +
  theme_minimal()

distancia_casa

La variable representa la distancia en kilómetros entre el lugar de residencia del empleado y la empresa. El análisis muestra una distribución sesgada a la derecha, donde la mayoría de los empleados vive a menos de 10 km de su lugar de trabajo (mediana = 7 km). Sin embargo, existen casos atípicos que alcanzan hasta los 29 km, lo cual podría afectar la satisfacción y predisposición al cambio de cargo en estos empleados.

trabajos_anteriores

Esta variable refleja la cantidad de empleos previos que ha tenido cada empleado. La mediana es de 2 trabajos anteriores, con valores que oscilan entre 0 y 9. La distribución muestra una fuerte concentración en valores bajos, indicando que una gran parte del personal no ha tenido mucha rotación laboral previa. No obstante, se observan empleados con historial laboral más amplio, lo que podría relacionarse con una mayor predisposición a rotar.

edad

La edad de los empleados presenta una distribución relativamente simétrica, con una media cercana a los 37 años y un rango de 18 a 60 años. La mayoría se encuentra entre los 30 y 45 años, lo que refleja una plantilla laboral predominantemente adulta. Esta variable será importante al explorar si la edad influye en la decisión de cambio de cargo.

Variable Rotación

# Tabla de frecuencias
tabla_rotacion <- rotacion_limpia %>%
  count(rotacion_binaria) %>%
  mutate(etiqueta = ifelse(rotacion_binaria == 1, "Sí rotó", "No rotó"))

# Mostrar tabla
knitr::kable(tabla_rotacion, caption = "Distribución de la Variable Rotación")
Distribución de la Variable Rotación
rotacion_binaria n etiqueta
0 1233 No rotó
1 237 Sí rotó
# Gráfico
ggplot(tabla_rotacion, aes(x = etiqueta, y = n)) +
  geom_col(fill = "#4B8BBE") +
  geom_text(aes(label = n), vjust = -0.3, size = 5) +
  labs(title = "Distribución de Rotación de Cargo", x = "Rotación", y = "Frecuencia") +
  theme_minimal()

La variable rotacion_binaria representa el evento de rotación de cargo por parte de los empleados, donde 1 = “Sí rotó” y 0 = “No rotó”. Como se observa, la gran mayoría de los empleados no presenta rotación en el periodo analizado (1.233 casos), mientras que 237 empleados sí cambiaron de cargo.

Esta distribución indica un evento poco frecuente (rotación ≈ 16%), lo cual es relevante para la estimación del modelo logístico, ya que la variable dependiente está desbalanceada. Este tipo de comportamiento es común en estudios organizacionales, y su análisis detallado permitirá identificar los factores que diferencian a los empleados que rotan de aquellos que permanecen estables.

3. Análisis bivariado

Se realizó la exploración de la relación entre la variable dependiente rotacion_binaria (1 = Sí rotó, 0 = No rotó) y las seis variables independientes seleccionadas previamente:

Rotación vs variables categóricas

color_unico <- "#4B8BBE"

# Función auxiliar para graficar barras proporcionales con etiquetas
graficar_proporcion_con_etiquetas <- function(df, variable, titulo, xlab) {
  df_prop <- df %>%
    group_by({{ variable }}, rotacion_binaria) %>%
    summarise(n = n(), .groups = "drop") %>%
    group_by({{ variable }}) %>%
    mutate(prop = n / sum(n),
           etiqueta = paste0(round(prop * 100, 1), "%"))
  
  ggplot(df_prop, aes(x = {{ variable }}, y = prop, fill = factor(rotacion_binaria))) +
    geom_col(position = "stack") +
    geom_text(aes(label = etiqueta), 
              position = position_stack(vjust = 0.5),
              color = "white", size = 5) +
    scale_fill_manual(values = c("gray80", color_unico),
                      labels = c("No rotó", "Sí rotó")) +
    labs(title = titulo, x = xlab, y = "Proporción", fill = "Rotación") +
    theme_minimal()
}

# --- Rendimiento Laboral ---
graficar_proporcion_con_etiquetas(rotacion_limpia, rendimiento_laboral, 
                                  "Rotación vs Rendimiento Laboral", "Rendimiento Laboral")

# --- Satisfacción Laboral ---
graficar_proporcion_con_etiquetas(rotacion_limpia, satisfacion_laboral, 
                                  "Rotación vs Satisfacción Laboral", "Satisfacción Laboral")

# --- Satisfacción Ambiental ---
graficar_proporcion_con_etiquetas(rotacion_limpia, satisfaccion_ambiental, 
                                  "Rotación vs Satisfacción Ambiental", "Satisfacción Ambiental")

Rotación vs rendimiento_laboral

Se observa que la proporción de empleados que rotan es similar en los niveles “Alto” y “Muy Alto”, con aproximadamente un 16% en cada grupo. Esto sugiere que, en este caso, el rendimiento laboral no presenta una diferencia marcada en la rotación, aunque se esperaba lo contrario. Por lo tanto, esta evidencia no valida completamente la hipótesis planteada.

Rotación vs satisfaccion_laboral

Los empleados con menor satisfacción laboral muestran una mayor probabilidad de rotar. Por ejemplo, el 22.8% de quienes se encuentran en la categoría “Muy Insatisfecho” presentan rotación, en contraste con solo el 11.3% de los clasificados como “Muy Satisfecho”. Estos resultados respaldan la hipótesis inicial, en la que una menor satisfacción se asocia con mayor rotación.

Rotación vs satisfacion_ambiental

Se evidencia un descenso progresivo en la rotación conforme aumenta la satisfacción ambiental. El grupo clasificado como “Muy Insatisfecho” registra una rotación del 25.4%, mientras que en la categoría “Muy Satisfecho” la rotación es de apenas el 13.5%. Esto confirma que un entorno físico desfavorable puede incrementar la probabilidad de rotación del personal.

Rotación vs variables cuantitativas

color_unico <- "#4B8BBE"

# --- Distancia desde casa vs Rotación ---
ggplot(rotacion_limpia, aes(x = factor(rotacion_binaria), y = distancia_casa)) +
  geom_boxplot(fill = color_unico) +
  labs(title = "Distancia desde Casa vs Rotación",
       x = "Rotación (0 = No, 1 = Sí)",
       y = "Distancia (km)") +
  theme_minimal()

# --- Trabajos anteriores vs Rotación ---
ggplot(rotacion_limpia, aes(x = factor(rotacion_binaria), y = trabajos_anteriores)) +
  geom_boxplot(fill = color_unico) +
  labs(title = "Trabajos Anteriores vs Rotación",
       x = "Rotación (0 = No, 1 = Sí)",
       y = "Cantidad de Trabajos Anteriores") +
  theme_minimal()

# --- Edad vs Rotación ---
ggplot(rotacion_limpia, aes(x = factor(rotacion_binaria), y = edad)) +
  geom_boxplot(fill = color_unico) +
  labs(title = "Edad vs Rotación",
       x = "Rotación (0 = No, 1 = Sí)",
       y = "Edad (años)") +
  theme_minimal()

distancia_casa

El boxplot evidencia que los empleados que sí rotaron tienden a vivir a mayor distancia del lugar de trabajo. La mediana y el rango intercuartílico son ligeramente más altos en este grupo, lo cual es coherente con la hipótesis planteada: a mayor distancia desde casa, mayor probabilidad de rotación.

trabajos_anteriores

Se observa una mayor cantidad de trabajos previos entre quienes rotaron, con una mayor dispersión y presencia de valores atípicos hacia la derecha. Este comportamiento respalda la hipótesis de que los empleados con mayor historial laboral previo tienden a mostrar mayor movilidad dentro de la organización.

edad

Los empleados que rotaron tienden a ser más jóvenes. El boxplot muestra que la mediana de edad es más alta en el grupo que no rota, mientras que quienes han rotado se concentran en edades más bajas. Este resultado valida la hipótesis de que los empleados más jóvenes presentan una mayor predisposición al cambio, posiblemente en búsqueda de nuevas oportunidades o crecimiento profesional.

4. Estimación del modelo

Se realizó la estimación del ** modelo de regresión logística** con la variable rotacion_binaria como variable dependiente (1 = sí rotó, 0 = no rotó) y seis variables independientes: tres categóricas ordinales (rendimiento_laboral, satisfaccion_laboral, satisfaccion_ambiental) y tres cuantitativas (distancia_casa, trabajos_anteriores, edad).

# Dataset solo con las 6 variables predictoras + respuesta
rotacion_modelo <- rotacion_limpia %>%
  select(
    rotacion_binaria,              # Variable dependiente
    rendimiento_laboral,           # Categórica ordinal
    satisfacion_laboral,          # Categórica ordinal
    satisfaccion_ambiental,        # Categórica ordinal
    distancia_casa,                # Cuantitativa
    trabajos_anteriores,           # Cuantitativa
    edad                           # Cuantitativa
  )

modelo_logistico <- glm(
  rotacion_binaria ~ rendimiento_laboral + satisfacion_laboral +
    satisfaccion_ambiental + distancia_casa + trabajos_anteriores + edad,
  data = rotacion_modelo,
  family = binomial(link = "logit")
)
# Resumen del modelo
summary(modelo_logistico)

Call:
glm(formula = rotacion_binaria ~ rendimiento_laboral + satisfacion_laboral + 
    satisfaccion_ambiental + distancia_casa + trabajos_anteriores + 
    edad, family = binomial(link = "logit"), data = rotacion_modelo)

Coefficients:
                                      Estimate Std. Error z value Pr(>|z|)    
(Intercept)                           1.144867   0.378696   3.023 0.002501 ** 
rendimiento_laboralMuy Alto           0.001973   0.204212   0.010 0.992290    
satisfacion_laboralInsatisfecho      -0.414726   0.221007  -1.877 0.060583 .  
satisfacion_laboralSatisfecho        -0.466832   0.197810  -2.360 0.018275 *  
satisfacion_laboralMuy Satisfecho    -0.865758   0.209852  -4.126 3.70e-05 ***
satisfaccion_ambientalInsatisfecho   -0.725949   0.222596  -3.261 0.001109 ** 
satisfaccion_ambientalSatisfecho     -0.824857   0.200589  -4.112 3.92e-05 ***
satisfaccion_ambientalMuy Satisfecho -0.828246   0.201908  -4.102 4.09e-05 ***
distancia_casa                        0.028085   0.008738   3.214 0.001308 ** 
trabajos_anteriores                   0.109756   0.029586   3.710 0.000208 ***
edad                                 -0.064822   0.009406  -6.892 5.51e-12 ***
---
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: 1196.5  on 1459  degrees of freedom
AIC: 1218.5

Number of Fisher Scoring iterations: 5
# Coeficientes exponentiados (Odds Ratios)
exp(coef(modelo_logistico))
                         (Intercept)          rendimiento_laboralMuy Alto 
                           3.1420231                            1.0019753 
     satisfacion_laboralInsatisfecho        satisfacion_laboralSatisfecho 
                           0.6605214                            0.6269856 
   satisfacion_laboralMuy Satisfecho   satisfaccion_ambientalInsatisfecho 
                           0.4207326                            0.4838653 
    satisfaccion_ambientalSatisfecho satisfaccion_ambientalMuy Satisfecho 
                           0.4382978                            0.4368148 
                      distancia_casa                  trabajos_anteriores 
                           1.0284834                            1.1160058 
                                edad 
                           0.9372340 
# Intervalos de confianza al 95%
exp(confint(modelo_logistico))
                                         2.5 %    97.5 %
(Intercept)                          1.5006405 6.6310997
rendimiento_laboralMuy Alto          0.6636506 1.4805908
satisfacion_laboralInsatisfecho      0.4265253 1.0160046
satisfacion_laboralSatisfecho        0.4252726 0.9245056
satisfacion_laboralMuy Satisfecho    0.2779601 0.6336959
satisfaccion_ambientalInsatisfecho   0.3109591 0.7453768
satisfaccion_ambientalSatisfecho     0.2951389 0.6486638
satisfaccion_ambientalMuy Satisfecho 0.2933148 0.6480173
distancia_casa                       1.0108957 1.0461611
trabajos_anteriores                  1.0526606 1.1822929
edad                                 0.9198068 0.9543804

El resumen del modelo indicó que todas las variables incluidas resultaron estadísticamente significativas al 95% de confianza, excepto el nivel “Muy Alto” de rendimiento_laboral, que no presentó un efecto estadísticamente significativo.

A continuación se interpretan los resultados a partir de los odds ratios estimados:

5. Evaluación del modelo

Para medir el poder predictivo del modelo de regresión logística, se utilizó la curva ROC (Receiver Operating Characteristic) junto con el Área Bajo la Curva (AUC). Esta herramienta permite evaluar la capacidad del modelo para distinguir entre empleados que rotaron de cargo (rotacion_binaria = 1) y aquellos que no lo hicieron (rotacion_binaria = 0).

library(pROC)

# 1. Obtener probabilidades predichas del modelo logístico
probabilidades <- predict(modelo_logistico, type = "response")

# 2. Calcular la curva ROC
roc_modelo <- roc(rotacion_modelo$rotacion_binaria, probabilidades)

# 3. Calcular AUC
auc_modelo <- auc(roc_modelo)
print(auc_modelo)  # Mostrará el valor del AUC en consola
Area under the curve: 0.7002
# 4. Graficar curva ROC
plot(roc_modelo,
     col = "#4B8BBE",         # Azul institucional
     lwd = 2,                 # Grosor de línea
     main = "Curva ROC - Modelo de Rotación")
abline(a = 0, b = 1, lty = 2, col = "gray")  # Línea diagonal de referencia

En el modelo estimado, el valor obtenido fue AUC = 0.7002, lo que indica un poder discriminativo aceptable. Este resultado significa que el modelo tiene una capacidad razonable para diferenciar entre empleados que rotan y los que no rotan.

Visualmente, la curva ROC se aleja de la línea diagonal (modelo aleatorio), confirmando que el modelo tiene una mejor capacidad de predicción que el azar. Aunque no alcanza un nivel excelente (AUC > 0.9), el resultado obtenido permite utilizar el modelo como herramienta de apoyo para identificar perfiles con mayor riesgo de rotación y establecer estrategias preventivas en la gestión del talento humano.

6. Predicciones

Se realiza una predicción sobre la probabilidad de rotación de un empleado hipotético, utilizando el modelo logístico estimado previamente. Adicionalmente, se define un punto de corte para determinar si el caso requiere intervención por parte del área de talento humano.

# Crear nuevo individuo hipotético
empleado_nuevo <- data.frame(
  rendimiento_laboral = factor("Alto", levels = levels(rotacion_modelo$rendimiento_laboral)),
  satisfacion_laboral = factor("Insatisfecho", levels = levels(rotacion_modelo$satisfacion_laboral)),
  satisfaccion_ambiental = factor("Satisfecho", levels = levels(rotacion_modelo$satisfaccion_ambiental)),
  distancia_casa = 12,                # kilómetros
  trabajos_anteriores = 4,            # trabajos previos
  edad = 30                           # años
)

# Predecir probabilidad de rotación
prob_rotacion <- predict(modelo_logistico, newdata = empleado_nuevo, type = "response")
prob_rotacion
        1 
0.2204001 

Se construyó un caso hipotético para evaluar la probabilidad de que un empleado rote de cargo. El perfil definido presenta un nivel de rendimiento laboral “Alto”, satisfacción laboral “Insatisfecho”, satisfacción ambiental “Satisfecho”, 12 kilómetros de distancia al trabajo, 4 trabajos anteriores y una edad de 30 años.

El modelo de regresión logística predice una probabilidad de rotación de 22.0% (0.2204). Considerando un punto de corte del 30% como umbral de intervención, este caso no sería considerado de alto riesgo. Sin embargo, dado que el nivel de satisfacción laboral es bajo y el historial de trabajos anteriores es elevado, podría ser conveniente realizar acciones preventivas de parte del área de talento humano.

7. Conclusiones

El modelo de regresión logística permitió identificar variables clave que influyen en la rotación de empleados dentro de la organización. Entre los factores más significativos se encuentran la satisfacción laboral, la satisfacción ambiental, el número de trabajos anteriores, la edad y la distancia desde el hogar al trabajo. Estos elementos mostraron una relación estadísticamente significativa con la probabilidad de rotación, lo cual respalda su importancia en la toma de decisiones estratégicas de retención.

Con base en estos hallazgos, se recomienda enfocar las estrategias de intervención en los empleados que presentan baja satisfacción laboral o ambiental, que han tenido múltiples empleos previos o que viven lejos del lugar de trabajo. Las acciones pueden incluir mejoras en el entorno físico, programas de bienestar, flexibilidad laboral o rutas de desarrollo profesional, que permitan aumentar el compromiso y disminuir el riesgo de rotación. El modelo, con un AUC de 0.70, demuestra ser una herramienta útil para anticipar comportamientos de salida y optimizar la gestión del talento humano.