Actividad 3: Modelado de la probabilidad de rotación de cargos mediante regresión logística
Autores: Luis Alberto Echeverry Henao, Maicol Contreras y Diana Camila Castillo
Profesora: Jennyfer Portilla Yela
Modelos estadísticos para la toma de decisiones
Universidad Javeriana de Cali
29 de Septiembre de 2025
El presente análisis tiene como propósito construir un modelo de regresión logística a partir de información histórica de los trabajadores, considerando variables tanto cuantitativas como categóricas relacionadas con la rotación. A través de un proceso que incluye selección de variables, análisis exploratorio, estimación e interpretación del modelo, así como la validación de su capacidad predictiva, se busca no solo explicar la dinámica de la rotación, sino también aportar recomendaciones prácticas para la gestión de recursos humanos.
En este punto se deben escoger 3 variables cuantitativas y 3 cualitativas para plantear con cada una de ellas una hipotesis donde se justifique su realcion y su comportamiento esperado, respecto a la variable a predecir que en este caso es la rotacion. Para ello iniciamos separando las variables numericas y validando sus estadisticos principales como se muestra a continuacion:
Antes de iniciar con los análisis, es fundamental conocer el tamaño y estructura de la base de datos utilizada. En la siguiente tabla se resumen las dimensiones del dataset rotacion, donde se presenta el número total de registros (filas) y el número de variables disponibles (columnas).
| Número.de.filas | Número.de.columnas |
|---|---|
| 1470 | 24 |
Es importante detallar las caracteristicas de cada variable disponible. En la siguiente tabla se presenta un resumen de las variables que conforman el dataset, indicando su tipo de dato, el número de valores únicos registrados, la cantidad de nulos presentes y algunos ejemplos representativos. Este análisis permite identificar desde el inicio posibles variables categóricas, numéricas y aquellas que requieren un tratamiento especial en etapas posteriores de depuración o modelamiento.
| Variable | Tipo | Unicos | Nulos | Ejemplo |
|---|---|---|---|---|
| Rotación | character | 2 | 0 | Si, No |
| Edad | numeric | 43 | 0 | 41, 49, 37, 33, 27, 32, 59, 30, 38, 36, 35, 29, 31 |
| Viaje de Negocios | character | 3 | 0 | Raramente, Frecuentemente, No_Viaja |
| Departamento | character | 3 | 0 | Ventas, IyD, RH |
| Distancia_Casa | numeric | 29 | 0 | 1, 8, 2, 3, 24, 23, 27, 16, 15, 26, 19, 21, 5 |
| Educación | numeric | 5 | 0 | 2, 1, 4, 3, 5 |
| Campo_Educación | character | 6 | 0 | Ciencias, Otra, Salud, Mercadeo, Tecnicos, Humanidades |
| Satisfacción_Ambiental | numeric | 4 | 0 | 2, 3, 4, 1 |
| Genero | character | 2 | 0 | F, M |
| Cargo | character | 9 | 0 | Ejecutivo_Ventas, Investigador_Cientifico, Tecnico_Laboratorio, Director_Manofactura, Representante_Salud, Gerente, Representante_Ventas, Director_Investigación, Recursos_Humanos |
| Satisfación_Laboral | numeric | 4 | 0 | 4, 2, 3, 1 |
| Estado_Civil | character | 3 | 0 | Soltero, Casado, Divorciado |
| Ingreso_Mensual | numeric | 1349 | 0 | 5993, 5130, 2090, 2909, 3468, 3068, 2670, 2693, 9526, 5237, 2426, 4193, 2911 |
| Trabajos_Anteriores | numeric | 10 | 0 | 8, 1, 6, 9, 0, 4, 5, 2, 7, 3 |
| Horas_Extra | character | 2 | 0 | Si, No |
| Porcentaje_aumento_salarial | numeric | 15 | 0 | 11, 23, 15, 12, 13, 20, 22, 21, 17, 14, 16, 18, 19 |
| Rendimiento_Laboral | numeric | 2 | 0 | 3, 4 |
| Años_Experiencia | numeric | 40 | 0 | 8, 10, 7, 6, 12, 1, 17, 5, 3, 31, 13, 0, 26 |
| Capacitaciones | numeric | 7 | 0 | 0, 3, 2, 5, 1, 4, 6 |
| Equilibrio_Trabajo_Vida | numeric | 4 | 0 | 1, 3, 2, 4 |
| Antigüedad | numeric | 37 | 0 | 6, 10, 0, 8, 2, 7, 1, 9, 5, 4, 25, 3, 12 |
| Antigüedad_Cargo | numeric | 19 | 0 | 4, 7, 0, 2, 5, 9, 8, 3, 6, 13, 1, 15, 14 |
| Años_ultima_promoción | numeric | 16 | 0 | 0, 1, 3, 2, 7, 4, 8, 6, 5, 15, 9, 13, 12 |
| Años_acargo_con_mismo_jefe | numeric | 18 | 0 | 5, 7, 0, 2, 6, 8, 3, 11, 17, 1, 4, 12, 9 |
Para caracterizar la distribución de las variables numéricas de interés, a continuación se presentan estadísticas descriptivas (mínimo, cuartiles, mediana, media y máximo), así como el conteo de faltantes (NA). Esta tabla nos permite detectar valores atípicos potenciales, rangos inusuales y la magnitud de datos faltantes, insumos necesarios para definir estrategias de limpieza y preparación del modelado.
| Edad | Distancia_Casa | Ingreso_Mensual | Trabajos_Anteriores | Porcentaje_aumento_salarial | Años_Experiencia | Capacitaciones | Antigüedad | Antigüedad_Cargo | |
|---|---|---|---|---|---|---|---|---|---|
| X | Min. :18.00 | Min. : 1.000 | Min. : 1009 | Min. :0.000 | Min. :11.00 | Min. : 0.00 | Min. :0.000 | Min. : 0.000 | Min. : 0.000 |
| X.1 | 1st Qu.:30.00 | 1st Qu.: 2.000 | 1st Qu.: 2911 | 1st Qu.:1.000 | 1st Qu.:12.00 | 1st Qu.: 6.00 | 1st Qu.:2.000 | 1st Qu.: 3.000 | 1st Qu.: 2.000 |
| X.2 | Median :36.00 | Median : 7.000 | Median : 4919 | Median :2.000 | Median :14.00 | Median :10.00 | Median :3.000 | Median : 5.000 | Median : 3.000 |
| X.3 | Mean :36.92 | Mean : 9.193 | Mean : 6503 | Mean :2.693 | Mean :15.21 | Mean :11.28 | Mean :2.799 | Mean : 7.008 | Mean : 4.229 |
| X.4 | 3rd Qu.:43.00 | 3rd Qu.:14.000 | 3rd Qu.: 8379 | 3rd Qu.:4.000 | 3rd Qu.:18.00 | 3rd Qu.:15.00 | 3rd Qu.:3.000 | 3rd Qu.: 9.000 | 3rd Qu.: 7.000 |
| X.5 | Max. :60.00 | Max. :29.000 | Max. :19999 | Max. :9.000 | Max. :25.00 | Max. :40.00 | Max. :6.000 | Max. :40.000 | Max. :18.000 |
| Años_ultima_promoción | Años_acargo_con_mismo_jefe | Años_ultima_promoción | Años_acargo_con_mismo_jefe | |
|---|---|---|---|---|
| X | Min. : 0.000 | Min. : 0.000 | Min. : 0.000 | Min. : 0.000 |
| X.1 | 1st Qu.: 0.000 | 1st Qu.: 2.000 | 1st Qu.: 0.000 | 1st Qu.: 2.000 |
| X.2 | Median : 1.000 | Median : 3.000 | Median : 1.000 | Median : 3.000 |
| X.3 | Mean : 2.188 | Mean : 4.123 | Mean : 2.188 | Mean : 4.123 |
| X.4 | 3rd Qu.: 3.000 | 3rd Qu.: 7.000 | 3rd Qu.: 3.000 | 3rd Qu.: 7.000 |
| X.5 | Max. :15.000 | Max. :17.000 | Max. :15.000 | Max. :17.000 |
Basandonos en la experiencia de ejercicios anteriores, podemos plantear las siguientes hipotesis:
Hipótesis H1 (Antigüedad):
Se espera que la antigüedad en el cargo se relacione de igual manera con la rotacion debido a que si una persona lleva varios años en un mismo cargo puede deberse en gran medida a que se encuentra conforme con sus condiciones laborales actuales. Con esto se esperaria que a mayor antigüedad en el cargo, menor probabilidad de rotar.
Hipótesis H2 (ingreso_mensual):
Se plantea que a mayor ingreso mensual, menor será la probabilidad de rotación. Esta hipótesis se sustenta en la teoría del costo de oportunidad: cuando los empleados reciben una remuneración competitiva, perciben que abandonar el cargo representa una pérdida significativa en términos económicos, lo cual funciona como un incentivo para permanecer en la organización. Por el contrario, cuando los salarios son bajos o percibidos como poco equitativos frente al esfuerzo invertido, los trabajadores tienen una mayor motivación para explorar oportunidades en otros cargos que ofrezcan mejores ingresos. Así, el ingreso mensual opera como una variable que refleja no solo la retribución económica, sino también la percepción de valoración y reconocimiento por parte de la empresa.
Hipótesis H3 (edad):
Se espera que la edad influya significativamente en la probabilidad de rotación, aunque su efecto puede variar según la etapa del ciclo laboral. Los empleados más jóvenes suelen estar en una fase de exploración profesional, buscan oportunidades de crecimiento, mejoras salariales o condiciones más flexibles, lo que aumenta su propensión a cambiar de empleo o cargo. En cambio, los empleados de mayor edad tienden a mostrar mayor estabilidad laboral, debido a factores como el apego al puesto, la acumulación de beneficios organizacionales (antigüedad, pensiones, experiencia reconocida), así como una menor disposición a asumir riesgos asociados a un cambio.
Una vez plateadas las hipotesis con las variables cuantitativas, procedemos a analizar las variables cualitativas como se muestra en la figura 4.
| skim_variable | n_missing | complete_rate | min | max | empty | n_unique | whitespace |
|---|---|---|---|---|---|---|---|
| Rotación | 0 | 1 | 2 | 2 | 0 | 2 | 0 |
| Viaje de Negocios | 0 | 1 | 8 | 14 | 0 | 3 | 0 |
| Departamento | 0 | 1 | 2 | 6 | 0 | 3 | 0 |
| Genero | 0 | 1 | 1 | 1 | 0 | 2 | 0 |
| Cargo | 0 | 1 | 7 | 23 | 0 | 9 | 0 |
| Estado_Civil | 0 | 1 | 6 | 10 | 0 | 3 | 0 |
| Horas_Extra | 0 | 1 | 2 | 2 | 0 | 2 | 0 |
| skim_variable | n_missing | complete_rate | ordered | n_unique | top_counts |
|---|---|---|---|---|---|
| Educación | 0 | 1 | FALSE | 5 | 3: 572, 4: 398, 2: 282, 1: 170 |
| Campo_Educación | 0 | 1 | FALSE | 6 | Cie: 606, Sal: 464, Mer: 159, Tec: 132 |
| Satisfacción_Ambiental | 0 | 1 | FALSE | 4 | 3: 453, 4: 446, 2: 287, 1: 284 |
| Satisfación_Laboral | 0 | 1 | FALSE | 4 | 4: 459, 3: 442, 1: 289, 2: 280 |
| Rendimiento_Laboral | 0 | 1 | FALSE | 2 | 3: 1244, 4: 226 |
| Equilibrio_Trabajo_Vida | 0 | 1 | FALSE | 4 | 3: 893, 2: 344, 4: 153, 1: 80 |
En este caso se tienen las siguientes hipotesis:
Hipótesis H4 (satisfacción_laboral):
La satisfacción laboral influye en la probabilidad de rotación de cargos. Dado que en este estudio la satisfacción se mide a través de una escala reducida de 1 a 4 (p. ej., muy satisfecho, satisfecho, poco satisfecho, nada satisfecho), se considerará como una variable categórica ordinal. Se espera que los empleados que reportan niveles bajos de satisfacción presenten una mayor probabilidad de rotar, mientras que aquellos con niveles altos tienden a permanecer en la organización. La lógica de esta hipótesis se apoya en que la satisfacción refleja directamente el compromiso y la percepción de bienestar, factores que moderan la intención de abandonar un cargo.
Hipótesis H5 (horas_extra):
El número de horas extra trabajadas influye significativamente en la probabilidad de rotación de empleados, debido al desgaste laboral y a un menor equilibrio entre la vida personal y el trabajo.
Hipótesis H6 (estado_civil):
El estado civil influye en la probabilidad de rotación laboral. Se plantea que las personas solteras tienden a mostrar una mayor disposición a cambiar de cargo, debido a que poseen mayor movilidad geográfica y menor dependencia de estabilidad económica para mantener un núcleo familiar. Por el contrario, los empleados casados o con responsabilidades familiares suelen priorizar la estabilidad laboral, ya que los riesgos asociados a un cambio de cargo pueden implicar incertidumbre financiera y desequilibrios en la dinámica familiar. Por ello, se espera que el estado civil opere como un factor que modera la rotación, reduciendo la movilidad de quienes tienen compromisos conyugales o hijos dependientes.
Iniciamos realizando el analisis de las variables categoricas usando histogramas como se muestra en la Grafica 1.
A través de las siguientes gráficas se identifican patrones de concentración, posibles desequilibrios en las categorías y primeras indicios de qué factores podrían influir en la rotación laboral. Se observa que la mayoría de los empleados se concentran en niveles intermedios de educación, presentan un rendimiento laboral homogéneo y en su mayoría reportan niveles medios de satisfacción ambiental y equilibrio trabajo–vida.
La mayoría de empleados no realiza horas extra y el nivel de satisfacción laboral tiende a concentrarse en valores medios-altos. Sin embargo, ya desde esta primera exploración se nota un desbalance importante en la variable de rotación, donde predominan los casos de empleados que permanecen en la organización frente a los que rotan. Este hallazgo será clave para el tratamiento de los datos en los modelos posteriores. Finalizando por indicar que la mayoría de empleados tambien pertenece al departamento de Investigación y Desarrollo, predominan los hombres frente a las mujeres y los cargos más comunes son gerencias y funciones asociadas a ventas e investigación.
Al analizar las variables numéricas, se observa que la mayoría presenta distribuciones asimétricas hacia la derecha, es decir, existe una mayor concentración de empleados en los valores bajos y pocos casos en los valores altos.
En la grafica anterior, se aprecia, por ejemplo, en las variables de antigüedad, años de experiencia, años desde la última promoción y número de trabajos anteriores, donde predominan los empleados con trayectorias cortas o moderadas dentro de la organización.
En cuanto a la variable edad, la distribución es más balanceada, concentrándose principalmente en el rango de 30 a 40 años, lo que refleja que los recursos laborales se encuentra en una etapa muy joven. Por su parte, el ingreso mensual muestra una fuerte dispersión con presencia de valores atípicos hacia los salarios más altos, aspecto que puede tener incidencia en el análisis posterior de equidad y satisfacción laboral.
Otras variables como distancia al hogar o capacitaciones revelan distribuciones más ajustadas, lo que sugiere diferencias en las condiciones de los empleados según factores externos y oportunidades de formación.
La exploración bivariada permite identificar relaciones lineales y posibles dependencias entre las variables numéricas. En la Gráfica 3 se presentan las correlaciones y diagramas de dispersión, lo cual facilita observar tendencias conjuntas en los datos.
CONTEO_GRAFICAS <- CONTEO_GRAFICAS + 1
# Cargar librerías
library(GGally)
library(ggplot2)
library(dplyr)
num_vars_df <- rotacion %>%
select(num_vars) %>%
as.data.frame()
GGally::ggpairs(num_vars_df,
lower = list(continuous = wrap("points", alpha = 0.5, size = 1)),
diag = list(continuous = wrap("barDiag", bins = 20, fill = "gray70")),
upper = list(continuous = wrap("cor", size = 4))) +
theme_minimal() +
labs(title = paste0("Grafica ",CONTEO_GRAFICAS,". Relación entre variables numéricas del dataset rotacion")) +
theme(
axis.text.x = element_text(angle = 45, hjust = 1),
legend.position = "none",
plot.title = element_text(
size = 9, # tamaño parecido al de skimr
face = "bold", # negrita
colour = "#777789", # gris oscuro (como texto de skimr)
hjust = 0 # alineado a la izquierda
)
)
Tomando en referencia lo visto en la grafica anterior, existe una fuerte correlación positiva entre años de experiencia y antigüedad (r ≈ 0.76), así como entre antigüedad en el cargo y antigüedad total (r ≈ 0.71). Esto refleja que, de manera natural, los empleados con mayor tiempo en la empresa también acumulan más experiencia y estabilidad en un mismo puesto.
Asimismo, se observa una relación moderada entre el ingreso mensual y la experiencia/antigüedad (r entre 0.51 y 0.54), lo cual sugiere que el sistema salarial responde parcialmente al tiempo de experiencia laboral.Otro aspecto relevante es la edad, que guarda correlaciones positivas con la antigüedad y la experiencia (r entre 0.20 y 0.31), confirmando la consistencia interna de los datos.
Por otro lado, fue bueno no tener en cuenta variables como distancia al hogar o capacitaciones, ya que no muestran correlaciones significativas con la mayoría de las demás, indicando que son factores más independientes y que podrían jugar un papel diferente en la predicción de la rotación.
La Gráfica 4 resume de forma visual las correlaciones entre tres variables clave: edad, antigüedad e ingreso mensual. Estas variables fueron seleccionadas por su relevancia en la trayectoria de los empleados y su posible impacto en la rotación.
Los resultados muestran correlaciones moderadas y positivas: la edad se relaciona con la antigüedad (r = 0.31) y con el ingreso mensual (r = 0.50), mientras que la antigüedad también presenta asociación con el ingreso (r = 0.51). Esto sugiere que, a medida que los empleados tienen mas experiencia laboral y acumulan tiempo en la empresa, tienden a recibir mejoras en sus ingresos.
La Gráfica 5 presenta la relación entre la rotación y distintas variables categóricas, lo que permite identificar patrones diferenciales entre quienes permanecen en la organización y quienes deciden rotar. Con estos resultados esperamos tener una guia de que la selección de variables para el modelo predictivo, tuvo una priorizacion correcta en aquellas ligadas al entorno laboral de cada empleado.
Algunas observaciones puntuales encontradas de la grafica anterior:
En la gráfica a continuacion (Grafica 6) se analizan de manera conjunta las variables categóricas seleccionadas (horas extra, satisfacción laboral y estado civil) con el fin de identificar si existen patrones o relaciones entre ellas. Esta comparación permite observar cómo factores personales y laborales se combinan y podrían influir en la experiencia del empleado dentro de la organización.
De esta comparacion, podemos tomar en cuenta los siguientes supuestos:
Pasando a la Gráfica 7, nos permite analizar cómo cambian variables numéricas como la edad, el ingreso mensual y la antigüedad según diferentes categorías (horas extra, satisfacción laboral, estado civil y rotación). Este tipo de visualización es útil ya que nos ayuda a detectar diferencias en medianas, dispersión y la presencia de valores atípicos entre los grupos.
Observaciones principales:
Como finalidad del grafico anterior, es bueno indicar que se muestran con alta coherencia las condiciones económicas y la experiencia laboral de los empleados (ingresos, antigüedad) y tienden a ser más bajas entre los empleados que rotan, lo que respalda la hipótesis de que la permanencia a la compañia está vinculada a la carrera profesional dentro de la compañia que tenga cada empleado.
# separación de muestras
ntrain <- nrow(rotacion)*0.6
ntest <- nrow(rotacion)*0.4
set.seed(123)
index_train<-sample(1:nrow(rotacion),size = ntrain)
train<-rotacion[index_train,] # muestra de entrenamiento
test<-rotacion[-index_train,] # muestra de prueba
Previo a la construcción del modelo, se verificó la existencia de registros duplicados en los conjuntos train y test. Este procedimiento es esencial, ya que la presencia de observaciones repetidas puede generar un sesgo hacia ciertos patrones, inflando artificialmente la importancia de algunos predictores y reduciendo la capacidad de generalización del modelo. En un contexto académico, revisar duplicados se interpreta como un control de calidad inicial que garantiza la independencia de los datos utilizados en el entrenamiento y la validación.
CONTEO_TABLAS <- CONTEO_TABLAS + 1
# Revisar duplicados en train y test
dup_train <- sum(duplicated(train))
dup_test <- sum(duplicated(test))
# Crear tabla
tabla_duplicados <- data.frame(
Conjunto = c("Train", "Test"),
Duplicados = c(dup_train, dup_test)
)
# Mostrar con kable
kable(tabla_duplicados, caption = paste0("Tabla ",CONTEO_TABLAS,". Número de duplicados en cada conjunto"))
| Conjunto | Duplicados |
|---|---|
| Train | 0 |
| Test | 0 |
El resultado fue positivo: no se detectaron registros duplicados en ninguno de los conjuntos. Esto significa que cada observación utilizada en la estimación corresponde a un caso único, lo que refuerza la validez del análisis. Con este hallazgo, se asegura que los coeficientes calculados provienen de relaciones genuinas y no de repeticiones que podrían sesgar las conclusione
# Seleccionamos solo variables numéricas
num_vars <- train %>% select("Edad","Distancia_Casa","Ingreso_Mensual","Trabajos_Anteriores",
"Porcentaje_aumento_salarial","Años_Experiencia",
"Capacitaciones","Antigüedad","Antigüedad_Cargo","Años_ultima_promoción","Años_acargo_con_mismo_jefe")
# Función para contar outliers con IQR
outlier_count <- function(x) {
Q1 <- quantile(x, 0.25, na.rm = TRUE)
Q3 <- quantile(x, 0.75, na.rm = TRUE)
IQR <- Q3 - Q1
lower <- Q1 - 1.5 * IQR
upper <- Q3 + 1.5 * IQR
sum(x < lower | x > upper, na.rm = TRUE)
}
# Conteo de outliers por variable numérica
outliers_train <- sapply(num_vars, outlier_count)
#outliers_train
Se analizaron las variables numéricas del conjunto train para identificar valores atípicos. Este paso es crucial porque los outliers, aunque forman parte de la realidad laboral, pueden influir desproporcionadamente en la estimación de los parámetros del modelo. En este caso, se encontró que las variables con mayores proporciones de outliers fueron Capacitaciones (16.67%) y Años_última_promoción (7.60%), seguidas por Antigüedad (6.01%), Ingreso_Mensual (5.78%) y Años_Experiencia (3.74%). Estos porcentajes reflejan la existencia de trayectorias laborales particulares, como empleados con un número inusualmente alto de capacitaciones o con largos períodos sin promoción.
CONTEO_TABLAS <- CONTEO_TABLAS + 1
outliers_df <- data.frame(
Variable = names(outliers_train),
Outliers = outliers_train,
Porcentaje = round((outliers_train / nrow(train)) * 100, 2),
stringsAsFactors = FALSE,
row.names = NULL
)
knitr::kable(outliers_df, caption = paste0("Tabla ",CONTEO_TABLAS,". Resumen de outliers en variables numéricas (muestra train)"))
| Variable | Outliers | Porcentaje |
|---|---|---|
| Edad | 0 | 0.00 |
| Distancia_Casa | 0 | 0.00 |
| Ingreso_Mensual | 51 | 5.78 |
| Trabajos_Anteriores | 30 | 3.40 |
| Porcentaje_aumento_salarial | 0 | 0.00 |
| Años_Experiencia | 33 | 3.74 |
| Capacitaciones | 147 | 16.67 |
| Antigüedad | 53 | 6.01 |
| Antigüedad_Cargo | 13 | 1.47 |
| Años_ultima_promoción | 67 | 7.60 |
| Años_acargo_con_mismo_jefe | 10 | 1.13 |
La decisión de mantener estos valores en el análisis es coherente, ya que representan perfiles reales dentro de la organización. Lejos de ser considerados errores, estos casos enriquecen el modelo al capturar la heterogeneidad del personal. Por ejemplo, empleados con muchas capacitaciones o con trayectorias largas sin promoción aportan señales importantes sobre factores que podrían predisponer a la rotación. El modelo, por tanto, no solo se ajusta a la “tendencia general”, sino que también aprende de estos extremos, lo que permite generar conclusiones más realistas y aplicables a escenarios diversos.
Una vez depurada la base de datos, se redujo el tamaño de los conjuntos: train pasó de 882 a 799 registros y test de 588 a 557. Este tipo de reducción es esperable en análisis de calidad de datos, donde se privilegia la coherencia y consistencia de la información sobre el volumen bruto de observaciones. Documentar la cantidad inicial y final permite evidenciar el impacto de la limpieza en el tamaño de la muestra y justificar la solidez del modelo ajustado.
CONTEO_TABLAS <- CONTEO_TABLAS + 1
num_vars_outliers <- c("Ingreso_Mensual","Antigüedad")
get_iqr_limits <- function(x) {
Q1 <- quantile(x, 0.25, na.rm = TRUE)
Q3 <- quantile(x, 0.75, na.rm = TRUE)
IQR_value <- Q3 - Q1
lower <- Q1 - 1.5 * IQR_value
upper <- Q3 + 1.5 * IQR_value
return(c(lower, upper))
}
# --- 2. Calcular límites con train ---
limits <- lapply(train[num_vars_outliers], get_iqr_limits)
# --- 3. Función para filtrar usando los límites calculados ---
remove_outliers_with_limits <- function(df, limits) {
for (col in names(limits)) {
lower <- limits[[col]][1]
upper <- limits[[col]][2]
df <- df %>% filter(.data[[col]] >= lower & .data[[col]] <= upper)
}
return(df)
}
# --- 4. Limpiar train y test usando los límites de train ---
train_clean <- remove_outliers_with_limits(train, limits)
test_clean <- remove_outliers_with_limits(test, limits)
tabla_tamanos <- data.frame(
Conjunto = c("Train", "Test"),
Original = c(nrow(train), nrow(test)),
Limpio = c(nrow(train_clean), nrow(test_clean))
)
# Mostrar con kable
kable(tabla_tamanos, caption = paste0("Tabla ",CONTEO_TABLAS,". Comparación de tamaños entre conjuntos original y limpio"))
| Conjunto | Original | Limpio |
|---|---|---|
| Train | 882 | 799 |
| Test | 588 | 557 |
El resultado de la depuración fue una reducción moderada que no compromete la representatividad. El conjunto resultante sigue teniendo suficiente volumen para entrenar y validar el modelo con un número adecuado de variables explicativas. De esta manera, se asegura un equilibrio entre calidad y cantidad de datos, lo cual es un criterio metodológico indispensable en el análisis aplicado a contextos organizacionales.
num_vars_norm <- c("Edad", "Ingreso_Mensual", "Antigüedad")
# Calcular media y desviación estándar en TRAIN
train_means <- sapply(train_clean[, num_vars_norm], mean, na.rm = TRUE)
train_sds <- sapply(train_clean[, num_vars_norm], sd, na.rm = TRUE)
# Función de normalización
normalize <- function(df, means, sds) {
df[, num_vars_norm] <- scale(df[, num_vars_norm], center = means, scale = sds)
return(df)
}
# Aplicar a train y test usando SOLO parámetros del train
train_norm <- normalize(train_clean, train_means, train_sds)
test_norm <- normalize(test_clean, train_means, train_sds)
La variable objetivo (rotación) presentó un desbalance natural: la mayoría de los empleados permanecen en la organización frente a quienes rotan. De no corregirse, este desequilibrio haría que el modelo favoreciera las predicciones de la clase mayoritaria, reduciendo su capacidad de identificar los casos de rotación. Para mitigar este problema, se aplicó un proceso de undersampling, equilibrando las proporciones de “Sí” y “No” en la base de entrenamiento.
library(ROSE)
CONTEO_TABLAS <- CONTEO_TABLAS + 1
# Balanceo por undersampling
set.seed(123)
names(train_norm) <- make.names(names(train_norm))
names(test_norm) <- make.names(names(test_norm))
train_balanced <- ovun.sample(`Rotación` ~ .,
data = train_norm,
method = "under")$data
tabla_antes <- table(train_clean$Rotación)
tabla_despues <- table(train_balanced$Rotación)
# Convertir en data.frame
resumen_balanceo <- data.frame(
Clase = names(tabla_antes),
Antes = as.numeric(tabla_antes),
Después = as.numeric(tabla_despues),
Proporción_Después = round(prop.table(tabla_despues), 3)
)
# Mostrar tabla en RMarkdown
kable(
resumen_balanceo,
caption = paste0("Tabla ",CONTEO_TABLAS,". Resumen de balanceo de clases (antes y después de undersampling)"),
align = "c"
)
| Clase | Antes | Después | Proporción_Después.Var1 | Proporción_Después.Freq |
|---|---|---|---|---|
| No | 667 | 130 | No | 0.496 |
| Si | 132 | 132 | Si | 0.504 |
El resultado fue un conjunto balanceado con proporciones cercanas a 50/50, lo cual permite que el modelo aprenda de manera equitativa los patrones de ambas clases. Esta decisión es clave porque, en un contexto empresarial, interesa más anticipar correctamente quiénes podrían rotar que simplemente acertar en la predicción de permanencia. Así, el balanceo no solo mejora la sensibilidad del modelo hacia la clase minoritaria, sino que también lo convierte en una herramienta práctica para apoyar decisiones de gestión del talento.
Los resultados confirman relaciones coherentes con lo planteado en las hipótesis:
Horas_Extra (p<0.001): trabajar horas extra casi multiplica por cinco la probabilidad de rotación, mostrando que la carga laboral es un factor crítico.
Estado_Civil=Soltero (p=0.012): los empleados solteros presentan más del doble de probabilidad de rotar frente a los casados, lo que refleja cómo la situación personal influye en la estabilidad.
Satisfacción_Laboral=4 (p=0.018): los empleados con máxima satisfacción tienen un 62% menos de probabilidad de rotar respecto a quienes reportan la satisfacción más baja.
Edad (p=0.006): a mayor edad, disminuye la propensión a cambiar de cargo, lo que concuerda con la teoría de la estabilidad en etapas avanzadas de la vida laboral.
Antigüedad (p≈0.055): aunque con significancia marginal, se observa un efecto protector, indicando que quienes llevan más tiempo en la empresa tienden a permanecer.
Ingreso_Mensual: no mostró un efecto significativo, lo que sugiere que el salario por sí solo no explica la decisión de rotar cuando se consideran otros factores laborales y personales.
Este conjunto de resultados aporta evidencia sólida de que la rotación está fuertemente asociada con aspectos de carga laboral, satisfacción y características personales, más que con variables puramente económicas.
train_clean_dummy <- train_balanced %>%
mutate(
Rotación = ifelse(Rotación == "Si", 1, 0),
Horas_Extra = ifelse(Horas_Extra == "Si", 1, 0),
Estado_Civil = factor(Estado_Civil),
)
# Crear dummies automáticas
train_clean_dummy <- model.matrix(~ Horas_Extra + Estado_Civil + Satisfación_Laboral +
Edad + Ingreso_Mensual + Antigüedad + Rotación,
data = train_balanced)[, -1] %>%
as.data.frame()
train_clean_dummy <- train_clean_dummy %>%
rename(
Rotación = RotaciónSi,
Horas_Extra = Horas_ExtraSi
)
CONTEO_TABLAS <- CONTEO_TABLAS + 1
modelo_rotacion <- glm(Rotación ~ Horas_Extra + Estado_CivilDivorciado + Estado_CivilSoltero + Satisfación_Laboral2 + Satisfación_Laboral3 + Satisfación_Laboral4 +
Edad + Ingreso_Mensual + Antigüedad, data = train_clean_dummy, family = binomial)
# Extraer coeficientes en data.frame
resumen <- coef(summary(modelo_rotacion)) %>%
as.data.frame() %>%
tibble::rownames_to_column("Variable")
# Redondear valores (opcional)
resumen <- resumen %>%
mutate(across(where(is.numeric), ~ round(., 3)))
# Mostrar con kable
kable(resumen, caption = paste0("Tabla ",CONTEO_TABLAS,". Resumen de coeficientes del modelo logit binomial"))
| Variable | Estimate | Std. Error | z value | Pr(>|z|) |
|---|---|---|---|---|
| (Intercept) | -0.468 | 0.350 | -1.338 | 0.181 |
| Horas_Extra | 1.591 | 0.320 | 4.966 | 0.000 |
| Estado_CivilDivorciado | -0.287 | 0.416 | -0.690 | 0.490 |
| Estado_CivilSoltero | 0.800 | 0.320 | 2.500 | 0.012 |
| Satisfación_Laboral2 | -0.619 | 0.447 | -1.385 | 0.166 |
| Satisfación_Laboral3 | -0.433 | 0.395 | -1.095 | 0.274 |
| Satisfación_Laboral4 | -0.958 | 0.406 | -2.360 | 0.018 |
| Edad | -0.471 | 0.172 | -2.740 | 0.006 |
| Ingreso_Mensual | -0.275 | 0.223 | -1.231 | 0.218 |
| Antigüedad | -0.354 | 0.185 | -1.915 | 0.055 |
Horas_Extra (β = 1.591, p < 0.001): Trabajar horas extra aumenta fuertemente la probabilidad de rotación. En términos de odds ratio: exp(1.591) ≈ 4.91 → quienes hacen horas extra tienen casi 5 veces más probabilidad de rotar.
Estado_CivilSoltero (β = 0.800, p = 0.012): Ser soltero se asocia positivamente con la rotación. Odds ratio: exp(0.800) ≈ 2.23 → los solteros tienen más del doble de probabilidad de rotar en comparación con los casados.
Estado_CivilDivorciado (β = -0.287, p = 0.491): No hay evidencia estadística suficiente para afirmar un efecto sobre la rotación. Odds ratio: exp(-0.287) ≈ 0.75, pero no significativo.
Satisfacción_Laboral2 (β = -0.619, p = 0.166): No significativo. Odds ratio: exp(-0.619) ≈ 0.54, lo que sugeriría menor rotación en comparación con el nivel 1, pero sin evidencia sólida.
Satisfacción_Laboral3 (β = -0.433, p = 0.274): No significativo. Odds ratio: exp(-0.433) ≈ 0.65. No se puede concluir que difiera del nivel 1.
Satisfacción_Laboral4 (β = -0.958, p = 0.018): Mayor satisfacción laboral se asocia con menor rotación. Odds ratio: exp(-0.958) ≈ 0.38 → empleados con nivel 4 de satisfacción tienen un 62% menos probabilidad de rotar frente al nivel 1.
Edad (β = -0.471, p = 0.006): La edad reduce la probabilidad de rotación. Odds ratio: exp(-0.471) ≈ 0.62 → cada incremento en la escala de edad disminuye en un 38% la probabilidad de rotar.
Ingreso_Mensual (β = -0.275, p = 0.218): No significativo. Odds ratio: exp(-0.275) ≈ 0.76. El ingreso mensual no muestra efecto claro sobre la rotación en este modelo.
Antigüedad (β = -0.354, p = 0.055): Casi significativo. Odds ratio: exp(-0.354) ≈ 0.70 → mayor antigüedad reduce la probabilidad de rotación en un 30%, aunque el efecto es débil.
CONTEO_TABLAS <- CONTEO_TABLAS + 1
modelo_nulo <- glm(Rotación ~ 1, data = train_clean_dummy, family = binomial)
anova_tabla <- anova(modelo_nulo, modelo_rotacion, test = "Chisq")
# Pasar a kable
kable(anova_tabla, caption = paste0("Tabla ",CONTEO_TABLAS,".Comparación entre modelo nulo y modelo de rotación (Test Chi-cuadrado)"))
| Resid. Df | Resid. Dev | Df | Deviance | Pr(>Chi) |
|---|---|---|---|---|
| 261 | 363.1939 | NA | NA | NA |
| 252 | 285.4712 | 9 | 77.72268 | 0 |
El resultado muestra una reducción de la deviance de 363.19 → 285.47, con una diferencia de 77.72 en 9 grados de libertad. El valor-p (4.57e-13) es muchísimo menor que 0.05, por lo que rechazamos la hipótesis nula de que las variables adicionales no aportan información. En consecuencia, concluimos que el modelo con predictores mejora significativamente respecto al modelo nulo y aporta evidencia sólida para explicar la rotación.
test_clean_dummy <- test_norm %>%
mutate(
Rotación = ifelse(Rotación == "Si", 1, 0),
Horas_Extra = ifelse(Horas_Extra == "Si", 1, 0),
Estado_Civil = factor(Estado_Civil),
`Satisfación_Laboral` = factor(`Satisfación_Laboral`,
levels = 1:4,
labels = c("1", "2", "3", "4"))
)
# Crear dummies automáticas
test_clean_dummy <- model.matrix(~ Horas_Extra + Estado_Civil + Satisfación_Laboral +
Edad + Ingreso_Mensual + Antigüedad + Rotación,
data = test_norm)[, -1] %>%
as.data.frame()
test_clean_dummy <- test_clean_dummy %>%
rename(
Rotación = RotaciónSi,
Horas_Extra = Horas_ExtraSi
)
Se utilizó la curva ROC y el área bajo la curva (AUC) para medir la capacidad discriminativa del modelo sin depender de un umbral específico de clasificación. Esta métrica resume qué tan bien el modelo diferencia entre empleados que rotan y quienes permanecen.
suppressPackageStartupMessages(library(pROC))
library(dplyr)
library(ggplot2)
CONTEO_TABLAS <- CONTEO_TABLAS + 1
# 1. Predecir probabilidades en TEST
prob_test <- predict(modelo_rotacion, newdata = test_clean_dummy, type = "response")
resultados_test <- data.frame(
test_clean_dummy,
Prob_Rotacion = prob_test
)
# 2. Calcular curva ROC
roc_obj <- roc(test_clean_dummy$Rotación, prob_test)
# 3. Mostrar AUC
auc_val <- auc(roc_obj, levels =c(0,1), direction = "<")
df_auc <- data.frame(Métrica = "AUC", Valor = round(as.numeric(auc_val), 3))
kable(df_auc, caption = paste0("Tabla ",CONTEO_TABLAS,".Área bajo la curva (AUC)"))
| Métrica | Valor |
|---|---|
| AUC | 0.763 |
CONTEO_GRAFICAS <- CONTEO_GRAFICAS + 1
# 4. Graficar curva ROC con AUC en el título
plot(roc_obj,
col = "#2C3E50", lwd = 2,
main = paste0("Gráfica ", CONTEO_GRAFICAS,
". Curva ROC - Modelo Rotación (AUC = ", round(auc_val, 3), ")"),
cex.main = 0.7, # tamaño del título (ajustar si lo quieres un poco más grande/pequeño)
font.main = 2, # 2 = bold
col.main = "gray40" # color gris
)
abline(a = 0, b = 1, lty = 2, col = "gray")
# 5. Tabla con métricas por umbral
roc_df <- coords(roc_obj, x = "all",
ret = c("threshold", "sensitivity", "specificity"),
transpose = FALSE) %>%
as.data.frame()
CONTEO_TABLAS <- CONTEO_TABLAS + 1
kable(head(roc_df), caption = paste0("Tabla ",CONTEO_TABLAS,".Primeras filas de los resultados ROC"))
| threshold | sensitivity | specificity |
|---|---|---|
| -Inf | 1 | 0.0000000 |
| 0.0272690 | 1 | 0.0021692 |
| 0.0338319 | 1 | 0.0043384 |
| 0.0414659 | 1 | 0.0065076 |
| 0.0441738 | 1 | 0.0086768 |
| 0.0456486 | 1 | 0.0108460 |
El modelo alcanzó un AUC de 0.763, lo cual refleja una buena capacidad de discriminación. En términos prácticos, significa que el modelo puede ordenar correctamente a un empleado que rota por encima de uno que no rota en más de 7 de cada 10 comparaciones al azar. Este nivel de desempeño es consistente con las expectativas de un modelo aplicado a datos de recursos humanos, donde los factores de comportamiento son complejos y no siempre lineales.
Además de la AUC, se calcularon métricas específicas como sensibilidad, especificidad, precisión y F1-score, con el objetivo de evaluar el balance entre aciertos y errores para cada clase. Y para complementar el análisis, se calcularon medidas globales como la exactitud y el estadístico Kappa, que permiten medir el acuerdo más allá del azar.
suppressPackageStartupMessages(library(caret))
library(ggplot2)
library(dplyr)
# 1. Umbral para convertir probabilidades en clases
# (ejemplo: 0.5, pero puedes ajustar según ROC)
pred_class <- ifelse(prob_test >= 0.5, "Si", "No")
# 2. Convertir a factor con mismos niveles que y real
pred_class <- factor(pred_class, levels = c("No", "Si"))
real_class <- factor(ifelse(test_clean_dummy$Rotación == 1, "Si", "No"),
levels = c("No", "Si"))
# 3. Matriz de confusión (tabla + métricas)
cm <- confusionMatrix(pred_class, real_class, positive = "Si")
CONTEO_TABLAS <- CONTEO_TABLAS + 1
# 2. Extraer estadísticas por clase (Sensibilidad, Especificidad, etc.)
por_clase <- as.data.frame(cm$byClass) %>%
tibble::rownames_to_column("Métrica")
kable(por_clase, caption = paste0("Tabla ",CONTEO_TABLAS,".Tabla de estadísticas por clase (Sensibilidad, Especificidad, etc.)"))
| Métrica | cm$byClass |
|---|---|
| Sensitivity | 0.7187500 |
| Specificity | 0.6789588 |
| Pos Pred Value | 0.3179724 |
| Neg Pred Value | 0.9205882 |
| Precision | 0.3179724 |
| Recall | 0.7187500 |
| F1 | 0.4408946 |
| Prevalence | 0.1723519 |
| Detection Rate | 0.1238779 |
| Detection Prevalence | 0.3895871 |
| Balanced Accuracy | 0.6988544 |
CONTEO_TABLAS <- CONTEO_TABLAS + 1
# 3. Extraer métricas globales (Accuracy, Kappa, etc.)
globales <- as.data.frame(t(cm$overall)) %>%
tibble::rownames_to_column("Métrica")
kable(globales, caption = paste0("Tabla ",CONTEO_TABLAS,".Tabla de métricas globales (Accuracy, Kappa, etc.)"))
| Métrica | Accuracy | Kappa | AccuracyLower | AccuracyUpper | AccuracyNull | AccuracyPValue | McnemarPValue |
|---|---|---|---|---|---|---|---|
| 1 | 0.6858169 | 0.265321 | 0.6454587 | 0.7241903 | 0.8276481 | 1 | 0 |
# Pasar matriz a data.frame para ggplot
cm_table <- as.data.frame(cm$table)
CONTEO_GRAFICAS <- CONTEO_GRAFICAS + 1
ggplot(cm_table, aes(x = Reference, y = Prediction, fill = Freq)) +
geom_tile() +
geom_text(aes(label = Freq), color = "white", size = 6) +
scale_fill_gradient(low = "steelblue", high = "darkred") +
labs(title = paste0("Grafica ",CONTEO_GRAFICAS,". Matriz de Confusión - Modelo Rotación"),
x = "Real", y = "Predicho") +
theme_minimal()+
theme(
axis.text.x = element_text(angle = 45, hjust = 1),
legend.position = "none",
plot.title = element_text(
size = 9, # tamaño parecido al de skimr
face = "bold", # negrita
colour = "#777789", # gris oscuro (como texto de skimr)
hjust = 0 # alineado a la izquierda
)
)
El modelo obtuvo una sensibilidad del 71.9% y una especificidad del 67.9%, lo que indica que identifica correctamente a la mayoría de empleados que rotan, aunque también comete un número considerable de falsos positivos (precisión ≈ 32%). El F1-score de 0.44 muestra un equilibrio moderado entre capturar casos positivos y no sobredimensionar los errores. Estos resultados son esperables, ya que el modelo fue entrenado en un conjunto balanceado, priorizando la detección de la rotación incluso a costa de cierta pérdida en precisión.
El modelo presenta una exactitud de 68.6% y un Kappa de 0.265, lo que corresponde a un acuerdo débil-moderado. Aunque estas cifras pueden parecer modestas, deben interpretarse en conjunto con la AUC y las métricas por clase, las cuales demuestran que el modelo tiene capacidad discriminativa y utilidad práctica para orientar estrategias de retención, incluso si no logra una predicción perfecta en todos los casos.
Finalmente, se aplicó el modelo para predecir la probabilidad de rotación en nuevos perfiles, con el fin de ilustrar su uso práctico en escenarios de gestión del talento.
nuevos_datos <- data.frame(
Horas_Extra = c(1, 1,0,1),
Estado_Civil = c("Soltero", "Divorciado","Soltero","Soltero"),
Satisfación_Laboral = c(4, 3,2,3),
Edad = c(36, 18,60,29),
Ingreso_Mensual = c(6503, 4900,8379,2911),
Antigüedad = c(1, 2,9,3)
)
nuevos_datos_dummies <- data.frame(
Horas_Extra = c(1, 1,0,1),
Estado_CivilDivorciado = c(0, 1,0,0),
Estado_CivilSoltero = c(1, 0,1,1),
Satisfación_Laboral2 = c(0, 0,1,0),
Satisfación_Laboral3 = c(0, 1,0,1),
Satisfación_Laboral4 = c(1, 0,0,0),
Edad = c(36, 18,60,29),
Ingreso_Mensual = c(6503, 4900,8379,2911),
Antigüedad = c(1, 2,9,3)
)
nuevos_datos_norm <- nuevos_datos_dummies
nuevos_datos_norm[, num_vars_norm] <- scale(
nuevos_datos[, num_vars_norm],
center = train_means,
scale = train_sds
)
# Predecir probabilidades de rotación
predicciones <- predict(modelo_rotacion, nuevos_datos_norm, type = "response")
# Mostrar resultados en tabla
tabla_pred <- cbind(
nuevos_datos,
Prob_Rotacion = paste0(round(predicciones * 100, 1), " %")
)
CONTEO_TABLAS <- CONTEO_TABLAS + 1
kable(tabla_pred, caption = paste0("Tabla ",CONTEO_TABLAS,". Predicción de rotación para nuevos casos"))
| Horas_Extra | Estado_Civil | Satisfación_Laboral | Edad | Ingreso_Mensual | Antigüedad | Prob_Rotacion |
|---|---|---|---|---|---|---|
| 1 | Soltero | 4 | 36 | 6503 | 1 | 78.7 % |
| 1 | Divorciado | 3 | 18 | 4900 | 2 | 85.2 % |
| 0 | Soltero | 2 | 60 | 8379 | 9 | 12 % |
| 1 | Soltero | 3 | 29 | 2911 | 3 | 91 % |
Los resultados muestran diferencias claras entre perfiles: un empleado joven, soltero, con baja antigüedad y que trabaja horas extra presenta probabilidades de rotación superiores al 90%, mientras que un empleado mayor, con más antigüedad y mayor satisfacción laboral apenas llega al 12%. Estas predicciones ejemplifican la capacidad del modelo para identificar perfiles de riesgo y priorizar acciones preventivas. En un contexto real, esta información puede orientar políticas de clima organizacional, manejo de cargas de trabajo y programas de fidelización de empleados clave.
El modelo de regresión logística desarrollado permitió identificar y cuantificar factores que inciden en la rotación de empleados dentro de la organización. Los resultados obtenidos confirman que la rotación no responde únicamente a variables económicas, como los ingresos, sino que se encuentra más estrechamente vinculada con condiciones laborales, características personales y percepciones de satisfacción. En particular, el análisis demostró que trabajar horas extra, ser soltero, reportar bajos niveles de satisfacción laboral y contar con menor edad son los principales determinantes que incrementan la probabilidad de rotación. En contraste, la antigüedad y la satisfacción laboral alta actúan como factores protectores que disminuyen de manera significativa dicha probabilidad.
El desempeño del modelo alcanzó un AUC de 0.763, lo cual evidencia una adecuada capacidad discriminativa para diferenciar entre empleados que permanecen y aquellos que deciden rotar. Si bien las métricas globales como la exactitud y el Kappa muestran niveles moderados, su interpretación conjunta con la sensibilidad y la especificidad confirma que el modelo cumple el objetivo de detectar con razonable eficacia los perfiles con mayor riesgo de abandono. En términos prácticos, esto significa que la herramienta puede servir de base para anticipar posibles escenarios de rotación y diseñar planes preventivos de retención.
Un hallazgo relevante es que las variables asociadas a la percepción del entorno laboral (satisfacción y equilibrio vida-trabajo, representadas en los resultados por la satisfacción laboral y las horas extra) resultan más influyentes que variables puramente estructurales como la educación o el departamento. Esto pone en evidencia que la gestión del talento humano debe orientarse no solo hacia políticas salariales competitivas, sino también hacia el fortalecimiento del clima organizacional, la distribución adecuada de cargas de trabajo y la generación de oportunidades de desarrollo.
Desde una perspectiva aplicada, los resultados sugieren varias líneas de acción para las organizaciones:
Monitoreo sistemático de horas extra: dado que trabajar más allá de la jornada regular es el predictor más fuerte de rotación, se recomienda implementar mecanismos de control y redistribución de cargas para evitar el desgaste laboral.
Estrategias de fidelización temprana: los empleados jóvenes y con baja antigüedad mostraron mayor propensión a rotar. Diseñar programas de inducción, acompañamiento y desarrollo profesional temprano podría reducir la vulnerabilidad de este grupo.
Fortalecimiento de la satisfacción laboral: los resultados evidencian que altos niveles de satisfacción disminuyen drásticamente la intención de rotar. Por tanto, programas de reconocimiento, bienestar y participación pueden tener un efecto directo sobre la permanencia.
Consideración del estado civil como factor moderador: si bien este hallazgo no debe usarse para discriminar, sí permite reconocer que los empleados solteros tienden a valorar más la movilidad. Esto puede aprovecharse ofreciendo esquemas flexibles de crecimiento, movilidad interna o experiencias que fortalezcan su sentido de pertenencia.
Además de los hallazgos principales, este estudio abre la puerta a líneas de trabajo futuras que podrían enriquecer el modelo de rotación y hacerlo más robusto para su aplicación en escenarios reales.
Explorar interacciones entre variables: el modelo actual considera efectos principales, pero sería valioso evaluar si existen interacciones relevantes, por ejemplo, entre horas extra y satisfacción laboral, o entre edad y antigüedad. Esto permitiría capturar patrones más finos y entender cómo se combinan los factores en la decisión de rotar.
Incorporar variables adicionales de contexto organizacional: factores como movilidad interna, oportunidades de ascenso, evaluaciones de desempeño o percepción de liderazgo podrían fortalecer la capacidad explicativa del modelo. Estos elementos son determinantes en la permanencia de los empleados y ampliarían la perspectiva más allá de las condiciones individuales.
Ampliar el horizonte temporal del análisis: al trabajar con datos históricos de un solo corte, el modelo refleja una fotografía puntual. Extender el análisis a datos longitudinales (series de tiempo de permanencia) permitiría pasar de una predicción puntual de rotación a un modelo de riesgo de salida en el tiempo, lo cual aportaría un componente dinámico al estudio.
Comparación con otros algoritmos de clasificación: aunque la regresión logística es adecuada por su interpretabilidad, explorar modelos como árboles de decisión, random forest o gradient boosting podría mejorar la precisión predictiva. Una comparación controlada permitiría balancear interpretabilidad y capacidad de predicción según el propósito de uso.
Calibración del umbral de decisión: la curva ROC mostró un desempeño global sólido, pero en un contexto práctico convendría ajustar el umbral de probabilidad en función de los costos asociados a falsos positivos y falsos negativos. Por ejemplo, priorizar la detección de empleados en riesgo alto aunque se sacrifiquen algunos aciertos en los que permanecen.
Segmentación de políticas de retención: a partir de los perfiles identificados como más propensos a rotar (jóvenes, con pocas oportunidades de promoción, que trabajan horas extra), sería posible diseñar estrategias diferenciadas de intervención. Esta segmentación optimizaría recursos y permitiría aplicar medidas más precisas en cada grupo.
En conclusión, el modelo logístico desarrollado es un punto de partida sólido que, además de aportar evidencia sobre los determinantes de la rotación, deja abierta la posibilidad de evolucionar hacia enfoques más sofisticados e integrados. Estos avances futuros fortalecerían su aplicabilidad en la gestión estratégica del talento humano y contribuirían a la toma de decisiones basadas en datos dentro de la organización.