true

Problema de 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 cuáles 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.

Considerando lo expuesto previamente, comenzamos el análisis del problema propuesto. Para ello, en un primer momento realizaremos la carga de la data.

library(paqueteMODELOS)
## Loading required package: boot
## Loading required package: broom
## Loading required package: GGally
## Loading required package: ggplot2
## Registered S3 method overwritten by 'GGally':
##   method from   
##   +.gg   ggplot2
## Loading required package: gridExtra
## Loading required package: knitr
## Loading required package: summarytools
data("rotacion")

Teniendo en cuenta los datos anteriores, podemos identificar un data set con 24 variables y 1.470 registros. Del total de variables procedemos a realizar la selección de las variables a analizar en el problema.

Selección de variables a analizar

Teniendo en cuenta las variables del data set procedemos a seleccionar las siguientes variables

Variables categóricas

Las variables categóricas seleccionadas para el presente ejercicio son:

  • Satsisfacción laboral: Esta variable se ha constituido como uno de los principales atributos en la explicación de la rotación de empleados en los últimos años. Esta variable permite analizar si las condiciones tanto laborales, psicológicas, emocionales, del entorno físico y la remuneración del trabajo son suficientes para el trabajador. En efecto, la medición de esta variable involucra una análisis que puede recoger una multiplicidad de factores explicativos a la rotación de empleados al interior de una organización. Finalmente, es importante reconocer que la satisfacción laboral está intimamente relacionada con variables de rendimiento psicológico y de salud mental que tienen gran relevancia en el mundo laboral actual.

  • Estado civil: El estado civil también influye en la rotación del personal al interior de una organización. De acuerdo con estudios a nivel organizacional, las pe rsonas casadas y con obligaciones familiares tendrán una mayor predisposición a buscar enotrnos laborales que les permitan reconciliar los tiempos familiares y las obligaciones profesionales.

  • Cargo: Finalmente, se decide escoger la variable categórica de cargo porque existen algunos puestos donde la carga laboral es pesada y genera mayor incentivos a algunos individuos para buscar nuevas alternativas de trabajo. En efecto, las evidencias empíricas reconocen que algunos puestos de alta gerencia, toma de decisiones y de presión pueden ocasionar sentimientos de depresión, anisedad, estrés laboral y burnout, lo cual motiva a los individuos a buscar nuevas oportunidades laborales. Esta variable, también está relacionada con la cultura organizacional de una empresa en relación al diseño y equilibrio de cargas de trabajo. Esto también ocurre con variables en el área de ventas o cumplimiento de metas.

Variables cuantitativas

  • Ingreso mensual: El sueldo es un factor trascendental en la decisión de los empleados para continuar con su cargo actual o buscar nuevas oportunidades laborales. Esta variable indica que entre mayor sea el sueldo, las personas tendrán una menor disposición a renunciar debido a que sus expectativas de un nuevo cargo implican que el sueldo sea mayor al existente.

  • Último año de promoción: Se establece que las promociones en el cargo laboral se constituyen como un incentivo para que los trabajadores presenten una menor rotación en el puesto de trabajo. Por ello, las empresas donde se generen más tipos de estos incentivos permitirá que se disminuya los factores explicativos que pueda tener un empleado para rotar de su puesto de trabajo.

  • Edad: Finalmente, se decide escoger la edad al considerar que esta variable puede explicar patrones sobre la rotación de personas de acuerdo a su ciclo de vida. En general, se ha evidenciado que las nuevas generaciones tienden a presentar una mayor tendencia a buscar diversidad de opciones laborales, mientras que las personas con más edad prefieren trabajos con mayor estabilidad.

Hipótesis

Considerando las variables expuestas previamente, procedemos a establecer las hipótesis con relación a la variable de rotación.

  1. Satisfacción laboral: Los trabajadores con altos niveles de insatisfacción laboral son más propensos a buscar nuevas oportunidades laborales que permitan incrementar su nivel de bienestar personal.

  2. Estado Civil: Los trabajadores casados podrían tener mayores incentivos a la rotación con el fin de buscar trabajos que les permita reconciliar el tiempo laboral con el familiar.

  3. Cargo: Los cargos que demandan una mayor dedicación de tiempo, toma de decisiones o trabajo a presión generarían mayores incentivos para que los profesionales busquen nuevas oportunidades laborales.

  4. Ingresos mensuales: Los trabajadores con altos ingresos mensuales tienen menos incentivos para buscar nuevos trabajos.

  5. Último año de promoción: A menos años de promoción laboral, el trabajador tendrá menores incetivos para rotar de su puesto de trabajo.

  6. Edad: Los trabajadores más jóvenes tienen una mayor propensión a presentar una alta rotación laboral en comparación con los trabajadores más antiguos.

Análisis Univariado

Luego de realizar la selección de las variables analizadas, procedemos a realizar un análisis univariado de los atributos seleccionados para obtener una visión general de cada uno de ellas. Para ello, en un primer momento vamos a crear un dataframe con las variables seleccionadas.

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

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

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

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.

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.

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

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

Se define vector

rotacion_seleccionada <- rotacion[,c("Rotación", "Genero", "Estado_Civil", "Distancia_Casa", "Ingreso_Mensual", "Edad", "Cargo")]
rotacion_seleccionada<-as.data.frame(rotacion_seleccionada)
NAs<-colSums(is.na(rotacion_seleccionada))
as.data.frame(NAs)
##                 NAs
## Rotación          0
## Genero            0
## Estado_Civil      0
## Distancia_Casa    0
## Ingreso_Mensual   0
## Edad              0
## Cargo             0

No se tienen datos faltantes.

Visualización del nuevo dataframe con los 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
  1. 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)
## 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 encuentra que de los datos registrados el 60% pertenece a mujeres y el 40% a hombres

Cargo

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

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

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

library(dplyr)
## 
## Attaching package: '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
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

Histograma

median_val_hist <- median(rotacion$Edad)
mean_val_hist <- mean(rotacion$Edad)

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

De acuerdo con los resultados del histograma podemos evidenciar graficamente que la edad predominante se ubica entre los 30 y 40 años, y segun las estadistica el rango de edad va desde los 18 hasta los 60 años.

library(ggplot2)


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

library(ggplot2)

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

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

print(p_box_edad)

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

Ingreso mensual

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

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

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

library(ggplot2)

# Calcular los cuartiles, la mediana y la media
q1_val_ingreso <- quantile(rotacion$Ingreso_Mensual, 0.25)
q3_val_ingreso <- quantile(rotacion$Ingreso_Mensual, 0.75)
median_val_ingreso <- median(rotacion$Ingreso_Mensual)
mean_val_ingreso <- mean(rotacion$Ingreso_Mensual)

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

print(p_box_ingreso)

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 casas

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

Histograma

median_val_hist <- median(rotacion$Distancia_Casa)
mean_val_hist <- mean(rotacion$Distancia_Casa)

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

El 50% de los individuos registrados tiene su vivienda ubicada a menos de 7 kilometros

library(ggplot2)

# Calcular los cuartiles, la mediana y la media para la variable Distancia_Casa
q1_val_distancia <- quantile(rotacion$Distancia_Casa, 0.25)
q3_val_distancia <- quantile(rotacion$Distancia_Casa, 0.75)
median_val_distancia <- median(rotacion$Distancia_Casa)
mean_val_distancia <- mean(rotacion$Distancia_Casa)

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

print(p_box_distancia_casa)

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

Análisis Bivariado

Codificación

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

Modelos logísticos

Género

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

D los resultados obtenidos se puede establecer que la variable genero no es determinante debido a sus valores cercanos a cero

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

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

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 desde la casa al lugar de trabajo, la estimación aumenta en 0.02. Dicho resultado indic que entre mas lejos se ubique la vivienda del empleado mayor 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.9291, lo que indica que 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

conforme incrementa la edad 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

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

Residuos de Deviance: Estos valores reflejan qué tan bien se ajusta el modelo a los datos. En este caso, el modelo parece ajustarse de manera adecuada, ya que la mayoría de los residuos de desviación están próximos a cero. El rango va desde -1.4989 hasta 2.7489, con una mediana de -0.4600.

(Intercepto) -3.430: Este valor representa el log-odds predicho cuando todas las variables predictoras son cero o se encuentran en su categoría de referencia. Indica que el log-odds de rotación de empleados es aproximadamente -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 de Cargo: Los distintos roles laborales tienen impactos variables en la respuesta del modelo. Algunos cargos, como Ejecutivo de Ventas, Investigador Científico, Recursos Humanos, Representante de Ventas y Técnico de Laboratorio, muestran coeficientes positivos y significativos. Esto indica que los empleados que ocupan estos cargos tienen mayores probabilidades 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.

Evluación

Predicciones probabilísticas

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

##Calculo de la curva ROC

library(pROC)
## 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="green")

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

AUC = 0.5: El modelo carece de habilidad para discernir entre la clase positiva y negativa. En otras palabras, no supera la aleatoriedad en sus elecciones.

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

AUC = 1: El modelo exhibe una capacidad de discriminación perfecta. Puede distinguir entre la clase positiva y negativa sin error alguno.

Resultado = 0.7332: De acuerdo con este resultado, podemos concluir que el modelo desarrollado tiene una capacidad aceptable para prever resultados.

#Predicción

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

Se procede a analizar la posibilidad de rotación de un trabajador con las siguientes características:

Predicción 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
)

Ejecución del modelo

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

Predicción 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 el segundo ejemplo, se observa que las posibilidades de rotación alcanzan el 58.4%, lo que sugiere una tasa significativamente alta. Una de las estrategias que la empresa podría considerar para abordar esta situación es fomentar entre los empleados la adquisición de viviendas más cercanas al lugar de trabajo. Para lograrlo, podrían establecer colaboraciones con las cajas de compensación con el fin de brindar el respaldo necesario a los empleados que deseen comprar su propio hogar.

Ahora, para desarrollar aún más el segundo ejemplo, se supone que la vivienda está aún más próxima al lugar de trabajo.

Predicción 3

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
)

Ejecución del modelo

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

Implementando el programa de vivienda para empleados en proximidad a la empresa, la probabilidad de rotación se reduce del 58.4% al 37.05%, lo que representa una disminución del 36% en la probabilidad de rotación.

Conclusiones

En las conclusiones del análisis, se observa que varias de las variables seleccionadas tienen un impacto significativo en la rotación de empleados. Por ejemplo, la variable “Cargo” destaca como un factor de influencia en el modelo, siendo difícil de intervenir debido a la estructura organizacional establecida en las empresas y las limitadas oportunidades de ascenso o cambio de roles.

La variable “Edad” también muestra un impacto considerable en la rotación, pero al igual que con el “Cargo”, la empresa tiene un margen de maniobra limitado en esta área. No obstante, podría considerar adaptar sus políticas de contratación, dando preferencia a candidatos mayores que el promedio de edad del personal actual si el objetivo es reducir la rotación.

Por otro lado, las variables “Ingreso Mensual” y “Distancia desde Casa” ofrecen oportunidades donde la empresa podría intervenir directamente. Ajustar los salarios o incentivar la adquisición de viviendas cercanas al lugar de trabajo podrían ser estrategias efectivas para reducir la rotación. Aunque implementar estas estrategias podría requerir una inversión inicial, es crucial que la empresa evalúe los beneficios a largo plazo. La rotación de empleados conlleva costos asociados, como la pérdida de conocimiento especializado, 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 podría resultar rentable para la organización.