Enunciado

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.

Retos:

  1. Seleccione 3 variables categóricas (distintas de rotación) y 3 variables cuantitativas, que se consideren estén relacionadas con la rotación. Nota: Debes justificar porque estas variables están relacionadas y que tipo de relación se espera entre ellas (Hipótesis).
  2. Realiza un análisis univariado (caracterización) de la información contenida en la base de datos rotacion.
  3. 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.
  4. 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.
  5. Evaluar el poder predictivo del modelo con base en la curva ROC y el AUC en el set de datos de prueba.
  6. 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).

Diccionario de datos.

  • Rendimiento laboral: 1= bajo, 2=medio, 3=alto, 4=Muy alto.
  • Distancia de la casa: kilómetros de distancia desde la casa.
  • Educación: 1=primaria, 2=secundaria, 3=técnico/tecnólogo 4=pregrado y 5=posgrado.
  • Satisfacción ambiental: 1=Muy insatisfecho, 2=insatisfecho, 3=satisfecho y 4=Muy insatisfecho.
  • Satisfacción laboral: 1=Muy insatisfecho, 2=insatisfecho, 3=satisfecho y 4=Muy insatisfecho.
  • Trabajos anteriores: cantidad de trabajos antes de ingresar a la empresa.
  • Equilibrio_trabajo_vida: 1=Muy bajo, 2=bajo, 3=Medio, 4=alto.

Entendimiento datos

Listar datos del dataset

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, …

El el dataset se cuenta con la siguiente distribución de variales categóricas y cuantitativas:

Variables categóricas:

    1.  Rotación: (Sí/No) – Variable de destino, binaria (categórica).
    2.  Viaje de Negocios: (Frecuentemente, Raramente, Nunca) – Categórica.
    3.  Departamento: (Ventas, IyD, etc.) – Categórica.
    4.  Estado Civil: (Casado, Soltero, Divorciado) – Categórica.
    5.  Horas Extra: (Sí/No) – Binaria (categórica).
    6.  Genero: (F/M) – Categórica.
    7.  Campo_Educación: (Ciencias, Otra, Salud, etc.) – Categórica.
    8.  Cargo: (Ejecutivo_Ventas, Investigador_Cientifico, etc.) – Categórica.

Variables cuantitativas:

    1.  Edad: Numérica, continua.
    2.  Distancia_Casa: Numérica, continua.
    3.  Educación: Numérica (1, 2, 3, etc.) – Categórica ordinal, se tratará como cuantitativa.
    4.  Satisfacción_Ambiental: Numérica (1-4) – Ordinal.
    5.  Ingreso_Mensual: Numérica, continua.
    6.  Trabajos_Anteriores: Numérica, discreta.
    7.  Porcentaje_aumento_salarial: Numérica, continua.
    8.  Rendimiento_Laboral: Numérica, discreta (puntuación).
    9.  Años_Experiencia: Numérica, continua.
    10. Capacitaciones: Numérica, discreta (número de capacitaciones).
    11. Equilibrio_Trabajo_Vida: Numérica, ordinal.
    12. Antigüedad: Numérica, continua.
    13. Antigüedad_Cargo: Numérica, continua.
    14. Años_ultima_promoción: Numérica, continua.
    15. Años_acargo_con_mismo_jefe: Numérica, continua.

Validar si hay valores faltantes

colSums(is.na(datos_rotacion))
                   Rotación                        Edad 
                          0                           0 
          Viaje de Negocios                Departamento 
                          0                           0 
             Distancia_Casa                   Educación 
                          0                           0 
            Campo_Educación      Satisfacción_Ambiental 
                          0                           0 
                     Genero                       Cargo 
                          0                           0 
        Satisfación_Laboral                Estado_Civil 
                          0                           0 
            Ingreso_Mensual         Trabajos_Anteriores 
                          0                           0 
                Horas_Extra Porcentaje_aumento_salarial 
                          0                           0 
        Rendimiento_Laboral            Años_Experiencia 
                          0                           0 
             Capacitaciones     Equilibrio_Trabajo_Vida 
                          0                           0 
                 Antigüedad            Antigüedad_Cargo 
                          0                           0 
      Años_ultima_promoción  Años_acargo_con_mismo_jefe 
                          0                           0 

Estadísticos descriptivos

summary(rotacion)
   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            

Punto 1

Seleccione 3 variables categóricas (distintas de rotación) y 3 variables cuantitativas, que se consideren estén relacionadas con la rotación. Nota: Debes justificar porque estas variables están relacionadas y que tipo de relación se espera entre ellas (Hipótesis).

1. Selección de variables

1.1 Variables categóricas

1.1.1 Horas extra

Hipótesis : Los empleados que trabajan más horas extra tienen una mayor probabilidad de rotación. El exceso de trabajo causa fatiga y una menor satisfacción, lo que incrementa la rotación.

1.1.2 Cargo

Hipótesis : Los empleados en cargos de nivel inferior tienen mayor probabilidad de rotación, ya que perciben menos oportunidades de crecimiento.

1.1.3 Estado civil

Hipótesis : Los empleados casados tienen menos probabilidad de rotación que los solteros. La búsqueda de estabilidad suele ser más importante para quienes tienen responsabilidades familiares.

1.2 Variables cuantitativas

1.2.1 Ingreso mensual

Hipótesis : A menor ingreso mensual, mayor probabilidad de rotación. Los empleados con salarios bajos tenderán a rotar en busca de mejores oportunidades.

1.2.2 Edad

Hipótesis : Empleados jóvenes, por debajo de los 30 años podrían estar más enfocados en buscar oportunidades de crecimiento y por tanto presenten mayor rotación, empleados de 30 a 50 años podrían estar más enfocados en un balance vida trabajo y su rotación dependerá de oportunidades que brinden este beneficio, mientras que empleados por encima de 50 años presenten la menor rotación considerando que prefieran la estabilidad laboral

1.2.3 Antigüedad en el cargo

Hipótesis : A mayor antigüedad mayor probabilidad de rotación dependiendo del cargo, si se trata de cargos operativos se puede presentar mayor rotación en empleados con poca antigüedad, también se considera que empleados que llevan mucho tiempo en un cargo pueden sentirse estancados y estar más abiertos a nuevas oportunidades, o dependiendo del cargo puede ser que hayan encontrado estabilidad laboral y no roten. Empleados con poca antigüedad no son tan tendientes a cambiar de puesto pronto.

Punto 2

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

2. Análisis univariado

g1 = ggplot(datos_rotacion, aes(x = Ingreso_Mensual)) + geom_histogram(fill="royalblue", binwidth = 500) + theme_gray() + ggtitle("Ingreso Mensual")
g2 = ggplot(datos_rotacion, aes(x = Edad)) + geom_histogram(fill="royalblue", binwidth = 1) + theme_gray() + ggtitle("Edad")
g3 = ggplot(datos_rotacion, aes(x = Antigüedad_Cargo)) + geom_histogram(fill="royalblue", binwidth = 1) + theme_gray() + ggtitle("Antigüedad en el cargo") + scale_x_continuous(limits = c(0, 10), breaks = seq(0, 10, by = 1))
g4 = ggplot(datos_rotacion, aes(x = Horas_Extra)) + geom_bar(fill="#0F8FA5") + theme_gray() + ggtitle("Horas Extra")
g5 = ggplot(datos_rotacion, aes(x = Estado_Civil)) + geom_bar(fill="#0F8FA5") + theme_gray() + ggtitle("Estado Civil")
g6 = ggplot(datos_rotacion, aes(x = Cargo)) + geom_bar(fill="#0F8FA5") + theme_gray() + ggtitle("Cargo") + 
    theme(axis.text.x = element_text(angle = 45, hjust = 1, size = 8),  # Reducir el tamaño de la fuente
          axis.title.x = element_blank(),  # Opcional: eliminar el título del eje x si es innecesario
          plot.margin = margin(10, 10, 10, 10))  # Ajustar el margen

# Combinar los gráficos en una cuadrícula
grid.arrange(g1, g2, g3, g4, g5, g6, ncol = 3, nrow = 2)

# Boxplot para la variable Edad
p1 <- ggplot(datos_rotacion, aes( y = Edad)) + 
      geom_boxplot(fill = "lightblue", color = "darkblue") +
      ggtitle("Edad") + ylab("Valores") + theme_minimal()

# Boxplot para la variable Antigüedad_Cargo
p2 <- ggplot(datos_rotacion, aes( y = Antigüedad_Cargo)) + 
      geom_boxplot(fill = "lightgreen", color = "darkgreen") +
      ggtitle("Antigüedad Cargo") + ylab("Valores") + theme_minimal()

# Boxplot para la variable Ingreso_Mensual
p3 <- ggplot(datos_rotacion, aes( y = Ingreso_Mensual)) + 
      geom_boxplot(fill = "lightcoral", color = "darkred") +
      ggtitle("Ingreso Mensual") + ylab("Valores") + theme_minimal()

# Mostrar los tres gráficos en una fila
grid.arrange(p1, p2, p3, ncol = 3)


Porcentaje de empleados que trabajan horas extra

tabla_horas_extra <- table(datos_rotacion$Horas_Extra)

porcentajes_horas_extra <- prop.table(tabla_horas_extra) * 100

tabla_final_extra <- data.frame(Opción = names(tabla_horas_extra),
                          Frecuencia = as.numeric(tabla_horas_extra),
                          Porcentaje = round(as.numeric(porcentajes_horas_extra), 2))

# Mostrar la tabla final
tabla_final_extra
  Opción Frecuencia Porcentaje
1     No       1054       71.7
2     Si        416       28.3

Porcentaje de empleados según estado civil

tabla_estado <- table(datos_rotacion$Estado_Civil)

porcentajes_estado <- prop.table(tabla_estado) * 100

tabla_final_estado <- data.frame(Opción = names(tabla_estado),
                          Frecuencia = as.numeric(tabla_estado),
                          Porcentaje = round(as.numeric(porcentajes_estado), 2))

# Mostrar la tabla final
tabla_final_estado
      Opción Frecuencia Porcentaje
1     Casado        673      45.78
2 Divorciado        327      22.24
3    Soltero        470      31.97

Porcentaje años antigüedad en el cargo

tabla_antiguedad <- table(datos_rotacion$Antigüedad_Cargo)

porcentajes_antiguedad <- prop.table(tabla_antiguedad) * 100

tabla_final_antiguedad <- data.frame(Opción = names(tabla_antiguedad),
                          Frecuencia = as.numeric(tabla_antiguedad),
                          Porcentaje = round(as.numeric(porcentajes_antiguedad), 2))

# Mostrar la tabla final
tabla_final_antiguedad
   Opción Frecuencia Porcentaje
1       0        244      16.60
2       1         57       3.88
3       2        372      25.31
4       3        135       9.18
5       4        104       7.07
6       5         36       2.45
7       6         37       2.52
8       7        222      15.10
9       8         89       6.05
10      9         67       4.56
11     10         29       1.97
12     11         22       1.50
13     12         10       0.68
14     13         14       0.95
15     14         11       0.75
16     15          8       0.54
17     16          7       0.48
18     17          4       0.27
19     18          2       0.14

Porcentaje empleados por cargo

tabla_cargo <- table(datos_rotacion$Cargo)

porcentajes_cargo <- prop.table(tabla_cargo) * 100

tabla_final_cargo <- data.frame(Opción = names(tabla_cargo),
                          Frecuencia = as.numeric(tabla_cargo),
                          Porcentaje = round(as.numeric(porcentajes_cargo), 2))

# Mostrar la tabla final
tabla_final_cargo
                   Opción Frecuencia Porcentaje
1  Director_Investigación         80       5.44
2    Director_Manofactura        145       9.86
3        Ejecutivo_Ventas        326      22.18
4                 Gerente        102       6.94
5 Investigador_Cientifico        292      19.86
6        Recursos_Humanos         52       3.54
7     Representante_Salud        131       8.91
8    Representante_Ventas         83       5.65
9     Tecnico_Laboratorio        259      17.62

2.1 Análisis

  • Ingreso mensual : El histograma sugiere que hay un gran número de empleados que ganan ingresos cercanos al a media, mientras que unos pocos tienen salarios más altos, por encima de $10,000. El salario típico está sobre los $4,900, el sesgo sugiere que solo una pequeña proporción de empleados gana más, lo que puede crear desigualdades percibidas por el resto de empleados y afectar la rotación en los rangos salariales bajos.
  • Edad : Presenta una distribución casi normal con edades alrededor de los 36 años y un rango entre 18 y 60 años, siendo entre 30 y 43 años el rango con mayor presencia.
  • Antigüedad en el cargo : es una variable multimodal y presenta dos momentos importantes sobre los 2 y 7 años de antigüedad. Entre 2 y 7 años tenemos el mayor porcentaje de empleados y con máximos de 18 años.
  • Horas extra : La mayoría de los trabajadores no trabajan horas extra, sin embargo, los que si podrían ver afectado el balance entre vida y trabajo influyendo en la decisión de cambiar de trabajo.
  • Estado civil : Siendo en su mayoría casados y divorciados, tal vez con responsabilidades familiares podrían estar más inclinados a contar con estabilidad y roten menos, los solteros son más propensos a la rotación.
  • Cargo : Los empleados con cargos más operativos (ejecutivo ventas, investigador científico, técnico laboratorio) podrían experimentar más insatisfacción y tener mayor probabilidad de rotación. Los cargos de dirección pueden ser más estables.

Concluyendo, la falta de aumento significativo en el ingreso y el tiempo sin promociones son factores que pueden incrementar la rotación para ciertos grupos, de igual manera puede ocurrir con los cargos operativos que tienen que trabajar horas extra, y por último los solteros son los que más riesgo pueden tener de rotación.

Punto 3

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.

3. Análisis bivariado

Se realiza el análisis vibariado de variables categóricas

ggplot(datos_rotacion, aes(x = Horas_Extra, fill = factor(Rotación))) + 
  geom_bar(position = "fill") + 
  scale_fill_manual(values = c("No" = "lightblue", "Si" = "coral")) +
  theme_minimal() + 
  labs(x = "Horas Extra", y = "Proporción", fill = "Rotación") +
  ggtitle("Distribución de Rotación por Horas extra") 

ggplot(datos_rotacion, aes(x = Estado_Civil, fill = factor(Rotación))) + 
  geom_bar(position = "fill") + 
  scale_fill_manual(values = c("No" = "lightblue", "Si" = "coral")) +
  theme_minimal() + 
  labs(x = "Estado civil", y = "Proporción", fill = "Rotación") +
  ggtitle("Distribución de Rotación por Estado civil") 

ggplot(datos_rotacion, aes(x = Cargo, fill = factor(Rotación))) + 
  geom_bar(position = "fill") + 
  scale_fill_manual(values = c("No" = "lightblue", "Si" = "coral")) +
  theme_minimal() + 
  labs(x = "Cargo", y = "Proporción", fill = "Rotación") +
  ggtitle("Distribución de Rotación por Cargo") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

Ahora se realiza el análisis vibariado de variables cuantitativas

ggplot(rotacion, aes(x = Rotación, y = Antigüedad_Cargo, fill= Rotación)) +
  geom_boxplot() +
  labs(title = "Distribución de Rotación según Antigüedad en el cargo",
       x = "Rotación",
       y = "Antigüedad en el cargo") +
  scale_fill_manual(values = c("Si" = "coral", "No" = "lightblue"))

ggplot(rotacion, aes(x = Rotación, y = Edad, fill= Rotación)) +
  geom_boxplot() +
  labs(title = "Distribución de Rotación según Edad",
       x = "Rotación",
       y = "Edad") +
  scale_fill_manual(values = c("Si" = "coral", "No" = "lightblue"))

ggplot(rotacion, aes(x = Rotación, y = Ingreso_Mensual, fill= Rotación)) +
  geom_boxplot() +
  labs(title = "Distribución de Rotación según Ingreso Mensual",
       x = "Rotación",
       y = "Ingreso Mensual") +
  scale_fill_manual(values = c("Si" = "coral", "No" = "lightblue"))

Análisis

  • Horas extra : En la gráfica se puede observar que el aunque el 71.7% de los empleados no hacen horas extra, la relación de quienes rotan y hacen horas extra es superior frente a los que no realizan horas extra afirmando la hipótesis inicial.
  • Estado civil : Se puede observar que el mayor porcentaje de rotación se presenta en los empleados solteros, lo que también confirma la hipótesis planteada.
  • Cargo : En la hipótesis se había considerado que tenía mayor probabilidad de rotación personal en cargos operativos, en la gráfica se puede apreciar que estos cargos operativos son los que mayor rotación presentan, mientras que los cargos de dirección son los de menor rotación comparativamente, confirmando la hipótesis.
  • Antigüedad en el cargo : Se aprecia en la gráfica que empleados con menos antigüedad cercana a los 2.5 mayor rotación presentan. En este caso la hipótesis no se cumplió a cabalidad, ya que se esperaba que empleados nuevos en un cargo no presentaran rotación, sin embargo se ve la influencia de la frecuencia de empleados con antigüedad alrededor de los 2 años, este también puede ser un motivo, dada la concentración de empleados, se pueden presentar más casos de rotación.
  • Edad : Se puede observar que a menor edad mayor probabildiad de rotación, lo que coincide con la hipótesis planteada.
  • Ingreso Mensual : Personas con ingresos menores son más tendientes a rotar que personas con ingresos por encima de $5,500 aproximadamente, lo que confirma la hipótesis planteada.

3.1 Modelo

3.1.1 Codificación de la variable respueta

datos_rotacion$Rotación <- ifelse(datos_rotacion$Rotación == "Si", 1, 0)
print(head(datos_rotacion, 3))
# A tibble: 3 × 24
  Rotación  Edad `Viaje de Negocios` Departamento Distancia_Casa Educación
     <dbl> <dbl> <chr>               <chr>                 <dbl>     <dbl>
1        1    41 Raramente           Ventas                    1         2
2        0    49 Frecuentemente      IyD                       8         1
3        1    37 Raramente           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>

3.1.2 Ajustar el modelo de regresión logística

Se usarán las variables seleccionadas (Antigüedad en el cargo, Edad, Ingreso Mensual, Horas Extra, Cargo, Estado civil) como predictoras para modelar la rotación.

# Ajustar el modelo de regresión logística
modelo_rotacion <- glm(Rotación ~ Antigüedad_Cargo + Edad + Ingreso_Mensual + 
                       Horas_Extra + Cargo + Estado_Civil, 
                       data = datos_rotacion, family = binomial)

# Ver el resumen del modelo
summary(modelo_rotacion)

Call:
glm(formula = Rotación ~ Antigüedad_Cargo + Edad + Ingreso_Mensual + 
    Horas_Extra + Cargo + Estado_Civil, family = binomial, data = datos_rotacion)

Coefficients:
                               Estimate Std. Error z value Pr(>|z|)    
(Intercept)                  -3.562e+00  1.034e+00  -3.446 0.000569 ***
Antigüedad_Cargo             -9.828e-02  2.768e-02  -3.551 0.000384 ***
Edad                         -2.669e-02  1.025e-02  -2.604 0.009221 ** 
Ingreso_Mensual               4.698e-05  4.641e-05   1.012 0.311393    
Horas_ExtraSi                 1.551e+00  1.628e-01   9.525  < 2e-16 ***
CargoDirector_Manofactura     1.169e+00  8.896e-01   1.314 0.188970    
CargoEjecutivo_Ventas         2.241e+00  8.462e-01   2.648 0.008086 ** 
CargoGerente                  7.258e-01  8.659e-01   0.838 0.401888    
CargoInvestigador_Cientifico  1.946e+00  9.358e-01   2.079 0.037622 *  
CargoRecursos_Humanos         2.833e+00  9.591e-01   2.953 0.003142 ** 
CargoRepresentante_Salud      1.226e+00  8.940e-01   1.371 0.170442    
CargoRepresentante_Ventas     3.199e+00  9.647e-01   3.316 0.000914 ***
CargoTecnico_Laboratorio      2.725e+00  9.331e-01   2.920 0.003500 ** 
Estado_CivilDivorciado       -3.206e-01  2.330e-01  -1.376 0.168843    
Estado_CivilSoltero           8.042e-01  1.734e-01   4.637 3.54e-06 ***
---
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: 1058.1  on 1455  degrees of freedom
AIC: 1088.1

Number of Fisher Scoring iterations: 6

3.1.3 Interpretación coeficientes

  • Horas extra :
    • Coeficiente 1.551 (p<0.001)
      • El componente es positivo y altamente significativo, esto indica que trabajar horas extra aumenta la probabilidad de rotación, lo que apoya la hipótesis de que los empleados que trabajan horas extra tienen más probabilidad de rotar, tal vez por el exceso de trabajo.
  • Estado civil :
    • Divorciado: Coeficiente -0.3206 (p=0.169) - No significativo
    • Soltero: Coeficiente 0.8042 (p<0.001) - muy significativo
      • Los empleados solteros tiene un coeficiente positivo y significativo, lo que indica que son más propensos a rotar en comparación con los casados. Esto apoya la hipótesis planteada, los divorciados por su parte no muestran un efecto significativo.
  • Cargo :
    • Director de Manufactura: Coeficiente 1.169 (p = 0.189) - No significativo.
      • Ejecutivo de Ventas: Coeficiente 2.241 (p = 0.008) - Significativo.
      • Gerente: Coeficiente 0.725 (p = 0.402) - No significativo.
      • Investigador Científico: Coeficiente 1.946 (p = 0.038) - Significativo.
      • Recursos Humanos: Coeficiente 2.833 (p = 0.003) - Significativo.
      • Representante de Ventas: Coeficiente 3.199 (p < 0.001) - Muy significativo.
      • Técnico de Laboratorio: Coeficiente 2.725 (p = 0.003) - Significativo.
        • los cargos operativos como Ejecutivo de ventas, Investigador científico, Representante de ventas y Técnico de laboratorio tienen coeficientes positivos significativos, lo que indica que empleados en estos roles tienen mayor probabilidad de rotar en comparación con otros cargos más enfocados en dirección. Esto confirma la hipótesis de que empleados con cargos de nivel inferior o más operativos son más propensos a rotar.
  • Antigüedad en el cargo :
    • Coeficiente: -0.0983 (p < 0.001)
      • El coeficiente es negativo, esto indica que a mayor antigüedad menor la probabilidad de rotación. Esto es contrario a la hipótesis original, que sugería que los empleados con mayor antigüedad podrían estar más propensos a rotar debido a la falta de oportunidades. Sin embargo, esto podría sugerir que los empleados con mayor antigüedad han alcanzado una fase de estabilidad en sus puestos y satisfacción.
  • Edad :
    • Coeficiente: -0.0267 (p = 0.009)
      • El coeficiente es negativo, lo que sugiere que a mayor edad, menor es la probabilidad de rotación. Esto apoya la hipótesis planteada, indicando que los empleados de más edad prefieren la estabilidad, mientras que los más jóvenes buscan más oportunidades.
  • Ingreso Mensual :
    • Coeficiente: 0.00004698 (p = 0.311)
      • Coeficiente positivo, pero no es significativo (p > 0.05). Esto indica que el ingreso mensual no tiene un impacto estadísticamente significativo en la probabilidad de rotación en este conjunto de datos. La hipótesis sugería que a menor ingreso más rotación, pero en el análisis no se puede concluir esto.

Conclusión : El modelo muestra que las variables que más influyen en la rotación son Horas Extra, Cargo, Estado Civil y Edad, todas con resultados significativos y que mayormente confirman las hipótesis planteadas. La única excepción relevante es la variable Antigüedad en el cargo, que muestra una relación inversa a lo esperado.

3.1.4 Estimación del modelo - Prueba Wald

Se calcula el estadistico Wald chi-square para evaluar la significancia individual de cada predictor del modelo.

# Obtener los coeficientes y errores estándar del modelo
coeficientes <- coef(summary(modelo_rotacion))

# Calcular el estadístico Wald
wald_stat <- (coeficientes[, "Estimate"] / coeficientes[, "Std. Error"])^2

# Mostrar los estadísticos Wald
wald_stat
                 (Intercept)             Antigüedad_Cargo 
                  11.8743240                   12.6067689 
                        Edad              Ingreso_Mensual 
                   6.7794994                    1.0247583 
               Horas_ExtraSi    CargoDirector_Manofactura 
                  90.7320241                    1.7256289 
       CargoEjecutivo_Ventas                 CargoGerente 
                   7.0144034                    0.7026694 
CargoInvestigador_Cientifico        CargoRecursos_Humanos 
                   4.3220475                    8.7229421 
    CargoRepresentante_Salud    CargoRepresentante_Ventas 
                   1.8790481                   10.9939152 
    CargoTecnico_Laboratorio       Estado_CivilDivorciado 
                   8.5267280                    1.8931897 
         Estado_CivilSoltero 
                  21.5017043 

Con estos indicadores se puede evaluar la significancia individual de cada variable en el modelo de regresión logísitca. Cuanto mayor el valor, mayor la evidencia que la variable es significativa en la predicción.

  • Horas extra -> 90.73, variable altamente signficativa para predecir la rotación.
  • Estado civil -> 21.50, en el caso de ser soltero también es altamente significativo para predecir la rotación.
  • Antigüedad en el cargo -> 12.61, es significativa en el modelo, a medida que aumenta la antigüedad en el cargo, disminuye la probabilidad de rotación.
  • Edad -> 6.78, también es significativa, pero en menor medida en comparación con las otras variables. Los más jóvenes tienen mayor probabilidad de rotar.
  • Las variables menos significativas son Ingreso mensual, Cargo de gerente, Estado civil divorciado y cargo como director de manufactura.

Cálculo de los p-valores

Ahora se calculan los p-valores para confirmar la significancia estadística de los coeficientes del modelo.

# Calcular los p-valores para cada estadístico Wald
p_values_wald <- 1 - pchisq(wald_stat, df = 1)

# Mostrar los p-valores
p_values_wald
                 (Intercept)             Antigüedad_Cargo 
                5.691312e-04                 3.843523e-04 
                        Edad              Ingreso_Mensual 
                9.221075e-03                 3.113930e-01 
               Horas_ExtraSi    CargoDirector_Manofactura 
                0.000000e+00                 1.889701e-01 
       CargoEjecutivo_Ventas                 CargoGerente 
                8.085657e-03                 4.018882e-01 
CargoInvestigador_Cientifico        CargoRecursos_Humanos 
                3.762163e-02                 3.142305e-03 
    CargoRepresentante_Salud    CargoRepresentante_Ventas 
                1.704424e-01                 9.141150e-04 
    CargoTecnico_Laboratorio       Estado_CivilDivorciado 
                3.499683e-03                 1.688426e-01 
         Estado_CivilSoltero 
                3.535143e-06 
  • los umbrales típicos para significancia son:
    • p < 0.05, la variable es significativa, hay suficiente evidencia para rechazar la hipótesis nula de que el coeficiente es 0)
    • p >= 0.05, la variable no es significativa.
  • Variables altamente significativas ( p < 0.001)
    • Horas extra, estado civil (soltero), Representante de ventas, Antigüedad en el cargo.
  • Variables significativas ( p < 0.05 )
    • Edad, Ejecutivo de Ventas, Investigador Científico, Recursos Humanos, Técnico de Laboratorio.
  • Variables No significativas (p > 0.05)
    • Ingreso Mensual, Director de Manufactura, Gerente, Representante de Salud, Estado Civil (Divorciado).

Punto 4

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.

4.1 Entrenamiento modelo (70-30)

4.1.1 Crear partición aleatoria (70% entrenamiento, 30% prueba)

# Crear la partición de los datos (70% entrenamiento, 30% prueba)
set.seed(42)  
indices_entrenamiento <- createDataPartition(datos_rotacion$Rotación, p = 0.7, list = FALSE)

# Conjuntos de entrenamiento y prueba
datos_entrenamiento <- datos_rotacion[indices_entrenamiento, ]
datos_prueba <- datos_rotacion[-indices_entrenamiento, ]

4.1.2 Ajustar el modelo logístico con el 70% de los datos de entrenamiento

# Ajustar el modelo logístico usando el conjunto de entrenamiento
modelo_logistico <- glm(Rotación ~ Antigüedad_Cargo + Edad + Ingreso_Mensual + 
                        Horas_Extra + Cargo + Estado_Civil, 
                        data = datos_entrenamiento, family = binomial)

# Mostrar los resultados del modelo
summary(modelo_logistico)

Call:
glm(formula = Rotación ~ Antigüedad_Cargo + Edad + Ingreso_Mensual + 
    Horas_Extra + Cargo + Estado_Civil, family = binomial, data = datos_entrenamiento)

Coefficients:
                               Estimate Std. Error z value Pr(>|z|)    
(Intercept)                  -3.771e+00  1.183e+00  -3.187  0.00144 ** 
Antigüedad_Cargo             -7.819e-02  3.352e-02  -2.333  0.01967 *  
Edad                         -4.170e-02  1.343e-02  -3.104  0.00191 ** 
Ingreso_Mensual               9.899e-05  5.809e-05   1.704  0.08838 .  
Horas_ExtraSi                 1.661e+00  2.010e-01   8.263  < 2e-16 ***
CargoDirector_Manofactura     1.208e+00  9.860e-01   1.225  0.22065    
CargoEjecutivo_Ventas         2.300e+00  9.100e-01   2.528  0.01148 *  
CargoGerente                  8.848e-01  9.083e-01   0.974  0.33002    
CargoInvestigador_Cientifico  2.178e+00  1.042e+00   2.091  0.03654 *  
CargoRecursos_Humanos         3.155e+00  1.088e+00   2.899  0.00374 ** 
CargoRepresentante_Salud      7.707e-01  1.016e+00   0.759  0.44789    
CargoRepresentante_Ventas     3.525e+00  1.083e+00   3.257  0.00113 ** 
CargoTecnico_Laboratorio      3.106e+00  1.039e+00   2.990  0.00279 ** 
Estado_CivilDivorciado       -2.075e-01  2.809e-01  -0.739  0.46000    
Estado_CivilSoltero           8.887e-01  2.179e-01   4.078 4.55e-05 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 879.08  on 1028  degrees of freedom
Residual deviance: 703.08  on 1014  degrees of freedom
AIC: 733.08

Number of Fisher Scoring iterations: 6

Punto 5

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

5. Predicciones

5.1 Predicciones en el conjunto de prueba

Esto generará probabilidades entre 0 y 1 que indican la probabilidad que un empleado rote.

# Predecir las probabilidades de rotación en el conjunto de prueba
predicciones <- predict(modelo_logistico, newdata = datos_prueba, type = "response")

5.2 Calcular la curva ROC y AUC

# Generar la curva ROC
roc_obj <- roc(datos_prueba$Rotación, predicciones)
Setting levels: control = 0, case = 1
Setting direction: controls < cases
# Calcular el AUC
auc_valor <- auc(roc_obj)

# Mostrar el AUC
print(auc_valor)
Area under the curve: 0.7513
  • AUC = 0.7513 Significa que el modelo tiene una capacidad moderadamente buena para distinguir entre empleados que rotan y los que no rotan.
    • Un 75.13% de los casos, el modelo será capaz de asignar una mayor probabilidad de rotación a un empleado que efectivamente rota (caso positivo), en comparación con uno que no rota (caso negativo).

5.3 Graficar la curva ROC

# Graficar la curva ROC
plot(roc_obj, col = "blue", main = paste("Curva ROC (AUC =", round(auc_valor, 2), ")"))

  • El área bajo la curva está mostrando el rendimiento del modelo, que en este caso es moderadamente bueno y que tiene aun oportunidades de mejora, bien sea cambiando las variables predictoras o ajustes en el modelo.

Punto 6

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

6. Conclusiones Finales

Para formular una estrategia para disminuir la rotación en la empresa con base en los resultados del modelo de regresión logística y las variables significativas identificadas, se deben considerar los factores clave que tienen un impacto directo en la rotación.

6.1 Horas Extra

  • Coeficiente: 1.551
  • Interpretación: Los empleados que trabajar horas extra tienen mayor probabilidad de rotar.
  • Estrategias
    • Implementar politicas que limiten las horas extra o compensarlas adecuadamente con tiempo libre o beneficios extra.
    • Promover equilibrio trabajo-vida, permitir flexibilidad laboral.
    • Distribuir de forma equitativa la carga de trabajo para reducir el posible agotamiento profesional.

6.2 Cargo

  • Coeficiente: Varios con coeficientes significativos
  • Interpretación: Los cargos más operativos, como Ejecutivo de Ventas, Investigador Científico, Técnico de Laboratorio, y Representante de Ventas, mostraron una mayor probabilidad de rotación.
  • Estrategias:
    • Implementar planes de desarrollo profesional específicos para estos roles.
    • Introducir programas de mentoría o coaching para empleados en estos cargos, que permita visualizar crecimiento profesional.
    • Evaluar el paquete de compensación y beneficios en estos roles.

6.3 Estado civil

  • Coeficiente: Soltero, 0.8042
  • Interpretación: Los empleados solteros tienen más probabilidad de rotación en comparación con los casados o divorciados.
  • Estrategias:
    • Ofrecer incentivos o beneficios que resulten atractivos para empleados solteros, como actividades sociales, formación continua, y oportunidades de desarrollo personal, también el participar en los viajes de la compañía puede ser un buen incentivo.
    • Crear un ambiente laboral que fomente el sentido de pertenencia.

6.4 Edad

  • Coeficiente: -0.0267
  • Interpretación: A medida que los empleados envejecen, su probabilidad de rotación disminuye.
  • Estrategias:
    • Para los empleados más jóvenes, la rotación puede estar relacionada con la búsqueda de oportunidades de crecimiento. Ofrecer programas de formación y asignarles proyectos desafiantes que fomenten su desarrollo profesional dentro de la empresa.
      • Para los empleados más cercanos a la jubilación, garantizar la seguridad laboral y ofrecer beneficios relacionados con el retiro o bienestar a largo plazo puede ayudar a mantener su compromiso.

6.5 Antigüedad en el cargo

  • Coeficiente: -0.0983
  • Interpretación: A mayor antigüedad en el cargo, menor probabilidad de rotación.
  • Estrategias:
    • Para los empleados con mucha antigüedad en su puesto, ofrecerles reconocimiento, beneficios extra, planes de mentoría, oportunidades dentro de la empresa.
    • Para empleados con menos antigüedad, garantizar inducción adecuada, fomentar su sentido de pertenencia a la empresa mediante cultura de apoyo y crecimiento.