Introducción

Problema: Rotación de cargo

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

Data

library(paqueteMODELOS)
library(tidyverse)
library(dplyr)
library(psych)
library(mice)
library(factoextra)
library(plotly)
library(ggplot2)
library(FactoMineR)
library(leaflet)
library(corrplot)
library(boot)
library(lmtest)
library(car)
library(ROSE)
library(pROC)

options(scipen = 100, digits = 2)

Exploración y modificación general

Se utiliza la función ‘glimpse’ que nos proporcionará una vista general de los datos. El número de registros, el número de campos y la clase a la que pertenecen esos campos.

# Cargar Datos
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, …
  • El conjunto de datos cuenta con 24 atributos y 1470 registros.

Identificación datos Vacíos

colSums(is.na(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

Identificación datos Únicos

colRotacion <- colnames(rotacion)

 for(variable in colRotacion){

unicos<- rotacion %>%
  group_by(!!sym(variable)) %>%
    summarise(registros = n())

 print(unicos)
}
## # A tibble: 2 × 2
##   Rotación registros
##   <chr>        <int>
## 1 No            1233
## 2 Si             237
## # A tibble: 43 × 2
##     Edad registros
##    <dbl>     <int>
##  1    18         8
##  2    19         9
##  3    20        11
##  4    21        13
##  5    22        16
##  6    23        14
##  7    24        26
##  8    25        26
##  9    26        39
## 10    27        48
## # ℹ 33 more rows
## # A tibble: 3 × 2
##   `Viaje de Negocios` registros
##   <chr>                   <int>
## 1 Frecuentemente            277
## 2 No_Viaja                  150
## 3 Raramente                1043
## # A tibble: 3 × 2
##   Departamento registros
##   <chr>            <int>
## 1 IyD                961
## 2 RH                  63
## 3 Ventas             446
## # A tibble: 29 × 2
##    Distancia_Casa registros
##             <dbl>     <int>
##  1              1       208
##  2              2       211
##  3              3        84
##  4              4        64
##  5              5        65
##  6              6        59
##  7              7        84
##  8              8        80
##  9              9        85
## 10             10        86
## # ℹ 19 more rows
## # A tibble: 5 × 2
##   Educación registros
##       <dbl>     <int>
## 1         1       170
## 2         2       282
## 3         3       572
## 4         4       398
## 5         5        48
## # A tibble: 6 × 2
##   Campo_Educación registros
##   <chr>               <int>
## 1 Ciencias              606
## 2 Humanidades            27
## 3 Mercadeo              159
## 4 Otra                   82
## 5 Salud                 464
## 6 Tecnicos              132
## # A tibble: 4 × 2
##   Satisfacción_Ambiental registros
##                    <dbl>     <int>
## 1                      1       284
## 2                      2       287
## 3                      3       453
## 4                      4       446
## # A tibble: 2 × 2
##   Genero registros
##   <chr>      <int>
## 1 F            588
## 2 M            882
## # A tibble: 9 × 2
##   Cargo                   registros
##   <chr>                       <int>
## 1 Director_Investigación         80
## 2 Director_Manofactura          145
## 3 Ejecutivo_Ventas              326
## 4 Gerente                       102
## 5 Investigador_Cientifico       292
## 6 Recursos_Humanos               52
## 7 Representante_Salud           131
## 8 Representante_Ventas           83
## 9 Tecnico_Laboratorio           259
## # A tibble: 4 × 2
##   Satisfación_Laboral registros
##                 <dbl>     <int>
## 1                   1       289
## 2                   2       280
## 3                   3       442
## 4                   4       459
## # A tibble: 3 × 2
##   Estado_Civil registros
##   <chr>            <int>
## 1 Casado             673
## 2 Divorciado         327
## 3 Soltero            470
## # A tibble: 1,349 × 2
##    Ingreso_Mensual registros
##              <dbl>     <int>
##  1            1009         1
##  2            1051         1
##  3            1052         1
##  4            1081         1
##  5            1091         1
##  6            1102         1
##  7            1118         1
##  8            1129         1
##  9            1200         1
## 10            1223         1
## # ℹ 1,339 more rows
## # A tibble: 10 × 2
##    Trabajos_Anteriores registros
##                  <dbl>     <int>
##  1                   0       197
##  2                   1       521
##  3                   2       146
##  4                   3       159
##  5                   4       139
##  6                   5        63
##  7                   6        70
##  8                   7        74
##  9                   8        49
## 10                   9        52
## # A tibble: 2 × 2
##   Horas_Extra registros
##   <chr>           <int>
## 1 No               1054
## 2 Si                416
## # A tibble: 15 × 2
##    Porcentaje_aumento_salarial registros
##                          <dbl>     <int>
##  1                          11       210
##  2                          12       198
##  3                          13       209
##  4                          14       201
##  5                          15       101
##  6                          16        78
##  7                          17        82
##  8                          18        89
##  9                          19        76
## 10                          20        55
## 11                          21        48
## 12                          22        56
## 13                          23        28
## 14                          24        21
## 15                          25        18
## # A tibble: 2 × 2
##   Rendimiento_Laboral registros
##                 <dbl>     <int>
## 1                   3      1244
## 2                   4       226
## # A tibble: 40 × 2
##    Años_Experiencia registros
##               <dbl>     <int>
##  1                0        11
##  2                1        81
##  3                2        31
##  4                3        42
##  5                4        63
##  6                5        88
##  7                6       125
##  8                7        81
##  9                8       103
## 10                9        96
## # ℹ 30 more rows
## # A tibble: 7 × 2
##   Capacitaciones registros
##            <dbl>     <int>
## 1              0        54
## 2              1        71
## 3              2       547
## 4              3       491
## 5              4       123
## 6              5       119
## 7              6        65
## # A tibble: 4 × 2
##   Equilibrio_Trabajo_Vida registros
##                     <dbl>     <int>
## 1                       1        80
## 2                       2       344
## 3                       3       893
## 4                       4       153
## # A tibble: 37 × 2
##    Antigüedad registros
##         <dbl>     <int>
##  1          0        44
##  2          1       171
##  3          2       127
##  4          3       128
##  5          4       110
##  6          5       196
##  7          6        76
##  8          7        90
##  9          8        80
## 10          9        82
## # ℹ 27 more rows
## # A tibble: 19 × 2
##    Antigüedad_Cargo registros
##               <dbl>     <int>
##  1                0       244
##  2                1        57
##  3                2       372
##  4                3       135
##  5                4       104
##  6                5        36
##  7                6        37
##  8                7       222
##  9                8        89
## 10                9        67
## 11               10        29
## 12               11        22
## 13               12        10
## 14               13        14
## 15               14        11
## 16               15         8
## 17               16         7
## 18               17         4
## 19               18         2
## # A tibble: 16 × 2
##    Años_ultima_promoción registros
##                    <dbl>     <int>
##  1                     0       581
##  2                     1       357
##  3                     2       159
##  4                     3        52
##  5                     4        61
##  6                     5        45
##  7                     6        32
##  8                     7        76
##  9                     8        18
## 10                     9        17
## 11                    10         6
## 12                    11        24
## 13                    12        10
## 14                    13        10
## 15                    14         9
## 16                    15        13
## # A tibble: 18 × 2
##    Años_acargo_con_mismo_jefe registros
##                         <dbl>     <int>
##  1                          0       263
##  2                          1        76
##  3                          2       344
##  4                          3       142
##  5                          4        98
##  6                          5        31
##  7                          6        29
##  8                          7       216
##  9                          8       107
## 10                          9        64
## 11                         10        27
## 12                         11        22
## 13                         12        18
## 14                         13        14
## 15                         14         5
## 16                         15         5
## 17                         16         2
## 18                         17         7

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.

Variables categóricas

  1. Se espera que el Departamento al que pertenece el trabajador se relacione con la rotación ya que algunos departamentos por dinámicas del mercado pueden ser más demandados y presentar ofertas atractivas. La hipótesis es que las personas que se encuentran en el Departamento de Ventas tienen una mayor probabilidad de abandonar su empleo en comparación con aquellas personas que se encuentran en otros departamentos.

  2. Se espera que el Cargo al que pertenece el trabajador se relacione con la rotación debido a que algunos cargos requieren un nivel de experiencia y conocimiento que implican una mayor demanda en el mercado.La hipótesis es que las personas con cargos técnicos o que no son de alta gerenciatienen una mayor probabilidad de abandonar su empleo en comparación con aquellas personas que tienen cargos directivos.

  3. Se espera que el Estado Civil del trabajador se relacione con la rotación ya que de acuerdo a esta situación, el trabajador puede buscar estabilidad o un crecimiento muy rápido.La hipótesis es que las personas que no están casadas tienen una mayor probabilidad de abandonar su empleo en comparación con aquellas personas con un estado civil diferente.

Variables cuantitativas

4.Se espera que la Satisfacción laboral del trabajador se relacione con la rotación debido a que un nivel bajo de satisfacción implicaría un trabajador desmotivado.La hipótesis es que las personas que tienen un nivel de satisfacción laboral bajo tienen una mayor probabilidad de abandonar su empleo en comparación con aquellas personas con un nivel de satisfacción alto.

  1. Se espera que el % Aumento salarial del trabajador se relacione con la rotación debido a que el aspecto económico es importante en el campo laboral y por lo tanto un determinante a la hora de continuar en una organización. La hipótesis es que las personas que tienen un % aumento salarial bajo tienen una mayor probabilidad de abandonar su empleo en comparación con aquellas que tienen un % aumento salarial mayor.

6.Se espera que el nivel de Equilibrio_Trabajo_Vida del trabajador se relacione con la rotación, ya que un bajo nivel de equilibrio implica que el trabajador enfrenta dificultades para conciliar sus responsabilidades laborales con sus compromisos familiares, personales y de ocio. La hipótesis planteada es que las personas que tienen un bajo nivel de equilibrio-trabajo-vida tienen una mayor probabilidad de abandonar su empleo en comparación con aquellas que tienen un nivel más alto de equilibrio-trabajo-vida.

2. Análisis Univariado

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

Se realiza un summary para explorar los datos de manera general.

summary(rotacion)
##    Rotación              Edad    Viaje de Negocios  Departamento      
##  Length:1470        Min.   :18   Length:1470        Length:1470       
##  Class :character   1st Qu.:30   Class :character   Class :character  
##  Mode  :character   Median :36   Mode  :character   Mode  :character  
##                     Mean   :37                                        
##                     3rd Qu.:43                                        
##                     Max.   :60                                        
##  Distancia_Casa   Educación   Campo_Educación    Satisfacción_Ambiental
##  Min.   : 1.0   Min.   :1.0   Length:1470        Min.   :1.0           
##  1st Qu.: 2.0   1st Qu.:2.0   Class :character   1st Qu.:2.0           
##  Median : 7.0   Median :3.0   Mode  :character   Median :3.0           
##  Mean   : 9.2   Mean   :2.9                      Mean   :2.7           
##  3rd Qu.:14.0   3rd Qu.:4.0                      3rd Qu.:4.0           
##  Max.   :29.0   Max.   :5.0                      Max.   :4.0           
##     Genero             Cargo           Satisfación_Laboral Estado_Civil      
##  Length:1470        Length:1470        Min.   :1.0         Length:1470       
##  Class :character   Class :character   1st Qu.:2.0         Class :character  
##  Mode  :character   Mode  :character   Median :3.0         Mode  :character  
##                                        Mean   :2.7                           
##                                        3rd Qu.:4.0                           
##                                        Max.   :4.0                           
##  Ingreso_Mensual Trabajos_Anteriores Horas_Extra       
##  Min.   : 1009   Min.   :0.0         Length:1470       
##  1st Qu.: 2911   1st Qu.:1.0         Class :character  
##  Median : 4919   Median :2.0         Mode  :character  
##  Mean   : 6503   Mean   :2.7                           
##  3rd Qu.: 8379   3rd Qu.:4.0                           
##  Max.   :19999   Max.   :9.0                           
##  Porcentaje_aumento_salarial Rendimiento_Laboral Años_Experiencia
##  Min.   :11.0                Min.   :3.0         Min.   : 0      
##  1st Qu.:12.0                1st Qu.:3.0         1st Qu.: 6      
##  Median :14.0                Median :3.0         Median :10      
##  Mean   :15.2                Mean   :3.2         Mean   :11      
##  3rd Qu.:18.0                3rd Qu.:3.0         3rd Qu.:15      
##  Max.   :25.0                Max.   :4.0         Max.   :40      
##  Capacitaciones Equilibrio_Trabajo_Vida   Antigüedad Antigüedad_Cargo
##  Min.   :0.0    Min.   :1.0             Min.   : 0   Min.   : 0.0    
##  1st Qu.:2.0    1st Qu.:2.0             1st Qu.: 3   1st Qu.: 2.0    
##  Median :3.0    Median :3.0             Median : 5   Median : 3.0    
##  Mean   :2.8    Mean   :2.8             Mean   : 7   Mean   : 4.2    
##  3rd Qu.:3.0    3rd Qu.:3.0             3rd Qu.: 9   3rd Qu.: 7.0    
##  Max.   :6.0    Max.   :4.0             Max.   :40   Max.   :18.0    
##  Años_ultima_promoción Años_acargo_con_mismo_jefe
##  Min.   : 0.0          Min.   : 0.0              
##  1st Qu.: 0.0          1st Qu.: 2.0              
##  Median : 1.0          Median : 3.0              
##  Mean   : 2.2          Mean   : 4.1              
##  3rd Qu.: 3.0          3rd Qu.: 7.0              
##  Max.   :15.0          Max.   :17.0

Atributos Categóricos

Construimos gráficas de barras para los datos categóricos.

dataCat <- c("Rotación", "Viaje de Negocios", "Departamento", "Educación", "Campo_Educación",
            "Genero", "Cargo", "Estado_Civil", "Horas_Extra")


for (col in dataCat) {
  barplot(prop.table(table(rotacion[[col]])),
          ylab = "Proporción",
          xlab = col,
          main = paste("Gráfico de barras para", col))

}

Atributos Cuantitativos

Construimos diagramas de cajas para los datos cuantitativos

dataCua <- c("Edad", "Distancia_Casa", "Satisfacción_Ambiental", "Satisfación_Laboral",
             "Ingreso_Mensual", "Trabajos_Anteriores", "Porcentaje_aumento_salarial",
             "Rendimiento_Laboral", "Años_Experiencia", "Capacitaciones", "Equilibrio_Trabajo_Vida","Antigüedad", "Antigüedad_Cargo", "Años_ultima_promoción",
             "Años_acargo_con_mismo_jefe")



for (col in dataCua) {

  
  boxplot(rotacion[[col]],
        names = col,
        main = paste("Diagrama de cajas para", col),
        ylab = "Valores")

}

Conclusiones.

Podemos notar un desequilibrio significativo en las clases, con más del 80% experimentando rotación, mientras que el 20% restante no muestra ningún indicio de rotación. Además, aproximadamente el 70% del personal viaja raramente. Del total, un poco más del 60% está asignado al departamento de Investigación y Desarrollo.

En cuanto a la formación académica, más del 70% posee estudios superiores. El 40% del personal se especializa en el campo de Ciencias, mientras que el 30% se centra en el campo de la Salud. En cuanto a la composición de género, aproximadamente el 60% del personal es masculino. Además, más del 40% está casado, mientras que el 20% está divorciado y el restante es soltero.

La edad del personal oscila entre 18 y 60 años, con una media de 36 años. En términos de distancia desde el hogar hasta el lugar de trabajo, la distancia varía de 1 a 29 unidades, con una media de 9.2 unidades. La satisfacción ambiental y laboral se sitúa en un promedio de 2.7 en una escala de 1 a 4.

En lo que respecta a los ingresos mensuales, estos varían desde 1009 hasta 19999, con un ingreso medio de 6503 unidades monetarias. En promedio, el personal ha tenido dos trabajos anteriores. El porcentaje de aumento salarial oscila entre 11% y 25%, con un promedio de 15.2%.

Además, el 75% del personal lleva menos de 9 años en la empresa, y paralelamente el 75% del personal lleva menos de 7 años en su puesto actual.

3. Análisis bivariado

Realiza un análisis 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.

Atributos Categóricos

Para ver la relación entre la rotación y las vriables cualitativas, utilizaremos la prueba Chi-cuadrado.

atrCat <- c("Viaje de Negocios", "Departamento", "Educación", "Campo_Educación",
            "Genero", "Cargo", "Estado_Civil", "Horas_Extra")


for (col in atrCat) {

  
prueba_chi <- chisq.test(rotacion$Rotación, rotacion[[col]])
print(paste("Resultado prueba chi cuadrado rotacion y ", col))
print(prueba_chi)
  
}
## [1] "Resultado prueba chi cuadrado rotacion y  Viaje de Negocios"
## 
##  Pearson's Chi-squared test
## 
## data:  rotacion$Rotación and rotacion[[col]]
## X-squared = 24, df = 2, p-value = 0.000006
## 
## [1] "Resultado prueba chi cuadrado rotacion y  Departamento"
## 
##  Pearson's Chi-squared test
## 
## data:  rotacion$Rotación and rotacion[[col]]
## X-squared = 11, df = 2, p-value = 0.005
## 
## [1] "Resultado prueba chi cuadrado rotacion y  Educación"
## 
##  Pearson's Chi-squared test
## 
## data:  rotacion$Rotación and rotacion[[col]]
## X-squared = 3, df = 4, p-value = 0.5
## 
## [1] "Resultado prueba chi cuadrado rotacion y  Campo_Educación"
## 
##  Pearson's Chi-squared test
## 
## data:  rotacion$Rotación and rotacion[[col]]
## X-squared = 16, df = 5, p-value = 0.007
## 
## [1] "Resultado prueba chi cuadrado rotacion y  Genero"
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  rotacion$Rotación and rotacion[[col]]
## X-squared = 1, df = 1, p-value = 0.3
## 
## [1] "Resultado prueba chi cuadrado rotacion y  Cargo"
## 
##  Pearson's Chi-squared test
## 
## data:  rotacion$Rotación and rotacion[[col]]
## X-squared = 86, df = 8, p-value = 0.000000000000003
## 
## [1] "Resultado prueba chi cuadrado rotacion y  Estado_Civil"
## 
##  Pearson's Chi-squared test
## 
## data:  rotacion$Rotación and rotacion[[col]]
## X-squared = 46, df = 2, p-value = 0.00000000009
## 
## [1] "Resultado prueba chi cuadrado rotacion y  Horas_Extra"
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  rotacion$Rotación and rotacion[[col]]
## X-squared = 88, df = 1, p-value <0.0000000000000002

Atributos Categóricos

Para ver la relación entre la rotación y las variables cuantitativas, convertiremos el atributo rotación como indica el enunciado y realizamos una matriz de correlación.

rotacionCor <- rotacion %>%
  mutate(Rotación = ifelse(Rotación=="Si", 1, 0)) %>% 
  select(-c("Viaje de Negocios", "Departamento", "Educación", "Campo_Educación",
         "Genero", "Cargo", "Estado_Civil", "Horas_Extra"))

matriz_cor_rotacion <- cor(rotacionCor)

corrplot(matriz_cor_rotacion, method = "color", addCoef.col = "black", tl.cex = 0.7, width = 10, number.cex = 0.7)

Conclusiones.

En el análisis de las pruebas chi-cuadrado de independencia realizadas, se destaca que varias variables están vinculadas a la rotación del personal en la empresa. Entre las más significativas se encuentran el Viaje de Negocios, el Cargo, el Estado Civil y las Horas Extras. Sin embargo, no se encontró evidencia de relación entre la rotación y las variables Educación y Género.

En lo que respecta a las variables cuantitativas, no se observa una correlación significativa entre la rotación y las demás variables. No obstante, se identifican algunas variables que muestran cierta correlación, como la distancia al hogar, la edad, el ingreso mensual y las variables relacionadas con la antigüedad. Estas últimas muestran una correlación por encima del 0.5 entre sí. Por lo tanto, se puede considerar utilizar una variable asociada a la antigüedad como indicador en el análisis.

4. Estimación del modelo

Realiza la estimación de un modelo de regresión logístico en el cual la variable respuesta es rotacion (\(y=1\) es si rotación, \(y=0\) es no rotación) y las covariables las 6 seleccionadas en el punto 1. Interprete los coeficientes del modelo y la significancia de los parámetros.

De acuerdo a los resultados anteriores. Las covariables seleccionadas son: Horas Extra, Cargo, Estado Civil, Ingreso Mensual, Distancia Casaa, Antigüedad en el Cargo. Primero se deben convertir las variables cualitativas a cuantativas.

dataModelo <- rotacion %>% 
  mutate(Rotación= ifelse(Rotación=="Si", 1, 0),
         Horas_Extra=ifelse(Horas_Extra=="Si", 1, 0),
         Cargo = case_when(Cargo=="Ejecutivo_Ventas"~1,
                           Cargo=="Investigador_Cientifico"~2,
                           Cargo=="Tecnico_Laboratorio"~3,
                           Cargo=="Director_Manofactura"~4,
                           Cargo=="Representante_Salud"~5,
                           Cargo=="Gerente"~6,
                           Cargo=="Representante_Ventas"~7,
                           Cargo=="Director_Investigación"~8,
                           T~9),
         Estado_Civil= case_when(Estado_Civil=="Soltero"~1,
                                 Estado_Civil=="Casado"~2,
                                 T ~3)) %>% 
  select(Rotación, Horas_Extra, Cargo, Estado_Civil, Ingreso_Mensual, Distancia_Casa,Antigüedad_Cargo)

Modelo

De acuerdo con el dataset modificado se construye el modelo

modeloRot<- glm(Rotación ~ Horas_Extra 
                    + Cargo 
                    + Estado_Civil
                    + Ingreso_Mensual 
                    + Distancia_Casa   
                    + Antigüedad_Cargo , 
                    family = binomial(link="logit"),
                    data=dataModelo)

summary(modeloRot)
## 
## Call:
## glm(formula = Rotación ~ Horas_Extra + Cargo + Estado_Civil + 
##     Ingreso_Mensual + Distancia_Casa + Antigüedad_Cargo, family = binomial(link = "logit"), 
##     data = dataModelo)
## 
## Coefficients:
##                    Estimate Std. Error z value             Pr(>|z|)    
## (Intercept)      -0.4580474  0.2671334   -1.71              0.08640 .  
## Horas_Extra       1.4582655  0.1566807    9.31 < 0.0000000000000002 ***
## Cargo             0.0404215  0.0352943    1.15              0.25210    
## Estado_Civil     -0.6642889  0.1112593   -5.97         0.0000000024 ***
## Ingreso_Mensual  -0.0001102  0.0000233   -4.72         0.0000023530 ***
## Distancia_Casa    0.0310129  0.0091904    3.37              0.00074 ***
## Antigüedad_Cargo -0.1022765  0.0268327   -3.81              0.00014 ***
## ---
## 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: 1100.7  on 1463  degrees of freedom
## AIC: 1115
## 
## Number of Fisher Scoring iterations: 5

Conclusiones.

El resultado del modelo indica que algunas variables están significativamente asociadas con la rotación del personal en la empresa. Aquí están los coeficientes estimados para cada variable:

Horas_Extra:

La variable “Horas_Extra” tiene un coeficiente estimado de 1.4582655 con un valor p extremadamente bajo (< 0.0000000000000002), lo que sugiere que el aumento en las horas extras trabajadas aumenta significativamente la probabilidad de rotación.

Cargo:

La variable “Cargo” tiene un coeficiente estimado de 0.0404215 con un valor p de 0.25210, lo que indica que el efecto del cargo en la probabilidad de rotación no es estadísticamente significativo.

Estado_Civil:

La variable “Estado_Civil” tiene un coeficiente estimado de -0.6642889 con un valor p muy bajo (0.0000000024), lo que sugiere que el estado civil tiene un impacto significativo en la probabilidad de rotación. Los empleados solteros tienen una probabilidad diferente de rotación en comparación con los casados o divorciados.

Ingreso_Mensual:

La variable “Ingreso_Mensual” tiene un coeficiente estimado de -0.0001102 con un valor p muy bajo (0.0000023530), lo que indica que el ingreso mensual tiene un impacto significativo en la probabilidad de rotación. A medida que aumenta el ingreso mensual, disminuye la probabilidad de rotación.

Distancia_Casa:

La variable “Distancia_Casa” tiene un coeficiente estimado de 0.0310129 con un valor p de 0.00074, lo que sugiere que la distancia al hogar también tiene un impacto significativo en la probabilidad de rotación. A medida que aumenta la distancia al hogar, aumenta la probabilidad de rotación.

Antigüedad_Cargo:

La variable “Antigüedad_Cargo” tiene un coeficiente estimado de -0.1022765 con un valor p de 0.00014, lo que sugiere que la antigüedad en el cargo tiene un impacto significativo en la probabilidad de rotación. A medida que aumenta la antigüedad en el cargo, disminuye la probabilidad de rotación.

En resumen, las horas extras trabajadas, el estado civil, el ingreso mensual, la distancia al hogar y la antigüedad en el cargo son variables significativas en el modelo de regresión logística para predecir la rotación del personal en la empresa.

5. Evaluación

Evaluar el poder predictivo del modelo con base en la curva ROC y el AUC.

data_train <- nrow(dataModelo)*0.7
data_test <- nrow(dataModelo)*0.3

set.seed(123)

index_train<-sample(1:nrow(dataModelo),size = data_train)

#Entrenamiento

train<-dataModelo[index_train,]

# Test
test<-dataModelo[-index_train,]


#Revisión de balanceo de los datos en los sets de train y test
prop.table(table(train$Rotación))
## 
##    0    1 
## 0.84 0.16

Como se puede observar existe un desbalanceo significativo entre las 2 clases.

Balanceo de clases

#Balanceo por oversampling

train_b=ovun.sample(Rotación~., data = train, 
                         p = 0.5, seed = 1, 
                         method = "over")$data

test_b=ovun.sample(Rotación~., data = test, 
                         p = 0.5, seed = 1, 
                         method = "over")$data



#Datos Balanceados
prop.table(table(train_b$Rotación))
## 
##    0    1 
## 0.51 0.49

Modelo con datos balanceados

modeloRotTrain<- glm(Rotación ~ Horas_Extra 
                    + Cargo 
                    + Estado_Civil
                    + Ingreso_Mensual 
                    + Distancia_Casa   
                    + Antigüedad_Cargo , 
                    family = binomial(link="logit"),
                    data=train_b)

Matriz de Confusión

valPronostico<- predict(modeloRotTrain,test_b,type = "response")
nivProB <- ifelse(valPronostico > 0.5, "Si","No") 
nivProB <-factor(nivProB)




RendimientoData <- data.frame(observados = test_b$Rotación,
                             predicciones =nivProB)

Positivos <- sum(RendimientoData$observados == 1)
Negativos <- sum(RendimientoData$observados == 0)


Positivos_pronosticados <- sum(RendimientoData$predicciones == "Si")
Negativos_pronosticados <- sum(RendimientoData$predicciones == "No")


Total <- nrow(RendimientoData)

VP <- sum(RendimientoData$observados == 1 & RendimientoData$predicciones == "Si")
VN <- sum(RendimientoData$observados == 0 & RendimientoData$predicciones == "No")
FP <- sum(RendimientoData$observados == 0 & RendimientoData$predicciones == "Si")
FN <- sum(RendimientoData$observados == 1 & RendimientoData$predicciones == "No")

matrizConfusion = matrix(c(VP, FP, FN,VN), nrow = 2)

rownames(matrizConfusion) = c(" Si ", " No")
colnames(matrizConfusion) = c("Si", "No")
matrizConfusion
##       Si  No
##  Si  255 103
##  No  120 246

Precisión, Recall y F1-score

Precision <- VP/(VP+FP)
Recall <- VP/(VP+FN)
F1 <- 2*((Precision*Recall)/(Precision+Recall))

print(Precision)
## [1] 0.68
print(Recall)
## [1] 0.71
print(F1)
## [1] 0.7

Curva ROC

ROC <- roc(test_b$Rotación, valPronostico)


auc<- round(auc(ROC, levels =c(0,1), direction = "<"),4)

ggroc(ROC, colour = "#1D8348", size=1)+
ggtitle(paste0("Curva ROC ", "(AUC = ", auc, ")"))+
xlab("Especificidad")+
ylab("Sensibilidad")  

Conclusiones.

Según los resultados, el modelo muestra una habilidad razonable para distinguir entre las clases positivas y negativas. Aunque el ROC se considera sólido, su interpretación precisa puede variar según el contexto específico del problema y los requisitos del proyecto. Un valor de ROC cercano a 1 indica un excelente desempeño del modelo, mientras que un valor cerca de 0.5 sugiere un rendimiento similar al azar.

Con un ROC superior a 0.7, el modelo parece tener una capacidad moderadamente buena para clasificar correctamente las instancias en las clases positivas y negativas. Sin embargo, es esencial considerar otras métricas de evaluación del modelo, como precisión, recall y F1-score, para obtener una visión completa de su rendimiento.

La precisión del modelo, que indica que el 68% de las veces que predice un cambio de trabajo, este ocurre realmente, y el recall, que señala que el modelo identifica correctamente alrededor del 71% de los trabajadores que realmente cambian de empleo, respaldan esta evaluación.

El F1-score, que se acerca a 1, sugiere un rendimiento razonablemente bueno del modelo en términos de equilibrio entre precisión y recall, lo que refuerza la confianza en su capacidad para predecir el cambio de trabajo de los empleados de manera efectiva.

6. Predicciones

Realiza una predicción la probabilidad de que un individuo (hipotético) rote y defina un corte para decidir si se debe intervenir a este empleado o no (posible estrategia para motivar al empleado).

Empleado 1

Supongamos un empleado no trabaja Horas Extra, que tenga el Cargo como Director de investigación, que sea divorciado, que tenga un ingreso mensual de 12000, que la distancia a casa es 3 y que la antigüedad en el cargo sea de 4 años.

predict(modeloRotTrain,list(Horas_Extra=0,
                              Cargo=8,
                              Estado_Civil=3,
                              Ingreso_Mensual =12000,
                              Distancia_Casa=3,
                              Antigüedad_Cargo=4),type="response")
##   1 
## 0.1

Empleado 2

Supongamos un empleado trabaja Horas Extra, que tenga el Cargo como Gerente, que sea soltero, que tenga un ingreso mensual de 10000, que la distancia a casa es 5 y que la antigüedad en el cargo sea de 6 años.

predict(modeloRotTrain,list(Horas_Extra=1,
                              Cargo=6,
                              Estado_Civil=1,
                              Ingreso_Mensual =10000,
                              Distancia_Casa=5,
                              Antigüedad_Cargo=6),type="response")
##    1 
## 0.69

7. Conclusiones

Para retener a los empleados y reducir la probabilidad de que cambien de trabajo, se puede implementar una estrategia integral que aborde varios aspectos relacionados con su satisfacción y bienestar en el trabajo. Aquí hay algunas estrategias que podrían considerarse:

  1. Programas de conciliación trabajo-vida: Ofrecer programas flexibles que permitan a los empleados equilibrar sus responsabilidades laborales y personales. Esto puede incluir horarios flexibles, trabajo remoto ocasional y políticas de permisos familiares.

  2. Incentivos económicos: Evaluar y ajustar los salarios y beneficios para garantizar que sean competitivos en el mercado laboral y reflejen el valor y la contribución de los empleados a la empresa.

  3. Gestión de horarios y carga laboral: Minimizar la necesidad de horas extras excesivas mediante una gestión eficaz de la carga laboral y la distribución equitativa de las responsabilidades entre los empleados.

  4. Desarrollo profesional y oportunidades de crecimiento: Brindar oportunidades de capacitación, desarrollo y crecimiento profesional que permitan a los empleados expandir sus habilidades y avanzar en sus carreras dentro de la empresa.

  5. Apoyo para la movilidad laboral: Proporcionar asistencia o incentivos para ayudar a los empleados a encontrar soluciones de vivienda más cercanas al lugar de trabajo, facilitando así una menor distancia de viaje.