Problema: Rotación de cargo

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.

Pasos

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

# Cargar archivo de datos
library(paqueteMODELOS)
data('rotacion')

# Ver encabezado / primeras filas
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>
# Ver últimas filas
tail(rotacion)
## # A tibble: 6 × 24
##   Rotación  Edad `Viaje de Negocios` Departamento Distancia_Casa Educación
##   <chr>    <dbl> <chr>               <chr>                 <dbl>     <dbl>
## 1 No          26 Raramente           Ventas                    5         3
## 2 No          36 Frecuentemente      IyD                      23         2
## 3 No          39 Raramente           IyD                       6         1
## 4 No          27 Raramente           IyD                       4         3
## 5 No          49 Frecuentemente      Ventas                    2         3
## 6 No          34 Raramente           IyD                       8         3
## # ℹ 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>
# Dataframe datos rotacion
rotacion_df = as.data.frame(rotacion)

# Estructura datos
str(rotacion)
## 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 ...

Variables seleccionadas

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

Variable Tipo Relación esperada
0. Rotación chr Variable objetivo.
1. Genero chr Por determinar si las mujeres rotan menos que los hombres.
2. Satisfación_Laboral num Entre mayor satisfacción laboral, se espera menor rotación.
3. Estado_Civil chr Se espera mayor rotación en las personas solteras que en las casadas.
4. Ingreso_Mensual num Entre menor ingreso mensual, se espera mayor rotación.
5. Horas_Extra chr Entre mayor horas extra (i.e. trabajo), se espera mayor rotación.
6. Antigüedad num Entre mayor antigüedad, se espera menor rotación.

Paso 2. Análisis univariado

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

Análisis Exploratorio Datos / EDA

# Resumen datos
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
# Cantidad de NaN / nulls por variable
colSums(is.na(rotacion_df))
##                    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

Se procede a analizar las variables categóricas:

# Selección variables categóricas (character / string)
rotacion_df_chr = rotacion_df %>%
  select(where(is.character))

# Identificación valores únicos variables categóricas
rotacion_df_chr_unq = lapply(rotacion_df_chr, unique)

# Valores únicos por variable
for (col in names(rotacion_df_chr_unq)) {
  cat('Valores únicos', col, ':', paste(rotacion_df_chr_unq[[col]], collapse = ', '), '\n')
}
## Valores únicos Rotación : Si, No 
## Valores únicos Viaje de Negocios : Raramente, Frecuentemente, No_Viaja 
## Valores únicos Departamento : Ventas, IyD, RH 
## Valores únicos Campo_Educación : Ciencias, Otra, Salud, Mercadeo, Tecnicos, Humanidades 
## Valores únicos Genero : F, M 
## Valores únicos Cargo : Ejecutivo_Ventas, Investigador_Cientifico, Tecnico_Laboratorio, Director_Manofactura, Representante_Salud, Gerente, Representante_Ventas, Director_Investigación, Recursos_Humanos 
## Valores únicos Estado_Civil : Soltero, Casado, Divorciado 
## Valores únicos Horas_Extra : Si, No
# Barras / tortas para cada variable categórica
par(mfrow = c(2, 2))

for (col in names(rotacion_df_chr)) {
  barplot(table(rotacion_df_chr[[col]]), main = col)
  pie(table(rotacion_df_chr[[col]]), main = col)
}

Luego se procede la generación de gráficos descriptivos para las variables numéricas del dataframe:

# Selección variables numéricas (numeric / double)
rotacion_df_num = rotacion_df %>%
  select(where(is.numeric))

# Histogramas / diagramas caja para cada variable numérica
par(mfrow = c(2, 2))

for (col in names(rotacion_df_num)) {
  hist(rotacion_df_num[[col]], main = col, xlab = col)
  boxplot(rotacion_df_num[[col]], main = col, ylab = col)
}

Paso 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 hipótesis planteada en el punto 1.

# Variables categóricas / chr seleccionadas
rotacion_df_chr_sel = c('Genero', 'Estado_Civil', 'Horas_Extra')

# Variables cuantitativas / num seleccionadas
rotacion_df_num_sel = c('Satisfación_Laboral', 'Ingreso_Mensual', 'Antigüedad')

# Crear un nuevo dataframe con las variables seleccionadas
rotacion_df_sel = rotacion %>% 
  select('Rotación', all_of(rotacion_df_chr_sel), all_of(rotacion_df_num_sel))

# Rotación como factor
rotacion_df_sel$Rotación <- factor(rotacion_df_sel$Rotación)

# Primeras filas dataframe
kable(head(rotacion_df_sel))
Rotación Genero Estado_Civil Horas_Extra Satisfación_Laboral Ingreso_Mensual Antigüedad
Si F Soltero Si 4 5993 6
No M Casado No 2 5130 10
Si M Soltero Si 3 2090 0
No F Casado Si 3 2909 8
No M Casado No 2 3468 2
No M Soltero No 4 3068 7
# Boxplot Rotación vs Género
ggplot(data = rotacion_df_sel, aes(x = Genero, fill = Rotación)) +
    geom_bar()

# Boxplot Rotación vs Estado Civil
ggplot(data = rotacion_df_sel, aes(x = Estado_Civil, fill = Rotación)) +
    geom_bar()

# Boxplot Rotación vs Extras
ggplot(data = rotacion_df_sel, aes(x = Horas_Extra, fill = Rotación)) +
    geom_bar()

# Boxplot Rotación vs Satisfacción
ggplot(data = rotacion_df_sel, aes(x = Rotación, y = Satisfación_Laboral, fill = Rotación)) +
    geom_boxplot()

# Boxplot Rotación vs Ingreso
ggplot(data = rotacion_df_sel, aes(x = Rotación, y = Ingreso_Mensual, fill = Rotación)) +
    geom_boxplot()

# Boxplot Rotación vs Antigüedad
ggplot(data = rotacion_df_sel, aes(x = Rotación, y = Antigüedad, fill = Rotación)) +
    geom_boxplot()

Las gráficas anteriores muestran que las hipótesis / relaciones esperadas parecen cumplirse para las variables seleccionadas: - Los hombres, solteros y personas con horas extras rotan más que las otras categorías. - Las personas que rotan presentan menor satisfacción laboral, ingresos mensuales y antigüedad.

# Mutación variable "Rotación" como binaria
rotacion_df_sel_bin = rotacion_df_sel %>%
  mutate(Rotación = as.numeric(rotacion_df_sel$Rotación == 'Si'))  %>%
  mutate(Genero = as.numeric(rotacion_df_sel$Genero == 'M'))  %>%
  mutate(Estado_Civil = as.factor(rotacion_df_sel$Estado_Civil))  %>%
  mutate(Horas_Extra = as.numeric(rotacion_df_sel$Horas_Extra == 'Si'))

kable(head(rotacion_df_sel_bin))
Rotación Genero Estado_Civil Horas_Extra Satisfación_Laboral Ingreso_Mensual Antigüedad
1 0 Soltero 1 4 5993 6
0 1 Casado 0 2 5130 10
1 1 Soltero 1 3 2090 0
0 0 Casado 1 3 2909 8
0 1 Casado 0 2 3468 2
0 1 Soltero 0 4 3068 7
# Matriz dispersión / scatterplot entre variables
ggpairs(rotacion_df_sel_bin)
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

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

# Modelo de regresión logístico para Rotación binario
rotacion_gmod = glm(Rotación ~ ., data = rotacion_df_sel_bin, family = 'binomial') # Se obtiene exactamente lo mismo usando data = rotacion_df_sel

# Mostrar un resumen del modelo
summary(rotacion_gmod)
## 
## Call:
## glm(formula = Rotación ~ ., family = "binomial", data = rotacion_df_sel_bin)
## 
## Coefficients:
##                          Estimate Std. Error z value Pr(>|z|)    
## (Intercept)            -1.004e+00  2.774e-01  -3.621 0.000293 ***
## Genero                  2.896e-01  1.601e-01   1.808 0.070574 .  
## Estado_CivilDivorciado -3.431e-01  2.295e-01  -1.495 0.134958    
## Estado_CivilSoltero     9.074e-01  1.698e-01   5.346 9.01e-08 ***
## Horas_Extra             1.511e+00  1.581e-01   9.559  < 2e-16 ***
## Satisfación_Laboral    -3.206e-01  6.885e-02  -4.657 3.20e-06 ***
## Ingreso_Mensual        -1.045e-04  2.462e-05  -4.247 2.16e-05 ***
## Antigüedad             -4.100e-02  1.811e-02  -2.265 0.023531 *  
## ---
## 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: 1095.6  on 1462  degrees of freedom
## AIC: 1111.6
## 
## Number of Fisher Scoring iterations: 5

Respecto a los resultamos del modelo glm, se puede observar lo siguiente:

  • El coeficiente para la variable Genero es de aproximadamente 0.29. Esto significa que, manteniendo todas las demás variables constantes, los hombres (género masculino / M) tienen una mayor probabilidad de rotación en comparación con las mujeres. De todos modos al contar con p-value de 0.0706, se considera que no es significativo al nivel alpha / significancia del 0.05.

  • El coeficiente para “Estado_CivilSoltero” es de aproximadamente 0.91. como se suponía las personas solteras tienen una mayor probabilidad de rotación en comparación con las personas que tienen otro estado civil. Este coeficiente es significativo con un valor p mucho menor que 0.05.

  • El coeficiente para Horas_Extra es de 1.51. Por lo que las personas que trabajan horas extras tienen una mayor probabilidad de rotación en comparación con las que no trabajan extras. Este coeficiente es muy significativo (p-value < 2e-16).

  • El coeficiente para Satisfacción_Laboral es -0.32. Esto significa que un aumento en la satisfacción laboral está asociado con una menor probabilidad de rotación. Este coeficiente es significativo (p-value de 3.20e-06 < 0.05).

  • El coeficiente para Ingreso_Mensual es de -1.045e-04. Por lo que un aumento en el ingreso mensual está asociado con una ligera disminución en la probabilidad de rotación. Este coeficiente es significativo (p-value de 2.16e-05 < 0.05), pero la magnitud del efecto es pequeña (-0.0001).

  • El coeficiente para Antigüedad es de -0.041. Esto indica que un aumento en la antigüedad está asociado con una ligera disminución en la probabilidad de rotación. Este coeficiente es significativo (p-value de 0.023, ligeramente menor que 0.05), pero al igual que el ingreso, el efecto es pequeño.

Paso 5. Evaluación

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

# Calcular probabilidades modelo glm Rotación
rotacion_df_sel_bin$Prob = predict(rotacion_gmod, type = 'response')

kable(head(rotacion_df_sel_bin))
Rotación Genero Estado_Civil Horas_Extra Satisfación_Laboral Ingreso_Mensual Antigüedad Prob
1 0 Soltero 1 4 5993 6 0.3227809
0 1 Casado 0 2 5130 10 0.0909139
1 1 Soltero 1 3 2090 0 0.6279140
0 0 Casado 1 3 2909 8 0.2521113
0 1 Casado 0 2 3468 2 0.1417619
0 1 Soltero 0 4 3068 7 0.1547539
# Calcular curva ROC modelo glm Rotación
rotacion_gmod_roc = roc(rotacion_df_sel_bin$Rotación, rotacion_df_sel_bin$Prob)

# Calcular AUC modelo glm Rotación
rotacion_gmod_auc = round(auc(rotacion_gmod_roc, levels =c(0,1), direction = '<'), 4)
rotacion_gmod_auc
## [1] 0.7755

Como puede observarse, un valor de AUC de 0.7755 indica que el modelo tiene un rendimiento razonable para predecir la rotación.

# pROC ggroc / curva ROC modelo glm Rotación
ggroc(rotacion_gmod_roc, colour = 'purple', size=1) +
ggtitle(paste0('Curva ROC ', '(AUC = ', rotacion_gmod_auc, ')'))+
xlab('Especificidad')+
ylab('Sensibilidad')  

Para complementar se obtiene la matriz de confusión con caret:

# Calcular las predicciones del modelo glm Rotación
rotacion_df_sel_bin$Predict = ifelse(rotacion_df_sel_bin$Prob > 0.5, 1, 0) # 'Si' = 1 y 'No' = 0

kable(head(rotacion_df_sel_bin))
Rotación Genero Estado_Civil Horas_Extra Satisfación_Laboral Ingreso_Mensual Antigüedad Prob Predict
1 0 Soltero 1 4 5993 6 0.3227809 0
0 1 Casado 0 2 5130 10 0.0909139 0
1 1 Soltero 1 3 2090 0 0.6279140 1
0 0 Casado 1 3 2909 8 0.2521113 0
0 1 Casado 0 2 3468 2 0.1417619 0
0 1 Soltero 0 4 3068 7 0.1547539 0
# calcular matriz confusión modelo glm Rotación
rotacion_confu_matrix = confusionMatrix(data = as.factor(rotacion_df_sel_bin$Predict),
                                         reference = as.factor(rotacion_df_sel_bin$Rotación))

# Matriz confusión modelo glm Rotación
print(rotacion_confu_matrix)
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction    0    1
##          0 1214  192
##          1   19   45
##                                          
##                Accuracy : 0.8565         
##                  95% CI : (0.8375, 0.874)
##     No Information Rate : 0.8388         
##     P-Value [Acc > NIR] : 0.03378        
##                                          
##                   Kappa : 0.2474         
##                                          
##  Mcnemar's Test P-Value : < 2e-16        
##                                          
##             Sensitivity : 0.9846         
##             Specificity : 0.1899         
##          Pos Pred Value : 0.8634         
##          Neg Pred Value : 0.7031         
##              Prevalence : 0.8388         
##          Detection Rate : 0.8259         
##    Detection Prevalence : 0.9565         
##       Balanced Accuracy : 0.5872         
##                                          
##        'Positive' Class : 0              
## 

Lo anterior nos muestra que la exactitud (accuracy) del modelo es de 85.65%.

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

# Dataframe persona / individuo hipotético
individuo_x = data.frame(
  Genero = 1, # 'M' = 1
  Estado_Civil = 'Casado',
  Horas_Extra = 1, # 'Si'= 1
  Satisfación_Laboral   = 2,
  Ingreso_Mensual = 9000,
  Antigüedad = 11
)

# Predicción probabilidad rotación Individuo X
rotacion_x = predict(rotacion_gmod, newdata = individuo_x, type = 'response')

# Probabilidad obtenida
print(rotacion_x)
##         1 
## 0.2249603

Según el modelo este “Individuo X”, tiene una probabilidad de aproximadamente 22.5% de rotar, lo cual se podría considerar dentro de lo “normal” y manejable. A juicio del autor, se deberían categorizar como críticos y tomar medidas (p.ej. trabajo remoto, pago estudios, viajes, bonificaciones, otorgamiento de reconocimientos, etc.) para los empleados que sean valiosos y/o tengan un alto desempeño en la organización.

Paso 7. Conclusiones

En las conclusiones adicione una discusió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).

Conclusiones y Recomendaciones

Con los datos de rotaciones analizados y al modelo de regresión logística aplicado, se puede observar lo siguiente:

  • La base de datos contiene registros de 1470 empleados, entre los 18 y los 60 años, con rangos entre 1 a casi 20 millones de pesos, de los cuales cerca de un 60% son hombres.
  • Como era de esperarse los hombres, las personas solteras con menos antigüedad y salario, así como las que trabajan más horas extras son las que más rotan (es evidente que las que están más descontentas también).
  • Luego de aplicar el modelo de regresión logístico, las variables significativas para predecir la rotación son Horas_Extra, Satisfacción_Laboral e Ingreso_Mensual.
  • Respecto a posibles medidas para disminuir la rotación de la empresa se podría implementar lo siguiente: contratar más mujeres no tan jóvenes con salarios competitivos y desde el primer día plantear a cada nuevo empleado un plan de carrera motivador.
  • Respecto al material de estudio, como en la anterior unidad se recomienda revisar ortografía, funcionalidad y la ampliación de los de los ejemplos.

Referencias

Amat Rodrigo, Joaquín. 2015. “Regresión Logística Simple y Múltiple.” Cienciadedatos.net. https://cienciadedatos.net/documentos/27_regresion_logistica_simple_y_multiple.html.
Caldeyro Rey, María Emma. 2021. “Análisis de Predicción Aplicado a La Deserción de Empleados.” Master’s thesis, Universidad Complutense Madrid. https://docta.ucm.es/entities/publication/9eefb94d-e1ff-44df-b21b-0374c5a96da9.
De La Fuente Fernández, Santiago. 2023. Estadistica.net. Universidad Autónoma de Madrid. https://www.estadistica.net/.
Holtz, Yan. n.d. “The R Graph Gallery – Help and Inspiration for R´ Charts.” The R Graph Gallery. https://r-graph-gallery.com/.
Maurandi-López, Antonio, L Alonso, Aurora González-Vidal, Maria Elvira, and Álvaro Hernández Vicente. 2019. “Fundamentos Estadísticos Para Investigación. Introducción a r y Modelos,” April. https://doi.org/https://doi.org/10.5281/zenodo.2628915.
Moirón Sánchez, Rubén. 2021. “Análisis de Datos: Estudio de La Probabilidad de Marcha de Un Empleado.” Master’s thesis, Universidad de Granada. https://masteres.ugr.es/estadistica-aplicada/sites/master/moea/public/inline-files/TFM_MoironSanchezRuben.pdf.
Morales, Javier, and María Asunción Martínez. 2021. Modelos Estadísticos. Bookdown.org. https://bookdown.org/j_morales/librostat/.
Posit Software, PBC. n.d. RPubs. Accessed September 27, 2023. https://rpubs.com/.
Soage, José Carlos. n.d. R-Charts.com. https://r-charts.com/.
Stack Exchange, Inc. n.d. Stack Overflow. https://stackoverflow.com/.
Xie, Yihui, J. J. Allaire, and Garrett Grolemund. 2023. R Markdown: The Definitive Guide. https://bookdown.org/yihui/rmarkdown/.