Enunciado - 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:

Base datos

library(paqueteMODELOS)
## Warning: package 'gridExtra' was built under R version 4.3.2
library(dplyr)
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, …
summary(rotacion) 
##    Rotación              Edad       Viaje de Negocios  Departamento      
##  Length:1470        Min.   :18.00   Length:1470        Length:1470       
##  Class :character   1st Qu.:30.00   Class :character   Class :character  
##  Mode  :character   Median :36.00   Mode  :character   Mode  :character  
##                     Mean   :36.92                                        
##                     3rd Qu.:43.00                                        
##                     Max.   :60.00                                        
##  Distancia_Casa     Educación     Campo_Educación    Satisfacción_Ambiental
##  Min.   : 1.000   Min.   :1.000   Length:1470        Min.   :1.000         
##  1st Qu.: 2.000   1st Qu.:2.000   Class :character   1st Qu.:2.000         
##  Median : 7.000   Median :3.000   Mode  :character   Median :3.000         
##  Mean   : 9.193   Mean   :2.913                      Mean   :2.722         
##  3rd Qu.:14.000   3rd Qu.:4.000                      3rd Qu.:4.000         
##  Max.   :29.000   Max.   :5.000                      Max.   :4.000         
##     Genero             Cargo           Satisfación_Laboral Estado_Civil      
##  Length:1470        Length:1470        Min.   :1.000       Length:1470       
##  Class :character   Class :character   1st Qu.:2.000       Class :character  
##  Mode  :character   Mode  :character   Median :3.000       Mode  :character  
##                                        Mean   :2.729                         
##                                        3rd Qu.:4.000                         
##                                        Max.   :4.000                         
##  Ingreso_Mensual Trabajos_Anteriores Horas_Extra       
##  Min.   : 1009   Min.   :0.000       Length:1470       
##  1st Qu.: 2911   1st Qu.:1.000       Class :character  
##  Median : 4919   Median :2.000       Mode  :character  
##  Mean   : 6503   Mean   :2.693                         
##  3rd Qu.: 8379   3rd Qu.:4.000                         
##  Max.   :19999   Max.   :9.000                         
##  Porcentaje_aumento_salarial Rendimiento_Laboral Años_Experiencia
##  Min.   :11.00               Min.   :3.000       Min.   : 0.00   
##  1st Qu.:12.00               1st Qu.:3.000       1st Qu.: 6.00   
##  Median :14.00               Median :3.000       Median :10.00   
##  Mean   :15.21               Mean   :3.154       Mean   :11.28   
##  3rd Qu.:18.00               3rd Qu.:3.000       3rd Qu.:15.00   
##  Max.   :25.00               Max.   :4.000       Max.   :40.00   
##  Capacitaciones  Equilibrio_Trabajo_Vida   Antigüedad     Antigüedad_Cargo
##  Min.   :0.000   Min.   :1.000           Min.   : 0.000   Min.   : 0.000  
##  1st Qu.:2.000   1st Qu.:2.000           1st Qu.: 3.000   1st Qu.: 2.000  
##  Median :3.000   Median :3.000           Median : 5.000   Median : 3.000  
##  Mean   :2.799   Mean   :2.761           Mean   : 7.008   Mean   : 4.229  
##  3rd Qu.:3.000   3rd Qu.:3.000           3rd Qu.: 9.000   3rd Qu.: 7.000  
##  Max.   :6.000   Max.   :4.000           Max.   :40.000   Max.   :18.000  
##  Años_ultima_promoción Años_acargo_con_mismo_jefe
##  Min.   : 0.000        Min.   : 0.000            
##  1st Qu.: 0.000        1st Qu.: 2.000            
##  Median : 1.000        Median : 3.000            
##  Mean   : 2.188        Mean   : 4.123            
##  3rd Qu.: 3.000        3rd Qu.: 7.000            
##  Max.   :15.000        Max.   :17.000
NAs<-colSums(is.na(rotacion))
as.data.frame(NAs)
##                             NAs
## Rotación                      0
## Edad                          0
## Viaje de Negocios             0
## Departamento                  0
## Distancia_Casa                0
## Educación                     0
## Campo_Educación               0
## Satisfacción_Ambiental        0
## Genero                        0
## Cargo                         0
## Satisfación_Laboral           0
## Estado_Civil                  0
## Ingreso_Mensual               0
## Trabajos_Anteriores           0
## Horas_Extra                   0
## Porcentaje_aumento_salarial   0
## Rendimiento_Laboral           0
## Años_Experiencia              0
## Capacitaciones                0
## Equilibrio_Trabajo_Vida       0
## Antigüedad                    0
## Antigüedad_Cargo              0
## Años_ultima_promoción         0
## Años_acargo_con_mismo_jefe    0

Carga de librerias

library(ggplot2)
library(ggpubr)
## Warning: package 'ggpubr' was built under R version 4.3.2
require(ggplot2)
require(ggpubr)
require(plotly)
## Warning: package 'plotly' was built under R version 4.3.3
library(vcd)
## Warning: package 'vcd' was built under R version 4.3.3

Desarrollo de la actividad

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

En varias organizaciones, la preferencia por contratar personal de un género específico puede ser común, y esto puede variar dependiendo del tipo de organización. Además, ciertos trabajos pueden requerir habilidades físicas que algunos géneros tienden a poseer en mayor medida. Estos factores podrían influir en la permanencia de un individuo en la empresa.

2. Estado Civil

Es probable que los empleados solteros o divorciados tengan una mayor probabilidad de renunciar a sus trabajos en comparación con aquellos que están casados, dado que podrían buscar una mayor estabilidad económica.

3. Horas Extra

Es probable que los trabajadores que realicen horas extras tengan una mayor propensión a dejar el empleo en comparación con aquellos que no lo hacen, ya que podrían necesitar más tiempo para compromisos personales fuera del ámbito laboral.

Variables Cuantitativas

1. Distancia del trabajo

Se anticipa que los empleados que residan más lejos de su lugar de trabajo tendrán una probabilidad aumentada de abandonar la empresa, ya que esto implica un mayor esfuerzo en tiempo que podrían preferir destinar al descanso o a otras actividades personales.

2. Factor de edad

Se prevé que la rotación laboral sea más alta entre los empleados más jóvenes, mientras que se espera una menor rotación entre los empleados de mayor edad.

3. Antiguedad en el cargo

Se anticipa que los empleados con una mayor antigüedad en su cargo tendrán una probabilidad mayor de dejar la empresa en comparación con aquellos con menos experiencia en el puesto.

2. Análisis univariado

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

rotacion_seleccionada <- rotacion[,c("Rotación", "Genero", "Estado_Civil", "Horas_Extra", "Distancia_Casa", "Edad", "Antigüedad_Cargo")]
rotacion_seleccionada<-as.data.frame(rotacion_seleccionada)

Visualimos nuestro nuevo dataframe con los 5 primeros registros

kable(head(rotacion_seleccionada, 5))
Rotación Genero Estado_Civil Horas_Extra Distancia_Casa Edad Antigüedad_Cargo
Si F Soltero Si 1 41 4
No M Casado No 8 49 7
Si M Soltero Si 2 37 0
No F Casado Si 3 33 7
No M Casado No 2 27 2

Analices variables Categoricas

1. Genero

p1 <- ggplot(rotacion, aes(x = Genero)) + 
    geom_bar(fill = "pink", 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 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.

Se observa una distribución de género en la base datos donde:

  • El 60% de los registros corresponden a empleados de género masculino.

  • El 40% de los registros corresponden a empleadas de género femenino.

Este desglose de género proporciona una visión general de la representación de hombres y mujeres en la muestra analizada.

2. Estado civil

p2 <- ggplot(rotacion, aes(x = Estado_Civil)) + 
    geom_bar(fill = "pink", 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(p2)

Se observa una distribución de estado civil en la base datos donde:

  • El 45.8% de los registros corresponden a empleados es casado.

  • El 32% de los registros corresponden a empleados es soltero.

  • El 22.2% de los resgistros corresponde a empleadps es divorciado.

Este desglose de estado civil proporciona una visión general de la representación de su estado civil en la muestra analizada.

3. Horas extras

p3 <- ggplot(rotacion, aes(x = Horas_Extra)) + 
    geom_bar(fill = "pink", 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 Horas Extras", x = "Horas Extras", y = "Frecuencia") + 
    theme_minimal() +
    theme(axis.text.x = element_text(angle = 45, hjust = 1))
print(p3)

Se observa una distribución de horas extras en la base datos donde:

  • El 72% de los registros corresponden a empleados que no realizaron horas extras.

  • El 28% de los registros corresponden a empleadas que sí realizaron horas extras.

Este desglose de horas extras proporciona una visión general de la representación de la propocio que realiza horas extras en la muestra analizada.

Analices variables cuantitativas

1. Distancia del trabajo a la casa

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 = "pink", color = "black", alpha = 0.7) + 
    geom_density(alpha = 0.2, fill = "green") +
    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()
## 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_distancia)
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

  • Media: Significa que, en promedio, los empleados tienen una distancia de alrededor de 9.19 unidades entre su casa y su lugar de trabajo.

  • Mediana: La mediana de la distancia es 7 unidades. Esto indica que el valor central en el conjunto de datos ordenado de menor a mayor es 7

  • Desviación Estándar: La desviación estándar es de aproximadamente 8.11 unidades. Esto indica que hay una variabilidad considerable en la distancia del trabajo a la casa entre los empleados.

  • Mínimo y Máximo: El valor mínimo de la distancia es 1 unidad, lo que indica que hay al menos un empleado cuyo lugar de trabajo está muy cerca de su casa. Por otro lado, el valor máximo de la distancia es 29 unidades, lo que sugiere que al menos un empleado tiene un largo viaje desde su casa hasta el trabajo.

2. 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 = "pink", color = "black", alpha = 0.7) + 
    geom_density(alpha = 0.2, fill = "green") +
    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()
print(p_edad)
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Según el histograma podemos evidenciar graficamente que la mayoria de las personas se ubican entre los 30 y 40 años, y segun las estadistica el rango de edad va desde los 18 hasta los 60 años.

  • Media: La media de la edad en la base de datos es de aproximadamente 36.92 años. Esto significa que, en promedio, los empleados tienen alrededor de 36.92 años de edad.

  • Mediana: La mediana de la edad es 36 años. Esto indica que el valor central en el conjunto de datos ordenado de menor a mayor es 36.

  • Desviación Estándar: La desviación estándar es de aproximadamente 9.14 años. Esto indica que hay una variabilidad moderada en las edades de los empleados en la base de datos.

  • Mínimo y Máximo: El valor mínimo de edad es 18 años, lo que indica que al menos un empleado en la base de datos es bastante joven. Por otro lado, el valor máximo de edad es 60 años, lo que sugiere que al menos un empleado es mayor.

3. Antigüedad en el cargo

kable(rotacion %>% 
          summarise(
            Media = mean(Antigüedad_Cargo),
            Mediana = median(Antigüedad_Cargo),
            Desv_Estandar = sd(Antigüedad_Cargo),
            Minimo = min(Antigüedad_Cargo),
            Maximo = max(Antigüedad_Cargo)
          ))
Media Mediana Desv_Estandar Minimo Maximo
4.229252 3 3.623137 0 18
median_val_hist <- median(rotacion$Antigüedad_Cargo)
mean_val_hist <- mean(rotacion$Antigüedad_Cargo)

p_Antigüedad_Cargo <- ggplot(rotacion, aes(x = Antigüedad_Cargo)) + 
    geom_histogram(aes(y = ..density..), fill = "pink", color = "black", alpha = 0.7) + 
    geom_density(alpha = 0.2, fill = "green") +
    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 Antigüedad_Cargo", x = "Antigüedad Cargo", 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_Antigüedad_Cargo)
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

  • Media : La media de la antigüedad en la base de datos es de aproximadamente 4.23 años. Esto sugiere que, en promedio, los empleados tienen alrededor de 4.23 años de antigüedad en la empresa.

  • Mediana: La mediana de la antigüedad es 3 años. Esto indica que el valor central en el conjunto de datos ordenado de menor a mayor es 3.

  • Desviación Estándar: La desviación estándar es de aproximadamente 3.62 años. Esto indica que hay una variabilidad considerable en la antigüedad de los empleados en la base de datos.

  • Mínimo y Máximo: El valor mínimo de antigüedad es 0 años, lo que implica que al menos un empleado en la base de datos es nuevo en la empresa. Por otro lado, el valor máximo de antigüedad es 18 años, lo que sugiere que al menos un empleado ha estado en la empresa durante un largo período de tiempo.

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

Ahora procedemos a realizar el modelo para cada una de las variables seleccionadas.

Variables Categoricas

1. Genero

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

El coeficiente es 0.17. Esto indica que, en comparación con el género de referencia (probablemente “Femenino”), la log odds de rotación de empleados aumenta en 0.17 unidades para los empleados de género masculino. Sin embargo, el valor p asociado con este coeficiente es 0.26, lo que indica que no es estadísticamente significativo a un nivel de confianza del 95% (α = 0.05). Esto sugiere que no hay evidencia suficiente para afirmar que el género masculino tenga un efecto significativo en la probabilidad de rotación de empleados en este modelo.

Según este modelo, no hay evidencia estadísticamente significativa para sugerir que el género de los empleados tenga un efecto significativo en la probabilidad de rotación de empleados en la empresa representada por los datos utilizados en el modelo.

library(ggplot2)

ggplot(rotacion_seleccionada, aes(x = Genero, fill = Rotación)) + 
  geom_bar()

2. Estado civil

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

Para el estado civil Divorciado, el coeficiente es -0.24. Esto indica que, en comparación con el estado civil de referencia Casado, la log odds de rotación de empleados disminuye en 0.24 unidades para los empleados divorciados. Sin embargo, el valor p asociado con este coeficiente es 0.27, lo que indica que no es estadísticamente significativo a un nivel de confianza del 95% (α = 0.05). Esto sugiere que no hay evidencia suficiente para afirmar que el estado civil Divorciado tenga un efecto significativo en la probabilidad de rotación de empleados en este modelo.

Para el estado civil Soltero, el coeficiente es 0.88. Esto indica que, en comparación con el estado civil de referencia Casado, la log odds de rotación de empleados aumenta en 0.88 unidades para los empleados solteros. Además, el valor p asociado con este coeficiente es 0.00, lo que indica que es estadísticamente significativo a un nivel de confianza del 95% (α = 0.05). Esto sugiere que hay evidencia suficiente para afirmar que el estado civil Soltero tiene un efecto significativo en la probabilidad de rotación de empleados en este modelo.

Este modelo, el estado civil de los empleados parece tener un efecto significativo en la probabilidad de rotación de empleados en la empresa representada por los datos utilizados en el modelo. Específicamente, los empleados solteros parecen tener una mayor probabilidad de rotación en comparación con los empleados casados. Sin embargo, no hay suficiente evidencia para afirmar que el estado civil Divorciado tenga un efecto significativo en la probabilidad de rotación.

ggplot(rotacion_seleccionada, aes(x = Estado_Civil, fill = Rotación)) + 
  geom_bar()

Horas Extras

modelo_Horas_Extra <- glm(y ~ Horas_Extra, data = rotacion_seleccionada, family = binomial)
round(summary(modelo_Horas_Extra)$coefficients, 2)
##               Estimate Std. Error z value Pr(>|z|)
## (Intercept)      -2.15       0.10  -21.34        0
## Horas_ExtraSi     1.33       0.15    9.06        0

Para la categoría Horas Extra Si, el coeficiente es 1.33. Esto indica que, en comparación con el valor de referencia “No” para las horas extra, la log odds de rotación de empleados aumenta en 1.33 unidades para aquellos empleados que realizan horas extra. Además, el valor p asociado con este coeficiente es 0.00, lo que indica que es estadísticamente significativo a un nivel de confianza del 95% (α = 0.05). Esto sugiere que hay evidencia suficiente para afirmar que las horas extra tienen un efecto significativo en la probabilidad de rotación de empleados en este modelo.

Este modelo, la realización de horas extra parece tener un efecto significativo en la probabilidad de rotación de empleados en la empresa representada por los datos utilizados en el modelo. Específicamente, aquellos empleados que realizan horas extra tienen una mayor probabilidad de rotación en comparación con aquellos que no las realizan.

ggplot(rotacion_seleccionada, aes(x = Horas_Extra, fill = Rotación)) + 
  geom_bar()

Variables Cuantitativas

Distancia de la casa al trabajo

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

De igual manera se nota que a medida que se incrementa la distancia entre el trabajo y el hogar, también aumenta la probabilidad de rotación. Por cada unidad adicional de distancia (sea un kilómetro o una milla) desde el hogar hasta el lugar de trabajo, la estimación se incrementa en 0.02. Este hallazgo es estadísticamente significativo, lo que indica que mientras más lejos esté ubicado el hogar del empleado, mayor es la probabilidad de que cambie de trabajo.

ggplot(rotacion_seleccionada,aes(x=Rotación,y=Distancia_Casa,fill=Rotación))+geom_boxplot()+theme_bw()

Edad

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

Conforme la edad aumenta, se observa una reducción del impacto en la variable base, aproximadamente de -0.05. Por lo tanto, a medida que la edad del empleado aumenta, la probabilidad de cambiar de trabajo disminuye. Esta tendencia sugiere que, en este conjunto de datos, los trabajadores más jóvenes tienden a ser más propensos a la rotación laboral.

ggplot(rotacion_seleccionada,aes(x=Rotación,y=Edad,fill=Rotación))+geom_boxplot()+theme_bw()

Antiguedad en el cargo

modelo_Antigüedad_Cargo <- glm(y ~ Antigüedad_Cargo, data = rotacion_seleccionada, family = binomial)
round(summary(modelo_Antigüedad_Cargo)$coefficients, 2)
##                  Estimate Std. Error z value Pr(>|z|)
## (Intercept)         -1.12       0.10  -10.77        0
## Antigüedad_Cargo    -0.15       0.02   -6.03        0

En este grupo de datos se puede observar que en cuanto menos años tenga el trabajador en la compañía más propenso a la rotación. Conforme la edad aumenta, se observa una reducción del impacto en la variable base, aproximadamente de -0.15.

ggplot(rotacion_seleccionada,aes(x=Rotación,y=Antigüedad_Cargo,fill=Rotación))+geom_boxplot()+theme_bw()

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_logistico <- glm(y ~ Genero + Estado_Civil + Horas_Extra + Distancia_Casa + Edad + Antigüedad_Cargo , data = rotacion_seleccionada, family = binomial)
summary(modelo_logistico)
## 
## Call:
## glm(formula = y ~ Genero + Estado_Civil + Horas_Extra + Distancia_Casa + 
##     Edad + Antigüedad_Cargo, family = binomial, data = rotacion_seleccionada)
## 
## Coefficients:
##                         Estimate Std. Error z value Pr(>|z|)    
## (Intercept)            -1.040309   0.369565  -2.815 0.004878 ** 
## GeneroM                 0.286488   0.160711   1.783 0.074646 .  
## Estado_CivilDivorciado -0.300119   0.227846  -1.317 0.187771    
## Estado_CivilSoltero     0.847638   0.171226   4.950 7.41e-07 ***
## Horas_ExtraSi           1.476247   0.157980   9.345  < 2e-16 ***
## Distancia_Casa          0.030924   0.009239   3.347 0.000817 ***
## Edad                   -0.041735   0.009085  -4.594 4.35e-06 ***
## Antigüedad_Cargo       -0.119395   0.026065  -4.581 4.63e-06 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 1298.6  on 1469  degrees of freedom
## Residual deviance: 1097.4  on 1462  degrees of freedom
## AIC: 1113.4
## 
## Number of Fisher Scoring iterations: 5

exp(modelo_logistico$coefficients)
##            (Intercept)                GeneroM Estado_CivilDivorciado 
##              0.3533456              1.3317419              0.7407301 
##    Estado_CivilSoltero          Horas_ExtraSi         Distancia_Casa 
##              2.3341265              4.3764908              1.0314076 
##                   Edad       Antigüedad_Cargo 
##              0.9591239              0.8874568

Coeficientes del Modelo:

  • Intercepto (Intercept: El intercepto del modelo representa la log odds de rotación de empleados cuando todas las demás variables independientes son cero. En este caso, el intercepto es -1.04.

  • Genero : El coeficiente asociado con el género masculino es 0.28. Esto sugiere que, en comparación con el género femenino (probablemente el valor de referencia), los empleados de género masculino tienen un aumento de 0.28 en la log odds de rotación.

  • Estado Civil: Los coeficientes asociados con el estado civil de Divorciado y Soltero son -0.30 y 0.85, respectivamente. Esto indica que en comparación con los empleados casados (probablemente el valor de referencia), los empleados divorciados tienen una disminución de 0.30 en la log odds de rotación, mientras que los empleados solteros tienen un aumento de 0.85 en la log odds de rotación.

  • Horas Extra : El coeficiente asociado con las horas extra es 1.48. Esto indica que los empleados que realizan horas extra tienen un aumento de 1.48 en la log odds de rotación en comparación con los empleados que no realizan horas extra.

  • Distancia Casa: El coeficiente asociado con la distancia desde la casa al trabajo es 0.03. Esto sugiere que por cada unidad adicional de distancia entre la casa y el trabajo, hay un aumento de 0.03 en la log odds de rotación.

  • Edad: El coeficiente asociado con la edad es -0.04. Esto indica que por cada año adicional de edad, hay una disminución de 0.04 en la log odds de rotación.

  • Antigüedad Cargo: El coeficiente asociado con la antigüedad en el cargo es -0.12. Esto sugiere que por cada unidad adicional de antigüedad en el cargo, hay una disminución de 0.12 en la log odds de rotación.

Significancia Estadística:

  • Los coeficientes para las variables Estado Civil (Soltero), Horas Extra (Si), Distancia Casa, Edad y Antigüedad Cargo son estadísticamente significativos, con valores de p muy bajos (menores que 0.05).

  • El coeficiente para la variable Genero (Masculino) parece no ser estadísticamente significativo al nivel de significancia del 95%, ya que su valor de p (0.07) es mayor que 0.05.

  • El coeficiente para la variable Estado Civil (Divorciado) tampoco es estadísticamente significativo, ya que su valor de p (0.19) es mayor que 0.05.

Bondad del Ajuste del Modelo:

  • El modelo parece ajustarse bien a los datos, ya que el valor del AIC (Criterio de Información de Akaike) es relativamente bajo.

  • La diferencia entre la devianza nula y la devianza residual indica que el modelo explica una cantidad significativa de variabilidad en los datos.

5. Evaluación

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

pp1= predict.glm(modelo_logistico, newdata = rotacion_seleccionada, type = "response")
resp = table(rotacion_seleccionada$Rotación, ifelse(pp1 >0.2, 1, 0), dnn = c("observaciones", "predicciones"))
resp
##              predicciones
## observaciones   0   1
##            No 972 261
##            Si  87 150
pred_probabilidades <- predict(modelo_logistico, type = "response")
library(pROC)
## Warning: package 'pROC' was built under R version 4.3.2
## Type 'citation("pROC")' for a citation.
## 
## Attaching package: '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="red")

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

El área bajo la curva de 0.76 indica que el modelo es aceptable y puede servir para predecir la probabilidad de rotación del empleado.

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

Individuo 1

predict(modelo_logistico,list(Genero="M",Estado_Civil="Soltero",Horas_Extra="Si",Distancia_Casa=25,Edad=30,Antigüedad_Cargo=3))
##         1 
## 0.7329392

Podemos observar que, en el caso de un empleado masculino soltero que trabaja horas extras, vive a 25 kilómetros de distancia de su lugar de trabajo, tiene 30 años de edad y tres años de antigüedad en su puesto, la probabilidad de rotación es del 73.29%. Este resultado sugiere una propensión significativa a la rotación.

Individuo 2

predict(modelo_logistico,list(Genero="F",Estado_Civil="Soltero",Horas_Extra="Si",Distancia_Casa=5,Edad=26,Antigüedad_Cargo=2))
##         1 
## 0.1142975

Se puede notar que, en el caso de un empleada femenina soltera que trabaja horas extras, vive a 5 kilómetros de distancia de su lugar de trabajo, tiene 26 años de edad y dos años de antigüedad en su puesto, la probabilidad de rotación es del 11.42%. Este resultado sugiere una propensión baja a la rotación.

7. Conclusión

Después de analizar detalladamente los datos, se puede concluir que varias variables juegan un papel significativo en la probabilidad de rotación de empleados en nuestra empresa. Específicamente, el estado civil, las horas extra, la distancia entre la casa y el trabajo, la edad y la antigüedad en el cargo surge como factores importantes que están estrechamente relacionados con la tendencia de rotación entre nuestro personal.

Los resultados revelan que los empleados solteros, aquellos que realizan horas extra, los más jóvenes y aquellos con menos tiempo en su cargo tienden a tener una mayor probabilidad de rotación. Esta asociación sugiere la existencia de posibles patrones subyacentes en el comportamiento de rotación del personal en nuestra empresa.

Es notable destacar que, aunque se exploraron variables como el género y el estado civil de los empleados, no parecen tener una influencia significativa en la probabilidad de rotación según los resultados de este modelo en particular. Este hallazgo ofrece una perspectiva interesante sobre los factores que realmente influyen en la retención del personal en nuestra organización.

La implicación práctica de estos resultados es significativa. Al comprender mejor los factores que contribuyen a la rotación de empleados, nuestra empresa puede tomar decisiones más informadas y desarrollar estrategias más efectivas para la retención del personal. Identificar y abordar las necesidades específicas de los empleados solteros, aquellos que realizan horas extra y los empleados más jóvenes podría ayudar a mejorar la satisfacción laboral y reducir la tasa de rotación en el futuro.

Estos resultados ofrecen valiosa información que puede guiar la toma de decisiones y la implementación de estrategias para la retención de empleados en nuestra empresa. Al considerar activamente estos factores y diseñar políticas y programas de retención adaptados a las necesidades de nuestro personal, podemos trabajar hacia la creación de un entorno laboral más estable y satisfactorio para todos los empleados.