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 indicen en mayor proporción a estos cambios.

Con esta información, la empresa podrá tomar medidas proactivas para retener a su talento clave, identificar áreas de mejora en la gestión de recursos humanos y fomentar un ambiente laboral más estable y tranquilo. La predicción de la probabilidad de rotación de empleados ayudará a la empresa a tomar decisiones estratégicas informadas y a mantener un equipo de trabajo comprometido y satisfecho en sus roles actuales.

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

1. Selección de variables

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

Rta./

  • Variables Categóricas:
  1. Satisfacción Laboral: Crucial para entender la rotación del personal, abarca aspectos emocionales, psicológicos y de compensación. Está relacionada con el rendimiento psicológico y la salud mental.

  2. Estado Civil: Impacta en la rotación, especialmente para personas con responsabilidades familiares, quienes buscan equilibrar vida laboral y personal.

  3. Cargo: Determinante debido a la carga laboral asociada; roles de alta presión pueden motivar a buscar nuevas oportunidades. Vinculado con la cultura organizacional y el diseño del trabajo.

  • Variables Cuantitativas:
  1. Ingreso Mensual: Importante factor de retención; a mayor salario, menor disposición a cambiar de empleo.

  2. Último Año de Promoción: Las promociones reducen la rotación; empresas que ofrecen más oportunidades de ascenso tienen menor rotación.

  3. Edad: Explica patrones de rotación según el ciclo de vida; las nuevas generaciones buscan variedad laboral, mientras que los más mayores prefieren estabilidad.

  • Hipótesis
  1. Satisfacción Laboral: Trabajadores insatisfechos tienen más probabilidades de buscar nuevas oportunidades laborales para mejorar su bienestar.

  2. Estado Civil: Empleados casados pueden estar más inclinados a cambiar de trabajo para equilibrar sus responsabilidades familiares y laborales.

  3. Cargo: Puestos con mayor carga horaria, responsabilidad o presión pueden incentivar a los profesionales a buscar nuevas oportunidades.

  4. Ingresos Mensuales: Altos ingresos mensuales disminuyen la probabilidad de buscar nuevos empleos.

  5. Último Año de Promoción: Menos años desde la última promoción reducen la tendencia a cambiar de trabajo.

  6. Edad: Los trabajadores más jóvenes tienen más probabilidades de rotación laboral que los más mayores.

Empecemos!

Importamos todo lo que necesitamos

Mostramos las primeras 10 filas de nuestro df, para verificar si debemos hacer algun proceso de limpieza

data(rotacion)
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 ...
head(rotacion,10)
## # A tibble: 10 × 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
##  7 No          59 Raramente           IyD                       3         3
##  8 No          30 Raramente           IyD                      24         1
##  9 No          38 Frecuentemente      IyD                      23         3
## 10 No          36 Raramente           IyD                      27         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>
md.pattern(rotacion, rotate.names = TRUE)
##  /\     /\
## {  `---'  }
## {  O   O  }
## ==>  V <==  No need for mice. This data set is completely observed.
##  \  \|/  /
##   `-----'

##      Rotación Edad Viaje de Negocios Departamento Distancia_Casa Educación
## 1470        1    1                 1            1              1         1
##             0    0                 0            0              0         0
##      Campo_Educación Satisfacción_Ambiental Genero Cargo Satisfación_Laboral
## 1470               1                      1      1     1                   1
##                    0                      0      0     0                   0
##      Estado_Civil Ingreso_Mensual Trabajos_Anteriores Horas_Extra
## 1470            1               1                   1           1
##                 0               0                   0           0
##      Porcentaje_aumento_salarial Rendimiento_Laboral Años_Experiencia
## 1470                           1                   1                1
##                                0                   0                0
##      Capacitaciones Equilibrio_Trabajo_Vida Antigüedad Antigüedad_Cargo
## 1470              1                       1          1                1
##                   0                       0          0                0
##      Años_ultima_promoción Años_acargo_con_mismo_jefe  
## 1470                     1                          1 0
##                          0                          0 0
colnames(rotacion)
##  [1] "Rotación"                    "Edad"                       
##  [3] "Viaje de Negocios"           "Departamento"               
##  [5] "Distancia_Casa"              "Educación"                  
##  [7] "Campo_Educación"             "Satisfacción_Ambiental"     
##  [9] "Genero"                      "Cargo"                      
## [11] "Satisfación_Laboral"         "Estado_Civil"               
## [13] "Ingreso_Mensual"             "Trabajos_Anteriores"        
## [15] "Horas_Extra"                 "Porcentaje_aumento_salarial"
## [17] "Rendimiento_Laboral"         "Años_Experiencia"           
## [19] "Capacitaciones"              "Equilibrio_Trabajo_Vida"    
## [21] "Antigüedad"                  "Antigüedad_Cargo"           
## [23] "Años_ultima_promoción"       "Años_acargo_con_mismo_jefe"
rotacion_seleccionada <- rotacion[,c("Rotación", "Genero", "Estado_Civil", "Distancia_Casa", "Ingreso_Mensual", "Edad", "Cargo")]
rotacion_seleccionada <- as.data.frame(rotacion_seleccionada)
NAs<-colSums(is.na(rotacion_seleccionada))
as.data.frame(NAs)
##                 NAs
## Rotación          0
## Genero            0
## Estado_Civil      0
## Distancia_Casa    0
## Ingreso_Mensual   0
## Edad              0
## Cargo             0
kable(head(rotacion_seleccionada))
Rotación Genero Estado_Civil Distancia_Casa Ingreso_Mensual Edad Cargo
Si F Soltero 1 5993 41 Ejecutivo_Ventas
No M Casado 8 5130 49 Investigador_Cientifico
Si M Soltero 2 2090 37 Tecnico_Laboratorio
No F Casado 3 2909 33 Investigador_Cientifico
No M Casado 2 3468 27 Tecnico_Laboratorio
No M Soltero 2 3068 32 Tecnico_Laboratorio

2 - Análisis Univariado

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

Género:

kable(table(rotacion$Genero))
Var1 Freq
F 588
M 882
p1 <- ggplot(rotacion, aes(x = Genero)) + 
    geom_bar(fill = "skyblue", color = "black", aes(y = ..count..)) +
    geom_text(aes(y = ..count.., label = scales::percent(..count../sum(..count..))), stat="count", position = position_dodge(0.9), vjust = -0.5) +
    labs(title = "Gráfico de barras para Género", x = "Género", y = "Frecuencia") + 
    theme_minimal() +
    theme(axis.text.x = element_text(angle = 45, hjust = 1))

print(p1)
## Warning: The dot-dot notation (`..count..`) was deprecated in ggplot2 3.4.0.
## ℹ Please use `after_stat(count)` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

Como podemos observar, el 60% son mujeres y solo el 40% hombres.

Cargo:

kable(table(rotacion$Cargo))
Var1 Freq
Director_Investigación 80
Director_Manofactura 145
Ejecutivo_Ventas 326
Gerente 102
Investigador_Cientifico 292
Recursos_Humanos 52
Representante_Salud 131
Representante_Ventas 83
Tecnico_Laboratorio 259
p2 <- ggplot(rotacion, aes(x = Cargo)) + 
    geom_bar(fill = "skyblue", color = "black") + 
    geom_text(aes(y = ..count.., label = scales::percent(..count../sum(..count..))), stat="count", position = position_dodge(0.9), vjust = -0.5) +
    labs(title = "Gráfico de barras para Carg", x = "Cargo", y = "Frecuencia") + 
    theme_minimal() +
    theme(axis.text.x = element_text(angle = 45, hjust = 1))
print(p2)

Como podemos observar, con un 22.18% el cargo de ejecutivo de ventas es en mayor, le sigue Inv. científico (19.86%). El menos frecuente es Recursos humanos con (3.54%)

Estado civil:

kable(table(rotacion$Estado_Civil))
Var1 Freq
Casado 673
Divorciado 327
Soltero 470
p3 <- ggplot(rotacion, aes(x = Estado_Civil)) + 
    geom_bar(fill = "skyblue", color = "black") + 
  geom_text(aes(y = ..count.., label = scales::percent(..count../sum(..count..))), stat="count", position = position_dodge(0.9), vjust = -0.5) +
    labs(title = "Gráfico de barras para Estado_Civil", x = "Estado_Civil", y = "Frecuencia") + 
    theme_minimal() +
    theme(axis.text.x = element_text(angle = 45, hjust = 1))
print(p3)

Como podemos observar, el 45.8% son casados, 22.2% divorciados, y 32% solteros

Edad

kable(rotacion %>% 
  summarise(Media = mean(Edad), 
            Mediana = median(Edad), 
            Desv_Estandar = sd(Edad), 
            Minimo = min(Edad), 
            Maximo = max(Edad)))
Media Mediana Desv_Estandar Minimo Maximo
36.92449 36 9.135938 18 60
median_val_hist <- median(rotacion$Edad)
mean_val_hist <- mean(rotacion$Edad)

p_edad <- ggplot(rotacion, aes(x = Edad)) + 
    geom_histogram(aes(y = ..density..), fill = "#FFB6C1", color = "black", alpha = 0.7) + 
    geom_density(alpha = 0.2, fill = "#006400") +
    geom_vline(aes(xintercept = median_val_hist), color = "blue", linetype = "dashed", size = 0.5) + 
    geom_vline(aes(xintercept = mean_val_hist), color = "red", linetype = "dashed", size = 0.5) +
    labs(title = "Histograma para Edad", x = "Edad", y = "Densidad") +
    annotate("text", x = mean_val_hist + 2, y = 0.02, label = "Media", color = "red") + 
    annotate("text", x = median_val_hist - 2, y = 0.02, label = "Mediana", color = "blue") + 
    theme_minimal()
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
print(p_edad)
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Como podemos observar en el histograma, la edad predominante esta entre los 30 y 40 años. Y va desde los 18 hasta los 60.

# Calcular los cuartiles, la mediana y la media
q1_val <- quantile(rotacion$Edad, 0.25)
q3_val <- quantile(rotacion$Edad, 0.75)
median_val_hist <- median(rotacion$Edad)
mean_val <- mean(rotacion$Edad)


# Calcular los cuartiles, la mediana y la media
q1_val <- quantile(rotacion$Edad, 0.25)
q3_val <- quantile(rotacion$Edad, 0.75)
median_val_hist <- median(rotacion$Edad)
mean_val <- mean(rotacion$Edad)

# Crear el gráfico
p_box_edad <- ggplot(rotacion, aes(y = Edad)) + 
  geom_boxplot(fill = "#FFB6C1", color = "black", width = 0.5, outlier.shape = NA) + 
  geom_jitter(aes(x = 0), width = 0.25, size = 2, alpha = 0.7, color = "#006400") +
  annotate("text", x = -0.5, y = median_val_hist, label = paste("Mediana:", round(median_val_hist, 2))) + 
  annotate("text", x = -0.5, y = q1_val, label = paste("Q1:", round(q1_val, 2))) + 
  annotate("text", x = -0.5, y = q3_val, label = paste("Q3:", round(q3_val, 2))) +
  annotate("text", x = -0.5, y = mean_val + 2, label = paste("Media:", round(mean_val, 2)), col = "red") +  
  labs(
    title = "Boxplot para Edad",
    y = "Edad",  
    x = NULL
  ) + 
  theme_minimal() +
  theme(axis.title.x=element_blank(),  
        axis.text.x=element_blank(),  
        axis.ticks.x=element_blank())  

print(p_box_edad)

En la anterior boxplor podemos ver que el 50% de la data, se acumula entre los 30 y 43 años de edad.

Ingreso Mensual

kable(rotacion %>% 
          summarise(
            Media = mean(Ingreso_Mensual),
            Mediana = median(Ingreso_Mensual),
            Desv_Estandar = sd(Ingreso_Mensual),
            Minimo = min(Ingreso_Mensual),
            Maximo = max(Ingreso_Mensual)
          ))
Media Mediana Desv_Estandar Minimo Maximo
6502.931 4919 4707.957 1009 19999
median_val_hist <- median(rotacion$Ingreso_Mensual)
mean_val_hist <- mean(rotacion$Ingreso_Mensual)

p_ingreso <- ggplot(rotacion, aes(x = Ingreso_Mensual)) + 
    geom_histogram(aes(y = ..density..), fill = "#FFB6C1", color = "black", alpha = 0.7) + 
    geom_density(alpha = 0.2, fill = "#006400") +
    geom_vline(aes(xintercept = median_val_hist), color = "blue", linetype = "dashed", size = 0.5) + 
    geom_vline(aes(xintercept = mean_val_hist), color = "red", linetype = "dashed", size = 0.5) +
    labs(title = "Histograma para Ingreso_Mensual", x = "Ingreso_Mensual", y = "Densidad") +
    annotate("text", x = mean_val_hist + 500, y = 0.00002, label = "Media", color = "red") + 
    annotate("text", x = median_val_hist - 500, y = 0.00002, label = "Mediana", color = "blue") + 
    theme_minimal()
print(p_ingreso)
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Como podemos observar, la mitad de la personas tienen un ingreso inferior a 5.000

q1_val_ingreso <- quantile(rotacion$Ingreso_Mensual, 0.25)
q3_val_ingreso <- quantile(rotacion$Ingreso_Mensual, 0.75)
median_val_ingreso <- median(rotacion$Ingreso_Mensual)
mean_val_ingreso <- mean(rotacion$Ingreso_Mensual)

# Crear el gráfico
p_box_ingreso <- ggplot(rotacion, aes(y = Ingreso_Mensual)) + 
    geom_boxplot(fill = "#FFB6C1", color = "black", width = 0.5, outlier.shape = NA) + 
    geom_jitter(aes(x = 0), width = 0.25, size = 2, alpha = 0.7, color = "#006400") +
    annotate("text", x = -0.5, y = median_val_ingreso, label = paste("               Mediana:", round(median_val_ingreso, 2))) + 
    annotate("text", x = -0.5, y = q1_val_ingreso, label = paste("     Q1:", round(q1_val_ingreso, 2))) + 
    annotate("text", x = -0.5, y = q3_val_ingreso, label = paste("     Q3:", round(q3_val_ingreso, 2))) +
    annotate("text", x = -0.5, y = mean_val_ingreso + 500, label = paste("               Media:", round(mean_val_ingreso, 2)), col = "red") +  
    labs(
      title = "Boxplot para Ingreso Mensual",
      y = "Ingresos Mensuales",  
      x = NULL
    ) + 
    theme_minimal() +
    theme(axis.title.x=element_blank(),  
          axis.text.x=element_blank(),  
          axis.ticks.x=element_blank())  

print(p_box_ingreso)

Podemos analizar del anterior boxplot que el 50% gana entre 2911 y 8379. La mediana es aproximadamente 4919, lo que sugiere que la mitad de los ingresos mensuales están por debajo de este valor. La media es ligeramente más alta, alrededor de 6502.93.

Distancia casas:

kable(rotacion %>% 
          summarise(
            Media = mean(Distancia_Casa),
            Mediana = median(Distancia_Casa),
            Desv_Estandar = sd(Distancia_Casa),
            Minimo = min(Distancia_Casa),
            Maximo = max(Distancia_Casa)
          ))
Media Mediana Desv_Estandar Minimo Maximo
9.192517 7 8.106864 1 29
median_val_hist <- median(rotacion$Distancia_Casa)
mean_val_hist <- mean(rotacion$Distancia_Casa)

p_distancia <- ggplot(rotacion, aes(x = Distancia_Casa)) + 
    geom_histogram(aes(y = ..density..), fill = "#FFB6C1", color = "black", alpha = 0.7) + 
    geom_density(alpha = 0.2, fill = "#006400") +
    geom_vline(aes(xintercept = median_val_hist), color = "blue", linetype = "dashed", size = 0.5) + 
    geom_vline(aes(xintercept = mean_val_hist), color = "red", linetype = "dashed", size = 0.5) +
    labs(title = "Histograma para Distancia_Casa", x = "Distancia_Casa", y = "Densidad") +
    annotate("text", x = mean_val_hist + 2, y = 0.02, label = "Media", color = "red") + 
    annotate("text", x = median_val_hist - 2, y = 0.02, label = "Mediana", color = "blue") + 
    theme_minimal()
print(p_distancia)
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Podemos observar que el 50% tiene su vivienda a menos de 7 kilometros pues así nos lo indica la mediana

q1_val_distancia <- quantile(rotacion$Distancia_Casa, 0.25)
q3_val_distancia <- quantile(rotacion$Distancia_Casa, 0.75)
median_val_distancia <- median(rotacion$Distancia_Casa)
mean_val_distancia <- mean(rotacion$Distancia_Casa)

# Crear el gráfico
p_box_distancia_casa <- ggplot(rotacion, aes(y = Distancia_Casa)) + 
    geom_boxplot(fill = "#FFB6C1", color = "black", width = 0.5, outlier.shape = NA) + 
    geom_jitter(aes(x = 0), width = 0.25, size = 2, alpha = 0.7, color = "#006400") +
    annotate("text", x = -0.5, y = median_val_distancia, label = paste("               Mediana:", round(median_val_distancia, 2))) + 
    annotate("text", x = -0.5, y = q1_val_distancia, label = paste("     Q1:", round(q1_val_distancia, 2))) + 
    annotate("text", x = -0.5, y = q3_val_distancia, label = paste("     Q3:", round(q3_val_distancia, 2))) +
    annotate("text", x = -0.5, y = mean_val_distancia + 2, label = paste("               Media:", round(mean_val_distancia, 2)), col = "red") +  
    labs(
      title = "Boxplot para Distancia_Casa",
      y = "Distancia Casa",  
      x = NULL
    ) + 
    theme_minimal() +
    theme(axis.title.x=element_blank(),  
          axis.text.x=element_blank(),  
          axis.ticks.x=element_blank())  

print(p_box_distancia_casa)

La mediana está alrededor de 7, lo que sugiere que la mitad de las distancias están por debajo de este valor. El 50% vive entre de 2 - 14 kilometros lejos de su casa, siendo 29 kilomentos la mayor distancia

3. Análisis bivariado

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

rotacion_seleccionada$y<-ifelse(rotacion_seleccionada$Rotación=="Si",1,0)

Modelos logísticos:

Género:

mod_gender <- glm(y ~ Genero, data = rotacion_seleccionada, family = binomial)
round(summary(mod_gender)$coefficients,2)
##             Estimate Std. Error z value Pr(>|z|)
## (Intercept)    -1.75       0.12  -15.07     0.00
## GeneroM         0.17       0.15    1.13     0.26

Los resultados revelan que el intercepto es altamente significativo, lo que sugiere una diferencia notable en la probabilidad de la variable dependiente en ausencia de otras variables. Por otro lado, el género no parece ser un factor determinante, ya que su coeficiente es relativamente pequeño y no alcanza significancia estadística, evidenciado por su valor p cercano a 0.26.

Cargo:

mod_spot <- glm(y ~ Cargo, data = rotacion_seleccionada, family = binomial)
round(summary(mod_spot)$coefficients, 2)
##                              Estimate Std. Error z value Pr(>|z|)
## (Intercept)                     -3.66       0.72   -5.12     0.00
## CargoDirector_Manofactura        1.06       0.79    1.35     0.18
## CargoEjecutivo_Ventas            2.11       0.73    2.89     0.00
## CargoGerente                     0.70       0.85    0.82     0.41
## CargoInvestigador_Cientifico     2.01       0.73    2.74     0.01
## CargoRecursos_Humanos            2.46       0.79    3.12     0.00
## CargoRepresentante_Salud         1.06       0.80    1.33     0.18
## CargoRepresentante_Ventas        3.25       0.75    4.33     0.00
## CargoTecnico_Laboratorio         2.51       0.73    3.43     0.00

Respecto a los cargos, algunos tienen un impacto significativo en la probabilidad de rotación del personal. Por ejemplo, los roles de Ejecutivo de Ventas, Investigador Científico, Recursos Humanos, Representante de Ventas y Técnico de Laboratorio muestran coeficientes positivos significativos, lo que sugiere una mayor probabilidad de rotación en estos roles en comparación con el punto de partida del modelo. Por otro lado, los roles de Director de Manufactura y Gerente no parecen tener un impacto significativo en la probabilidad de rotación, ya que sus coeficientes son relativamente pequeños y no alcanzan significancia estadística.

Estado Civil:

mod_status <- glm(y ~ Estado_Civil, data = rotacion_seleccionada, family = binomial)
round(summary(mod_status)$coefficients, 2)
##                        Estimate Std. Error z value Pr(>|z|)
## (Intercept)               -1.95       0.12  -16.70     0.00
## Estado_CivilDivorciado    -0.24       0.22   -1.10     0.27
## Estado_CivilSoltero        0.88       0.16    5.57     0.00

El estado civil de divorciado no parece tener un efecto significativo en la probabilidad de rotación, dado su coeficiente no significativo. Por otro lado, el estado civil de soltero muestra un coeficiente positivo y altamente significativo, sugiriendo una mayor probabilidad de rotación entre los empleados solteros en comparación con otros estados civiles.

Distancia casa:

mod_distance <- glm(y ~ Distancia_Casa, data = rotacion_seleccionada, family = binomial)
round(summary(mod_distance)$coefficients, 2)
##                Estimate Std. Error z value Pr(>|z|)
## (Intercept)       -1.89       0.11  -16.97        0
## Distancia_Casa     0.02       0.01    2.97        0

La distancia a casa tiene un coeficiente positivo significativo, indicando que a medida que aumenta la distancia entre el trabajo y el hogar, aumenta la probabilidad de rotación del personal.

Ingreso mensual:

mod_salary <- glm(y ~ Ingreso_Mensual, data = rotacion_seleccionada, family = binomial)
round(summary(mod_salary)$coefficients, 4)
##                 Estimate Std. Error z value Pr(>|z|)
## (Intercept)      -0.9291     0.1292 -7.1911        0
## Ingreso_Mensual  -0.0001     0.0000 -5.8793        0

El ingreso mensual tiene un coeficiente negativo significativo, lo que sugiere que a medida que aumenta el ingreso mensual, disminuye la probabilidad de rotación del personal.

Edad:

mod_age <- glm(y ~ Edad, data = rotacion_seleccionada, family = binomial)
round(summary(mod_age)$coefficients, 2)
##             Estimate Std. Error z value Pr(>|z|)
## (Intercept)     0.21       0.31    0.67      0.5
## Edad           -0.05       0.01   -6.01      0.0

El intercepto muestra un valor positivo pero no significativo, lo que indica que no hay una diferencia significativa en la probabilidad de rotación cuando no se considera la edad. La variable de edad tiene un coeficiente negativo significativo, lo que sugiere que a medida que aumenta la edad de los empleados, la probabilidad de rotación tiende a disminuir.

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.

model <- glm(y ~ Genero + Estado_Civil + Cargo + Distancia_Casa + Ingreso_Mensual + Edad , data = rotacion_seleccionada, family = binomial)

summary(model)
## 
## Call:
## glm(formula = y ~ Genero + Estado_Civil + Cargo + Distancia_Casa + 
##     Ingreso_Mensual + Edad, family = binomial, data = rotacion_seleccionada)
## 
## Coefficients:
##                                Estimate Std. Error z value Pr(>|z|)    
## (Intercept)                  -3.430e+00  1.014e+00  -3.384 0.000715 ***
## GeneroM                       1.440e-01  1.559e-01   0.924 0.355659    
## Estado_CivilDivorciado       -2.060e-01  2.235e-01  -0.922 0.356660    
## Estado_CivilSoltero           8.166e-01  1.654e-01   4.938 7.91e-07 ***
## CargoDirector_Manofactura     1.013e+00  8.682e-01   1.166 0.243502    
## CargoEjecutivo_Ventas         2.006e+00  8.254e-01   2.430 0.015078 *  
## CargoGerente                  7.663e-01  8.561e-01   0.895 0.370729    
## CargoInvestigador_Cientifico  1.874e+00  9.092e-01   2.061 0.039328 *  
## CargoRecursos_Humanos         2.547e+00  9.336e-01   2.728 0.006368 ** 
## CargoRepresentante_Salud      1.039e+00  8.750e-01   1.187 0.235256    
## CargoRepresentante_Ventas     3.027e+00  9.370e-01   3.230 0.001237 ** 
## CargoTecnico_Laboratorio      2.398e+00  9.066e-01   2.645 0.008178 ** 
## Distancia_Casa                2.908e-02  8.888e-03   3.272 0.001068 ** 
## Ingreso_Mensual               1.858e-05  4.378e-05   0.424 0.671352    
## Edad                         -2.530e-02  9.850e-03  -2.569 0.010199 *  
## ---
## 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: 1155.9  on 1455  degrees of freedom
## AIC: 1185.9
## 
## Number of Fisher Scoring iterations: 6
  • La devianza residual es 1155.9 en 1455 grados de libertad, lo cual sugiere que el modelo de regresión logística se ajusta razonablemente bien a los datos.

  • En este caso, el intercepto es -3.430 con un error estándar de 1.014 y un valor z de -3.384, con un nivel de significancia de p = 0.000715.

    Este valor negativo del intercepto indica que cuando todas las demás variables del modelo son cero, la probabilidad de que ocurra el evento de interés (en este caso, la rotación del personal) es baja.

  • El coeficiente para el género no es significativo (p = 0.356), lo que indica que no hay un efecto significativo del género en la probabilidad de rotación.

  • En cuanto al estado civil, se observa que el coeficiente para la categoría “Divorciado” no es significativo (p = 0.357), mientras que para la categoría “Soltero” es altamente significativo (p < 0.001). Esto sugiere que los empleados solteros tienen una probabilidad significativamente más alta de rotación en comparación con otros estados civiles.

  • Respecto a los cargos, se encuentran varios con coeficientes significativos, como Ejecutivo de Ventas, Investigador Científico, Recursos Humanos, Representante de Ventas y Técnico de Laboratorio. Esto indica que estos roles específicos están vinculados con una mayor probabilidad de rotación.

  • En cuanto a la distancia a casa, se observa un coeficiente significativo (p = 0.001), lo que sugiere que a medida que aumenta la distancia entre el hogar y el lugar de trabajo, aumenta la probabilidad de rotación.

  • Por otro lado, el ingreso mensual no parece tener un impacto significativo en la probabilidad de rotación, dado que su coeficiente no es significativo (p = 0.671).

  • Finalmente, la edad muestra un coeficiente altamente significativo (p = 0.010), indicando que a medida que aumenta la edad, la probabilidad de rotación tiende a disminuir.

5. Evaluación

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

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

7. Conclusiones

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