1 Informe regresión logística, caso: Rotación de cargo

Por :

  • Leimar Torres

  • Oscar Mauricio Montaño Bolaños

  • Juan Hurtado

1.1 Enunciado

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.

1.2 Selección de variables:

Seleccione 3 variables categóricas (distintas de rotación) y 3 variables cuantitativas, que se consideren estén relacionadas con la rotación.

Variables categóricas:

  1. Horas_Extra. Hipótesis: se plantea que los empleados que realizan horas extra pueden presentar una mayor probabilidad de rotación, debido a un posible aumento en la carga laboral y niveles de estrés, lo que podría afectar su satisfacción laboral.

  2. Cargo. Hipótesis: se plantea que el cargo del empleado puede influir en la probabilidad de rotación, ya que diferentes roles pueden presentar variaciones en condiciones laborales, oportunidades de crecimiento y niveles de responsabilidad, lo que impacta la permanencia en la organización.

  3. Estado_Civil. Hipótesis: se plantea que el estado civil puede influir en la rotación, ya que empleados solteros podrían presentar mayor movilidad laboral y menor restricción geográfica, lo que incrementa la probabilidad de cambio de empleo en comparación con empleados casados. {#Estadocivil}

1.2.1 Prueba Chi2 de variables categóricas frente a Rotación (tabla cruzada)

Nivel de significancia \(\alpha = 0.05\).

H₀ p_value >= 0.05 : No hay relación con la rotación

H₁ p_value < 0.05 : Sí hay relación

library(paqueteMODELOS)
library(tidyverse)
library(ggplot2)
library(knitr)
library(kableExtra)
library(factoextra)
library(FactoMineR)
library(gridExtra)
library(corrplot)
library(tibble)
library(leaflet)
library(plotly)
library(dplyr)
library(psych)
library(car)
library(pscl)

data("rotacion")

df <- rotacion

# Convertir a factor variables categóricas
df[] <- lapply(df, function(x) {
  if (is.character(x)) as.factor(x) else x
})

####Identificar categóricas reales####

vars_cat <- names(df)[sapply(df, is.factor)] #Aplica la función is.factor a cada columna y genera un lista, no un dataframe
vars_cat <- setdiff(vars_cat, "Rotación")# Deja todas las categórcas, menos Rotación

resultados <- data.frame(Variable = character(), p_value = numeric())#Crea un dataframe vacío donde vas a guardar resultados.

for (var in vars_cat) {
  
  tabla <- table(df[[var]], df$Rotación)#Crea una tabla cruzada por cada varaiable categórca vs rotación
  
  if (all(dim(tabla) > 1)) { #asegura que hay al menos 2 categorías
    test <- chisq.test(tabla) #Test Chi-cuadrado, H₀: No hay relación, H₁: Sí hay relación
    
    resultados <- rbind(resultados, #Guardar resultados, rbind = “pegar filas”
                        data.frame(
                          Variable = var,
                          p_value = test$p.value #Extraer p-value
                        ))
  }
}

# Ordenar por importancia
resultados <- resultados[order(resultados$p_value), ]

# Formato científico
resultados$p_value <- formatC(resultados$p_value, 
                              format = "e", 
                              digits = 2)


resultados %>%
  knitr::kable("html", booktabs = TRUE,
                row.names = FALSE, ##que no aparezca índie de filas
               caption = "<span style='font-size:13pt; font-weight:bold;'>Tabla 1. Resultados Prueba Chi2</span>") %>%
  kable_styling(full_width = FALSE,
                position = "center",
                bootstrap_options = c("striped", "hover")) %>%
  column_spec(1, bold = TRUE, width = "8cm") %>%
  row_spec(0, bold = TRUE, background = "#f2f2f2")
Tabla 1. Resultados Prueba Chi2
Variable p_value
Horas_Extra 8.16e-21
Cargo 2.75e-15
Estado_Civil 9.46e-11
Viaje de Negocios 5.61e-06
Departamento 4.53e-03
Campo_Educación 6.77e-03
Genero 2.91e-01

Los resultados de la tabla 1 evidencian que variables como Horas Extra, Cargo, Estado Civil, Viaje de Negocios, Departamento y Campo de Educación presentan una relación estadísticamente significativa con la rotación de empleados (p < 0.05). En particular, Horas Extra muestra la asociación más fuerte, sugiriendo que la carga laboral es un factor determinante en la decisión de permanencia.

Por otro lado, la variable Género no presenta una relación significativa (p > 0.05), lo que indica que no influye en la rotación. En conjunto, estos resultados sugieren que la rotación está más asociada a condiciones laborales y características del puesto que a factores demográficos.

Variables cuantiativas:

  1. Ingreso_Mensual. Hipótesis: se plantea que el ingreso mensual puede influir negativamente en la probabilidad de rotación, dado que mayores niveles salariales incrementan la satisfacción laboral y reducen el incentivo de buscar nuevas oportunidades.

  2. Antigüedad_Cargo. Hipótesis: se plantea que una mayor antigüedad en el cargo se puede asociar con una menor probabilidad de rotación, debido a la acumulación de experiencia específica, estabilidad laboral y posibles costos de cambio asociados a abandonar la organización.

  3. Edad. Hipótesis: se plantea que la edad puede influir negativamente en la probabilidad de rotación, ya que empleados de mayor edad tienden a presentar mayor preferencia por la estabilidad laboral y menor disposición a asumir riesgos asociados al cambio de empleo.

1.2.2 Prueba t-Studen y Mann-Whitney (no paramétrica) de variables cuantitativas frente a Rotación

Nivel de significancia \(\alpha = 0.05\).

H₀ p_value >= 0.05 : No hay relación con la rotación

H₁ p_value < 0.05 : Sí hay relación

vars_num <- names(df)[sapply(df, is.numeric)]

resultados_num <- data.frame(
  Variable = character(),
  p_ttest = numeric(),
  p_wilcox = numeric()
)

for (var in vars_num) {
  
  formula <- as.formula(paste(var, "~ `Rotación`"))
  
  # Inicializar
  p_t <- NA
  p_w <- NA
  
  # t-test con control de error
  try({
    test_t <- t.test(formula, data = df)
    p_t <- test_t$p.value
  }, silent = TRUE)
  
  # Mann-Whitney (más robusto)
  try({
    test_w <- wilcox.test(formula, data = df, exact = FALSE)
    p_w <- test_w$p.value
  }, silent = TRUE)
  
  resultados_num <- rbind(resultados_num,
                          data.frame(
                            Variable = var,
                            p_ttest = p_t,
                            p_wilcox = p_w
                          ))
}

# Ordenar
resultados_num <- resultados_num[order(resultados_num$p_wilcox), ]

resultados_num$p_ttest <- formatC(resultados_num$p_ttest, 
                              format = "e", 
                              digits = 2)

resultados_num$p_wilcox <- formatC(resultados_num$p_wilcox, 
                              format = "e", 
                              digits = 2)

resultados_num %>%
  knitr::kable("html", booktabs = TRUE,
                row.names = FALSE, ##que no aparezca índie de filas
               caption = "<span style='font-size:13pt; font-weight:bold;'>Tabla 2. Resultados Prueba t de Student y Mann-Whitney</span>") %>%
  kable_styling(full_width = FALSE,
                position = "center",
                bootstrap_options = c("striped", "hover")) %>%
  column_spec(1, bold = TRUE, width = "8cm") %>%
  row_spec(0, bold = TRUE, background = "#f2f2f2")
Tabla 2. Resultados Prueba t de Student y Mann-Whitney
Variable p_ttest p_wilcox
Años_Experiencia 1.16e-11 2.40e-14
Ingreso_Mensual 4.43e-13 2.95e-14
Antigüedad 2.29e-07 2.92e-13
Antigüedad_Cargo 3.19e-11 4.43e-12
Años_acargo_con_mismo_jefe 1.19e-10 1.81e-11
Edad 1.37e-08 5.28e-11
Satisfación_Laboral 1.05e-04 7.96e-05
Satisfacción_Ambiental 2.09e-04 2.17e-04
Distancia_Casa 4.14e-03 2.39e-03
Años_ultima_promoción 1.99e-01 4.12e-02
Equilibrio_Trabajo_Vida 3.05e-02 4.65e-02
Capacitaciones 2.04e-02 4.73e-02
Trabajos_Anteriores 1.16e-01 2.42e-01
Educación 2.24e-01 2.45e-01
Porcentaje_aumento_salarial 6.14e-01 3.66e-01
Rendimiento_Laboral 9.12e-01 9.12e-01

La tabla 2 de las pruebas t de Student y Mann-Whitney evidencian que variables como ingreso mensual, años de experiencia, antigüedad y edad presentan una relación estadísticamente significativa con la rotación de empleados (p < 0.05 en ambos tests). Estas variables reflejan factores estructurales asociados a la estabilidad laboral y al valor del empleado dentro de la organización.

Adicionalmente, variables relacionadas con satisfacción y condiciones laborales, como satisfacción laboral, equilibrio trabajo-vida y distancia al trabajo, también muestran influencia significativa, aunque en menor medida.

Por otro lado, variables como educación, rendimiento laboral y porcentaje de aumento salarial no presentan evidencia de relación con la rotación, lo que sugiere que estos factores no son determinantes en la decisión de permanencia.

1.3 Análisis univariado

library(scales) # para formato %

df %>%
  group_by(Horas_Extra, Rotación) %>%
  summarise(n = n(), .groups = "drop") %>%
  group_by(Horas_Extra) %>%
  mutate(prop = n / sum(n)) %>%
  ggplot(aes(x = Horas_Extra, y = prop, fill = Rotación)) +
  geom_col(position = "fill") +
  geom_text(aes(label = percent(prop, accuracy = 1)),
            position = position_fill(vjust = 0.5),
            color = "white",
            size = 4) +
  labs(title = "Rotación por Horas Extra",
       y = "Proporción",
        caption = "Figura 1. Proporción de Rotación respecto de si se hacen horas extra") +
  theme_minimal()+
  theme(
    plot.caption = element_text(
      hjust = 0.5,      # centrar
      size = 11,
      face = "italic"  
    ))

De acuerdo con la Figura 1, se observa que la proporción de empleados que presentan rotación es mayor entre aquellos que realizan horas extra (31%) en comparación con aquellos que no las realizan (10%). Esto sugiere una asociación positiva entre la realización de horas extra y la rotación de empleados.

# df %>%
#   ggplot(aes(x = Cargo, fill = Rotación)) +
#   geom_bar(position = "fill") +
#   coord_flip() +
#   labs(title = "Rotación por Cargo",
#        y = "Proporción",
#         caption = "Figura 2. Cargo vs Rotación") +
#   theme_minimal()+
#   theme(
#     plot.caption = element_text(
#       hjust = 0.5,      # centrar
#       size = 11,
#       face = "italic"  
#     ))

df %>%
  group_by(Cargo, Rotación) %>%
  summarise(n = n(), .groups = "drop") %>%
  group_by(Cargo) %>%
  mutate(prop = n / sum(n)) %>%
  ggplot(aes(x = Cargo, y = prop, fill = Rotación)) +
  geom_col(position = "fill") +
  geom_text(aes(label = percent(prop, accuracy = 1)),
            position = position_fill(vjust = 0.5),
            color = "white",
            size = 3) +
  coord_flip() +
  scale_y_continuous(labels = percent_format()) +  # 👈 eje en %
  labs(title = "Rotación por Cargo",
       y = "Porcentaje",
       caption = "Figura 2. Proporción de Rotación respecto del cargo") +
  theme_minimal() +
  theme(
    plot.caption = element_text(
      hjust = 0.5,
      size = 11,
      face = "italic"
    )
  )

De la figura 2 se observa que los cargos operativos y comerciales presentan mayores niveles de rotación, destacándose especialmente los representantes de ventas. En contraste, los cargos directivos y gerenciales presentan una menor proporción de rotación, lo que sugiere una mayor estabilidad en niveles jerárquicos superiores.

df %>%
  group_by(Estado_Civil, Rotación) %>%
  summarise(n = n(), .groups = "drop") %>%
  group_by(Estado_Civil) %>%
  mutate(prop = n / sum(n)) %>%
  ggplot(aes(x = Estado_Civil, y = prop, fill = Rotación)) +
  geom_col(position = "fill") +
  geom_text(aes(label = percent(prop, accuracy = 1)),
            position = position_fill(vjust = 0.5),
            color = "white",
            size = 4) +
  labs(title = "Rotación por Estado_Civil",
       y = "Proporción",
        caption = "Figura 3. Proporción de Rotación frente al estado civil") +
  theme_minimal()+
  theme(
    plot.caption = element_text(
      hjust = 0.5,      # centrar
      size = 11,
      face = "italic"  
    ))

De acuerdo con la figura 3, el estado civil muestra una relación clara con la rotación, siendo los empleados solteros quienes presentan la mayor proporción de rotación. Esto puede estar asociado a una mayor movilidad laboral y menor restricción geográfica en comparación con empleados casados o divorciados. Esta afirmación respalda la hipotesis planteada en la fase de elección de variables categóricas.Véase aquí