Introducción

En una organización, se busca comprender y prever los factores que influyen en la rotación de empleados entre distintos cargos. La empresa ha recopilado datos históricos sobre el empleo de sus trabajadores, incluyendo variables como la antigüedad en el cargo actual, el nivel de satisfacción laboral, el salario actual, edad y otros factores relevantes. La gerencia planea desarrollar un modelo de regresión logística que permita estimar la probabilidad de que un empleado cambie de cargo en el próximo período y determinar cuales factores indicen en mayor proporción a estos cambios.

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.

A continuación se describen los pasos que la gerencia ha propuesto para el análisis:

1. Selección de variables

Seleccione 3 variables categóricas (distintas de rotación) y 3 variables cuantitativas, que se consideren estén relacionadas con la rotación.

Se debe justificar porque estas variables están relacionadas y que tipo de relación se espera entre ellas (Hipótesis).

Variables categóricas

Viaje de Negocios: Los viajes frecuentes por trabajo pueden desgastar a los empleados y aumentar su probabilidad de buscar otro cargo donde haya menos desplazamientos.Se espera que a más viajes frecuentes por trabajo aumenten la rotación.

Horas_Extra: Trabajar horas extra aumenta el riesgo de rotación, ya que los empleados que trabajan más horas podrían sentirse más agotados o insatisfechos con el equilibrio entre la vida laboral y personal. Se espera que trabajar más horas extras incremente la probabilidad de rotación.

Cargo: Estar en un cargo más operativo genera más rotación que estar en un cargo directivo, porque siempre se va a buscar la opción de ascender.

Variables cuantitativas

Satisfación_Laboral: Una baja satisfacción laboral generalmente está relacionada con una mayor rotación. Se espera que empleados menos satisfechos sean más propensos a cambiar de cargo.

Ingreso_Mensual: Un menor salario podría estar asociado a una mayor rotación, ya que los empleados pueden buscar cargos mejor remunerados. Se espera que ingresos más bajos estén asociados a una mayor rotación.

Distancia_Casa: Se espera que una mayor distancia entre la casa y el trabajo pueda incrementar la rotación, ya que los empleados podrían buscar cargos más convenientes o cercanos.

#librerías
library(paqueteMODELOS)
library(dplyr)
library(psych)
library(pROC)
library(ggplot2)
library(egg)

# descargar la data
devtools::install_github("centromagis/paqueteMODELOS", force =TRUE)
## Error in utils::download.file(url, path, method = method, quiet = quiet,  : 
##   download from 'https://api.github.com/repos/centromagis/paqueteMODELOS/tarball/HEAD' failed
data("rotacion")
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, …
# Ver un vistazo de los datos
head(rotacion)
## # A tibble: 6 × 24
##   Rotación  Edad `Viaje de Negocios` Departamento Distancia_Casa Educación
##   <chr>    <dbl> <chr>               <chr>                 <dbl>     <dbl>
## 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
## # ℹ 18 more variables: Campo_Educación <chr>, Satisfacción_Ambiental <dbl>,
## #   Genero <chr>, Cargo <chr>, Satisfación_Laboral <dbl>, Estado_Civil <chr>,
## #   Ingreso_Mensual <dbl>, Trabajos_Anteriores <dbl>, Horas_Extra <chr>,
## #   Porcentaje_aumento_salarial <dbl>, Rendimiento_Laboral <dbl>,
## #   Años_Experiencia <dbl>, Capacitaciones <dbl>,
## #   Equilibrio_Trabajo_Vida <dbl>, Antigüedad <dbl>, Antigüedad_Cargo <dbl>,
## #   Años_ultima_promoción <dbl>, Años_acargo_con_mismo_jefe <dbl>
#copia de rotacion
rotacion_df <- rotacion

#Muestra que el dataframe rotación
dimension <- dim(rotacion_df)
dimension 
## [1] 1470   24
# primeras líneas del dataset 
head(rotacion_df)
## # A tibble: 6 × 24
##   Rotación  Edad `Viaje de Negocios` Departamento Distancia_Casa Educación
##   <chr>    <dbl> <chr>               <chr>                 <dbl>     <dbl>
## 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
## # ℹ 18 more variables: Campo_Educación <chr>, Satisfacción_Ambiental <dbl>,
## #   Genero <chr>, Cargo <chr>, Satisfación_Laboral <dbl>, Estado_Civil <chr>,
## #   Ingreso_Mensual <dbl>, Trabajos_Anteriores <dbl>, Horas_Extra <chr>,
## #   Porcentaje_aumento_salarial <dbl>, Rendimiento_Laboral <dbl>,
## #   Años_Experiencia <dbl>, Capacitaciones <dbl>,
## #   Equilibrio_Trabajo_Vida <dbl>, Antigüedad <dbl>, Antigüedad_Cargo <dbl>,
## #   Años_ultima_promoción <dbl>, Años_acargo_con_mismo_jefe <dbl>
#Muestra que el dataframe rotación
str(rotacion_df)
## tibble [1,470 × 24] (S3: tbl_df/tbl/data.frame)
##  $ Rotación                   : chr [1:1470] "Si" "No" "Si" "No" ...
##  $ Edad                       : num [1:1470] 41 49 37 33 27 32 59 30 38 36 ...
##  $ Viaje de Negocios          : chr [1:1470] "Raramente" "Frecuentemente" "Raramente" "Frecuentemente" ...
##  $ Departamento               : chr [1:1470] "Ventas" "IyD" "IyD" "IyD" ...
##  $ Distancia_Casa             : num [1:1470] 1 8 2 3 2 2 3 24 23 27 ...
##  $ Educación                  : num [1:1470] 2 1 2 4 1 2 3 1 3 3 ...
##  $ Campo_Educación            : chr [1:1470] "Ciencias" "Ciencias" "Otra" "Ciencias" ...
##  $ Satisfacción_Ambiental     : num [1:1470] 2 3 4 4 1 4 3 4 4 3 ...
##  $ Genero                     : chr [1:1470] "F" "M" "M" "F" ...
##  $ Cargo                      : chr [1:1470] "Ejecutivo_Ventas" "Investigador_Cientifico" "Tecnico_Laboratorio" "Investigador_Cientifico" ...
##  $ Satisfación_Laboral        : num [1:1470] 4 2 3 3 2 4 1 3 3 3 ...
##  $ Estado_Civil               : chr [1:1470] "Soltero" "Casado" "Soltero" "Casado" ...
##  $ Ingreso_Mensual            : num [1:1470] 5993 5130 2090 2909 3468 ...
##  $ Trabajos_Anteriores        : num [1:1470] 8 1 6 1 9 0 4 1 0 6 ...
##  $ Horas_Extra                : chr [1:1470] "Si" "No" "Si" "Si" ...
##  $ Porcentaje_aumento_salarial: num [1:1470] 11 23 15 11 12 13 20 22 21 13 ...
##  $ Rendimiento_Laboral        : num [1:1470] 3 4 3 3 3 3 4 4 4 3 ...
##  $ Años_Experiencia           : num [1:1470] 8 10 7 8 6 8 12 1 10 17 ...
##  $ Capacitaciones             : num [1:1470] 0 3 3 3 3 2 3 2 2 3 ...
##  $ Equilibrio_Trabajo_Vida    : num [1:1470] 1 3 3 3 3 2 2 3 3 2 ...
##  $ Antigüedad                 : num [1:1470] 6 10 0 8 2 7 1 1 9 7 ...
##  $ Antigüedad_Cargo           : num [1:1470] 4 7 0 7 2 7 0 0 7 7 ...
##  $ Años_ultima_promoción      : num [1:1470] 0 1 0 3 2 3 0 0 1 7 ...
##  $ Años_acargo_con_mismo_jefe : num [1:1470] 5 7 0 0 2 6 0 0 8 7 ...
#muestra  un resumen estad´sitico básico
summary(rotacion_df)
##    Rotación              Edad       Viaje de Negocios  Departamento      
##  Length:1470        Min.   :18.00   Length:1470        Length:1470       
##  Class :character   1st Qu.:30.00   Class :character   Class :character  
##  Mode  :character   Median :36.00   Mode  :character   Mode  :character  
##                     Mean   :36.92                                        
##                     3rd Qu.:43.00                                        
##                     Max.   :60.00                                        
##  Distancia_Casa     Educación     Campo_Educación    Satisfacción_Ambiental
##  Min.   : 1.000   Min.   :1.000   Length:1470        Min.   :1.000         
##  1st Qu.: 2.000   1st Qu.:2.000   Class :character   1st Qu.:2.000         
##  Median : 7.000   Median :3.000   Mode  :character   Median :3.000         
##  Mean   : 9.193   Mean   :2.913                      Mean   :2.722         
##  3rd Qu.:14.000   3rd Qu.:4.000                      3rd Qu.:4.000         
##  Max.   :29.000   Max.   :5.000                      Max.   :4.000         
##     Genero             Cargo           Satisfación_Laboral Estado_Civil      
##  Length:1470        Length:1470        Min.   :1.000       Length:1470       
##  Class :character   Class :character   1st Qu.:2.000       Class :character  
##  Mode  :character   Mode  :character   Median :3.000       Mode  :character  
##                                        Mean   :2.729                         
##                                        3rd Qu.:4.000                         
##                                        Max.   :4.000                         
##  Ingreso_Mensual Trabajos_Anteriores Horas_Extra       
##  Min.   : 1009   Min.   :0.000       Length:1470       
##  1st Qu.: 2911   1st Qu.:1.000       Class :character  
##  Median : 4919   Median :2.000       Mode  :character  
##  Mean   : 6503   Mean   :2.693                         
##  3rd Qu.: 8379   3rd Qu.:4.000                         
##  Max.   :19999   Max.   :9.000                         
##  Porcentaje_aumento_salarial Rendimiento_Laboral Años_Experiencia
##  Min.   :11.00               Min.   :3.000       Min.   : 0.00   
##  1st Qu.:12.00               1st Qu.:3.000       1st Qu.: 6.00   
##  Median :14.00               Median :3.000       Median :10.00   
##  Mean   :15.21               Mean   :3.154       Mean   :11.28   
##  3rd Qu.:18.00               3rd Qu.:3.000       3rd Qu.:15.00   
##  Max.   :25.00               Max.   :4.000       Max.   :40.00   
##  Capacitaciones  Equilibrio_Trabajo_Vida   Antigüedad     Antigüedad_Cargo
##  Min.   :0.000   Min.   :1.000           Min.   : 0.000   Min.   : 0.000  
##  1st Qu.:2.000   1st Qu.:2.000           1st Qu.: 3.000   1st Qu.: 2.000  
##  Median :3.000   Median :3.000           Median : 5.000   Median : 3.000  
##  Mean   :2.799   Mean   :2.761           Mean   : 7.008   Mean   : 4.229  
##  3rd Qu.:3.000   3rd Qu.:3.000           3rd Qu.: 9.000   3rd Qu.: 7.000  
##  Max.   :6.000   Max.   :4.000           Max.   :40.000   Max.   :18.000  
##  Años_ultima_promoción Años_acargo_con_mismo_jefe
##  Min.   : 0.000        Min.   : 0.000            
##  1st Qu.: 0.000        1st Qu.: 2.000            
##  Median : 1.000        Median : 3.000            
##  Mean   : 2.188        Mean   : 4.123            
##  3rd Qu.: 3.000        3rd Qu.: 7.000            
##  Max.   :15.000        Max.   :17.000

2. Análisis Univariado

Realiza un análisis univariado (caracterización) de la información contenida en la base de datos rotacion.

# Variables categóricas
table(rotacion_df$`Viaje de Negocios`)
## 
## Frecuentemente       No_Viaja      Raramente 
##            277            150           1043
table(rotacion_df$`Horas_Extra`)
## 
##   No   Si 
## 1054  416
table(rotacion_df$`Cargo`)
## 
##  Director_Investigación    Director_Manofactura        Ejecutivo_Ventas 
##                      80                     145                     326 
##                 Gerente Investigador_Cientifico        Recursos_Humanos 
##                     102                     292                      52 
##     Representante_Salud    Representante_Ventas     Tecnico_Laboratorio 
##                     131                      83                     259
# Gráficos
#barplot(table(rotacion_df$`Viaje de Negocios`), main="Distribución de Viaje de Negocios")
#barplot(table(rotacion_df$`Horas_Extra`), main="Distribución de Horas Extra")
#barplot(table(rotacion_df$`Cargo`), main="Distribución de Cargo")
# Gráfico  para Viaje de Negocios
barplot(table(rotacion_df$`Viaje de Negocios`), 
        main = "Distribución de Viajes de Negocios",
        col = "steelblue",               # Color de las barras
        border = "black",                # Borde de las barras
        ylab = "Frecuencia",             # Etiqueta del eje y
        xlab = "Viaje de Negocios",      # Etiqueta del eje x
        las = 1,                         # Orientación horizontal de etiquetas
        cex.names = 1.2,                 # Tamaño de las etiquetas de las categorías
        cex.axis = 1.1,                  # Tamaño de las etiquetas de los ejes
        cex.main = 1.5)                  # Tamaño del título

En esta gráfica y la tabla permite identificar que la mayoría de las personas raramente viaja lo que puede influir en que la rotación sea baja.

# Gráfico para Horas Extra
barplot(table(rotacion_df$`Horas_Extra`), 
        main = "Distribución de Horas Extra",
        col = "tomato",                  # Color de las barras
        border = "black",                # Borde de las barras
        ylab = "Frecuencia",             # Etiqueta del eje y
        xlab = "Horas Extra",            # Etiqueta del eje x
        las = 1,                         # Orientación horizontal de etiquetas
        cex.names = 1.2,                 # Tamaño de las etiquetas de las categorías
        cex.axis = 1.1,                  # Tamaño de las etiquetas de los ejes
        cex.main = 1.5)                  # Tamaño del título

De acuerdo a la distribución de horas extras la gran mayoría no trabaja horas extra.

# Gráfico para Cargo
barplot(table(rotacion_df$`Cargo`), 
        main = "Distribución de Cargo",
        col = "darkgreen",               # Color de las barras
        border = "black",                # Borde de las barras
        ylab = "Frecuencia",             # Etiqueta del eje y
        xlab = "Cargo",                  # Etiqueta del eje x
        las = 2,                         # Orientación vertical de etiquetas (útil si hay muchas categorías)
        cex.names = 0.9,                 # Tamaño de las etiquetas de las categorías
        cex.axis = 1.1,                  # Tamaño de las etiquetas de los ejes
        cex.main = 1.5)                  # Tamaño del título

Esta distribución nos indica que los cargos más representativos son ejecutivo de ventas, investigador científico y técnico de laboratorio.

# Variables cuantitativas
summary(rotacion_df$Ingreso_Mensual)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    1009    2911    4919    6503    8379   19999
summary(rotacion_df$Distancia_Casa)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   1.000   2.000   7.000   9.193  14.000  29.000
summary(rotacion_df$Satisfación_Laboral)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   1.000   2.000   3.000   2.729   4.000   4.000
# Descripción detallada de todas las variables cuantitativas
describe(select(rotacion_df, Ingreso_Mensual, Satisfación_Laboral, Distancia_Casa))
##                     vars    n    mean      sd median trimmed     mad  min   max
## Ingreso_Mensual        1 1470 6502.93 4707.96   4919 5667.24 3260.24 1009 19999
## Satisfación_Laboral    2 1470    2.73    1.10      3    2.79    1.48    1     4
## Distancia_Casa         3 1470    9.19    8.11      7    8.08    7.41    1    29
##                     range  skew kurtosis     se
## Ingreso_Mensual     18990  1.37     0.99 122.79
## Satisfación_Laboral     3 -0.33    -1.22   0.03
## Distancia_Casa         28  0.96    -0.23   0.21
#hist(rotacion_df$Ingreso_Mensual, main="Distribución del Ingreso Mensual", xlab="Ingreso Mensual", col="lightblue")
#hist(rotacion_df$Distancia_Casa, main="Distribución de la distancia de la casa al trabajo", xlab="Distancia casa -trabajo", col="lightgreen")
#hist(rotacion_df$Satisfación_Laboral, main="Distribución de la Satisfacción Laboral", xlab="Satisfacción Laboral", col="lightcoral")

g_ingreso = ggplot(rotacion_df, aes(x = Ingreso_Mensual)) + geom_histogram(fill="royalblue", color = "black", alpha = 0.7) +
  geom_density(color = "red", size = 1) + # Línea de densidad
  labs(title = "Distribución del Ingreso Mensual",
       x = "Ingreso Mensual",
       y = "Densidad") +
  theme_minimal() + # Cambiar a un tema minimalista
  theme(plot.title = element_text(hjust = 0.5), # Centrar el título
        axis.title.x = element_text(face = "bold"),
        axis.title.y = element_text(face = "bold"))

g_distancia = ggplot(rotacion_df, aes(x = Distancia_Casa)) + geom_histogram(fill="royalblue", color = "black", alpha = 0.7) +
  geom_density(color = "red", size = 1) + # Línea de densidad
  labs(title = "Distribución de la distancia casa - trabajo",
       x = "Distancia casa",
       y = "Densidad") +
  theme_minimal() + # Cambiar a un tema minimalista
  theme(plot.title = element_text(hjust = 0.5), # Centrar el título
        axis.title.x = element_text(face = "bold"),
        axis.title.y = element_text(face = "bold"))

g_satisfacion = ggplot(rotacion_df, aes(x = Satisfación_Laboral)) + geom_histogram(fill="royalblue", color = "black", alpha = 0.7) +
  geom_density(color = "red", size = 1) + # Línea de densidad
  labs(title = "Distribución Satisfacción laboral",
       x = "Satisfacción laboral",
       y = "Densidad") +
  theme_minimal() + # Cambiar a un tema minimalista
  theme(plot.title = element_text(hjust = 0.5), # Centrar el título
        axis.title.x = element_text(face = "bold"),
        axis.title.y = element_text(face = "bold"))

# Crear el boxplot
b_ingreso <- ggplot(rotacion_df, aes(y = Ingreso_Mensual)) +
  geom_boxplot(fill = "lightblue", color = "darkblue") +
  theme_minimal() +
  labs(title = "Boxplot del Ingreso Mensual", y = "Ingreso Mensual") +
  theme(plot.title = element_text(hjust = 0.5, size = 10, face = "bold"))

b_distancia <- ggplot(rotacion_df, aes(y = Distancia_Casa)) +
  geom_boxplot(fill = "lightblue", color = "darkblue") +
  theme_minimal() +
  labs(title = "Boxplot del Distancia casa", y = "Distancia Casa") +
  theme(plot.title = element_text(hjust = 0.5, size = 10, face = "bold"))

b_satisfaccion <- ggplot(rotacion_df, aes(y = Satisfación_Laboral)) +
  geom_boxplot(fill = "lightblue", color = "darkblue") +
  theme_minimal() +
  labs(title = "Boxplot Satisfacción Laboral", y = "Satisfacción Laboral") +
  theme(plot.title = element_text(hjust = 0.5, size = 10, face = "bold"))


ggarrange(g_ingreso, b_ingreso, g_distancia, b_distancia, g_satisfacion, b_satisfaccion, ncol = 2, nrow = 3)

De acuerdo al análisis de las variables cuantitativas se puede decir que:

El ingreso mensual de las personas en promedio es 4919 y esta bastante alejado del valor máximo lo que puede indicar que la gran mayoria de las personas gana poco y tendrian más posibilidades de rotar.

La distancia de la casa al trabajo en pormedio es 7 km que está bien distante de los que viven mas lejos que son 29 km lo que en teoria reduciría el riesgo de rotación.

La satisfación laboral en la empresa esta en su gran mayoría satisfechos lo que puede generar menos riesgo de rotación.

3. Análisis Bivariado

Realiza un análisis de bivariado en donde la variable respuesta sea rotacion codificada de la siguiente manera (y=1 es si rotación, y=0 es no rotación). Con base en estos resultados identifique cuales son las variables determinantes de la rotación e interpretar el signo del coeficiente estimado. Compare estos resultados con la hipotesis planteada en el punto 2.

# Codificar la variable 'Rotación'
rotacion_df$Rotación <- ifelse(rotacion_df$Rotación == "Si", 1, 0)

table(rotacion_df$Rotación)
## 
##    0    1 
## 1233  237
# Crear variables dummy para las variables categóricas seleccionadas
rotacion_dummy <- rotacion_df %>%
  select(`Viaje de Negocios`, Horas_Extra, Cargo) %>%
  mutate(across(where(is.factor), as.factor))

# Usar model.matrix para generar las variables dummy
dummy_data <- model.matrix(~ `Viaje de Negocios` + Horas_Extra + Cargo, data = rotacion_dummy)[, -1]

# Unir las variables dummy con el dataset original
rotacion_df_dummy <- cbind(rotacion_df %>% select(Rotación, Ingreso_Mensual, Distancia_Casa, Satisfación_Laboral), dummy_data)

# Ver el dataset con las variables dummy
head(rotacion_df_dummy)
##   Rotación Ingreso_Mensual Distancia_Casa Satisfación_Laboral
## 1        1            5993              1                   4
## 2        0            5130              8                   2
## 3        1            2090              2                   3
## 4        0            2909              3                   3
## 5        0            3468              2                   2
## 6        0            3068              2                   4
##   `Viaje de Negocios`No_Viaja `Viaje de Negocios`Raramente Horas_ExtraSi
## 1                           0                            1             1
## 2                           0                            0             0
## 3                           0                            1             1
## 4                           0                            0             1
## 5                           0                            1             0
## 6                           0                            0             0
##   CargoDirector_Manofactura CargoEjecutivo_Ventas CargoGerente
## 1                         0                     1            0
## 2                         0                     0            0
## 3                         0                     0            0
## 4                         0                     0            0
## 5                         0                     0            0
## 6                         0                     0            0
##   CargoInvestigador_Cientifico CargoRecursos_Humanos CargoRepresentante_Salud
## 1                            0                     0                        0
## 2                            1                     0                        0
## 3                            0                     0                        0
## 4                            1                     0                        0
## 5                            0                     0                        0
## 6                            0                     0                        0
##   CargoRepresentante_Ventas CargoTecnico_Laboratorio
## 1                         0                        0
## 2                         0                        0
## 3                         0                        1
## 4                         0                        0
## 5                         0                        1
## 6                         0                        1
# Renombrar automáticamente las columnas con nombres válidos
names(rotacion_df_dummy) <- make.names(names(rotacion_df_dummy))

names(rotacion_df_dummy)
##  [1] "Rotación"                      "Ingreso_Mensual"              
##  [3] "Distancia_Casa"                "Satisfación_Laboral"          
##  [5] "X.Viaje.de.Negocios.No_Viaja"  "X.Viaje.de.Negocios.Raramente"
##  [7] "Horas_ExtraSi"                 "CargoDirector_Manofactura"    
##  [9] "CargoEjecutivo_Ventas"         "CargoGerente"                 
## [11] "CargoInvestigador_Cientifico"  "CargoRecursos_Humanos"        
## [13] "CargoRepresentante_Salud"      "CargoRepresentante_Ventas"    
## [15] "CargoTecnico_Laboratorio"
# Modelos de regresión logística simple para variables categóricas
modelo_viaje <- glm(Rotación ~ X.Viaje.de.Negocios.Raramente + X.Viaje.de.Negocios.No_Viaja, data=rotacion_df_dummy, family=binomial)

summary(modelo_viaje)
## 
## Call:
## glm(formula = Rotación ~ X.Viaje.de.Negocios.Raramente + X.Viaje.de.Negocios.No_Viaja, 
##     family = binomial, data = rotacion_df_dummy)
## 
## Coefficients:
##                               Estimate Std. Error z value Pr(>|z|)    
## (Intercept)                    -1.1034     0.1389  -7.943 1.98e-15 ***
## X.Viaje.de.Negocios.Raramente  -0.6346     0.1638  -3.873 0.000107 ***
## X.Viaje.de.Negocios.No_Viaja   -1.3389     0.3315  -4.039 5.36e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 1298.6  on 1469  degrees of freedom
## Residual deviance: 1274.8  on 1467  degrees of freedom
## AIC: 1280.8
## 
## Number of Fisher Scoring iterations: 5
modelo_horas_extra <- glm(Rotación ~ `Horas_ExtraSi`, data=rotacion_df_dummy, family=binomial)

summary(modelo_horas_extra)
## 
## Call:
## glm(formula = Rotación ~ Horas_ExtraSi, family = binomial, data = rotacion_df_dummy)
## 
## Coefficients:
##               Estimate Std. Error z value Pr(>|z|)    
## (Intercept)    -2.1496     0.1007 -21.338   <2e-16 ***
## Horas_ExtraSi   1.3274     0.1466   9.056   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 1298.6  on 1469  degrees of freedom
## Residual deviance: 1217.2  on 1468  degrees of freedom
## AIC: 1221.2
## 
## Number of Fisher Scoring iterations: 4
modelo_cargo <- glm(Rotación ~ `CargoDirector_Manofactura`+ `CargoEjecutivo_Ventas`+`CargoGerente`
                    +`CargoInvestigador_Cientifico`+`CargoRecursos_Humanos`+`CargoRepresentante_Salud`
                    +`CargoRepresentante_Ventas`+`CargoTecnico_Laboratorio`, data=rotacion_df_dummy, family=binomial)

summary(modelo_cargo)
## 
## Call:
## glm(formula = Rotación ~ CargoDirector_Manofactura + CargoEjecutivo_Ventas + 
##     CargoGerente + CargoInvestigador_Cientifico + CargoRecursos_Humanos + 
##     CargoRepresentante_Salud + CargoRepresentante_Ventas + CargoTecnico_Laboratorio, 
##     family = binomial, data = rotacion_df_dummy)
## 
## Coefficients:
##                              Estimate Std. Error z value Pr(>|z|)    
## (Intercept)                   -3.6636     0.7161  -5.116 3.12e-07 ***
## CargoDirector_Manofactura      1.0609     0.7875   1.347 0.177957    
## CargoEjecutivo_Ventas          2.1119     0.7308   2.890 0.003854 ** 
## CargoGerente                   0.6983     0.8504   0.821 0.411553    
## CargoInvestigador_Cientifico   2.0125     0.7336   2.743 0.006083 ** 
## CargoRecursos_Humanos          2.4596     0.7881   3.121 0.001804 ** 
## CargoRepresentante_Salud       1.0568     0.7951   1.329 0.183793    
## CargoRepresentante_Ventas      3.2480     0.7504   4.328 1.50e-05 ***
## CargoTecnico_Laboratorio       2.5075     0.7308   3.431 0.000601 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 1298.6  on 1469  degrees of freedom
## Residual deviance: 1209.7  on 1461  degrees of freedom
## AIC: 1227.7
## 
## Number of Fisher Scoring iterations: 6
# Modelos de regresión logística simple para variables cuantitativas
modelo_ingreso <- glm(Rotación ~ Ingreso_Mensual, data=rotacion_df, family=binomial)
# Resúmenes de los modelos
summary(modelo_ingreso)
## 
## Call:
## glm(formula = Rotación ~ Ingreso_Mensual, family = binomial, 
##     data = rotacion_df)
## 
## Coefficients:
##                   Estimate Std. Error z value Pr(>|z|)    
## (Intercept)     -9.291e-01  1.292e-01  -7.191 6.43e-13 ***
## Ingreso_Mensual -1.271e-04  2.162e-05  -5.879 4.12e-09 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 1298.6  on 1469  degrees of freedom
## Residual deviance: 1253.1  on 1468  degrees of freedom
## AIC: 1257.1
## 
## Number of Fisher Scoring iterations: 5
modelo_distancia <- glm(Rotación ~ Distancia_Casa, data=rotacion_df, family=binomial)
summary(modelo_distancia)
## 
## Call:
## glm(formula = Rotación ~ Distancia_Casa, family = binomial, 
##     data = rotacion_df)
## 
## Coefficients:
##                 Estimate Std. Error z value Pr(>|z|)    
## (Intercept)    -1.890051   0.111382 -16.969  < 2e-16 ***
## Distancia_Casa  0.024710   0.008312   2.973  0.00295 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 1298.6  on 1469  degrees of freedom
## Residual deviance: 1290.0  on 1468  degrees of freedom
## AIC: 1294
## 
## Number of Fisher Scoring iterations: 4
modelo_satisfaccion <- glm(Rotación ~ Satisfación_Laboral, data=rotacion_df, family=binomial)
summary(modelo_satisfaccion)
## 
## Call:
## glm(formula = Rotación ~ Satisfación_Laboral, family = binomial, 
##     data = rotacion_df)
## 
## Coefficients:
##                     Estimate Std. Error z value Pr(>|z|)    
## (Intercept)          -0.9903     0.1757  -5.635 1.75e-08 ***
## Satisfación_Laboral  -0.2510     0.0637  -3.940 8.16e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 1298.6  on 1469  degrees of freedom
## Residual deviance: 1283.1  on 1468  degrees of freedom
## AIC: 1287.1
## 
## Number of Fisher Scoring iterations: 4

Interpretación de los coeficientes del modelo:

  • Viaje de Negocios: Aquellos empleados que no viajan por negocios o lo hacen raramente tienen una menor probabilidad de rotación en comparación con aquellos que viajan frecuentemente.

  • Horas Extra: Los empleados que realizan horas extra tienen una probabilidad mucho mayor de rotación, como se observa con el coeficiente positivo significativo (p-valor < 0.001).

  • Cargo: Algunas categorías de cargos, como Representante de Ventas y Recursos Humanos, parecen tener una mayor tendencia a la rotación, mientras que otros cargos no presentan una relación estadísticamente significativa con la rotación.

  • Ingreso Mensual: El ingreso mensual parece tener una relación negativa con la rotación, pero no es estadísticamente significativo en este caso (p-valor = 0.095).

  • Distancia de Casa: Los empleados que viven más lejos de la empresa tienen una mayor probabilidad de rotación.

  • Satisfacción Laboral: Como era de esperarse, la baja satisfacción laboral se asocia con un aumento en la rotación, siendo una variable significativa con un p-valor muy bajo (p < 0.001).

4. Partición de datos

Realice una partición en los datos de forma aleatoria donde 70% sea un set para entrenar el modelo y 30% para prueba. Estime un modelo logístico con la muestra del 70%. Muestre los resultados.

# Seleccionar las variables necesarias
variables_seleccionadas <- rotacion_df %>%
  select(Rotación, `Viaje de Negocios`, Horas_Extra, Cargo,
         Ingreso_Mensual, Distancia_Casa, Satisfación_Laboral)

set.seed(123)  # Asegurar la reproducibilidad
index <- sample(1:nrow(variables_seleccionadas), 0.7 * nrow(variables_seleccionadas))
# Crear los conjuntos de entrenamiento y prueba
train_data <- variables_seleccionadas[index, ]
test_data <- variables_seleccionadas[-index, ]

5. Evaluar

Evaluar el poder predictivo del modelo con base en la curva ROC y el AUC en el set de datos de prueba.

# Ajustar el modelo logístico
modelo_logistico <- glm(Rotación ~ `Viaje de Negocios` + Horas_Extra + Cargo + 
                          + Ingreso_Mensual + Distancia_Casa + Satisfación_Laboral,
                        data = train_data, family = binomial)

# Resumen del modelo
summary(modelo_logistico)
## 
## Call:
## glm(formula = Rotación ~ `Viaje de Negocios` + Horas_Extra + 
##     Cargo + +Ingreso_Mensual + Distancia_Casa + Satisfación_Laboral, 
##     family = binomial, data = train_data)
## 
## Coefficients:
##                                Estimate Std. Error z value Pr(>|z|)    
## (Intercept)                  -2.343e+00  1.338e+00  -1.751 0.079923 .  
## `Viaje de Negocios`No_Viaja  -1.147e+00  4.136e-01  -2.772 0.005568 ** 
## `Viaje de Negocios`Raramente -6.894e-01  2.162e-01  -3.188 0.001431 ** 
## Horas_ExtraSi                 1.419e+00  1.940e-01   7.313 2.61e-13 ***
## CargoDirector_Manofactura     1.059e+00  1.164e+00   0.909 0.363135    
## CargoEjecutivo_Ventas         1.836e+00  1.140e+00   1.611 0.107080    
## CargoGerente                  1.158e+00  1.193e+00   0.971 0.331779    
## CargoInvestigador_Cientifico  1.449e+00  1.223e+00   1.185 0.236085    
## CargoRecursos_Humanos         2.396e+00  1.257e+00   1.906 0.056652 .  
## CargoRepresentante_Salud      1.017e+00  1.180e+00   0.862 0.388932    
## CargoRepresentante_Ventas     2.893e+00  1.258e+00   2.299 0.021528 *  
## CargoTecnico_Laboratorio      2.155e+00  1.220e+00   1.767 0.077261 .  
## Ingreso_Mensual              -8.777e-05  5.265e-05  -1.667 0.095484 .  
## Distancia_Casa                2.621e-02  1.138e-02   2.303 0.021279 *  
## Satisfación_Laboral          -3.024e-01  8.362e-02  -3.616 0.000299 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 896.03  on 1028  degrees of freedom
## Residual deviance: 740.08  on 1014  degrees of freedom
## AIC: 770.08
## 
## Number of Fisher Scoring iterations: 6
# Hacer predicciones sobre el conjunto de prueba
predicciones <- predict(modelo_logistico, newdata = test_data, type = "response")

# Generar la curva ROC
roc_curve <- roc(test_data$Rotación, predicciones)

# Mostrar el AUC
auc(roc_curve)
## Area under the curve: 0.7788
# Graficar la curva ROC
plot(roc_curve, col = "blue", main = "Curva ROC - Modelo Logístico")

La curva ROC es clave para medir el rendimiento predictivo del modelo. Un AUC de 0.7788 indica un buen poder predictivo, aunque no perfecto. Un AUC cercano a 0.8 indica que el modelo tiene una capacidad razonable para distinguir entre empleados que van a rotar y los que no.

6. Conclusiones

En las conclusiones adicione una discución sobre cuál sería la estrategia para disminuir la rotación en la empresa (con base en las variables que resultaron significativas en el punto 3).

Las variables más significativas para la rotación incluyen:

  • Horas Extra: Los empleados que realizan más horas extra tienen una mayor probabilidad de rotación. Esto sugiere que la sobrecarga de trabajo puede ser una razón importante para que los empleados dejen la empresa.

  • Viaje de Negocios: Los empleados que no viajan o lo hacen raramente están menos inclinados a rotar, mientras que aquellos que viajan frecuentemente tienen un mayor riesgo de rotación.

  • Distancia a Casa: Los empleados que viven más lejos también tienden a rotar más, lo que sugiere que la ubicación geográfica es un factor a tener en cuenta.

  • Satisfacción Laboral: La insatisfacción laboral es una de las causas más relevantes para la rotación, como se ve en el análisis.

La siguientes estrategias, basadas en los hallazgos del análisis, podrían contribuir a reducir significativamente la rotación de empleados en la empresa.

  1. Revisión de Horas Extra: Implementar políticas que limiten las horas extra o proporcionar incentivos adicionales para los empleados que las realicen de manera frecuente.

  2. Mejorar la Satisfacción Laboral: Invertir en iniciativas de bienestar y desarrollo profesional para mejorar la satisfacción laboral. Realizar encuestas periódicas y reuniones con el personal para entender sus preocupaciones.

  3. Flexibilidad de Viajes: Para aquellos empleados que viajan por negocios, se podrían ofrecer incentivos adicionales o proporcionar una mayor flexibilidad en sus horarios y cargas de trabajo.

  4. Ubicación de la Oficina: Considerar la posibilidad de teletrabajo o horarios flexibles para empleados que viven más lejos, lo cual puede mejorar su calidad de vida y reducir la rotación.