INTRODUCCIÓN

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.

LIBRERIAS

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)

DATOS

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

REVISIÓN DE LOS DATOS

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

ANÁLISIS UNIVARIADO

Resúmen

df <- rename(df, Viaje_Negocios = `Viaje de Negocios`)
skim(df)
Data summary
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áficos

# 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.

Datos Faltantes

# 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

ANÁLISIS BIVARIADO

Correlación

# 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.

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 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.

ESTIMACIÓN DEL MODELO

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.

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

EVALUACIÓN

# 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.

PREDICCIONES

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.

CONCLUSIONES

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.

DISCUSIÓN RESULTADOS

Según los resultados obtenidos del modelo, se pueden sugerir las siguientes estrategias para disminuir la rotación en la empresa:

  1. 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.

  2. 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.

  3. 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.

  4. 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.