La rotación de personal es uno de los desafíos más significativos para las organizaciones, ya que no solo implica costos asociados con la contratación y la capacitación de nuevos empleados, sino que también puede afectar la moral y la productividad dentro de la empresa. Comprender las causas subyacentes de la rotación y poder predecirla de manera efectiva es crucial para implementar estrategias que favorezcan la retención de talento y optimicen el entorno laboral.
Este análisis tiene como objetivo explorar los factores que influyen en la rotación de personal a partir de un conjunto de datos detallado que contiene información sobre características tanto demográficas como laborales de los empleados.
Se carga el conjunto de datos “rotacion”. Se verifica la dimensión del dataset (1470 filas y 24 columnas).
data("rotacion")
colnames(rotacion)<-c("Rotacion",colnames(rotacion[2:ncol(rotacion)]))
dim(rotacion)
## [1] 1470 24
Se escogen 3 variables categóricas y 3 cuantitativas para el análisis.
Variables categóricas:
Viaje de negocios
Estado civil
Horas Extra
Variables cuantitativas:
Antigüedad del cargo
Ingresos mensuales
Edad
variables_categoricas <- c("Rotacion","Viaje de Negocios", "Estado_Civil", "Horas_Extra")
variables_cuantitativas <- c("Antigüedad_Cargo", "Ingreso_Mensual", "Edad")
rotacion<-rotacion[,c(variables_categoricas,variables_cuantitativas)]
# Gráficos para variables categóricas
p1= ggplot(rotacion, aes(x = Rotacion)) + geom_bar(fill = "lightblue") + ggtitle("Rotación")
p2= ggplot(rotacion, aes(x = `Viaje de Negocios`)) + geom_bar(fill = "lightblue") + ggtitle("Viaje de Negocios")
p3= ggplot(rotacion, aes(x = Estado_Civil)) + geom_bar(fill = "lightblue") + ggtitle("Estado Civil")
p4= ggplot(rotacion, aes(x = Horas_Extra)) + geom_bar(fill = "lightblue") + ggtitle("Horas_Extra")
grid.arrange(p1, p2, p3, p4, ncol = 2)
Figura 1: Variables categóricas
Las gráficas de barras muestran la distribución de la rotación, el viaje de negocios, el estado civil y las horas extra. Se observa que la mayoría de los empleados no han rotado, que la mayoría viajan raramente por negocios, y que el estado civil más común es casado. Además, hay una diferencia significativa en la cantidad de empleados que hacen horas extra respecto a los que no.
# Gráficos para variables cuantitativas
p1=ggplot(rotacion, aes(x = Antigüedad_Cargo)) + geom_histogram(bins = 20,fill = "lightblue") + ggtitle("Antigüedad en el Cargo") + xlab("Antigüedad (Años)")
p2=ggplot(rotacion, aes(x = Ingreso_Mensual)) + geom_histogram(bins = 20,fill = "lightblue") + ggtitle("Ingreso Mensual")+ xlab("Ingresos ($)")
p3=ggplot(rotacion, aes(x = Edad)) + geom_histogram(bins = 20,fill = "lightblue") + ggtitle("Edad") + xlab("Edad (Años)")
grid.arrange(p1, p2, p3 , ncol = 3)
Figura 2: Variables cuantitativas
En cuanto a las variables cuantitativas, los histogramas indican que la antigüedad en el cargo se concentra en valores bajos, los ingresos mensuales presentan una distribución sesgada a la derecha, y la edad sigue una distribución aproximadamente normal con mayor frecuencia en los 30-40 años.
# Relación entre variables y rotación
ggplot(rotacion, aes(x = `Viaje de Negocios`, fill = Rotacion)) + geom_bar(position = "fill") + ggtitle("Viaje de Negocios vs Rotación")+ scale_y_continuous(labels = scales::percent) +
ylab("Porcentaje")
Figura 3: Viaje de Negocios vs Rotación
ggplot(rotacion, aes(x = Estado_Civil, fill = Rotacion)) + geom_bar(position = "fill") + ggtitle("Estado Civil vs Rotación")+ scale_y_continuous(labels = scales::percent) +
ylab("Porcentaje")
Figura 4: Estado Civil vs Rotación
ggplot(rotacion, aes(x = Horas_Extra, fill = Rotacion)) + geom_bar(position = "fill") + ggtitle("Horas Extra vs Rotación")+ scale_y_continuous(labels = scales::percent) +
ylab("Porcentaje")
Figura 5: Horas Extra vs Rotación
Los gráficos de barras apiladas muestran que la rotación es más alta entre empleados que viajan frecuentemente por negocios, empleados solteros y entre aquellos que hacen horas extra.
ggplot(rotacion, aes(x = Rotacion, y = Antigüedad_Cargo)) + geom_boxplot(fill = "lightblue") + ggtitle("Antigüedad en el Cargo vs Rotación")
Figura 6: Antigüedad en el Cargo vs Rotación
ggplot(rotacion, aes(x = Rotacion, y = Ingreso_Mensual)) + geom_boxplot(fill = "lightblue") + ggtitle("Ingreso Mensual vs Rotación")
Figura 7: Ingreso Mensual vs Rotación
ggplot(rotacion, aes(x = Rotacion, y = Edad)) + geom_boxplot(fill = "lightblue") + ggtitle("Edad vs Rotación")
Figura 8: Edad vs Rotación
Los diagramas de caja indican que los empleados que han rotado tienden a tener menor antigüedad en el cargo, menores ingresos y ser más jóvenes en comparación con aquellos que no han rotado.
Se convierte la variable de rotación en binaria (1 para “Sí”, 0 para “No”) y se divide el dataset en conjuntos de entrenamiento (70%) y prueba (30%), asegurando una distribución balanceada de la variable de interés.
rotacion <- rotacion %>% mutate(Rotacion = ifelse(Rotacion == "Si", 1, 0))
set.seed(123)
trainIndex <- createDataPartition(rotacion$Rotacion, p = 0.7, list = FALSE)
trainData <- rotacion[trainIndex, ]
testData <- rotacion[-trainIndex, ]
options(scipen=5)
modelo <- glm(Rotacion ~ ., data = trainData, family = binomial)
summary(modelo)
##
## Call:
## glm(formula = Rotacion ~ ., family = binomial, data = trainData)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -1.6378 -0.5728 -0.3848 -0.2105 3.2854
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 0.36732833 0.47060407 0.781 0.435069
## `Viaje de Negocios`No_Viaja -1.26577273 0.42075158 -3.008 0.002627 **
## `Viaje de Negocios`Raramente -0.72574978 0.21680538 -3.347 0.000816 ***
## Estado_CivilDivorciado -0.44156049 0.28790875 -1.534 0.125108
## Estado_CivilSoltero 0.83772578 0.20670158 4.053 5.06e-05 ***
## Horas_ExtraSi 1.37558093 0.19324821 7.118 1.09e-12 ***
## Antigüedad_Cargo -0.10306804 0.03325752 -3.099 0.001941 **
## Ingreso_Mensual -0.00007853 0.00003291 -2.387 0.017003 *
## Edad -0.03908496 0.01295076 -3.018 0.002545 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 896.03 on 1028 degrees of freedom
## Residual deviance: 732.07 on 1020 degrees of freedom
## AIC: 750.07
##
## Number of Fisher Scoring iterations: 6
Viaje de negocios: Los empleados que no viajan tienen una menor probabilidad de rotar en comparación con quienes viajan frecuentemente (\(\beta\) = -1.27, p \(\approx\) 0). Los que viajan raramente también tienen una menor probabilidad de rotar (\(\beta\) = -0.73, p \(\approx\) 0).
Estado civil: Ser soltero aumenta significativamente la probabilidad de rotación (\(\beta\) = 0.84, p \(\approx\) 0), mientras que ser divorciado no muestra un efecto significativo sobre la rotación (\(\beta\) = -0.44, p = 0.125).
Horas extra: Hacer horas extra tiene un fuerte impacto positivo en la probabilidad de rotación (\(\beta\) = 1.38, p \(\approx\) 0), indicando que los empleados que trabajan horas adicionales tienen mayor tendencia a dejar la empresa.
Antigüedad en el cargo: Tiene un coeficiente negativo y significativo (\(\beta\) = -0.10, p \(\approx\) 0), lo que indica que a mayor tiempo en el cargo, menor es la probabilidad de rotación.
Ingreso mensual: Tiene un coeficiente negativo y significativo (\(\beta\) = -0.00008, p \(\approx\) 0), indicando que un mayor salario reduce ligeramente la probabilidad de rotación.
Edad: También presenta un coeficiente negativo y significativo (\(\beta\) = -0.039, p \(\approx\) 0), sugiriendo que los empleados más jóvenes tienen una mayor propensión a rotar en comparación con los mayores.
predicciones <- predict(modelo, newdata = testData, type = "response")
roc_curve <- roc(testData$Rotacion, predicciones)
## Setting levels: control = 0, case = 1
## Setting direction: controls < cases
#plot(roc_curve, main = "Curva ROC")
#auc(roc_curve)
plot.roc(roc_curve,print.auc=T,print.thres = "best",
col="blue",xlab="1-ESpecificidad",ylab="Sensibilidad")
Figura 9: Curva ROC
Las predicciones del modelo se comparan con los datos reales para evaluar su desempeño. La curva ROC muestra una capacidad moderada de clasificación con un AUC de 0.731, lo que indica que el modelo es aceptable pero no perfecto en la predicción de la rotación del personal.
best_threshold <- coords(roc_curve, "best", ret = "threshold")
testData$Prediccion <- ifelse(predicciones >= best_threshold$threshold, 1, 0)
confusionMatrix(factor(testData$Prediccion), factor(testData$Rotacion))
## Confusion Matrix and Statistics
##
## Reference
## Prediction 0 1
## 0 266 26
## 1 100 49
##
## Accuracy : 0.7143
## 95% CI : (0.6696, 0.756)
## No Information Rate : 0.8299
## P-Value [Acc > NIR] : 1
##
## Kappa : 0.273
##
## Mcnemar's Test P-Value : 7.855e-11
##
## Sensitivity : 0.7268
## Specificity : 0.6533
## Pos Pred Value : 0.9110
## Neg Pred Value : 0.3289
## Prevalence : 0.8299
## Detection Rate : 0.6032
## Detection Prevalence : 0.6621
## Balanced Accuracy : 0.6901
##
## 'Positive' Class : 0
##
Con el umbral optimo determinado mediante la curva ROC se genera una matriz de confusión para evaluar el desempeño del modelo. Se observa que el modelo tiene una precisión aceptable, aunque la sensibilidad y especificidad podrían mejorarse para reducir los falsos positivos y falsos negativos.
El análisis realizado sobre la rotación de personal ha revelado una serie de factores clave que influyen significativamente en la probabilidad de que los empleados dejen la empresa. A través de un enfoque detallado, que incluye el análisis univariado y bivariado, así como la estimación de un modelo de regresión logística, se pudo identificar y cuantificar los factores más relevantes para predecir la rotación.
Uno de los hallazgos más notables es que la rotación está fuertemente relacionada con el comportamiento de los empleados en cuanto a viajes de negocios, horas extra y su estado civil. Los empleados que viajan frecuentemente por negocios, los solteros y aquellos que realizan horas extra tienen una mayor probabilidad de rotar. Este patrón sugiere que las condiciones laborales intensivas, como los viajes frecuentes o la sobrecarga de trabajo, pueden contribuir al agotamiento o insatisfacción laboral, lo que a su vez aumenta la probabilidad de rotación. De hecho, la variable de horas extra ha mostrado un impacto notablemente alto sobre la rotación, lo que señala la necesidad de una gestión más equilibrada de las cargas laborales.
En cuanto a las variables cuantitativas, la antigüedad en el cargo es un factor inversamente relacionado con la rotación, lo que sugiere que los empleados con mayor tiempo en la empresa tienden a ser más estables y menos propensos a dejar su puesto. Sin embargo, los empleados más jóvenes, así como aquellos con menos antigüedad, son más propensos a cambiar de trabajo. Este hallazgo es crucial para las estrategias de retención, ya que indica que la empresa podría necesitar enfocarse más en la estabilidad y el bienestar de los empleados más nuevos o más jóvenes, quienes podrían buscar nuevas oportunidades más frecuentemente.
El modelo de regresión logística ha proporcionado información detallada sobre la magnitud de estos efectos, y la evaluación mediante la curva ROC con un AUC de 0.731 ha demostrado que el modelo tiene una capacidad moderada para predecir la rotación. Aunque los resultados son prometedores, existe margen para mejorar la precisión, especialmente en términos de sensibilidad y especificidad, lo que podría reducir la tasa de falsos positivos y negativos.
A partir de estos resultados, se pueden ofrecer varias recomendaciones estratégicas para la empresa. Primero, es fundamental abordar el problema de las horas extra, posiblemente mediante la implementación de políticas que promuevan una mejor distribución del trabajo y una mayor flexibilidad para los empleados. Esto no solo contribuiría a reducir la rotación, sino también a mejorar el bienestar general de los empleados, lo cual puede tener efectos positivos en su productividad y satisfacción laboral.
Además, dada la correlación entre los empleados más jóvenes o con menor antigüedad y la rotación, la empresa debería considerar el diseño de programas específicos de retención para estos grupos, tales como el desarrollo de planes de carrera, oportunidades de capacitación y beneficios exclusivos. Esto podría fortalecer su compromiso con la empresa y reducir la probabilidad de que busquen otras oportunidades fuera de la organización.
Por otro lado, la política salarial también juega un papel importante. Aunque los ingresos mensuales tienen un impacto más moderado en la rotación, un salario competitivo sigue siendo un factor relevante en la retención de talento. Por lo tanto, sería recomendable revisar las políticas salariales y beneficios para garantizar que estén alineadas con las expectativas del mercado y sean lo suficientemente atractivas para los empleados clave.
Finalmente, es esencial fomentar una cultura organizacional que promueva el equilibrio entre la vida laboral y personal. Los empleados solteros y aquellos que enfrentan una carga de trabajo excesiva debido a las horas extra pueden estar buscando un mayor balance, lo que hace crucial que la empresa se enfoque en crear un entorno que favorezca este equilibrio.
En conclusión, para reducir la rotación de personal, la empresa debe centrarse en una gestión laboral más equilibrada, políticas salariales atractivas, y estrategias específicas de retención para empleados más jóvenes y con menor antigüedad. Con base en los resultados de este análisis, es posible desarrollar intervenciones más precisas y adaptadas a las necesidades de los empleados, lo que no solo reducirá la rotación, sino que también fomentará una mayor estabilidad y satisfacción dentro de la organización.