En una organización, se busca comprender y prever los factores que influyen en la rotación de empleados entre distintos cargos. La empresa ha recopilado datos históricos sobre el empleo de sus trabajadores, incluyendo variables como la antigüedad en el cargo actual, el nivel de satisfacción laboral, el salario actual, edad y otros factores relevantes.
La gerencia planea desarrollar un modelo de regresión logística que permita estimar la probabilidad de que un empleado cambie de cargo en el próximo período y determinar cuales factores indicen en mayor proporción a estos cambios.La predicción de la probabilidad de rotación de empleados ayudará a la empresa a tomar decisiones estratégicas informadas y a mantener un equipo de trabajo comprometido y satisfecho en sus roles actuales.
La base de datos arroja 1470 observaciones de 24 variables de las cuales 11 son categoricas y 13 cuantitativas: Rotación Departamento Edad Distancia_Casa Educación Campo_Educación Cargo Satisfacción_Ambiental Genero Estado_Civil Horas_Extra Satisfación_Laboral Ingreso_Mensual Trabajos_Anteriores Porcentaje_aumento_salarial Rendimiento_Laboral Años_Experiencia Capacitaciones Equilibrio_Trabajo_Vida Antigüedad Antigüedad_Cargo Años_ultima_promoción Años_acargo_con_mismo_jefe
Seleccione 3 variables categóricas (distintas de rotación) y 3 variables cuantitativas, que se consideren estén relacionadas con la rotación.
Justificación: Estudios han encontrado que en las mujeres hay una mayor tasa de rotación en comparación con los hombres (Polania, 2024)
Hipótesis: Las mujeres pueden tender a una mayor rotación dentro de la empresa debido a la falta de oportunidades de ascenso o crecimiento profesional dentro de una organización en comparación con los hombres.
Justificación: “La generación de perfiles ha permitido identificar de manera clara la variedad de características internas y es notorio que las colaboradoras involucradas mayormente ostentan el estado civil de solteras” (Mata, 2024)
Hipotesis:Las personas solteras podrian tener una mayor rotación al carecer de responsabilidades y lazos familiares con personas dependientes.
Justificación: debido a que el sujeto enfoca “su propia situación de empleo bajo una serie de expectativas, referidas a su trabajo actual, a la supervisión que recibe de sus superiores y a las relaciones interpersonales (ricas o pobres) que mantiene con su grupo de trabajo” (Hernández, 2014), la satisfacción con los beneficios obtenidos del puesto actual, las expectativas en cuanto al desarrollo profesional y otras consideraciones (Littlewoord,2006).
Hipótesis: Los empleados con mas cantidad de trabajo o un clima desfavorable en su zona de trabaja tendran una mayor rotación
Justificación: Algunos estudios muestran que las personas entre rango de 36 a 40 años son las que más rotan en las empresas, lo que indica que “este grupo demográfico es también el más contratado, por su experiencia laboral, y también puede ser más susceptible a cambios laborales” (Polania, 2024)
Hipótesis: Los grupos etareos entre los 35 y 40 años tendrán una tendencia a una mayor rotación con mas movilidad laboral tendiendo a explorar mas el mercado.A mayor edad los empleados tienden a tener menor rotacion
Justificación:“Existen causas principales de la alta rotación en las empresas tales como la baja remuneración, poca motivación y liderazgo y exceso de carga laboral” (Cifuentes,2017) Otros estudios refieren que “el salario mensual tiene consecuencias en la rotación existente en una empresa debido a quelos empleados que consideran que su salario es insuficiente pueden sentirse motivados a buscar o aceptar ofertas más atractivas en otros lugares (Salazar,2022)
Hipótesis: Los salarios mas bajos están relacionados con una mayor rotacion en los empleados
Justificación: El percibir que “la compensación recibida no permanece en sintonía con los deberes, conocimientos, experiencia y formación del empleado puede generar una sensación de frustración y llevar al trabajador a sentirse infravalorado desencadenando una percepción de rechazo por parte del empleado hacía la empresa” (Torres,2023)
Hipótesis: Los empleados con mas antigüedad tendrán poca propension a los cambios y podran tener menor rotación al tener sensación de estabilidad laboral.
Realiza un análisis univariado (caracterización) de la información contenida en la base de datos rotación. Para ello primero generamos un subset que incluye únicamente los datos considerados en el paso 1 de selección de variables, más la variable respuesta (Rotación).
rotacion_subset <- subset(rotacion, select = c(Genero, Estado_Civil, Satisfación_Laboral, Edad, Ingreso_Mensual, Antigüedad, Rotación))
# Ver las primeras filas
head(rotacion_subset)
# A tibble: 6 × 7
Genero Estado_Civil Satisfación_Laboral Edad Ingreso_Mensual Antigüedad
<chr> <chr> <dbl> <dbl> <dbl> <dbl>
1 F Soltero 4 41 5993 6
2 M Casado 2 49 5130 10
3 M Soltero 3 37 2090 0
4 F Casado 3 33 2909 8
5 M Casado 2 27 3468 2
6 M Soltero 4 32 3068 7
# ℹ 1 more variable: Rotación <chr>
Identificación de datos faltantes: Se confirma que la base de datos no contiene datos faltantes
# Convertir la variable Rotación en booleana
rotacion_subset <- rotacion_subset %>%
mutate(Rotación = ifelse(Rotación == "Si", 1, 0))
# Verificar la transformación
table(rotacion_subset$Rotación)
0 1
1233 237
La variable Rotación presenta un claro desbalance de clases, con 1,233 observaciones (83.9%) en la categoría “0” (No rotación) y solo 237 observaciones (16.1%) en la categoría “1” (Rotación). Esta diferencia indica que la mayoría de los empleados permanecen en la empresa, mientras que solo una minoría experimenta rotación. Este desbalance puede afectar el desempeño de modelos predictivos, ya que los algoritmos tienden a favorecer la clase mayoritaria. Para abordar este problema, podrían explorarse estrategias como el sobremuestreo de la clase minoritaria, el submuestreo de la clase mayoritaria, o el uso de métricas de evaluación adecuadas, como el F1-score o el AUC-ROC, en lugar de la simple precisión.
# Obtener los nombres de las columnas del subset
columnas <- names(rotacion_subset)
# Generar los gráficos dinámicamente sin conteo
graficos <- lapply(columnas, function(col) {
ggplot(rotacion_subset, aes_string(x = col)) +
geom_bar() +
theme_bw() +
ggtitle(col) # Agregar título con el nombre de la variable
})
Warning: `aes_string()` was deprecated in ggplot2 3.0.0.
ℹ Please use tidy evaluation idioms with `aes()`.
ℹ See also `vignette("ggplot2-in-packages")` for more information.
This warning is displayed once every 8 hours.
Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
generated.
# Mostrar los gráficos en una cuadrícula (ajusta 'ncol' según el número de columnas)
do.call(grid.arrange, c(graficos, ncol = 3))
rotacion_subset <- rotacion_subset %>%
mutate(Satisfación_Laboral = as.character(Satisfación_Laboral))
Se realiza un análisis exploratorio de sus medidas de tendencia central y distribución de las variables, según sean categóricas o numéricas. Para ello, primero se transforma la variable Satasfación_Laboral a formato texto.
# Resumen con mejor formato
skim(rotacion_subset)
Name | rotacion_subset |
Number of rows | 1470 |
Number of columns | 7 |
_______________________ | |
Column type frequency: | |
character | 3 |
numeric | 4 |
________________________ | |
Group variables | None |
Variable type: character
skim_variable | n_missing | complete_rate | min | max | empty | n_unique | whitespace |
---|---|---|---|---|---|---|---|
Genero | 0 | 1 | 1 | 1 | 0 | 2 | 0 |
Estado_Civil | 0 | 1 | 6 | 10 | 0 | 3 | 0 |
Satisfación_Laboral | 0 | 1 | 1 | 1 | 0 | 4 | 0 |
Variable type: numeric
skim_variable | n_missing | complete_rate | mean | sd | p0 | p25 | p50 | p75 | p100 | hist |
---|---|---|---|---|---|---|---|---|---|---|
Edad | 0 | 1 | 36.92 | 9.14 | 18 | 30 | 36 | 43 | 60 | ▂▇▇▃▂ |
Ingreso_Mensual | 0 | 1 | 6502.93 | 4707.96 | 1009 | 2911 | 4919 | 8379 | 19999 | ▇▅▂▁▂ |
Antigüedad | 0 | 1 | 7.01 | 6.13 | 0 | 3 | 5 | 9 | 40 | ▇▂▁▁▁ |
Rotación | 0 | 1 | 0.16 | 0.37 | 0 | 0 | 0 | 0 | 1 | ▇▁▁▁▂ |
Sobre las variables numéricas se realiza un diagrama de cajas y bigotes para identificar datos atípicos.
# Filtrar solo las variables numéricas y excluir 'Rotación'
numericas <- rotacion_subset %>%
select(-Rotación) %>% # Excluir la variable respuesta
select(where(is.numeric)) # Seleccionar solo columnas numéricas
# Obtener nombres de las columnas numéricas
columnas_numericas <- names(numericas)
# Generar los boxplots dinámicamente
boxplots <- lapply(columnas_numericas, function(col) {
ggplot(rotacion_subset, aes_string(y = col)) +
geom_boxplot(fill = "lightblue", color = "black", outlier.colour = "red") + # Resaltar outliers en rojo
theme_bw() +
ggtitle(paste("Boxplot de", col)) # Agregar título con el nombre de la variable
})
# Mostrar los gráficos organizados en una cuadrícula (ajustar 'ncol' según necesidad)
do.call(grid.arrange, c(boxplots, ncol = 3))
A partir del análisis de boxplots, se identificó la presencia de valores
atípicos en las variables de Ingreso Mensual y Antigüedad.
Ingreso Mensual: Se observaron valores extremos significativamente superiores al rango intercuartílico, lo que indica la existencia de empleados con sueldos considerablemente más altos en comparación con la mayoría de la muestra. Esto puede deberse a diferencias en cargos, experiencia o políticas salariales dentro de la empresa.
Antigüedad: Se evidenciaron valores atípicos en el superior. Esto sugiere la presencia de empleados con tiempos de permanencia inusualmente largos en la empresa, lo que podría estar relacionado con factores como estrategias de retención, cambios organizacionales o políticas de contratación.
La detección de estos valores atípicos es clave, ya que pueden influir en el análisis estadístico y en la construcción del modelo predictivo de rotación. En este caso, podría ser posible tener que hacer un proceso de estandarización en los datos para mejorar sus resultados.
Realiza un análisis bivariado en donde la variable respuesta sea rotacion codificada de la siguiente manera (y=1 es si rotación, y=0 es no rotación). Con base en estos resultados identifique cuales son las variables determinantes de la rotación e interpretar el signo del coeficiente estimado. Compare estos resultados con la hipotesis planteada en el punto 2.
Se usa el test de Chi cuadrado para evaluar si existe una relación significativa entre cada variable categórica y la rotación (1 = Sí, 0 = No).
# Prueba de Chi-cuadrado para cada variable categórica
chi_genero <- chisq.test(table(rotacion_subset$Genero, rotacion$Rotación))
chi_estado_civil <- chisq.test(table(rotacion_subset$Estado_Civil, rotacion$Rotación))
chi_satisfaccion <- chisq.test(table(rotacion_subset$Satisfación_Laboral, rotacion$Rotación))
# Mostrar los resultados
chi_genero
Pearson's Chi-squared test with Yates' continuity correction
data: table(rotacion_subset$Genero, rotacion$Rotación)
X-squared = 1.117, df = 1, p-value = 0.2906
chi_estado_civil
Pearson's Chi-squared test
data: table(rotacion_subset$Estado_Civil, rotacion$Rotación)
X-squared = 46.164, df = 2, p-value = 9.456e-11
chi_satisfaccion
Pearson's Chi-squared test
data: table(rotacion_subset$Satisfación_Laboral, rotacion$Rotación)
X-squared = 17.505, df = 3, p-value = 0.0005563
Basado en los resultados del p-value es posible inferir que, en el caso del análisis entre género y rotación, el p-valor (0.2906) al ser mayor a 0.05 indica que no hay evidencia suficiente para afirmar que el género influye en la rotación. Es decir, la distribución de empleados que rotan o no rotan es similar entre géneros. Esto se hace evidente también al ver el gráfico de barras apiladas con la proporción de rotación entre géneros, donde no se evidencia visualmente ninguna diferencia significativa.
En el caso de Estado Civil, el p-valor es mucho menor que 0.05, lo que significa que existe una relación estadísticamente significativa entre el estado civil y la rotación. Esto sugiere que ciertos estados civiles pueden estar más asociados con la rotación laboral. Al validar con el gráfico de barras apiladas mostrado a continuación, se ve que el estado civil soltero, tiene mayor cantidad de casos positivos de rotación, versus casado o divorciado.
En el análisis entre Rotación y Satisfacción Laboral, como era de esperarse, se obtuo un p-valor menor a 0.05 (0.0005563), lo que indica que la satisfacción laboral tiene un impacto significativo en la rotación. Esto sugiere que los empleados con menor satisfacción laboral tienen más probabilidades de rotar. Al observar el gráfico, los valores bajos (1) representan una mayor cantidad de casos positivos de rotación, versus otros valores altos (4).
# Gráfico de barras apiladas para Género vs. Rotación
ggplot(rotacion_subset, aes(x = Genero, fill = factor(Rotación))) +
geom_bar(position = "fill") +
theme_minimal() +
labs(y = "Proporción", fill = "Rotación")
# Gráfico para Estado Civil vs. Rotación
ggplot(rotacion_subset, aes(x = Estado_Civil, fill = factor(Rotación))) +
geom_bar(position = "fill") +
theme_minimal() +
labs(y = "Proporción", fill = "Rotación")
# Gráfico para Satisfacción Laboral vs. Rotación
ggplot(rotacion_subset, aes(x = Satisfación_Laboral, fill = factor(Rotación))) +
geom_bar(position = "fill") +
theme_minimal() +
labs(y = "Proporción", fill = "Rotación")
A partir de los resultados anteriores se decide realizar un ajuste sobre la hipótesis inicial y seleccionar una variable diferente a género que logre explicar en mayor medida la rotación de empleados. En ese caso se decide camiar la variable por Departamento. Mostrando los siguientes resultados.
Justificación: “En el contexto de la organización, su clima laboral condiciona las actitudes por parte de los empleados en el area donde se desempeñan” (Hall, 2019) y las causas de rotación de personal pueden ser internas y externas como traslados a otras areas o departamentos (García, 2016).
Hipótesis: Existen departamentos o áreas cuentan con una mayor rotación en los empleados
#Definir nuevamente el subset con el cambio en la variable Departamento
rotacion_subset <- subset(rotacion, select = c(Estado_Civil, Departamento, Satisfación_Laboral, Edad, Ingreso_Mensual, Antigüedad, Rotación))
rotacion_subset <- rotacion_subset %>%
mutate(Satisfación_Laboral = as.character(Satisfación_Laboral))
# Convertir la variable Rotación en booleana
rotacion_subset <- rotacion_subset %>%
mutate(Rotación = ifelse(Rotación == "Si", 1, 0))
# Prueba de Chi-cuadrado para la variable Departamento
chi_departamento <- chisq.test(table(rotacion$Departamento, rotacion$Rotación))
# Mostrar los resultados
chi_departamento
Pearson's Chi-squared test
data: table(rotacion$Departamento, rotacion$Rotación)
X-squared = 10.796, df = 2, p-value = 0.004526
# Gráfico de Departamento vs. Rotación
ggplot(rotacion, aes(x = Departamento, fill = factor(Rotación))) +
geom_bar(position = "fill") +
theme_minimal() +
labs(y = "Proporción", fill = "Rotación")
En la comparación entre Departamento y Rotación se ve que el p-value es
menor 0.05, por lo que rechazamos la hipótesis nula (No hay relación
entre Departamento y Rotación, es decir, son independientes) con un
nivel de confianza del 95%. Esto indica que hay una relación
significativa entre el Departamento y la Rotación. En otras palabras, la
distribución de la rotación no es la misma en todos los departamentos y
algunos departamentos podrían tener tasas de rotación más altas o bajas,
tal como se observa en el gráfico anterior.
A continuación se realiza un análisis bivariado de las variables numéricas (Ingreso Mensual, Antigüedad y Edad) respecto a la variable binaria Rotación (0 = No rotación, 1 = Sí rotación) utilizando la prueba t de diferencia de medias (t-test).
# Definir las variables numéricas a analizar
variables_numericas <- c("Ingreso_Mensual", "Antigüedad", "Edad")
# Aplicar la prueba t para cada variable numérica comparando según la variable binaria 'Rotación'
resultados_ttest <- lapply(variables_numericas, function(var) {
prueba <- t.test(rotacion_subset[[var]] ~ rotacion_subset$Rotación, var.equal = FALSE) # Prueba t con varianzas desiguales
data.frame(
Variable = var,
Media_No_Rotacion = mean(rotacion_subset[[var]][rotacion_subset$Rotación == 0], na.rm = TRUE),
Media_Rotacion = mean(rotacion_subset[[var]][rotacion_subset$Rotación == 1], na.rm = TRUE),
p_value = prueba$p.value
)
})
# Convertir lista de resultados en un dataframe
resultados_ttest_df <- do.call(rbind, resultados_ttest)
# Mostrar resultados
print(resultados_ttest_df)
Variable Media_No_Rotacion Media_Rotacion p_value
1 Ingreso_Mensual 6832.739659 4787.092827 4.433589e-13
2 Antigüedad 7.369019 5.130802 2.285905e-07
3 Edad 37.562044 33.607595 1.371249e-08
A partir del resultado se observa que las tres variables analizadas muestran diferencias estadísticamente significativas entre los empleados que rotaron y los que no, indicando que los empleados con menores ingresos, menor antigüedad y menor edad tienen una mayor probabilidad de rotación. Estas variables podrían ser determinantes en la retención de empleados y podrían ayudar a la empresa a diseñar estrategias para reducir la rotación, como ajustes salariales o programas de retención de talento joven.
Realiza la estimación de un modelo de regresión logístico en el cual la variable respuesta es rotacion (y=1 es si rotación, y=0 es no rotación) y las 6 variables seleccionadas en el punto 1 y ajustadas a partir de los resultados del punto 2. Interprete los coeficientes del modelo y la significancia de los parámetros.
# Crea un modelo de regresión logística
modelo <- glm(Rotación ~ Departamento + Satisfación_Laboral + Estado_Civil + Edad + Ingreso_Mensual + Antigüedad, data = rotacion_subset, family = "binomial")
# Resumen del modelo para ver los coeficientes y sus p-values
summary(modelo)
Call:
glm(formula = Rotación ~ Departamento + Satisfación_Laboral +
Estado_Civil + Edad + Ingreso_Mensual + Antigüedad, family = "binomial",
data = rotacion_subset)
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) -1.356e-01 3.625e-01 -0.374 0.708408
DepartamentoRH 5.733e-01 3.500e-01 1.638 0.101413
DepartamentoVentas 5.861e-01 1.602e-01 3.659 0.000253 ***
Satisfación_Laboral2 -4.887e-01 2.250e-01 -2.172 0.029853 *
Satisfación_Laboral3 -4.497e-01 1.995e-01 -2.255 0.024162 *
Satisfación_Laboral4 -9.603e-01 2.128e-01 -4.512 6.43e-06 ***
Estado_CivilDivorciado -2.453e-01 2.229e-01 -1.101 0.271087
Estado_CivilSoltero 8.044e-01 1.644e-01 4.891 1.00e-06 ***
Edad -2.231e-02 9.670e-03 -2.307 0.021070 *
Ingreso_Mensual -8.476e-05 2.689e-05 -3.153 0.001618 **
Antigüedad -3.953e-02 1.844e-02 -2.144 0.032027 *
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
(Dispersion parameter for binomial family taken to be 1)
Null deviance: 1298.6 on 1469 degrees of freedom
Residual deviance: 1167.4 on 1459 degrees of freedom
AIC: 1189.4
Number of Fisher Scoring iterations: 5
Los coeficientes indican el efecto de cada variable en la probabilidad de rotación. Un coeficiente negativo sugiere que la variable reduce la probabilidad de rotación, mientras que un coeficiente positivo sugiere que la aumenta.
Variables significativas (p < 0.05)
Departamento - Ventas (β = 0.586, p = 0.000253) Los empleados de Ventas tienen mayor probabilidad de rotación en comparación con el departamento de referencia.
Satisfacción Laboral (menores valores = menor satisfacción):
– Nivel 2 (β = -0.489, p = 0.029853) – Nivel 3 (β = -0.449, p = 0.024162) – Nivel 4 (β = -0.960, p = 6.43e-06)
A mayor satisfacción laboral, menor probabilidad de rotación (coeficientes negativos y significativos).
Estado Civil - Soltero (β = 0.804, p = 1.00e-06) Los empleados solteros tienen una mayor probabilidad de rotación en comparación con los casados.
Edad (β = -0.022, p = 0.021070) La rotación disminuye a medida que la edad aumenta.
Ingreso Mensual (β = -0.0000848, p = 0.001618) A mayor salario, menor probabilidad de rotación.
Antigüedad (β = -0.0395, p = 0.032027) A mayor antigüedad, menor probabilidad de rotación.
Variables No significativas (p > 0.05)
Las siguiente variables no tuvieron un efecto significativo en el modelo para la predicción de la rotación:
Respecto a las métricas para evaluar la bondad del modelo, el resultao de ejecución arroja automáticamente dos resultados, Deviance y IAC (Criterio de Información de Akaike). El primero mide qué tan bien el modelo predice la variable respuesta en comparación con un modelo de referencia basandose en la verosimilitud del modelo. En este caso el modelo sin predictores (Solo con el intercepto) toma un valor para la métrica de 1298.6, mientras que el Deviance residual (con predictores) es menor (1167.4), lo que indica que el modelo con predictores ajusta mejor los datos que un modelo sin variables explicativas, por lo que la inclusión de las variables (Departamento, Satisfacción Laboral, Estado Civil, Edad, Ingreso Mensual y Antigüedad) mejoró la capacidad predictiva del modelo.
El IAC (Criterio de Información de Akaike) es una métrica que balancea el ajuste del modelo y su complejidad. En este caso el resultado 1189.4 es menor que el resultado del modelo de referencia (1298.6) (solo con el intercepto), lo que indica según la interpretación de esta métrica que el modelo tiene un buen ajuste.
A continuación se procede a evaluar el poder predictivo del modelo con base en la curva ROC y el AUC.
# names(dataMat)
# nrow(dataMat)
ntrain <- nrow(rotacion_subset)*0.6
ntest <- nrow(rotacion_subset)*0.4
# c(ntrain,ntest)
set.seed(123)
index_train<-sample(1:nrow(rotacion_subset),size = ntrain)
train<-rotacion_subset[index_train,] # muestra de entrenamiento
test<-rotacion_subset[-index_train,] # muestra de prueba
modelo2 <- glm(Rotación ~ Departamento + Satisfación_Laboral + Estado_Civil + Edad + Ingreso_Mensual + Antigüedad, data = rotacion_subset, family = "binomial")
valor_pronosticado <- predict(modelo2,test,type = "response")
niveles_pronosticados <- ifelse(valor_pronosticado >0.5, 1, 0 ) %>%
factor(.)
rendimiento_data<-data.frame(observados=test$Rotación,
predicciones= niveles_pronosticados)
# Calcular la curva ROC
curva_ROC <- roc(test$Rotación, valor_pronosticado) # test$Rotación es la variable real en el conjunto de prueba
Setting levels: control = 0, case = 1
Setting direction: controls < cases
auc <- round(auc(curva_ROC, levels = c(0, 1), direction = "<"), 4) # Área bajo la curva
# Graficar la curva ROC
ggroc(curva_ROC, colour = "#FF7F00", size = 1) +
ggtitle(paste0("Curva ROC ", "(AUC = ", auc, ")")) +
xlab("1 - Especificidad") + # En la curva ROC, el eje X representa 1 - Especificidad
ylab("Sensibilidad") # El eje Y representa la Sensibilidad (Verdaderos Positivos)
El AUC esta en 0.5 < AUC < 1: El modelo tiene una habilidad de predicción mejor que el azar. El modelo tiene una capacidad de discriminación del 70% o sea que tiene una alta eficiencia para distinguir entre la clase positiva y la negativa.
También se calculan otras métricas de predicción del modelo com la especificidad, precisión y sensibilidad.
# Obtener las predicciones en el conjunto de prueba
predicciones <- predict(modelo2, newdata = test, type = "response")
clases_predichas <- ifelse(predicciones > 0.5, 1, 0) # Umbral de 0.5
# Crear la matriz de confusión
matriz_confusion <- confusionMatrix(factor(clases_predichas), factor(test$Rotación))
# Mostrar la matriz de confusión y métricas de evaluación
print(matriz_confusion)
Confusion Matrix and Statistics
Reference
Prediction 0 1
0 484 93
1 5 6
Accuracy : 0.8333
95% CI : (0.8007, 0.8626)
No Information Rate : 0.8316
P-Value [Acc > NIR] : 0.4829
Kappa : 0.078
Mcnemar's Test P-Value : <2e-16
Sensitivity : 0.98978
Specificity : 0.06061
Pos Pred Value : 0.83882
Neg Pred Value : 0.54545
Prevalence : 0.83163
Detection Rate : 0.82313
Detection Prevalence : 0.98129
Balanced Accuracy : 0.52519
'Positive' Class : 0
El modelo de clasificación de rotación presenta una precisión del 83.33%, lo que indica que en general clasifica correctamente la mayoría de los casos. Sin embargo, dado el desbalance de clases, este valor puede ser engañoso. La sensibilidad (recall de la clase positiva) es muy alta (98.98%), lo que significa que el modelo detecta casi todos los empleados que no rotaron. En contraste, la especificidad es extremadamente baja (6.06%), lo que indica que el modelo tiene una capacidad muy limitada para identificar correctamente a los empleados que sí rotaron. En términos de precisión, el valor predictivo positivo (PPV) es de 83.88%, lo que significa que, cuando el modelo predice rotación, suele estar en lo correcto. Sin embargo, el valor predictivo negativo (NPV) es bajo (54.54%), lo que sugiere que la predicción de “no rotación” es menos confiable.
Desde una perspectiva más profunda, el índice Kappa es de apenas 0.078, lo que indica que el modelo apenas mejora respecto a una clasificación aleatoria. Asimismo, la Balanced Accuracy, que es un mejor indicador en contextos de desbalance de clases, es de solo 52.52%, lo que confirma que el modelo no está funcionando bien en ambas clases. Además, el p-valor del test de McNemar (< 2e-16) sugiere que hay una diferencia significativa entre los errores de tipo I y tipo II, lo que indica un sesgo en la clasificación de la clase minoritaria (rotación). Aunque el modelo parece funcionar bien a simple vista en realidad tiene problemas para identificar correctamente a los empleados que rotan, lo que limita su utilidad en la toma de decisiones. Esto seguramente se debe a los problemas de desbalanceo en la clase a predecir. Se tendrían que aplicar técnicas de balanceo para corregir este error y entrenar el modelo con datos balanceados.
Finalmente, a partir de los resultados anteriores se calcula el F1-Score, útil en en los casos, como este, en donde hay un alto desbalance de clases.
# Extraer la matriz de confusión
cm <- matriz_confusion$table # Extrae la tabla de confusión
# Definir TP, FP, FN, TN
TP <- cm[2,2] # Verdaderos positivos
FP <- cm[1,2] # Falsos positivos
FN <- cm[2,1] # Falsos negativos
TN <- cm[1,1] # Verdaderos negativos
# Calcular Precisión y Recall
precision <- TP / (TP + FP)
recall <- TP / (TP + FN)
# Calcular F1-score
F1_score <- 2 * (precision * recall) / (precision + recall)
# Mostrar resultados
cat("Precisión:", round(precision, 4), "\n")
Precisión: 0.0606
cat("Recall (Sensibilidad):", round(recall, 4), "\n")
Recall (Sensibilidad): 0.5455
cat("F1-score:", round(F1_score, 4), "\n")
F1-score: 0.1091
El F1-score es de solo 0.1091, lo que sugiere un rendimiento deficiente en la predicción de la clase minoritaria. En conclusión, aunque el modelo identifica algunos factores asociados a la rotación, su capacidad de predicción es insuficiente para una aplicación efectiva en la toma de decisiones.
Realiza una predicción la probabilidad de que un individuo (hipotético) rote y defina un corte para decidir si se debe intervenir a este empleado o no (posible estrategia para motivar al empleado).
empleado <- data.frame(Intercept = 1,
Departamento = "Ventas",
Satisfación_Laboral = "1",
Estado_Civil= "Soltero",
Ingreso_Mensual =4000,
Edad = 23,
Antigüedad = 1)
probabilidad_rotacion <- predict(modelo, newdata = empleado, type = "response")
probabilidad_rotacion
1
0.5898325
De acuerdo a lo descrito en la literatura se acepta una probabilidad de rotacion de personal con un punto de corte maximo entre el 0.10 y el 0.15 en una empresa (Mathis, 2017;Zacarías, 2010;Puentes, 2021) por lo cual en este ejemplo el empleado requiere intervencion pues presenta una probabilidad de rotacion del 0.58.
El modelo de regresión logística desarrollado permite estimar la probabilidad de que un empleado cambie de cargo en el próximo período con una precisión del 83.33%, lo que indica que en general clasifica correctamente los casos para la clase mayoritaria con una alta sensibilidad (98.98%) y un buen valor predictivo positivo (83.88%). Aunque el modelo tiene una capacidad de discriminación del 70% para distinguir entre la clase positiva y la negativa tiene problemas para identificar correctamente a los empleados que rotan, lo que limita su utilidad en la toma de decisiones. Se tendrían que aplicar técnicas de balanceo para entrenar al modelo y mejorar su capacidad predictiva a la hora de determinar los empleados que tiene mas probabilidad de rotar.
El modelo con predictores ajusta mejor los datos con variables explicativas, por lo cual se deben tener en cuenta las siguientes variables que podrian ser determinantes para predecir la rotacion de empleados: Departamento, Satisfacción Laboral, Estado Civil, Edad, Ingreso Mensual y Antigüedad.
Las oportunidades de mejora para la empresa de acuerdo a los hallazgos encontrados son las siguientes:
Seguimiento especifico por Departamento: Se deben Identificar los problemas, oportunidades y clima laboral por cada uno debido a que unos departamentos como el de ventas tiene mas probabilidad de rotar, se deben ajustar las soluciones de acuerdo a las necesidades específicas
Programas de motivacion por grupo etareo: Se deben buscar estrategias motivacionales acordes a cada grupo etario fomentando el sentido de pertenencia en las personas mas jovenes quienes deben tener un programa de desarrollo profesional y oportunidades de ascenso dentro de la empresa.Se requieren programas de mentoria
Antiguedad: Las estrategias deben ser dirigidas al reconocimiento y la dedicacion a lo largo del tiempo en el personal con mayores incentivos
Estado civil: Las personas solteras deben tener una amplia oferta de capacitaciones y de educacion continuada para generar adherencia a las politicas de la empresa debido a que tiene un gran potencial y demanda de avanzar profesionalmente
Satisfaccion laboral: Se deben evaluar en forma temprana los casos de baja satisfaccion laboral para intervenirlos en forma rapida y asi poder identificar los factores que favorezcan la rotacion de personal
Ingresos_ La remuneracion adecuada debe ser un factor que motiva a las personas aa permanecer en su cargo. El estudio de mercado y de condiciones laborales en otras empresas es importante para tener puntos de comparacion y asi ser mas competitivos en el mercado.
Cifuentes Cadena, T. (2017). Análisis de factores que influyen en la rotación de personal en una empresa del rubro de alimentos y bebidas.
García, K.L. (2016). Causas internas y externas que influyen en la rotación de personal en una empresa de alimentos de la costa sur. Tesis de grado para obtener el título en Licenciatura en Psicología Industrial/Organizacional. Universidad Rafael Landívar. Escuintla, Guatemala.
Hernández, Y., Hernández, G., Mendieta, A. (2014). Modelo de rotación de personal y prácticas organizacionales. Historia y comunicación social. Vol. 18 N° Especial Diciembre. Págs. 837-863. http://dx.doi.org/10.5209/rev_HICS.2013.v18.44369
Littlewoord, Z., Herman, F. (2006). Antecedentes de la rotación voluntaria de personal. Investigación administrativa. Págs. 8-25. https://www.redalyc.org/articulo.oa?id=4560/456045194001
Mata, K. Y. C., & Flores, S. G. O. (2024). Implementación de sistema de datos para análisis predictivo de rotación de personal en Los Pinos Apparel SA (Doctoral dissertation, Universidad Tecnológica Centroamericana UNITEC).
Mathis, R. L., Jackson, J. H., Valentine, S. R., & Meglich, P. A. (2017). Human resource management. Cengage learning.
Polania Ovalle, S., & Gamboa Agredo, L. K. (2024). Caracterización de la rotación de personal en una organización del sector farmacéutico.
Puentes, Z., & Dioneth, K. (2021). Informe técnico de rotación de personal.
Quevedo Espinosa, N. J. (2020). Factores de rotación de personal Cueros Vélez Regional Bogotá.
Salazar, T. (2022). Identificacion de los factores que determinan la alta rotacion del personal de ventas en empresas retail de prendas de vstir:caso Tiendas Piero [Universidad de Lima]. https://repositorio.ulima.edu.pe/bitstream/handle/20.500.12724/1724/Salazar_Prado_Tal ia.pdf?sequence=1&isAllowed=y
Torres, D. (2023, junio 21). Rotación de personal: qué es, causas, consecuencias y soluciones. Hubspot.es. https://blog.hubspot.es/sales/rotacion-personal
Zacarías, H. M. M., & Olmos, R. E. (2010). Análisis de las características del emprendimiento y liderazgo en los países de Asia y Latinoamérica. Portes, revista mexicana de estudios sobre la Cuenca del Pacífico, 4(8), 101-122.