Actividad 3

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"

Variables categóricas:

  • Genero:

    En muchas organizaciones dependiendo del tipo de organizacion suele haber mayor preferencia por personal femenino o masculino y tambien dependiendo del tipo de trabajo hay generos que pueden tener mas ventaja físicas para poder desarrollarlos, eso podría influir en la pemanencia o no de la persona en la empresa.

  • Cargo:

    Dependiendo del cargo y el área puede haber mayor estres lo que podría generar salidas prematuras del personal.

  • Estado Civil:

    Las obligaciones familiares y personales podrían influir en la decisión de un empleado de quedarse o dejar una empresa.

Variables cuantitativas:

  • Distancia_Casa:

    Se espera que aquellos que viven más lejos de su lugar de trabajo tengan una mayor probabilidad de rotar para buscar empleo más cerca de casa.

  • Ingreso_Mensual:

    Los ingresos influyen mucho en la estabilidad laboral de una persona, a mayor salario menor es la posibilidad de un empleado quiera dejar su trabajo.

  • Edad:

    Los empleados con menos edad al no tener responsabilidades suelen cambiar mas facilmente de trabajo dado que no tienen mayores complicaciones para hacerlo.

Hipotesis

  1. Genero: Las cualidades físicas de cada genero podrían influir en la rotacion del personal dependiendo de la exigencia del cargo.

  2. Cargo: Cada uno de los cargos en una determianda organización maneja cierto tipo de estres por tanto el nivel de estres provocado por un determinado cargo podría influir en la rotación

  3. Estado Civil: Se podría hipotetizar que aquellos que están casados o tienen dependientes podrían buscar una mayor estabilidad por tanto podrían tener una tasa de rotación más baja.

  4. Distancia_Casa: Aquellas personas que viven más lejos de su lugar de trabajo tengan una mayor probabilidad de rotar para buscar empleo más cerca de casa.

  5. Ingresos_Mensuales: Los empleados que tienen un buen ingreso salarial tienen menores intensiones de cambiar su trabajo.

  6. Edad: Los empleados con menos edad tienen mayores posibilidades de cambiar de trabajo dado que por su edad tienden a buscar empresas que se ajusten a lo que quieren.



Variables seleccionadas
  • Definimos vector:
rotacion_seleccionada <- rotacion[,c("Rotación", "Genero", "Estado_Civil", "Distancia_Casa", "Ingreso_Mensual", "Edad", "Cargo")]
rotacion_seleccionada<-as.data.frame(rotacion_seleccionada)


Validamos la cantidad de datos faltantes.


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


No se tienen datos faltantes.


  • Visualimos nuestro nuevo dataframe con los 5 primeros registros
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

Sin novedades en nuestros datos



2. Análisis univariado


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


Variables categoricas

Genero


Visulizamos la cantidad de registros

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 Genero", x = "Genero", y = "Frecuencia") + 
    theme_minimal() +
    theme(axis.text.x = element_text(angle = 45, hjust = 1))

print(p1)


En nuestra data tenemos que el 60% de los registros pertenecen a hombres y el 40% a mujeres.


Cargo

Visulizamos la cantidad de registros

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)


El cargo de ejecutivo de ventas es el cargo que predomina con un 22,18%, seguido de Investigador cientifico con 19,86% y Tecnico LAboratorio con 17,62%, el cargo menos frecuente es el de Recursos Humanos con un 3,54%

Estado Civil


Visulizamos la cantidad de registros

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)


La mayoria de las personas de nuestra data son casadas, en total un 45,8% son casadas, el 32% son soteras y el 22,2% son divorciadas

Variables Cuantitativas


Edad


Obtenemos la información básica de la variable

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


Graficamos el histograma de la variable.

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()
print(p_edad)


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.


  • Graficamos el boxplot


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, label = paste("               Mediana:", round(median_val, 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)


El 50% de nuestros datos se concentran entro los 30 y 43 años de edad.

Ingreso_mensual


Obtenemos la información básica de la variable



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


Graficamos el histograma de la variable.


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)


Según el histograma podemos evidenciar graficamente que la mtiad de las personas tiene un ingreso inferior a 5000.


  • Graficamos el boxplot


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, label = paste("               Mediana:", round(median_val, 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 + 500, label = paste("               Media:", round(mean_val, 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)


El 50% de las personas ganan entre 2911 y 8379, solo un 25% tiene ingresos a los 8379, y la que mas ingresos tienen percibe un salario de 19999

Distancia_Casa


Obtenemos la información básica de la variable


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


Graficamos el histograma de la variable.

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)


El 50% de las personas vive a una distancia inferior de los 7 kilometros.

  • Graficamos el Boxplot


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, label = paste("               Mediana:", round(median_val, 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 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)


El 50% de las personas viven entres los 2 y los 14 kilometros, la persona que vive mas lejos está a 29 kilometros



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

Codificar la variable


Codificamos la variables asignando los 1 y 0.

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

Modelos logísticos


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


  • 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


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

  • Cargo


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 si influye significativamente en la rotación y cargos como (como Ejecutivo de Ventas, Investigador Científico, Recursos Humanos, Representante de Ventas y Técnico de Laboratorio) tienen unos valores significativos

  • 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


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.

  • Distancia_Casa


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.

  • Ingreso_Mensual


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.

  • 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


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


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.


Definimos nuestro modelo

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


Visualizamos los resultados de la variable.


summary(modelo_logistico)
## 
## Call:
## glm(formula = y ~ Genero + Estado_Civil + Cargo + Distancia_Casa + 
##     Ingreso_Mensual + Edad, family = binomial, data = rotacion_seleccionada)
## 
## Deviance Residuals: 
##     Min       1Q   Median       3Q      Max  
## -1.4989  -0.6285  -0.4600  -0.2700   2.7489  
## 
## 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 dan idea de cómo se ajusta el modelo a los datos, en este caso el modelo se ajusta perfectamente, se espera que la mayoría de las deviance residuals fueran cercanas a cero. El rango va de -1.4989 a 2.7489, con la mediana en -0.4600.

  • (Intercept) -3.430:
    Este es el log-odds predicho cuando todas las variables predictoras son 0 o están en su categoría de referencia la rotación de empleados es -3.430.



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



  • Estado_CivilDivorciado -0.206:
    En comparación con la categoría de referencia que es casado, estar divorciado disminuye el log-odds de la respuesta en 0.206, manteniendo todas las demás variables constantes, pero esta diferencia no es estadísticamente significativa.

  • Estado_CivilSoltero 0.8166:
    Estar soltero, en comparación con estar casado, aumenta el log-odds de la respuesta en 0.8166, este efecto es estadísticamente significativo, lo que sugiere que los empleados solteros tienen una mayor probabilidad de rotación en comparación con los empleados casados.



  • Variables relacionadas con el Cargo:
    Diferentes cargos tienen diferentes efectos sobre la respuesta. Algunos como CargoEjecutivo_Ventas, CargoInvestigador_Cientifico, CargoRecursos_Humanos, CargoRepresentante_Ventas, y CargoTecnico_Laboratorio tienen coeficientes positivos y significativos, lo que quiere decir que empleados en estos cargos tienen mayores log-odds de rotación.

  • Distancia_Casa 0.02908:
    Por cada unidad adicional en la distancia desde la casa al trabajo, el log-odds de la rotación de empleados aumenta en 0.02908, el coeficiente es estadísticamente significativo, podemos decir que la distancia entre la casa y el trabajo juega un papel importante en la decisión de un empleado de abandonar la empresa.

  • Ingreso_Mensual 0.00001858:
    Aunque el coeficiente es cercano a cero y no es significativo, por cada unidad adicional en el ingreso mensual, hay un ligero aumento en el log-odds de la rotación de empleados pero no es significativo.

  • Edad -0.0253:
    Por cada año adicional en la edad del empleado, el log-odds de la rotación de empleados disminuye en 0.0253. Esto es significativo y sugiere que a medida que los empleados envejecen, tienen menos probabilidades de abandonar la empresa.

En el modelo las variables como Estado_Civil= Soltero, varios cargos, Distancia_Casa y Edad tienen coeficientes significativos, lo que sugiere que son factores importantes a considerar al analizar la rotación de empleados.



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.

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

Calcular la Curva ROC:
Se usa la función roc del paquete pROC para calcular la curva ROC.

library(pROC)
curva_roc <- roc(rotacion_seleccionada$y, pred_probabilidades)


Graficar la Curva ROC:

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 cerca esté el valor de AUC de 1, mejor será el modelo.

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

  • Resultado = 0.7332 En el resultado obtenido 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).

Para realizar una predicción sobre un individuo hipotético, se necesita definir los valores de las variables que tiene ese modelo.

Se debe Definir los valores de las covariables para el individuo hipotético,vamos a suponer que nuestro empleado hipotético tiene las siguientes características:

  • Ejemplo 1
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
)


Una vez definidas las variables procedemos a ejecutar nuestro modelo.


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.

  • Ejemplo 2
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` = 2500,  # tiene ingresos de 2500
  `Distancia_Casa` = 35,   # Vive a 35 kilometros del lugar de trabajo
  `Edad` = 20   # Tiene 20 años
)


Ejecución del modelo.


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


En nuestro segundo ejemplo obtenemos que las posibilidades de rotar son de 58.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.
Desarrollemos el ejemplo 2 pero esta vez suponiendo una vivienda mas cercana.



  • Ejemplo 3

En este caso la distancia de la casa al trabajo se disminuye a 5 kilometros.

empleado_hipotetico3 <- 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` = 2500,  # tiene ingresos de 2500
  `Distancia_Casa` = 5,   # Vive a 5 kilometros del lugar de trabajo
  `Edad` = 20   # Tiene 20 años
)


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


Con el plan de vivienda para empleados cerca de la empresa la probabilidad de rotación baja desde 58,4% al 37.05%, es decir una reducción en la probabilidad de rotación del 36%.


___


7. Conclusiones


Finalmente nn nuestra análisis, encontramos que varias de las variables seleccionadas tienen un impacto considerable en la rotación de empleados, por ejemplo, la variable “Cargo” que tiene un impacto dignificativo en nuestro modelo es dificil de intervenir dado que las empresas operan dentro de un organigrama establecido y las oportunidades para ascensos o cambios de roles son limitadas.

La “Edad” es otra variable con un impacto significativo en la rotación, pero, al igual que con el “Cargo”, la empresa tiene un margen limitado de acción sobre esta variable, no obstante, se podría considerar adaptar sus políticas de contratación, favoreciendo a candidatos que se encuentren por encima del promedio de edad del actual personal, si el objetivo es reducir la rotación.

Por otro lado, las variables “Ingreso_Mensual” y “Distancia_Casa” son variables donde la empresa podría tener un impacto directo, ajustar los salarios o icentivar la compra de vivienda cerca al trabajo podría ser para los empleados r estrategias efectivas para disminuir la rotación, aunque implementar estas estrategias podría suponer una inversión inicial, es esencial que la empresa evalúe 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 reduzca la rotación podría ser rentable para la organización.