library(paqueteMODELOS)
## Cargando paquete requerido: boot
## Cargando paquete requerido: broom
## Warning: package 'broom' was built under R version 4.4.3
## Cargando paquete requerido: GGally
## Warning: package 'GGally' was built under R version 4.4.3
## Cargando paquete requerido: ggplot2
## Warning: package 'ggplot2' was built under R version 4.4.3
## Cargando paquete requerido: gridExtra
## Cargando paquete requerido: knitr
## Warning: package 'knitr' was built under R version 4.4.3
## Cargando paquete requerido: summarytools
## Warning: package 'summarytools' was built under R version 4.4.3
data("rotacion")
library(paqueteMODELOS)
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.4.3
## 
## Adjuntando el paquete: 'dplyr'
## The following object is masked from 'package:gridExtra':
## 
##     combine
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
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, …
rotacion
## # A tibble: 1,470 × 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
## # ℹ 1,460 more rows
## # ℹ 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>, …

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.

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.

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"
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 categóricas

Género: En muchas organizaciones, dependiendo del tipo de actividad, suele haber mayor preferencia por personal femenino o masculino. Además, ciertos trabajos pueden favorecer características físicas de un género específico, lo que podría influir en la permanencia o salida del empleado de la empresa.

Cargo: Dependiendo del cargo y del área, algunos puestos generan mayor nivel de estrés, lo que podría provocar salidas prematuras del personal.

Estado Civil: Las obligaciones familiares y personales pueden influir en la decisión de un empleado de permanecer o dejar la empresa.

#Variables cuantitativas

Distancia a la casa: Se espera que aquellos que viven más lejos de su lugar de trabajo tengan una mayor probabilidad de rotar, buscando empleo más cercano.

Ingreso mensual: Los ingresos influyen directamente en la estabilidad laboral. A mayor salario, menor es la probabilidad de que un empleado quiera cambiar de trabajo.

Edad: Los empleados más jóvenes, al no tener tantas responsabilidades, suelen cambiar de empleo con mayor facilidad.

#Hipótesis

Género: Las características físicas de cada género podrían influir en la rotación del personal según la exigencia del cargo.

Cargo: Cada puesto en una organización genera un nivel de estrés determinado, lo que podría afectar la rotación de empleados.

Estado Civil: Aquellos empleados casados o con dependientes podrían buscar mayor estabilidad y, por tanto, tener una menor tasa de rotación.

Distancia a la casa: Se espera que quienes viven más lejos del trabajo tengan mayor probabilidad de rotar buscando empleo más cercano.

Ingreso mensual: Los empleados con mejores ingresos tienden a tener menos intención de cambiar de empleo.

Edad: Los empleados más jóvenes tienen mayores probabilidades de cambiar de trabajo, buscando empresas que se ajusten a sus preferencias.

library(janitor)
## Warning: package 'janitor' was built under R version 4.4.3
## 
## Adjuntando el paquete: 'janitor'
## The following objects are masked from 'package:stats':
## 
##     chisq.test, fisher.test
rotacion <- clean_names(rotacion) 

rotacion_seleccionada <- rotacion[, c("rotacion", "genero", "cargo", 
                                      "estado_civil", "distancia_casa", 
                                      "ingreso_mensual", "edad")]

rotacion_seleccionada <- as.data.frame(rotacion_seleccionada)
kable(head(rotacion_seleccionada))
rotacion genero cargo estado_civil distancia_casa ingreso_mensual edad
Si F Ejecutivo_Ventas Soltero 1 5993 41
No M Investigador_Cientifico Casado 8 5130 49
Si M Tecnico_Laboratorio Soltero 2 2090 37
No F Investigador_Cientifico Casado 3 2909 33
No M Tecnico_Laboratorio Casado 2 3468 27
No M Tecnico_Laboratorio Soltero 2 3068 32

2. Análisis univariado

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

tabla_1 = table(rotacion_seleccionada$rotacion)
kable(tabla_1, caption = "Distribución rotación por Empleado")
Distribución rotación por Empleado
Var1 Freq
No 1233
Si 237
datos_1 <- c(0.84, 0.16)
categorías <- c("NO", "SI")
colores <- c("pink", "purple")
pie(datos_1, labels = categorías, col = colores, main = "Rotacion Empleados")

kable(table(rotacion_seleccionada$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 = "Grafico de barras para Genero", x = "genero", 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.

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 = "Grafico de barras para Carg", x = "Cargo", y = "Frecuencia") + 
    theme_minimal() +
    theme(axis.text.x = element_text(angle = 45, hjust = 1))
print(p2)

El cargo de Ejecutivo de Ventas es el que predomina con un 22,18%, seguido por Investigador Científico con un 19,86% y Técnico de Laboratorio con un 17,62%. El cargo menos frecuente corresponde a Recursos Humanos, con un 3,54%.

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 = "Grafico de barras para Estado_Civil", x = "Estado_Civil", y = "Frecuencia") + 
    theme_minimal() +
    theme(axis.text.x = element_text(angle = 45, hjust = 1))
print(p3)

La mayoría de las personas en nuestra base de datos están casadas, representando el 45,8%. Un 32% son solteras y el 22,2% son divorciadas

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 `binwidth`.

Según el histograma, se evidencia gráficamente que la mayoría de las personas se concentran en el rango de 30 a 40 años. De acuerdo con las estadísticas, la edad mínima registrada es de 18 años y la máxima de 60 años.

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.

rotacion_seleccionada$y<-ifelse(rotacion_seleccionada$rotacion=="Si",1,0)

modelo_genero <- glm(y ~ genero, data = rotacion_seleccionada, family = binomial)
round(summary(modelo_genero)$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

De los resultados obtenidos podemos concluir que la variable genero no es un predictor fuerte dado que sus valores son cercanos a 0

modelo_cargo <- glm(y ~ cargo, data = rotacion_seleccionada, family = binomial)
round(summary(modelo_cargo)$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

La variable Cargo influye significativamente en la rotación. En particular, cargos como Ejecutivo de Ventas, Investigador Científico, Recursos Humanos, Representante de Ventas y Técnico de Laboratorio presentan valores con un impacto relevante.

modelo_estado_civil <- glm(y ~ estado_civil, data = rotacion_seleccionada, family = binomial)
round(summary(modelo_estado_civil)$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 según los resultados obtenidos si influyen en la rotación del personal y la variable que mas influye es estar Soltero la cual esta 0,88 por encima de la variable de referencia que en este caso es Casado.

modelo_distancia <- glm(y ~ distancia_casa, data = rotacion_seleccionada, family = binomial)
round(summary(modelo_distancia)$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

Por cada unidad adicional de distancia (ya sea un kilómetro o una milla) desde la casa al lugar de trabajo, la estimación aumenta en 0.02. Este resultado es estadísticamente significativo, lo que significa que entre mas lejos se ubique la casa del empleado mayo es la posibilidad de cambiar de trabajo.

modelo_ingreso_mensual <- glm(y ~ ingreso_mensual, data = rotacion_seleccionada, family = binomial)
round(summary(modelo_ingreso_mensual)$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

La estimación base es de -0.93 y por cada unidad adicional de ingreso se impacta un -0.0001, es decir se impacta negativamente, por tanto a mayores ingresos la probabilidad de cambair de trabajo disminuye.

modelo_Edad <- glm(y ~ edad, data = rotacion_seleccionada, family = binomial)
round(summary(modelo_Edad)$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

A medida que la edad aumenta el impacto en la variable base disminuye un -0.05 por tanto a medida que la edad del empleado aumenta, la posibilidad de cambiar de trabajo disminuye

4. Estimación del modelo

modelo_logistico <- glm(y ~ genero + estado_civil + cargo + distancia_casa + ingreso_mensual + edad , data = rotacion_seleccionada, family = binomial)

summary(modelo_logistico)
## 
## 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

Deviance Residuals

Los valores de los deviance residuals permiten evaluar qué tan bien se ajusta el modelo a los datos. En este caso, el modelo se ajusta correctamente, pues la mayoría de los residuales están cercanos a cero. El rango observado va de -1.4989 a 2.7489, con una mediana de -0.4600.

(Intercept) -3.430

Este valor representa los log-odds predichos cuando todas las variables predictoras son cero o están en su categoría de referencia. En ese escenario, la rotación esperada de empleados es -3.430.

Género (GeneroM = 0.144)

Manteniendo constantes las demás variables, ser hombre aumenta los log-odds de rotación en 0.144 en comparación con el género de referencia (femenino). Este efecto no es estadísticamente significativo (Pr(>|z|) = 0.356), lo que implica que no hay evidencia suficiente para afirmar que existe una diferencia en la rotación de empleados entre géneros.

Estado Civil

Divorciado (-0.206): En comparación con casado, estar divorciado disminuye los log-odds en 0.206, pero el efecto no es significativo.

Soltero (0.8166): En comparación con casado, estar soltero aumenta los log-odds en 0.8166. Este efecto sí es estadísticamente significativo, lo que sugiere que los empleados solteros tienen mayor probabilidad de rotación frente a los casados.

Cargo

Los diferentes cargos presentan efectos distintos sobre la rotación. Algunos, como Ejecutivo de Ventas, Investigador Científico, Recursos Humanos, Representante de Ventas y Técnico de Laboratorio, tienen coeficientes positivos y significativos, lo que indica que los empleados en estos cargos presentan mayores probabilidades de rotación.

Distancia a la Casa (0.02908)

Por cada unidad adicional en la distancia entre la casa y el trabajo, los log-odds de rotación aumentan en 0.02908. Este coeficiente es estadísticamente significativo, lo que indica que la distancia al lugar de trabajo es un factor importante en la decisión de un empleado de abandonar la empresa.

Ingreso Mensual (0.00001858)

El coeficiente es muy cercano a cero y no es significativo. Aunque existe un ligero aumento en los log-odds de rotación por cada unidad adicional de ingreso, este efecto no tiene relevancia estadística.

Edad (-0.0253)

Por cada año adicional de edad, los log-odds de rotación disminuyen en 0.0253. Este efecto es estadísticamente significativo y sugiere que a medida que los empleados envejecen, disminuye su probabilidad de abandonar la empresa.

Conclusión

En este modelo, las variables Estado Civil (soltero), varios cargos específicos, Distancia a la Casa y Edad tienen coeficientes estadísticamente significativos. Esto indica que son factores clave para explicar la rotación de empleados, mientras que otras variables como género e ingreso mensual no muestran un efecto relevante.

5. Evaluación

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

Predicciones probabilísticas: Obtemos las predicciones probabilísticas del modelo modelo_logistico para la variable de rotación.

library(vcd)
## Cargando paquete requerido: grid
pp1= predict.glm(modelo_logistico, newdata = rotacion, type = "response")
resp = table(rotacion$rotacion, ifelse(pp1 >0.2, 1, 0), dnn = c("observaciones", "predicciones"))
resp
##              predicciones
## observaciones   0   1
##            No 918 315
##            Si  93 144
mosaic(resp, shade = T, colorize = T,
gp = gpar(fill = matrix(c("pink", "purple", "purple", "pink"), 2, 2)))

pred_probabilidades <- predict(modelo_logistico, type = "response")

library(pROC)
## Warning: package 'pROC' was built under R version 4.4.3
## Type 'citation("pROC")' for a citation.
## 
## Adjuntando el paquete: 'pROC'
## The following objects are masked from 'package:stats':
## 
##     cov, smooth, var
curva_roc <- roc(rotacion_seleccionada$y, pred_probabilidades)
## Setting levels: control = 0, case = 1
## Setting direction: controls < cases
plot(curva_roc, main="Curva ROC", col="blue", lwd=2)
abline(h=0, v=1, col="gray")

auc(curva_roc)
## Area under the curve: 0.7332

AUC = 0.5: El modelo no tiene capacidad de discriminación para distinguir entre la clase positiva y la clase negativa. Es decir, el modelo no es mejor que una elección aleatoria.

0.5 < AUC < 1: El modelo tiene capacidad de discriminación. Cuanto más cercano esté el valor de AUC a 1, mejor será el desempeño del modelo.

AUC = 1: El modelo tiene una capacidad de discriminación perfecta, siendo capaz de distinguir completamente entre la clase positiva y la clase negativa sin cometer errores.

Resultado obtenido = 0.7332: Con este valor podemos concluir que el modelo desarrollado tiene una capacidad aceptable para predecir resultados.

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_hipotetico <- data.frame(
  `genero` = "M", # Es de genero Masculino
  `cargo` = "Ejecutivo_Ventas",  # Trabaja como ejecutivo de ventas
  `estado_civil` = "Soltero",  # Es un hombre soltero
  `ingreso_mensual` = 7500,  # tiene ingresos de 7500
  `distancia_casa` = 5,   # Vive a 5 kilometros del lugar de trabajo
  `edad` = 26   # Tiene 26 años
)

prediccion <- predict(modelo_logistico, newdata = empleado_hipotetico, type = "response")
print(prediccion)
##         1 
## 0.3023459

El resultado indica que el individuo tiene una probabilidad de 30.2% de rotar, es decir las probabilidades son bajas.

empleado_hipotetico2 <- data.frame(
  `genero` = "F", # Es de genero Femenino
  `cargo` = "Tecnico_Laboratorio",  # Trabaja como ténico de laboratorio
  `estado_civil` = "Soltero",  # Es una mujer soltera
  `ingreso_mensual` = 3500,  # tiene ingresos de 2500
  `distancia_casa` = 40,   # Vive a 35 kilometros del lugar de trabajo
  `edad` = 25   # Tiene 20 años
)

prediccion <- predict(modelo_logistico, newdata = empleado_hipotetico2, type = "response")
print(prediccion)
##        1 
## 0.593904

En nuestro segundo ejemplo obtenemos que las posibilidades de rotar son de 59.4% por tanto se podría considerar que son altas, alguna de las estrategías que puede implementar la empresa sería incentivar a los empleados a adquirir viviendas cerca al lugar de trabajo, para ello se pueden establecer alianzas en conjunto con las cajas de compensación para así brindar el apoyo necesario a los empleados de adquirir su propia vivienda.

##7. Conclusiones

En nuestro análisis, encontramos que varias de las variables seleccionadas tienen un impacto considerable en la rotación de empleados.

Cargo: Esta variable tiene un efecto significativo en el modelo, pero es difícil de intervenir, dado que las empresas operan dentro de un organigrama establecido y las oportunidades para ascensos o cambios de roles son limitadas.

Edad: También es significativa en la rotación. Al igual que con el cargo, la empresa tiene un margen limitado de acción sobre esta variable. Sin embargo, se podría considerar adaptar las políticas de contratación, favoreciendo candidatos cuya edad esté por encima del promedio del personal actual, si el objetivo es reducir la rotación.

Ingreso mensual y Distancia a la casa: Estas son variables donde la empresa puede tener un impacto directo. Ajustar los salarios o incentivar la compra de vivienda cerca del trabajo puede ser una estrategia efectiva para disminuir la rotación. Aunque implementar estas estrategias podría suponer una inversión inicial, es fundamental evaluar los beneficios a largo plazo.

La rotación de empleados conlleva costos asociados, como la pérdida de conocimiento experto, la disminución en la productividad durante el período de adaptación de los nuevos empleados y el tiempo necesario para que alcancen su máxima eficiencia. Por lo tanto, cualquier estrategia que contribuya a reducir la rotación puede resultar rentable para la organización.