En el entorno empresarial actual, la rotación de empleados es un fenómeno frecuente que puede afectar la productividad y el ambiente laboral de una organización. Por ello, es crucial identificar y anticipar los factores que influyen en los cambios de puesto entre los empleados.
Una empresa ha reunido datos históricos sobre su personal, incluyendo información como la duración en el puesto actual, nivel de satisfacción laboral, salario, edad, entre otros factores. Con esta información, la empresa busca crear un modelo de regresión logística.
El propósito del modelo es predecir la probabilidad de que un empleado cambie de cargo en el próximo período, y determinar qué variables influyen más en este comportamiento. Esto permitirá a la empresa implementar estrategias para retener a su talento clave, mejorar la gestión de recursos humanos y promover un ambiente laboral más estable.
La predicción de la rotación de empleados permitirá a la empresa tomar decisiones estratégicas mejor informadas, ayudando a mantener un equipo comprometido y satisfecho en sus funciones. El objetivo final es que el modelo de regresión logística sea una herramienta clave para la gestión de recursos humanos.
library(paqueteMETODOS)
library(devtools)
library(tidyverse)
library(skimr)
library(car)
library(plotly)
library(ggpubr)
library(gridExtra)
library(reshape2)
library(corrplot)
library(vcd)
library(caret)
library(pROC)
library(GGally)
library(car)
library(bestNormalize)
library(stargazer)
library(lmtest)
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, …
Algunas variables, aunque numéricas, deben tratarse como categorías, por lo que se transforman en tipo factor, tambien se renombrara una variable para un mejor manejo.
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)
)
df <- rename(df, Viaje_Negocios = `Viaje de Negocios`)
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_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:
Viaje de Negocios: La frecuencia de los viajes
puede afectar la rotación. Los empleados que viajan con frecuencia
podrían estar más propensos a rotar debido al estrés o desequilibrio
entre vida laboral y personal.
Hipótesis: Los empleados que viajan con más frecuencia tienden
a rotar más.
Departamento: La rotación puede variar entre
departamentos por diferencias en la cultura laboral o
expectativas.
Hipótesis: Algunos departamentos presentan mayores tasas de
rotación que otros.
Estado_Civil: El estado civil podría influir en
la rotación, ya que los empleados solteros podrían tener más
flexibilidad para cambiar de trabajo.
Hipótesis: Los empleados solteros tienen mayor probabilidad de
rotar que los casados.
Variables cuantitativas:
Edad: Los empleados más jóvenes podrían estar
más inclinados a cambiar de trabajo para buscar nuevas
oportunidades.
Hipótesis: Los empleados jóvenes tienen mayor probabilidad de
rotar.
Distancia_Casa: Aquellos que viven lejos de la
oficina podrían buscar empleo más cercano.
Hipótesis: Los empleados que viven lejos tienen más
probabilidades de rotar.
Ingreso_Mensual: Los empleados con salarios más
bajos podrían estar más motivados a cambiar de trabajo para ganar
más.
Hipótesis: Los empleados con ingresos más bajos tienden a rotar
con mayor frecuencia.
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 ofrecen un panorama general sobre cómo se distribuyen las variables en el conjunto de datos.
# Gráfico de pastel con plotly
p <- plot_ly(df, labels = ~Rotación, type = "pie",
marker = list(colors = c("#E63946", "#4CAF50"))) %>%
layout(title = "Rotación")
p
A nivel proporcional, se observa que únicamente el 16.1% de los empleados de la empresa presenta rotación, mientras que la mayoría tiende a quedarse.
# 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, fill = Viaje_Negocios)) +
geom_bar(show.legend = FALSE) +
labs(title = "Viaje de Negocios") +
scale_fill_manual(values = palette()) + # Colores personalizados
theme(axis.text.x = element_text(angle = 45, hjust = 1))
g2 <- ggplot(df, aes(x = Departamento, fill = Departamento)) +
geom_bar(show.legend = FALSE) +
labs(title = "Departamento") +
scale_fill_manual(values = palette()) + # Colores personalizados
theme(axis.text.x = element_text(angle = 45, hjust = 1))
g3 <- ggplot(df, aes(x = Estado_Civil, fill = Estado_Civil)) +
geom_bar(show.legend = FALSE) +
labs(title = "Estado Civil") +
scale_fill_manual(values = palette()) + # Colores personalizados
theme(axis.text.x = element_text(angle = 45, hjust = 1))
g4 <- ggplot(df, aes(x = Edad)) +
geom_histogram(binwidth = 5, fill = "#007BFF", color = "black") + # Color del histograma
labs(title = "Edad")
g5 <- ggplot(df, aes(x = Distancia_Casa)) +
geom_histogram(binwidth = 5, fill = "#FF5722", color = "black") + # Color del histograma
labs(title = "Distancia desde Casa")
g6 <- ggplot(df, aes(x = Ingreso_Mensual)) +
geom_histogram(binwidth = 500, fill = "#4CAF50", color = "black") + # Color del histograma
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 suelen viajar con frecuencia por negocios, ya que esto ocurre raramente. Además, el departamento con menos personal es RH, y la mayoría de los empleados están casados, seguidos por los solteros. En cuanto a la edad, la distribución es algo simétrica, con una media y mediana que se sitúan entre los 30 y 40 años. La distancia desde el hogar muestra una asimetría hacia la izquierda, indicando que la mayoría de los empleados vive a más de 10 kilómetros de la oficina. Por último, los ingresos mensuales en dólares también presentan una asimetría hacia la izquierda, lo que sugiere que pocos empleados ganan más de 5,000 dólares al mes.
En cuanto a los datos faltantes tenemos:
# 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")
Después de analizar las correlaciones entre las variables, se encuentra que las variables cuantitativas con mayor relación con la variable de rotación son Distancia_Casa y Trabajos_Anteriores. En el caso de las variables categóricas, las que muestran una mayor relación con la rotación son Cargo, Estado_Civil y Horas_Extra. Aunque estas correlaciones son relativamente bajas, podrían tener un efecto significativo en la creación de un modelo de clasificación.
Es relevante mencionar que, al evaluar un modelo, se podría considerar la eliminación de ciertas variables. Por ejemplo, la variable Años_Experiencia muestra una correlación media a alta con Edad e Ingreso_Mensual. Asimismo, las variables Antigüedad_Cargo y Años_a_cargo_con_mismo_jefe podrían eliminarse debido a su alta correlación entre sí y con la variable Antigüedad.
En cuanto a las variables categóricas, se sugiere eliminar Departamento y Campo_Educación por su alta correlación con la variable Cargo.
La eliminación de estas variables es recomendable para evitar problemas de multicolinealidad en la construcción del modelo, lo cual es fundamental para desarrollar un modelo efectivo tanto explicativo como predictivo.
Modelación:
# 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 emplea para estimar la probabilidad de la variable de respuesta binaria Rotación en función de diferentes variables predictivas.
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.
A partir de estos resultados, las variables que parecen ser clave para la Rotación (es decir, aquellas con un valor p menor a 0.05) son: Edad, Viaje_Negocios (tanto en las categorías No_Viaja como Raramente), Distancia_Casa, Campo_Educación_Tecnicos, Satisfacción_Ambiental (en los niveles 2, 3 y 4), Estado_Civil_Soltero, Trabajos_Anteriores, Horas_Extra_1, Años_Experiencia, Capacitaciones, Equilibrio_Trabajo_Vida (en los niveles 2, 3 y 4), Antigüedad, Antigüedad_Cargo, Años_última_promoción y Años_a_cargo_con_mismo_jefe.
Con base en los resultados del modelo de regresión logística, se puede analizar si las hipótesis formuladas para las primeras seis variables son válidas.
Variables categóricas:
Viaje_Negocios: Los coeficientes para las categorías No_Viaja y Raramente son negativos y significativos, lo que indica que los empleados que viajan poco o no viajan tienen menores probabilidades de rotar. Esto contradice la hipótesis de que los empleados que viajan con frecuencia son más propensos a rotar.
Departamento: Los coeficientes para RH y Ventas no son significativos, lo que sugiere que no hay diferencias importantes en la rotación entre los departamentos. Esto contradice la hipótesis de que algunos departamentos tienen tasas de rotación más elevadas que otros.
Estado Civil: El coeficiente para Soltero es positivo y significativo, lo que indica que los empleados solteros son más propensos a rotar. Esto respalda la hipótesis de que los empleados solteros tienen más probabilidades de rotar en comparación con los casados.
Variables cuantitativas:
Edad: El coeficiente es negativo y significativo, lo que sugiere que a medida que aumenta la edad, la probabilidad de rotación disminuye. Esto apoya 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 mayor distancia desde el hogar, mayor es la probabilidad de rotación. Esto respalda la hipótesis de que los empleados que viven más lejos tienden a rotar más.
Ingreso_Mensual: El coeficiente no es significativo, lo que sugiere que el ingreso mensual no afecta de manera relevante la rotación. Esto contradice la hipótesis de que los empleados con salarios más bajos tienen más probabilidades de rotar.
El objetivo ahora es desarrollar el modelo utilizando únicamente las 6 variables mencionadas anteriormente, considerando que el 70% de los datos se destinará al conjunto de entrenamiento y el 30% restante se utilizará para las 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(429) # 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) -5.654e-01 4.499e-01 -1.257 0.208858
## Edad -1.577e-02 1.139e-02 -1.384 0.166273
## Viaje_NegociosNo_Viaja -1.541e+00 4.357e-01 -3.538 0.000403 ***
## Viaje_NegociosRaramente -6.247e-01 2.051e-01 -3.045 0.002326 **
## DepartamentoRH 2.434e-01 4.431e-01 0.549 0.582753
## DepartamentoVentas 5.153e-01 1.902e-01 2.709 0.006744 **
## Estado_CivilDivorciado -2.725e-01 2.650e-01 -1.028 0.303871
## Estado_CivilSoltero 7.115e-01 1.961e-01 3.627 0.000286 ***
## Distancia_Casa 2.944e-02 1.055e-02 2.791 0.005248 **
## Ingreso_Mensual -1.175e-04 3.029e-05 -3.880 0.000105 ***
## ---
## 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: 818.96 on 1020 degrees of freedom
## AIC: 838.96
##
## 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.01577, 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.166273, 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.541 y -0.6247 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.2434 y 0.5153 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 0.7115, 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.02944, 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.02944, 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.0001175, 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.0001175, manteniendo constantes todas las demás variables. Este resultado es estadísticamente significativo con un valor p menor a 0.05.
En comparación con el AIC del modelo completo, el AIC de este modelo es considerablemente más bajo, lo que indica que está mejor ajustado a los datos. Esto sugiere que una selección de variables podría contribuir a identificar un modelo más efectivo para clasificar si un empleado rotará 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, 927, 927, 928, 927, 927, ...
## Resampling results:
##
## Accuracy Kappa
## 0.8446825 0.07759804
1030 samples: Indica que el conjunto de entrenamiento está compuesto por 1030 observaciones (o filas).
6 predictor: Significa 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 posibles clases: ‘0’ (no rotación) y ‘1’ (sí rotación).
No pre-processing: Esto señala que no se ha realizado ningún tipo de preprocesamiento en los datos antes de ajustar el modelo.
Resampling: Cross-Validated (10 fold): Esto muestra que se ha implementado validación cruzada de 10 pliegues para evaluar el modelo. En este enfoque, los datos se dividen en 10 subconjuntos de tamaño aproximadamente igual. Luego, el modelo se entrena 10 veces, utilizando 9 subconjuntos como datos de entrenamiento y el restante como datos de prueba.
Accuracy: 0.8446825: La precisión mide cuántas predicciones fueron correctas. Una precisión de 0.8446825 significa que el modelo acertó aproximadamente el 84.47% de las predicciones.
Kappa: 0.07759804: El coeficiente Kappa evalúa la precisión de la clasificación considerando el acuerdo aleatorio. Un valor de kappa de 0.07759804 Indica que hay un acuerdo menor al que se esperaría por azar.
# Predecimos las probabilidades en el conjunto de prueba
probs <- predict(modelo, newdata = datos_prueba, type = "prob")
# Creamos el objeto ROC
roc_obj <- roc(datos_prueba$Rotación, probs[,2])
## Setting levels: control = 0, case = 1
## Setting direction: controls < cases
# Imprimimos el AUC
cat("AUC: ", auc(roc_obj), "\n")
## AUC: 0.7435017
# Creamos el gráfico de la curva ROC con ggplot2
df_roc <- data.frame(
FPR = roc_obj$specificities,
TPR = roc_obj$sensitivities
)
roc_plot <- ggplot(df_roc, aes(x = FPR, y = TPR)) +
geom_line(color = "blue") +
labs(x = "1 - Especificidad (Tasa de Falsos Positivos)",
y = "Sensibilidad (Tasa de Verdaderos Positivos)",
title = "Curva ROC") +
theme_minimal()
# Convertimos el gráfico a un gráfico interactivo con plotly
roc_plotly <- ggplotly(roc_plot)
# Mostramos el gráfico interactivo
roc_plotly
El AUC de 0.7435017 indica que el modelo es relativamente eficaz para diferenciar entre las dos clases, pero aún está lejos de alcanzar una perfección (1), lo que sugiere que hay oportunidades para mejorar su desempeño.
Se llevó a cabo un análisis utilizando un modelo de regresión logística para predecir la rotación de empleados. Los resultados mostraron un rendimiento razonablemente bueno, con un AUC de 0.7435017, lo que indica una capacidad decente para diferenciar entre empleados que rotan y los que no. Sin embargo, este valor aún está lejos de ser ideal, sugiriendo que hay oportunidades para mejorar el modelo. Según el análisis, los factores más determinantes en la rotación de empleados parecen ser estado civil, la edad, la distancia a casa y si el empleado viaja por negocios o no.
El modelo también alcanzó una precisión del 84.47% en una validación cruzada de 10 pliegues, lo que es bastante alto. No obstante, el valor de Kappa resultó relativamente bajo, lo que sugiere que el modelo podría estar clasificando en su mayoría las observaciones en la clase mayoritaria. Esto implica que, aunque la precisión general es alta, el modelo podría no ser tan eficaz al identificar la clase minoritaria, es decir, a los empleados que rotan.
En lo que respecta al AIC del modelo, un valor más bajo indica un mejor ajuste a los datos. Por lo tanto, el hecho de que el AIC de este modelo sea significativamente inferior al del modelo completo sugiere que se ajusta mejor a los datos. Sin embargo, es crucial recordar que un buen ajuste a los datos de entrenamiento no garantiza un rendimiento óptimo en datos nuevos o no vistos. Por ello, siempre es recomendable validar el rendimiento del modelo en un conjunto de datos de prueba independiente.
Discusión de resultados:
A partir de los resultados del modelo, se pueden proponer las siguientes estrategias para reducir la rotación de empleados en la empresa:
Viajes de Negocios: Dado que aquellos empleados que viajan con poca frecuencia o no viajan tienen menos probabilidades de abandonar la empresa, se podría considerar la opción de disminuir la frecuencia de los viajes de negocios o explorar alternativas como reuniones virtuales. Esto ayudaría a reducir el estrés asociado con los viajes frecuentes, lo que podría resultar en una disminución de la rotación entre los empleados que sí viajan.
Edad: Dado que la probabilidad de rotación disminuye con la edad, sería beneficioso implementar estrategias enfocadas en retener a los empleados más jóvenes. Esto podría incluir programas de mentoría, oportunidades de desarrollo profesional y un claro camino de progreso en sus carreras.
Distancia a Casa: Como la probabilidad de rotación aumenta con la distancia que los empleados tienen que recorrer para llegar al trabajo, la empresa podría considerar alternativas para apoyar a aquellos que viven más lejos. Esto podría incluir opciones de trabajo flexible, como el trabajo remoto, o proporcionar asistencia en transporte.
Estado Civil: Dado que los empleados solteros son más propensos a rotar, sería útil diseñar estrategias específicas para este grupo. Esto podría incluir fomentar un ambiente laboral más inclusivo y social, lo que ayudaría a que los empleados solteros se sientan más conectados con la empresa.
Es importante considerar estas estrategias como sugerencias que deben adaptarse a las necesidades particulares de la empresa. Además, siempre es recomendable validar cualquier estrategia con datos antes de implementarla completamente.