Problema

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


Solución

Etapa 1. Selección de variables

1.1 cargue y lectura de datos

#Carga de datos
data("rotacion")
glimpse(rotacion)
## Rows: 1,470
## Columns: 24
## $ Rotación                    <chr> "Si", "No", "Si", "No", "No", "No", "No", …
## $ Edad                        <dbl> 41, 49, 37, 33, 27, 32, 59, 30, 38, 36, 35…
## $ `Viaje de Negocios`         <chr> "Raramente", "Frecuentemente", "Raramente"…
## $ Departamento                <chr> "Ventas", "IyD", "IyD", "IyD", "IyD", "IyD…
## $ Distancia_Casa              <dbl> 1, 8, 2, 3, 2, 2, 3, 24, 23, 27, 16, 15, 2…
## $ Educación                   <dbl> 2, 1, 2, 4, 1, 2, 3, 1, 3, 3, 3, 2, 1, 2, …
## $ Campo_Educación             <chr> "Ciencias", "Ciencias", "Otra", "Ciencias"…
## $ Satisfacción_Ambiental      <dbl> 2, 3, 4, 4, 1, 4, 3, 4, 4, 3, 1, 4, 1, 2, …
## $ Genero                      <chr> "F", "M", "M", "F", "M", "M", "F", "M", "M…
## $ Cargo                       <chr> "Ejecutivo_Ventas", "Investigador_Cientifi…
## $ Satisfación_Laboral         <dbl> 4, 2, 3, 3, 2, 4, 1, 3, 3, 3, 2, 3, 3, 4, …
## $ Estado_Civil                <chr> "Soltero", "Casado", "Soltero", "Casado", …
## $ Ingreso_Mensual             <dbl> 5993, 5130, 2090, 2909, 3468, 3068, 2670, …
## $ Trabajos_Anteriores         <dbl> 8, 1, 6, 1, 9, 0, 4, 1, 0, 6, 0, 0, 1, 0, …
## $ Horas_Extra                 <chr> "Si", "No", "Si", "Si", "No", "No", "Si", …
## $ Porcentaje_aumento_salarial <dbl> 11, 23, 15, 11, 12, 13, 20, 22, 21, 13, 13…
## $ Rendimiento_Laboral         <dbl> 3, 4, 3, 3, 3, 3, 4, 4, 4, 3, 3, 3, 3, 3, …
## $ Años_Experiencia            <dbl> 8, 10, 7, 8, 6, 8, 12, 1, 10, 17, 6, 10, 5…
## $ Capacitaciones              <dbl> 0, 3, 3, 3, 3, 2, 3, 2, 2, 3, 5, 3, 1, 2, …
## $ Equilibrio_Trabajo_Vida     <dbl> 1, 3, 3, 3, 3, 2, 2, 3, 3, 2, 3, 3, 2, 3, …
## $ Antigüedad                  <dbl> 6, 10, 0, 8, 2, 7, 1, 1, 9, 7, 5, 9, 5, 2,…
## $ Antigüedad_Cargo            <dbl> 4, 7, 0, 7, 2, 7, 0, 0, 7, 7, 4, 5, 2, 2, …
## $ Años_ultima_promoción       <dbl> 0, 1, 0, 3, 2, 3, 0, 0, 1, 7, 0, 0, 4, 1, …
## $ Años_acargo_con_mismo_jefe  <dbl> 5, 7, 0, 0, 2, 6, 0, 0, 8, 7, 3, 8, 3, 2, …

La base de datos cuenta con 1470 registros y 24 variables, distribuidas asi:

  • Variables categóricas: Rotación, Viaje de Negocios, Departamento, Campo Educación, Género, Cargo, Estado Civil, Horas Extra.

  • Variables numéricas: Edad, Distancia Casa, Educación, Satisfacción Ambiental, Satisfacción Laboral, Ingreso Mensual, Trabajos Anteriores, Porcentaje de Aumento Salarial, Rendimiento Laboral, Años de Experiencia, Capacitaciones, Equilibrio Trabajo-Vida, Antigüedad, Antigüedad en el Cargo, Años desde la Última Promoción, Años al Cargo con el Mismo Jefe.

#Estadísticas descriptivas de las variables númericas
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
# Verificar valores nulos por columna
valores_nulos <- colSums(is.na(rotacion))

# Mostrar los nombres de las columnas con valores nulos y la cantidad de ellos
print(valores_nulos[valores_nulos > 0])
## named numeric(0)

No hay datos faltantes en la base de datos.


1.2 Selección de variables

Elejir 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

  • Departamento: diferentes departamentos tienen diferentes tareas, responsabilidades y diferentes oportunidades de crecimiento de forma que algunos pueden presentarse como más tractivos y promover la rotación.

  • Horas extra: trabajar horas extra puede aumentar el riesgo de rotación debido al agotamiento y la insatisfacción laboral.

  • Género: es común que diferentes géneros tengan diferentes oportunidades laborales y por tanto influya en la rotación.

Variables numéricas

  • Satisfacción laboral: La rotación suele ser más alta entre los menos satisfechos, quienes buscan mejores oportunidades laborales.

  • Años de experiencia: Los empleados con más experiencia tienden a cambiar menos de trabajo, a menudo asociando un cambio de puesto con la pérdida de años de experiencia.

  • Edad: estadísticamente, los trabajadores más jóvenes tienden a cambiar de trabajo con más frecuencia, mientras que los más mayores prefieren la estabilidad laboral.


Etapa 2. Análisis univariado

2.1 Variables categoricas

# Seleccionar variables categóricas
variables_categoricas <- rotacion[, c("Departamento", "Horas_Extra", "Genero")]

# Realizar análisis univariado de variables categóricas
summary(variables_categoricas)
##  Departamento       Horas_Extra           Genero         
##  Length:1470        Length:1470        Length:1470       
##  Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character
library(ggplot2)

# Gráfico de barras para Departamento
ggplot(rotacion, aes(x = Departamento)) +
  geom_bar(fill = "skyblue", color = "black") +
  geom_text(stat = 'count', aes(label = ..count..), position = position_stack(vjust = 0.5)) +
  labs(title = "Empleados por Departamento",
       x = "Departamento",
       y = "Número de empleados")

# Gráfico de barras para Horas Extra
ggplot(rotacion, aes(x = Horas_Extra)) +
  geom_bar(fill = "lightgreen", color = "black") +
  geom_text(stat = 'count', aes(label = ..count..), position = position_stack(vjust = 0.5)) +
  labs(title = "Horas extra",
       x = "Horas Extra",
       y = "Número de empleados")

# Gráfico de barras para Género
ggplot(rotacion, aes(x = Genero)) +
  geom_bar(fill = "lightcoral", color = "black") +
  geom_text(stat = 'count', aes(label = ..count..), position = position_stack(vjust = 0.5)) +
  labs(title = "Empleados por Género",
       x = "Género",
       y = "Número de empleados")
## 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.

  • La empresa tiene 3 departamentos: IyD, RH, y Ventas: IyD con 961 empleados, Ventas con 446 empleados y luego RH con 61 empleados, para un total de 1470 empleados.

  • Mas de 400 empleados trabajan horas extras, y 1054 empleados no trabajan horas extras.

  • El 40% de los empleados son muejres y el 60% de los empleados son hombres.


2.1 Variables cuantitativas

# Seleccionar variables numéricas
variables_numericas <- rotacion[, c("Satisfación_Laboral", "Años_Experiencia", "Edad")]

# Realizar análisis univariado de variables numéricas
summary(variables_numericas)
##  Satisfación_Laboral Años_Experiencia      Edad      
##  Min.   :1.000       Min.   : 0.00    Min.   :18.00  
##  1st Qu.:2.000       1st Qu.: 6.00    1st Qu.:30.00  
##  Median :3.000       Median :10.00    Median :36.00  
##  Mean   :2.729       Mean   :11.28    Mean   :36.92  
##  3rd Qu.:4.000       3rd Qu.:15.00    3rd Qu.:43.00  
##  Max.   :4.000       Max.   :40.00    Max.   :60.00
# Histograma para Satisfacción Laboral
ggplot(rotacion, aes(x = Satisfación_Laboral)) +
  geom_histogram(fill = "lightblue", color = "black", bins = 20) +
  labs(title = "Satisfacción Laboral",
       x = "Satisfacción Laboral",
       y = "Frecuencia")

# Histograma para Años de Experiencia
ggplot(rotacion, aes(x = Años_Experiencia)) +
  geom_histogram(fill = "lightgreen", color = "black", bins = 20) +
  labs(title = "Años de Experiencia",
       x = "Años de Experiencia",
       y = "Frecuencia")

# Histograma para Edad
ggplot(rotacion, aes(x = Edad)) +
  geom_histogram(fill = "lightcoral", color = "black") +
  labs(title = "Distribución de Edad",
       x = "Edad",
       y = "Frecuencia")

## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

  • La edad media se encuentra en la edad de 36 años, la edad mínima es 18 años y la edad máxima 60 años.

  • Diccionario Satisfacción laboral: 1=Muy insatisfecho, 2=insatisfecho, 3=satisfecho y 4=Muy satisfecho. La barra más alta corresponde a la satisfacción laboral con una puntuación de 4 muy satisfecho, seguida por 3 satisfecho, las puntuaciones 1 y 2 son las menores.

  • La mayoría de empleados tiene entre 5 y 10 años de experiencia


Etapa 3. Análisis bivariado

# Crear un data frame con la variable respuesta y las variables predictoras
datos <- data.frame(
  rotacion = ifelse(rotacion$Rotación == "Si_rotacion", 1, 0),
  Departamento = as.factor(rotacion$Departamento),
  Horas_Extra = as.factor(rotacion$Horas_Extra),
  Genero = as.factor(rotacion$Genero),
  Satisfaccion_Laboral = rotacion$Satisfación_Laboral,
  Años_Experiencia = rotacion$Años_Experiencia,
  Edad = rotacion$Edad
)

# Ajustar un modelo de regresión logística
modelo <- glm(rotacion ~ ., data = datos, family = "binomial")
## Warning: glm.fit: algorithm did not converge
# Mostrar un resumen del modelo
summary(modelo)
## 
## Call:
## glm(formula = rotacion ~ ., family = "binomial", data = datos)
## 
## Coefficients:
##                        Estimate Std. Error z value Pr(>|z|)
## (Intercept)          -2.657e+01  5.000e+04  -0.001        1
## DepartamentoRH        2.956e-15  4.636e+04   0.000        1
## DepartamentoVentas    6.984e-14  2.042e+04   0.000        1
## Horas_ExtraSi         6.588e-14  2.065e+04   0.000        1
## GeneroM              -4.707e-14  1.903e+04   0.000        1
## Satisfaccion_Laboral  2.232e-14  8.438e+03   0.000        1
## Años_Experiencia     -3.647e-15  1.631e+03   0.000        1
## Edad                  3.038e-15  1.389e+03   0.000        1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 0.0000e+00  on 1469  degrees of freedom
## Residual deviance: 8.5283e-09  on 1462  degrees of freedom
## AIC: 16
## 
## Number of Fisher Scoring iterations: 25

De acuerdo a este analisis vibariado ninguna de las variables es un predictor fuerte de rotacion. a continuacion veremos si en el modelo particionado se tiene una mejor interpretación.


Etapa 4. Estimación de modelo

# Convertir la variable Rotación a un factor y recodificar como binaria
rotacion$Rotacion_binaria <- as.numeric(rotacion$Rotación == "Si")

# Seleccionar las variables de interés
variables_categoricas <- rotacion[, c("Departamento", "Horas_Extra", "Genero")]
variables_numericas <- rotacion[, c("Satisfación_Laboral", "Años_Experiencia", "Edad")]
rotacion_subset <- cbind(variables_categoricas, variables_numericas, Rotacion = rotacion$Rotacion_binaria)

# Partición aleatoria de los datos
set.seed(123)
indices_entrenamiento <- sample(nrow(rotacion_subset), 0.7 * nrow(rotacion_subset))  
datos_entrenamiento <- rotacion_subset[indices_entrenamiento, ]
datos_prueba <- rotacion_subset[-indices_entrenamiento, ]

# Ajustar el modelo logístico
modelo_logistico <- glm(Rotacion ~ ., data = datos_entrenamiento, family = binomial)

# Mostrar los resultados del modelo
summary(modelo_logistico)
## 
## Call:
## glm(formula = Rotacion ~ ., family = binomial, data = datos_entrenamiento)
## 
## Coefficients:
##                      Estimate Std. Error z value Pr(>|z|)    
## (Intercept)          0.539487   0.505873   1.066 0.286221    
## DepartamentoRH       0.634478   0.427677   1.484 0.137930    
## DepartamentoVentas   0.493707   0.196610   2.511 0.012036 *  
## Horas_ExtraSi        1.391303   0.188424   7.384 1.54e-13 ***
## GeneroM             -0.001289   0.189739  -0.007 0.994580    
## Satisfación_Laboral -0.309294   0.082082  -3.768 0.000164 ***
## Años_Experiencia    -0.056471   0.020086  -2.812 0.004931 ** 
## Edad                -0.043709   0.015360  -2.846 0.004432 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 896.03  on 1028  degrees of freedom
## Residual deviance: 769.23  on 1021  degrees of freedom
## AIC: 785.23
## 
## Number of Fisher Scoring iterations: 5

Horas_ExtraSi: Un coeficiente positivo (1.391) sugiere que los empleados que trabajan horas extras tienen una mayor probabilidad de rotación en comparación con los que no trabajan horas extras.

GeneroM: El coeficiente cercano a cero (-0.001) indica que el género no tiene un efecto significativo en la probabilidad de rotación.

Satisfacion_Laboral: Un coeficiente negativo (-0.309) sugiere que un aumento en la satisfacción laboral está asociado con una disminución en la probabilidad de rotación.

Años_Experiencia y Edad: Ambas variables tienen coeficientes negativos, lo que sugiere que a medida que aumenta la experiencia laboral y la edad del empleado, la probabilidad de rotación tiende a disminuir.

En resumen, las variables significativas para predecir la rotación son: Departamento (Ventas), Horas_Extra, Satisfaccion_Laboral, Años_Experiencia y Edad. Estas variables muestran una asociación significativa con la probabilidad de rotación de los empleados en la empresa.


Etapa 5. ROC y el AUC

# Calcular las probabilidades predichas de rotación para el conjunto de datos de prueba
probabilidades_predichas <- predict(modelo_logistico, newdata = datos_prueba, type = "response")

# Cargar la biblioteca para trabajar con curvas ROC y AUC
library(pROC)

# Crear un objeto de curva ROC
curva_roc <- roc(response = datos_prueba$Rotacion, predictor = probabilidades_predichas)
## Setting levels: control = 0, case = 1
## Setting direction: controls < cases
# Calcular el área bajo la curva (AUC)
auc <- auc(curva_roc)

# Graficar la curva ROC
plot(curva_roc, main = "Curva ROC del Modelo Logístico",
     xlab = "Tasa de Falsos Positivos", ylab = "Tasa de Verdaderos Positivos")

# Agregar la leyenda con el AUC
legend("bottomright", legend = paste("AUC =", round(auc, 2)),
       col = "black", pch = 16)

# Interpretar la curva ROC y el AUC
print(curva_roc)
## 
## Call:
## roc.default(response = datos_prueba$Rotacion, predictor = probabilidades_predichas)
## 
## Data: probabilidades_predichas in 366 controls (datos_prueba$Rotacion 0) < 75 cases (datos_prueba$Rotacion 1).
## Area under the curve: 0.7255

Area under the curve (AUC): El valor del AUC es 0.7255. Esto indica que el modelo tiene un poder discriminativo moderado para distinguir entre los individuos que rotaron y los que no lo hicieron en el conjunto de datos de prueba. Un AUC de 0.5 sugiere un rendimiento similar al azar, mientras que un AUC cercano a 1 indica un rendimiento perfecto del modelo en la clasificación.

Interpretación de la curva ROC: La curva ROC representa la relación entre la tasa de verdaderos positivos (sensibilidad) y la tasa de falsos positivos (1 - especificidad) en diferentes umbrales de clasificación. En este caso, la curva ROC muestra que, a medida que se ajusta el umbral de clasificación, la sensibilidad y la especificidad varían. El punto ideal en la curva ROC estaría en el extremo superior izquierdo, donde la sensibilidad es 1 y la especificidad es 0. Sin embargo, debido a que la curva se acerca a la esquina superior izquierda, sugiere que el modelo tiene una capacidad razonable para predecir la rotación.

En resumen, el modelo logístico tiene una capacidad predictiva moderada para distinguir entre los empleados que rotaron y los que no lo hicieron en el conjunto de datos de prueba, como se indica por el AUC de 0.7255. Si bien el modelo no tiene un rendimiento perfecto, su capacidad para discriminar entre las dos clases es mejor que una clasificación aleatoria.


Etapa 6. Estrategia disminución de rotación

Dado el análisis previo del modelo logístico y su capacidad para predecir la rotación de empleados, así como la identificación de las variables determinantes, aquí hay algunas estrategias que podrían ayudar a disminuir la rotación en la empresa:

Mejora de la satisfacción laboral: Dado que la satisfacción laboral tiene un impacto significativo en la probabilidad de rotación, una estrategia clave sería mejorar el ambiente laboral, ofrecer oportunidades de crecimiento profesional, reconocer el trabajo bien hecho y fomentar una cultura organizacional positiva.

Gestión de horas extras: Como se identificó que trabajar horas extras está asociado con una mayor probabilidad de rotación, se puede implementar una gestión más efectiva de las horas de trabajo, asegurando que los empleados no se sientan abrumados o agotados por la carga de trabajo.

Desarrollo y retención de talento: Dado que la experiencia laboral y la edad parecen estar inversamente relacionadas con la probabilidad de rotación, la empresa puede centrarse en el desarrollo profesional y la retención de empleados con experiencia, ofreciendo programas de capacitación, oportunidades de ascenso y beneficios atractivos.

Revisión de políticas de recursos humanos: Evaluar las políticas de recursos humanos relacionadas con la asignación de departamentos y el equilibrio trabajo-vida puede ayudar a identificar áreas de mejora. Por ejemplo, se podría revisar la distribución de cargas de trabajo en los diferentes departamentos y ofrecer flexibilidad en los horarios laborales para promover un mejor equilibrio entre el trabajo y la vida personal.

Análisis continuo: Es importante seguir monitoreando y evaluando los factores que influyen en la rotación de empleados. Realizar encuestas de satisfacción periódicas, analizar datos de rotación y retroalimentación de los empleados, y ajustar las estrategias en función de los hallazgos pueden contribuir a una gestión efectiva de la rotación en la empresa.