#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")
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:
Selección de variables: Se seleccionarán seis variables (tres categóricas y tres cuantitativas) que se consideren relacionadas con la rotación.
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.
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.
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.
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.
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.
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
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
)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.
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
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_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.
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
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.
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] |
|
|
1470 (100.0%) | 0 (0.0%) | |||||||||||||||
2 | Antigüedad [numeric] |
|
37 distinct values | 1470 (100.0%) | 0 (0.0%) | |||||||||||||||
3 | Edad [numeric] |
|
43 distinct values | 1470 (100.0%) | 0 (0.0%) | |||||||||||||||
4 | Porcentaje_aumento_salarial [numeric] |
|
15 distinct values | 1470 (100.0%) | 0 (0.0%) | |||||||||||||||
5 | Estado_Civil [character] |
|
|
1470 (100.0%) | 0 (0.0%) | |||||||||||||||
6 | Horas_Extra [character] |
|
|
1470 (100.0%) | 0 (0.0%) | |||||||||||||||
7 | Viaje de Negocios [character] |
|
|
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.
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)
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)
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.
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)
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.
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)
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.
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.
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 Sí (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.
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.
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.
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.
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")
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 :
Antigüedad: El empleado 1 lleva 2 años en la empresa, mientras que el empleado 2 lleva 10 años. Menor antigüedad se asocia con mayor riesgo de rotación.
Edad: El empleado 1 tiene 25 años, mientras que el empleado 2 tiene 40 años. Empleados más jóvenes tienden a tener mayor probabilidad de rotación.
Porcentaje de aumento salarial: El empleado 1 recibió un aumento menor (5%) en comparación con el empleado 2 (10%), lo que puede influir en su motivación y riesgo de irse.
Estado civil: El empleado 1 es soltero y el empleado 2 casado; aunque este factor puede tener un efecto menor, según tu modelo podría estar asociado con mayor estabilidad para los casados.
Horas extra: El empleado 1 trabaja horas extra, lo que podría reflejar sobrecarga laboral o estrés, incrementando la rotación.
Viaje de negocios: El empleado 1 viaja con frecuencia, mientras que el empleado 2 raramente. Los viajes frecuentes podrían aumentar el riesgo de rotación si generan cansancio o desbalance trabajo-vida.
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.
Banco Interamericano de Desarrollo (BID). (2014). Antigüedad en el empleo y rotación laboral en América Latina. Disponible en: https://publications.iadb.org/publications/spanish/document/Antig%C3%BCedad-en-el-empleo-y-rotaci%C3%B3n-laboral-en-Am%C3%A9rica-Latina.pdf
Gasparini, L., & Tornarolli, L. (2016). Antigüedad en el empleo y rotación laboral en América Latina. ResearchGate. Disponible en: https://www.researchgate.net/publication/307576314_Antiguedad_en_el_Empleo_y_Rotacion_Laboral_en_America_Latina
Herzberg, F. (1968). One more time: How do you motivate employees? Harvard Business Review, 46(1), 53–62.
Gammarano, R. (2020). Día Internacional de la Familia: cómo influye el estado civil en los resultados del mercado laboral. ILOSTAT. Recuperado de https://ilostat.ilo.org/es/blog/international-day-of-families-how-marital-status-shapes-labour-market-outcomes/
Organización Internacional del Trabajo. (2020). Situación y perspectivas de la jornada de trabajo en América Latina. Recuperado de https://www.ilo.org/media/375881/download
El País. (2024). 480.000 trabajadores no cobran sus horas extra, un agujero de 3.254 millones de euros al año en salarios y cotizaciones. Recuperado de https://elpais.com/economia/2024/10/09/480000-trabajadores-no-cobran-sus-horas-extra-un-agujero-de-3254-millones-de-euros-al-ano-en-salarios-y-cotizaciones.html
SAP. (2023). Viajes de negocio: tendencias y desafíos en América Latina. Recuperado de https://news.sap.com/latinamerica/2024/01/viajes-de-negocio-tendencias-y-desafios-en-america-latina/