En el dinámico mundo empresarial de hoy, la rotación de empleados es un fenómeno común que puede tener un impacto significativo en la eficiencia y la moral de una organización. Comprender y prever los factores que influyen en la rotación de empleados entre distintos cargos es, por lo tanto, de vital importancia.
En este contexto, una empresa ha recopilado datos históricos sobre el empleo de sus trabajadores. Estos datos incluyen variables como la antigüedad en el cargo actual, el nivel de satisfacción laboral, el salario actual, la edad y otros factores relevantes. Con estos datos, la gerencia planea desarrollar un modelo de regresión logística.
El objetivo de este modelo es estimar la probabilidad de que un empleado cambie de cargo en el próximo período y determinar cuáles factores influyen en mayor proporción a estos cambios. Con esta información, la empresa podrá tomar medidas proactivas para retener a su talento clave, identificar áreas de mejora en la gestión de recursos humanos y fomentar un ambiente laboral más estable y tranquilo.
La predicción de la probabilidad de rotación de empleados ayudará a la empresa a tomar decisiones estratégicas informadas y a mantener un equipo de trabajo comprometido y satisfecho en sus roles actuales. En última instancia, la idea es construir un modelo de regresión logística que pueda servir como una herramienta valiosa para la gestión de recursos humanos en la empresa.
library(devtools)
library(paqueteMETODOS)
library(skimr)
library(car)
library(tidyverse)
library(ggpubr)
library(gridExtra)
library(GGally)
library(car)
library(bestNormalize)
library(stargazer)
library(lmtest)
library(plotly)
library(reshape2)
library(corrplot)
library(vcd)
library(caret)
library(pROC)
data("rotacion")
rotacion <- as.data.frame(rotacion)
head(rotacion)
## Rotación Edad Viaje de Negocios Departamento Distancia_Casa Educación
## 1 Si 41 Raramente Ventas 1 2
## 2 No 49 Frecuentemente IyD 8 1
## 3 Si 37 Raramente IyD 2 2
## 4 No 33 Frecuentemente IyD 3 4
## 5 No 27 Raramente IyD 2 1
## 6 No 32 Frecuentemente IyD 2 2
## Campo_Educación Satisfacción_Ambiental Genero Cargo
## 1 Ciencias 2 F Ejecutivo_Ventas
## 2 Ciencias 3 M Investigador_Cientifico
## 3 Otra 4 M Tecnico_Laboratorio
## 4 Ciencias 4 F Investigador_Cientifico
## 5 Salud 1 M Tecnico_Laboratorio
## 6 Ciencias 4 M Tecnico_Laboratorio
## Satisfación_Laboral Estado_Civil Ingreso_Mensual Trabajos_Anteriores
## 1 4 Soltero 5993 8
## 2 2 Casado 5130 1
## 3 3 Soltero 2090 6
## 4 3 Casado 2909 1
## 5 2 Casado 3468 9
## 6 4 Soltero 3068 0
## Horas_Extra Porcentaje_aumento_salarial Rendimiento_Laboral Años_Experiencia
## 1 Si 11 3 8
## 2 No 23 4 10
## 3 Si 15 3 7
## 4 Si 11 3 8
## 5 No 12 3 6
## 6 No 13 3 8
## Capacitaciones Equilibrio_Trabajo_Vida Antigüedad Antigüedad_Cargo
## 1 0 1 6 4
## 2 3 3 10 7
## 3 3 3 0 0
## 4 3 3 8 7
## 5 3 3 2 2
## 6 2 2 7 7
## Años_ultima_promoción Años_acargo_con_mismo_jefe
## 1 0 5
## 2 1 7
## 3 0 0
## 4 3 0
## 5 2 2
## 6 3 6
glimpse(rotacion)
## Rows: 1,470
## Columns: 24
## $ Rotación <chr> "Si", "No", "Si", "No", "No", "No", "No", …
## $ Edad <dbl> 41, 49, 37, 33, 27, 32, 59, 30, 38, 36, 35…
## $ `Viaje de Negocios` <chr> "Raramente", "Frecuentemente", "Raramente"…
## $ Departamento <chr> "Ventas", "IyD", "IyD", "IyD", "IyD", "IyD…
## $ Distancia_Casa <dbl> 1, 8, 2, 3, 2, 2, 3, 24, 23, 27, 16, 15, 2…
## $ Educación <dbl> 2, 1, 2, 4, 1, 2, 3, 1, 3, 3, 3, 2, 1, 2, …
## $ Campo_Educación <chr> "Ciencias", "Ciencias", "Otra", "Ciencias"…
## $ Satisfacción_Ambiental <dbl> 2, 3, 4, 4, 1, 4, 3, 4, 4, 3, 1, 4, 1, 2, …
## $ Genero <chr> "F", "M", "M", "F", "M", "M", "F", "M", "M…
## $ Cargo <chr> "Ejecutivo_Ventas", "Investigador_Cientifi…
## $ Satisfación_Laboral <dbl> 4, 2, 3, 3, 2, 4, 1, 3, 3, 3, 2, 3, 3, 4, …
## $ Estado_Civil <chr> "Soltero", "Casado", "Soltero", "Casado", …
## $ Ingreso_Mensual <dbl> 5993, 5130, 2090, 2909, 3468, 3068, 2670, …
## $ Trabajos_Anteriores <dbl> 8, 1, 6, 1, 9, 0, 4, 1, 0, 6, 0, 0, 1, 0, …
## $ Horas_Extra <chr> "Si", "No", "Si", "Si", "No", "No", "Si", …
## $ Porcentaje_aumento_salarial <dbl> 11, 23, 15, 11, 12, 13, 20, 22, 21, 13, 13…
## $ Rendimiento_Laboral <dbl> 3, 4, 3, 3, 3, 3, 4, 4, 4, 3, 3, 3, 3, 3, …
## $ Años_Experiencia <dbl> 8, 10, 7, 8, 6, 8, 12, 1, 10, 17, 6, 10, 5…
## $ Capacitaciones <dbl> 0, 3, 3, 3, 3, 2, 3, 2, 2, 3, 5, 3, 1, 2, …
## $ Equilibrio_Trabajo_Vida <dbl> 1, 3, 3, 3, 3, 2, 2, 3, 3, 2, 3, 3, 2, 3, …
## $ Antigüedad <dbl> 6, 10, 0, 8, 2, 7, 1, 1, 9, 7, 5, 9, 5, 2,…
## $ Antigüedad_Cargo <dbl> 4, 7, 0, 7, 2, 7, 0, 0, 7, 7, 4, 5, 2, 2, …
## $ Años_ultima_promoción <dbl> 0, 1, 0, 3, 2, 3, 0, 0, 1, 7, 0, 0, 4, 1, …
## $ Años_acargo_con_mismo_jefe <dbl> 5, 7, 0, 0, 2, 6, 0, 0, 8, 7, 3, 8, 3, 2, …
Hay variables que pese a tener números deben ser consideradas como categorías por lo que se procede a convertir estas variables en tipo factor.
df <- rotacion %>%
mutate(
# Variables a factor
Rotación = as.factor(ifelse(Rotación == "Si", 1, 0)),
`Viaje de Negocios` = as.factor(`Viaje de Negocios`),
Departamento = as.factor(Departamento),
Campo_Educación = as.factor(Campo_Educación),
Genero = as.factor(Genero),
Cargo = as.factor(Cargo),
Estado_Civil = as.factor(Estado_Civil),
Horas_Extra = as.factor(ifelse(Horas_Extra == "Si", 1, 0)),
Satisfacción_Ambiental = as.factor(Satisfacción_Ambiental),
Satisfación_Laboral = as.factor(Satisfación_Laboral),
Rendimiento_Laboral = as.factor(Rendimiento_Laboral),
Equilibrio_Trabajo_Vida = as.factor(Equilibrio_Trabajo_Vida),
Educación = as.factor(Educación)
)
glimpse(df)
## Rows: 1,470
## Columns: 24
## $ Rotación <fct> 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ Edad <dbl> 41, 49, 37, 33, 27, 32, 59, 30, 38, 36, 35…
## $ `Viaje de Negocios` <fct> Raramente, Frecuentemente, Raramente, Frec…
## $ Departamento <fct> Ventas, IyD, IyD, IyD, IyD, IyD, IyD, IyD,…
## $ Distancia_Casa <dbl> 1, 8, 2, 3, 2, 2, 3, 24, 23, 27, 16, 15, 2…
## $ Educación <fct> 2, 1, 2, 4, 1, 2, 3, 1, 3, 3, 3, 2, 1, 2, …
## $ Campo_Educación <fct> Ciencias, Ciencias, Otra, Ciencias, Salud,…
## $ Satisfacción_Ambiental <fct> 2, 3, 4, 4, 1, 4, 3, 4, 4, 3, 1, 4, 1, 2, …
## $ Genero <fct> F, M, M, F, M, M, F, M, M, M, M, F, M, M, …
## $ Cargo <fct> Ejecutivo_Ventas, Investigador_Cientifico,…
## $ Satisfación_Laboral <fct> 4, 2, 3, 3, 2, 4, 1, 3, 3, 3, 2, 3, 3, 4, …
## $ Estado_Civil <fct> Soltero, Casado, Soltero, Casado, Casado, …
## $ Ingreso_Mensual <dbl> 5993, 5130, 2090, 2909, 3468, 3068, 2670, …
## $ Trabajos_Anteriores <dbl> 8, 1, 6, 1, 9, 0, 4, 1, 0, 6, 0, 0, 1, 0, …
## $ Horas_Extra <fct> 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, …
## $ Porcentaje_aumento_salarial <dbl> 11, 23, 15, 11, 12, 13, 20, 22, 21, 13, 13…
## $ Rendimiento_Laboral <fct> 3, 4, 3, 3, 3, 3, 4, 4, 4, 3, 3, 3, 3, 3, …
## $ Años_Experiencia <dbl> 8, 10, 7, 8, 6, 8, 12, 1, 10, 17, 6, 10, 5…
## $ Capacitaciones <dbl> 0, 3, 3, 3, 3, 2, 3, 2, 2, 3, 5, 3, 1, 2, …
## $ Equilibrio_Trabajo_Vida <fct> 1, 3, 3, 3, 3, 2, 2, 3, 3, 2, 3, 3, 2, 3, …
## $ Antigüedad <dbl> 6, 10, 0, 8, 2, 7, 1, 1, 9, 7, 5, 9, 5, 2,…
## $ Antigüedad_Cargo <dbl> 4, 7, 0, 7, 2, 7, 0, 0, 7, 7, 4, 5, 2, 2, …
## $ Años_ultima_promoción <dbl> 0, 1, 0, 3, 2, 3, 0, 0, 1, 7, 0, 0, 4, 1, …
## $ Años_acargo_con_mismo_jefe <dbl> 5, 7, 0, 0, 2, 6, 0, 0, 8, 7, 3, 8, 3, 2, …
Ahora se decide tener algunas consideraciones sobre 3 variables categóricas y 3 cuantitativas, para establecer algunas hipótesis respecto a su relación con la variable rotación, estas son:
Variables categóricas:
1. Viaje de Negocios: La frecuencia de
los viajes de negocios podría influir en la rotación. Los empleados que
viajan con frecuencia podrían tener más probabilidades de rotar debido
al estrés o la interrupción del equilibrio entre el trabajo y la vida
personal. Hipótesis: Los empleados que viajan con frecuencia tienen más
probabilidades de rotar.
2. Departamento: La rotación podría
variar entre departamentos debido a las diferencias en la cultura del
equipo, las expectativas de trabajo, entre otras. Hipótesis: Algunos
departamentos tienen tasas de rotación más altas que otros.
3. Estado Civil: El estado civil podría
influir en la rotación. Por ejemplo, los empleados solteros podrían
tener más flexibilidad para cambiar de trabajo que los casados.
Hipótesis: Los empleados solteros tienen más probabilidades de rotar que
los casados.
Variables cuantitativas:
1. Edad: Los empleados más jóvenes
podrían estar más dispuestos a cambiar de trabajo para explorar nuevas
oportunidades. Hipótesis: Los empleados más jóvenes tienen más
probabilidades de rotar que los mayores.
2. Distancia_Casa: Los empleados que
viven más lejos de la oficina podrían estar más dispuestos a rotar para
encontrar un trabajo más cercano a casa. Hipótesis: Los empleados que
viven más lejos tienen más probabilidades de rotar.
3. Ingreso_Mensual: Los empleados con
salarios más bajos podrían estar más dispuestos a rotar para buscar un
salario más alto. Hipótesis: Los empleados con salarios más bajos tienen
más probabilidades de rotar.
Ahora se inicia con el análisis de los datos
df <- rename(df, Viaje_Negocios = `Viaje de Negocios`)
skim(df)
| Name | df |
| Number of rows | 1470 |
| Number of columns | 24 |
| _______________________ | |
| Column type frequency: | |
| factor | 13 |
| numeric | 11 |
| ________________________ | |
| Group variables | None |
Variable type: factor
| skim_variable | n_missing | complete_rate | ordered | n_unique | top_counts |
|---|---|---|---|---|---|
| Rotación | 0 | 1 | FALSE | 2 | 0: 1233, 1: 237 |
| Viaje_Negocios | 0 | 1 | FALSE | 3 | Rar: 1043, Fre: 277, No_: 150 |
| Departamento | 0 | 1 | FALSE | 3 | IyD: 961, Ven: 446, RH: 63 |
| 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 |
| Genero | 0 | 1 | FALSE | 2 | M: 882, F: 588 |
| Cargo | 0 | 1 | FALSE | 9 | Eje: 326, Inv: 292, Tec: 259, Dir: 145 |
| Satisfación_Laboral | 0 | 1 | FALSE | 4 | 4: 459, 3: 442, 1: 289, 2: 280 |
| Estado_Civil | 0 | 1 | FALSE | 3 | Cas: 673, Sol: 470, Div: 327 |
| Horas_Extra | 0 | 1 | FALSE | 2 | 0: 1054, 1: 416 |
| 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 |
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 | ▂▇▇▃▂ |
| Distancia_Casa | 0 | 1 | 9.19 | 8.11 | 1 | 2 | 7 | 14 | 29 | ▇▅▂▂▂ |
| Ingreso_Mensual | 0 | 1 | 6502.93 | 4707.96 | 1009 | 2911 | 4919 | 8379 | 19999 | ▇▅▂▁▂ |
| Trabajos_Anteriores | 0 | 1 | 2.69 | 2.50 | 0 | 1 | 2 | 4 | 9 | ▇▃▂▂▁ |
| Porcentaje_aumento_salarial | 0 | 1 | 15.21 | 3.66 | 11 | 12 | 14 | 18 | 25 | ▇▅▃▂▁ |
| Años_Experiencia | 0 | 1 | 11.28 | 7.78 | 0 | 6 | 10 | 15 | 40 | ▇▇▂▁▁ |
| Capacitaciones | 0 | 1 | 2.80 | 1.29 | 0 | 2 | 3 | 3 | 6 | ▂▇▇▂▃ |
| Antigüedad | 0 | 1 | 7.01 | 6.13 | 0 | 3 | 5 | 9 | 40 | ▇▂▁▁▁ |
| Antigüedad_Cargo | 0 | 1 | 4.23 | 3.62 | 0 | 2 | 3 | 7 | 18 | ▇▃▂▁▁ |
| Años_ultima_promoción | 0 | 1 | 2.19 | 3.22 | 0 | 0 | 1 | 3 | 15 | ▇▁▁▁▁ |
| Años_acargo_con_mismo_jefe | 0 | 1 | 4.12 | 3.57 | 0 | 2 | 3 | 7 | 17 | ▇▂▅▁▁ |
El set de datos consta de 1470 filas y 24 columnas. Las columnas se dividen en 13 variables categóricas (factor) y 11 variables numéricas (numeric).
Las variables categóricas incluyen Rotación,
Viaje_Negocios, Departamento,
Educación, Campo_Educación,
Satisfacción_Ambiental, Género,
Cargo, Satisfación_Laboral,
Estado_Civil, Horas_Extra,
Rendimiento_Laboral y Equilibrio_Trabajo_Vida.
La variable Rotación tiene dos categorías únicas, que son
‘0’ y ‘1’, con ‘0’ siendo la categoría más frecuente.
En cuanto a las variables numéricas, la Edad de los
empleados varía de 18 a 60 años con una media de 36.92 años. La
Distancia_Casa tiene un rango de 1 a 29 con una media de
9.19. El Ingreso_Mensual varía de 1009 a 19999 con una
media de 6502.93. La variable Trabajos_Anteriores tiene un
rango de 0 a 9 con una media de 2.69. El
Porcentaje_aumento_salarial varía de 11 a 25 con una media
de 15.21. Los Años_Experiencia varían de 0 a 40 con una
media de 11.28. Las Capacitaciones varían de 0 a 6 con una
media de 2.80. La Antigüedad varía de 0 a 40 con una media
de 7.01. La Antigüedad_Cargo varía de 0 a 18 con una media
de 4.23. Los Años_ultima_promoción varían de 0 a 15 con una
media de 2.19. Los Años_acargo_con_mismo_jefe varían de 0 a
17 con una media de 4.12.
Estos resultados proporcionan una visión general de la distribución de las variables en el conjunto de datos.
# Gráfico de pastel con plotly
p <- plot_ly(df, labels = ~Rotación, type = "pie") %>%
layout(title = "Rotación")
p
Se evidencia a nivel proporcional que solo el 16.1% de los empleados de la compañía realizan rotación, los demás suelen permanecer.
# Aumentamos el tamaño de la figura
options(repr.plot.width=10, repr.plot.height=8)
# Creamos los gráficos ggplot
g1 <- ggplot(df, aes(x = Viaje_Negocios)) +
geom_bar() +
labs(title = "Viaje de Negocios") +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) # Rotamos las etiquetas del eje x
g2 <- ggplot(df, aes(x = Departamento)) +
geom_bar() +
labs(title = "Departamento") +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) # Rotamos las etiquetas del eje x
g3 <- ggplot(df, aes(x = Estado_Civil)) +
geom_bar() +
labs(title = "Estado Civil") +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) # Rotamos las etiquetas del eje x
g4 <- ggplot(df, aes(x = Edad)) +
geom_histogram(binwidth = 5) +
labs(title = "Edad")
g5 <- ggplot(df, aes(x = Distancia_Casa)) +
geom_histogram(binwidth = 5) +
labs(title = "Distancia desde Casa")
g6 <- ggplot(df, aes(x = Ingreso_Mensual)) +
geom_histogram(binwidth = 500) +
labs(title = "Ingreso Mensual")
# Creamos la grilla de gráficos
grid.arrange(g1, g2, g3, g4, g5, g6, nrow = 2)
Se observa que los empleados no son precisamente de estar viajando por
negocios ya que raramente lo hacen, que el departamento con menos
empleado es RH, que en estado civil lo más común es encontrar empleados
casados, seguidos de solteros. respecto a la edad, esta alcanza a tener
una forma algo simetrica cuya media y mediana estarían entre los 30 y 40
años de edad, la distancia desde casa muestra con una asimetría hacia la
izquierda que los empleados suelen vivir a más de 10 kilometros de la
oficina, finalmente los ingresos mensuales en dólares muestra nuevamente
asimetría hacía la izquierda, dando a entender que los empleados no
suelen ganar en la compañía más de 5000 dólares al mes siendo más pocos
los que ganan más de esa cifra.
# Calculamos el número y el porcentaje de valores faltantes por variable
df %>%
summarise_all(function(x) mean(is.na(x))) %>%
gather(key = "Variable", value = "Porcentaje") %>%
mutate(Porcentaje = Porcentaje * 100)
## Variable Porcentaje
## 1 Rotación 0
## 2 Edad 0
## 3 Viaje_Negocios 0
## 4 Departamento 0
## 5 Distancia_Casa 0
## 6 Educación 0
## 7 Campo_Educación 0
## 8 Satisfacción_Ambiental 0
## 9 Genero 0
## 10 Cargo 0
## 11 Satisfación_Laboral 0
## 12 Estado_Civil 0
## 13 Ingreso_Mensual 0
## 14 Trabajos_Anteriores 0
## 15 Horas_Extra 0
## 16 Porcentaje_aumento_salarial 0
## 17 Rendimiento_Laboral 0
## 18 Años_Experiencia 0
## 19 Capacitaciones 0
## 20 Equilibrio_Trabajo_Vida 0
## 21 Antigüedad 0
## 22 Antigüedad_Cargo 0
## 23 Años_ultima_promoción 0
## 24 Años_acargo_con_mismo_jefe 0
# Convertimos la variable Rotación a numérica
df$Rotación <- as.numeric(as.character(df$Rotación))
# Seleccionamos las variables numéricas
df_num <- df %>% select_if(is.numeric)
# Calculamos la matriz de correlación de Spearman
cor_num <- cor(df_num, method = "spearman")
# Convertimos la matriz de correlación a un dataframe para el gráfico
cor_num_melt <- melt(cor_num)
# Creamos el gráfico de correlación con plotly
p <- plot_ly(cor_num_melt, x = ~Var1, y = ~Var2, z = ~value, type = "heatmap") %>%
layout(title = "Correlación de Spearman para variables numéricas",
xaxis = list(title = ""),
yaxis = list(title = ""))
p
# Convertimos la variable Rotación a numérica
df$Rotación <- as.factor(df$Rotación)
# Seleccionamos las variables categóricas
df_cat <- df %>% select_if(is.factor)
# Calculamos la matriz de contingencia de Cramér
assoc_mat <- matrix(0, ncol = ncol(df_cat), nrow = ncol(df_cat))
for(i in 1:ncol(df_cat)) {
for(j in 1:ncol(df_cat)) {
assoc_mat[i,j] <- assocstats(table(df_cat[,i], df_cat[,j]))$cramer
}
}
rownames(assoc_mat) <- colnames(df_cat)
colnames(assoc_mat) <- colnames(df_cat)
# Creamos el gráfico de correlación con corrplot
corrplot(assoc_mat, method = "color")
Tras analizar las correlaciones entre las variables, se observa que
las variables cuantitativas que presentan mayor relación con la variable
Rotación son Distancia_Casa y
Trabajos_Anteriores. En cuanto a las variables categóricas,
las que guardan mayor relación con Rotación son
Cargo, Estado_Civil y
Horas_Extra. Aunque estas correlaciones son mínimas,
podrían tener un impacto significativo en la construcción de un modelo
de clasificación.
Es importante mencionar que se podría considerar la eliminación de
ciertas variables al evaluar un modelo. Por ejemplo, la variable
Años_Experiencia presenta una correlación media y alta con
las variables Edad e Ingreso_Mensual,
respectivamente. Asimismo, las variables Antigüedad_Cargo y
Años_acargo_con_mismo_jefe podrían eliminarse debido a su
alta correlación entre ellas y con la variable
Antigüedad.
En el caso de las variables categóricas, las variables
Departamento y Campo_Educación podrían
eliminarse debido a su alta correlación con la variable
Cargo.
La eliminación de estas variables se sugiere debido a que las altas correlaciones entre las variables podrían generar problemas de multicolinealidad en la construcción de un modelo, algo a considerar para generar un buen modelo tanto explicativo como predictivo.
# Ajustamos el modelo de regresión logística
modelo <- glm(Rotación ~ ., data = df, family = binomial)
# Obtenemos un resumen del modelo
summary(modelo)
##
## Call:
## glm(formula = Rotación ~ ., family = binomial, data = df)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 1.180e-01 1.369e+00 0.086 0.931294
## Edad -3.541e-02 1.352e-02 -2.620 0.008801 **
## Viaje_NegociosNo_Viaja -1.798e+00 4.102e-01 -4.383 1.17e-05 ***
## Viaje_NegociosRaramente -7.992e-01 2.101e-01 -3.803 0.000143 ***
## DepartamentoRH -1.275e+01 3.808e+02 -0.033 0.973286
## DepartamentoVentas -7.286e-02 1.036e+00 -0.070 0.943941
## Distancia_Casa 4.501e-02 1.061e-02 4.243 2.21e-05 ***
## Educación2 1.132e-01 3.209e-01 0.353 0.724313
## Educación3 1.502e-01 2.832e-01 0.530 0.595817
## Educación4 -2.829e-02 3.091e-01 -0.092 0.927093
## Educación5 -1.863e-01 5.976e-01 -0.312 0.755201
## Campo_EducaciónHumanidades 8.711e-01 7.989e-01 1.090 0.275525
## Campo_EducaciónMercadeo 4.660e-01 3.261e-01 1.429 0.153008
## Campo_EducaciónOtra 1.149e-01 4.115e-01 0.279 0.780111
## Campo_EducaciónSalud -6.886e-02 2.154e-01 -0.320 0.749211
## Campo_EducaciónTecnicos 9.194e-01 3.027e-01 3.038 0.002384 **
## Satisfacción_Ambiental2 -9.586e-01 2.675e-01 -3.583 0.000340 ***
## Satisfacción_Ambiental3 -1.230e+00 2.496e-01 -4.927 8.35e-07 ***
## Satisfacción_Ambiental4 -1.363e+00 2.509e-01 -5.433 5.55e-08 ***
## GeneroM 3.315e-01 1.831e-01 1.811 0.070170 .
## CargoDirector_Manofactura 1.224e+00 9.655e-01 1.267 0.204981
## CargoEjecutivo_Ventas 2.067e+00 1.390e+00 1.487 0.137007
## CargoGerente 1.195e+00 1.020e+00 1.172 0.241054
## CargoInvestigador_Cientifico 1.540e+00 1.021e+00 1.508 0.131557
## CargoRecursos_Humanos 1.495e+01 3.808e+02 0.039 0.968685
## CargoRepresentante_Salud 9.120e-01 9.621e-01 0.948 0.343146
## CargoRepresentante_Ventas 3.142e+00 1.487e+00 2.113 0.034636 *
## CargoTecnico_Laboratorio 2.480e+00 1.017e+00 2.439 0.014743 *
## Satisfación_Laboral2 -6.577e-01 2.679e-01 -2.455 0.014084 *
## Satisfación_Laboral3 -6.875e-01 2.380e-01 -2.889 0.003867 **
## Satisfación_Laboral4 -1.356e+00 2.557e-01 -5.303 1.14e-07 ***
## Estado_CivilDivorciado -4.003e-01 2.564e-01 -1.561 0.118422
## Estado_CivilSoltero 1.040e+00 1.988e-01 5.230 1.70e-07 ***
## Ingreso_Mensual 5.184e-06 5.989e-05 0.087 0.931020
## Trabajos_Anteriores 1.696e-01 3.795e-02 4.470 7.83e-06 ***
## Horas_Extra1 1.923e+00 1.908e-01 10.078 < 2e-16 ***
## Porcentaje_aumento_salarial -1.691e-02 3.861e-02 -0.438 0.661427
## Rendimiento_Laboral4 1.239e-01 3.970e-01 0.312 0.754915
## Años_Experiencia -5.843e-02 2.860e-02 -2.043 0.041075 *
## Capacitaciones -1.791e-01 7.200e-02 -2.487 0.012870 *
## Equilibrio_Trabajo_Vida2 -9.431e-01 3.560e-01 -2.649 0.008070 **
## Equilibrio_Trabajo_Vida3 -1.378e+00 3.344e-01 -4.121 3.78e-05 ***
## Equilibrio_Trabajo_Vida4 -1.000e+00 4.081e-01 -2.451 0.014264 *
## Antigüedad 9.533e-02 3.811e-02 2.501 0.012371 *
## Antigüedad_Cargo -1.324e-01 4.474e-02 -2.960 0.003075 **
## Años_ultima_promoción 1.826e-01 4.170e-02 4.380 1.19e-05 ***
## Años_acargo_con_mismo_jefe -1.652e-01 4.661e-02 -3.545 0.000392 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 1298.58 on 1469 degrees of freedom
## Residual deviance: 874.33 on 1423 degrees of freedom
## AIC: 968.33
##
## Number of Fisher Scoring iterations: 14
Este es el resultado de un modelo de regresión logística, que se
utiliza para predecir la probabilidad de la variable de respuesta
binaria Rotación en función de varias variables
predictoras.
Estimate: Son los coeficientes de regresión
logística para cada variable predictora. Un coeficiente positivo indica
que a medida que la variable predictora aumenta, la probabilidad
logarítmica de Rotación = 1 (sí rotación) también aumenta,
manteniendo constantes todas las demás variables. Un coeficiente
negativo indica que a medida que la variable predictora aumenta, la
probabilidad logarítmica de Rotación = 1 disminuye,
manteniendo constantes todas las demás variables.
Std. Error: Esta es la desviación estándar de los coeficientes de regresión. Cuanto más pequeño sea este valor, más precisa será la estimación del coeficiente.
z value: Este es el valor z, que se calcula dividiendo el coeficiente de regresión entre el error estándar. Se utiliza para probar la hipótesis nula de que el coeficiente de la variable predictora es cero (es decir, la variable no tiene efecto sobre la respuesta).
Pr(>|z|): Este es el valor p asociado con el valor z. Un valor p pequeño (generalmente menor a 0.05) indica que puedes rechazar la hipótesis nula y concluir que la variable predictora tiene un efecto significativo sobre la respuesta.
Con base a estos resultados, las variables que parecen ser
determinantes de la Rotación (es decir, tienen un valor p
menor a 0.05) son Edad, Viaje_Negocios (tanto
para No_Viaja como para Raramente),
Distancia_Casa, Campo_EducaciónTecnicos,
Satisfacción_Ambiental (para los niveles 2, 3 y 4),
Estado_CivilSoltero, Trabajos_Anteriores,
Horas_Extra1, Años_Experiencia,
Capacitaciones, Equilibrio_Trabajo_Vida (para
los niveles 2, 3 y 4), Antigüedad,
Antigüedad_Cargo, Años_ultima_promoción y
Años_acargo_con_mismo_jefe.
Ahora, según los resultados del modelo de regresión logística, se puede evaluar si se cumplen las hipótesis planteadas para las primeras seis variables:
Variables categóricas:
- Viaje_Negocios: Los coeficientes para
No_Viaja y Raramente son negativos y
significativos, lo que indica que los empleados que viajan raramente o
no viajan tienen menos probabilidades de rotar. Esto contradice la
hipótesis de que los empleados que viajan con frecuencia tienen más
probabilidades de rotar.
- Departamento: Los coeficientes para
RH y Ventas no son significativos, lo que
sugiere que no hay una diferencia significativa en la rotación entre los
departamentos. Esto contradice la hipótesis de que algunos departamentos
tienen tasas de rotación más altas que otros.
- Estado Civil: El coeficiente para
Soltero es positivo y significativo, lo que indica que los
empleados solteros tienen más probabilidades de rotar. Esto respalda la
hipótesis de que los empleados solteros tienen más probabilidades de
rotar que los casados.
Variables cuantitativas:
- Edad: El coeficiente es negativo y
significativo, lo que indica que a medida que la edad aumenta, la
probabilidad de rotación disminuye. Esto respalda la hipótesis de que
los empleados más jóvenes tienen más probabilidades de rotar que los
mayores.
- Distancia_Casa: El coeficiente es
positivo y significativo, lo que indica que a medida que la distancia a
casa aumenta, la probabilidad de rotación también aumenta. Esto respalda
la hipótesis de que los empleados que viven más lejos tienen más
probabilidades de rotar.
- Ingreso_Mensual: El coeficiente no es
significativo, lo que sugiere que el ingreso mensual no tiene un efecto
significativo sobre la rotación. Esto contradice la hipótesis de que los
empleados con salarios más bajos tienen más probabilidades de rotar.
La idea ahora es construir el modelo usando solo las 6 variables anteriores, teniendo en cuenta un conjunto de entrenamiento del 70% y un 30% de los datos serán usados para pruebas:
# Definimos las variables predictoras
predictores <- c("Edad", "Viaje_Negocios", "Departamento", "Estado_Civil", "Distancia_Casa", "Ingreso_Mensual")
# Creamos un conjunto de datos con solo las variables de interés
df_modelo <- df[, c("Rotación", predictores)]
# Convertimos la variable Rotación a factor
df_modelo$Rotación <- as.factor(df_modelo$Rotación)
# Creamos los conjuntos de entrenamiento y prueba
set.seed(123) # Para reproducibilidad
indices <- createDataPartition(df_modelo$Rotación, p = 0.7, list = FALSE)
datos_entrenamiento <- df_modelo[indices, ]
datos_prueba <- df_modelo[-indices, ]
# Ajustamos el modelo de regresión logística con validación cruzada
ctrl <- trainControl(method = "cv", number = 10)
modelo <- train(Rotación ~ ., data = datos_entrenamiento, method = "glm", family = "binomial", trControl = ctrl)
# Imprimimos un resumen del modelo
summary(modelo)
##
## Call:
## NULL
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -6.896e-01 4.640e-01 -1.486 0.137254
## Edad -2.087e-02 1.209e-02 -1.725 0.084481 .
## Viaje_NegociosNo_Viaja -1.965e+00 4.649e-01 -4.226 2.38e-05 ***
## Viaje_NegociosRaramente -7.422e-01 2.065e-01 -3.595 0.000325 ***
## DepartamentoRH 7.481e-01 3.976e-01 1.882 0.059896 .
## DepartamentoVentas 6.427e-01 1.943e-01 3.308 0.000940 ***
## Estado_CivilDivorciado 1.316e-01 2.622e-01 0.502 0.615675
## Estado_CivilSoltero 1.039e+00 2.041e-01 5.094 3.51e-07 ***
## Distancia_Casa 3.658e-02 1.079e-02 3.391 0.000697 ***
## Ingreso_Mensual -1.115e-04 3.146e-05 -3.543 0.000395 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 909.69 on 1029 degrees of freedom
## Residual deviance: 795.92 on 1020 degrees of freedom
## AIC: 815.92
##
## Number of Fisher Scoring iterations: 5
Los coeficientes del modelo de regresión logística representan el
cambio en el logaritmo de las odds de la variable de respuesta
(Rotación) por cada unidad de cambio en la variable
predictora, manteniendo constantes todas las demás variables.
Edad: El coeficiente es -0.02087, lo que indica
que a medida que la Edad aumenta en una unidad, el
logaritmo de las odds de Rotación disminuye en 0.02087,
manteniendo constantes todas las demás variables. Sin embargo, el valor
p es 0.084481, que es mayor que 0.05, por lo que este resultado no es
estadísticamente significativo al nivel del 5%.
Viaje de Negocios: Los coeficientes para
No_Viaja y Raramente son -1.965 y -0.7422
respectivamente, lo que indica que los empleados que no viajan o viajan
raramente tienen menos probabilidades de rotar. Ambos resultados son
estadísticamente significativos con valores p menores a 0.05.
Departamento: Los coeficientes para
RH y Ventas son 0.7481 y 0.6427
respectivamente. Esto sugiere que los empleados en el departamento de
RH y Ventas tienen más probabilidades de
rotar. Sin embargo, solo el resultado para Ventas es
estadísticamente significativo con un valor p menor a 0.05.
Estado Civil: El coeficiente para
Soltero es 1.039, lo que indica que los empleados solteros
tienen más probabilidades de rotar. Este resultado es estadísticamente
significativo con un valor p menor a 0.05.
Distancia_Casa: El coeficiente es 0.03658, lo
que indica que a medida que la Distancia_Casa aumenta en
una unidad, el logaritmo de las odds de Rotación aumenta en
0.03658, manteniendo constantes todas las demás variables. Este
resultado es estadísticamente significativo con un valor p menor a
0.05.
Ingreso_Mensual: El coeficiente es -0.0001115,
lo que indica que a medida que el Ingreso_Mensual aumenta
en una unidad, el logaritmo de las odds de Rotación
disminuye en 0.0001115, manteniendo constantes todas las demás
variables. Este resultado es estadísticamente significativo con un valor
p menor a 0.05.
Frente al AIC del modelo contra el del modelo completo, este es mucho menor por lo que este sería un modelo mejor ajustado a los datos que el modelo completo, una selección de variables podría ayudar a determinar un mejor modelo para clasificar entonces si un empleado rotaría o no.
print(modelo)
## Generalized Linear Model
##
## 1030 samples
## 6 predictor
## 2 classes: '0', '1'
##
## No pre-processing
## Resampling: Cross-Validated (10 fold)
## Summary of sample sizes: 927, 928, 928, 927, 927, 927, ...
## Resampling results:
##
## Accuracy Kappa
## 0.8437492 0.1176451
1030 samples: Muestra que el conjunto de entrenamiento consta de 1030 observaciones (o filas).
6 predictor: Muestra que se han utilizado 6 variables predictoras (o características) para construir el modelo.
2 classes: ‘0’, ‘1’: Indica que la variable de
respuesta Rotación es binaria, con dos clases posibles: ‘0’
(no rotación) y ‘1’ (sí rotación).
No pre-processing: Esto indica que no se ha realizado ningún preprocesamiento en los datos antes de ajustar el modelo.
Resampling: Cross-Validated (10 fold): Muestra que se ha utilizado la validación cruzada de 10 pliegues para evaluar el modelo. En la validación cruzada de 10 pliegues, los datos se dividen en 10 subconjuntos de aproximadamente el mismo tamaño. Luego, el modelo se entrena 10 veces, cada vez utilizando 9 subconjuntos como datos de entrenamiento y el subconjunto restante como datos de prueba.
Accuracy: 0.8437492: La precisión es una medida de cuántas predicciones el modelo acertó. Una precisión de 0.8437492 significa que el modelo acertó aproximadamente el 84.37% de las predicciones.
Kappa: 0.1176451: El coeficiente kappa es una medida de la precisión de la clasificación que tiene en cuenta el acuerdo debido al azar. Un valor de kappa de 0.1176451 indica un acuerdo leve más allá del azar.
# Predecimos las probabilidades en el conjunto de prueba
probabilidades <- predict(modelo, newdata = datos_prueba, type = "prob")
# Creamos el objeto ROC
roc_obj <- roc(datos_prueba$Rotación, probabilidades[,2])
## Setting levels: control = 0, case = 1
## Setting direction: controls < cases
# Imprimimos el AUC
cat("AUC: ", auc(roc_obj), "\n")
## AUC: 0.6731173
# Creamos el gráfico de la curva ROC con ggplot2
df_roc <- data.frame(
FPR = roc_obj$specificities,
TPR = roc_obj$sensitivities
)
ggplot(df_roc, aes(x = FPR, y = TPR)) +
geom_line() +
labs(x = "1 - Especificidad (Tasa de Falsos Positivos)",
y = "Sensibilidad (Tasa de Verdaderos Positivos)",
title = "Curva ROC") +
theme_minimal()
Un AUC de 0.6731173 sugiere que el modelo tiene una capacidad razonable para distinguir entre las dos clases. Sin embargo, este valor está lejos de ser perfecto (1), lo que indica que hay margen para mejorar el modelo.
Ahora se evalúa la predicción para ello, primero, se definen los valores de las variables predictoras para el individuo hipotético. Luego, se usa el modelo para predecir la probabilidad de que este individuo rote. Finalmente, se define un umbral de corte para decidir si se debe intervenir o no.
# Se definen los valores de las variables predictoras para el individuo hipotético
individuo_hipotetico <- data.frame(
Edad = 30,
Viaje_Negocios = 'Raramente',
Departamento = "Ventas",
Estado_Civil = "Casado",
Distancia_Casa = 10,
Ingreso_Mensual = 5000
)
# Se usa el modelo para predecir la probabilidad de que este individuo rote
probabilidad_rotacion <- predict(modelo, newdata = individuo_hipotetico, type = "prob")[,2]
# Probabilidad de rotación
cat("Probabilidad de rotación: ", probabilidad_rotacion, "\n")
## Probabilidad de rotación: 0.1670439
# Umbral de corte
umbral_corte <- 0.5
# Decide si se debe intervenir o no
if (probabilidad_rotacion > umbral_corte) {
cat("La probabilidad de rotación es mayor que el umbral de corte. Se recomienda intervenir.\n")
} else {
cat("La probabilidad de rotación es menor que el umbral de corte. No se recomienda intervenir.\n")
}
## La probabilidad de rotación es menor que el umbral de corte. No se recomienda intervenir.
Se realizó un análisis utilizando un modelo de regresión logística para predecir la rotación de los empleados. El modelo demostró un rendimiento razonablemente bueno, con un AUC de 0.6731173, lo que indica una capacidad decente para distinguir entre los empleados que rotan y los que no. Sin embargo, este valor está lejos de ser perfecto, lo que sugiere que hay margen para mejorar el modelo. Los factores más influyentes en la rotación de los empleados, según el modelo, parecen ser el estado civil, la edad, la distancia a casa y si el empleado viaja por negocios o no.
Además, el modelo demostró una precisión del 84.37% en la validación cruzada de 10 pliegues, lo que es bastante alto. Sin embargo, el valor de Kappa es relativamente bajo, lo que indica que el modelo podría estar clasificando la mayoría de las observaciones en la clase mayoritaria. Esto sugiere que, aunque el modelo tiene una alta precisión general, podría no estar tan bien en la clasificación de la clase minoritaria, es decir, los empleados que rotan.
En cuanto al AIC del modelo, un valor más bajo indica un mejor ajuste del modelo a los datos. Por lo tanto, el hecho de que el AIC de este modelo sea mucho menor que el del modelo completo sugiere que este modelo es un mejor ajuste a los datos. Sin embargo, siempre es importante recordar que un buen ajuste del modelo a los datos de entrenamiento no garantiza necesariamente un buen rendimiento en datos nuevos o no vistos. Por lo tanto, siempre es una buena práctica validar el rendimiento del modelo en un conjunto de datos de prueba independiente.
Según los resultados obtenidos del modelo, se pueden sugerir las siguientes estrategias para disminuir la rotación en la empresa:
Viajes de Negocios: Dado que los empleados que viajan raramente o no viajan tienen menos probabilidades de rotar, la empresa podría considerar reducir la frecuencia de los viajes de negocios o buscar alternativas, como las reuniones virtuales. Esto podría ayudar a disminuir el estrés asociado con los viajes frecuentes y, por lo tanto, reducir la rotación, en empleados que si viajan.
Edad: Como la probabilidad de rotación disminuye con la edad, la empresa podría considerar estrategias para retener a los empleados más jóvenes. Esto podría incluir programas de mentoría, oportunidades de desarrollo profesional o un camino claro de progresión de carrera.
Distancia a Casa: Dado que la probabilidad de rotación aumenta con la distancia a casa, la empresa podría considerar estrategias para ayudar a los empleados que viven más lejos. Esto podría incluir opciones de trabajo flexible, como el trabajo remoto, o asistencia con el transporte.
Estado Civil: Como los empleados solteros tienen más probabilidades de rotar, la empresa podría considerar estrategias específicas para este grupo. Esto podría incluir la creación de un ambiente de trabajo más inclusivo y social que pueda ayudar a los empleados solteros a sentirse más conectados con la empresa.
Estas estrategias deben ser consideradas como sugerencias y adaptadas según las necesidades específicas de la empresa. Además, siempre es una buena práctica validar cualquier estrategia con datos antes de su implementación completa.