Rotacion de empleados.

Dada la preocupante tasa de rotación de empleados en una organización, se ha iniciado un análisis exhaustivo para comprender y anticipar los factores que influyen en dicha rotación en diferentes cargos. Para ello, la organización ha recopilado datos históricos sobre los empleados, incluyendo variables como antigüedad, nivel de satisfacción, edad, cargo actual, entre otras. El objetivo principal es identificar patrones y tendencias que permitan anticipar la rotación de los empleados en sus cargos actuales, lo que proporcionará a la organización información valiosa para implementar estrategias efectivas de retención de talento.



Conociendo los datos.

Se visualiza el DataFrame completo a trabajar.

## 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, …

Seleccionando las variables. (3 Categoricas y 3 Cuandotitativas).

Variables Tipo de datos Descipción
Edad numerico Edad del empleado
Ingresos mensuales numerico Salario mensual (USD)
Antigüedad numerico Años en la empresa
Horas extras Caracter Trabaja horas extra
Cargo Caracter Cargo actual
Campo educación Caracter Campo educativo


Decidimos incluir la variable de edad en nuestro análisis basándonos en una lógica común que sugiere que las personas más jóvenes tienden a cambiar de trabajo con mayor frecuencia o a aspirar a puestos de trabajo de mayor nivel. Es posible que esta población más joven experimente una mayor rotación laboral en comparación con aquellas personas de edad más avanzada, de igual forma en nuestro dataframe incluimos la variable Ingresos mensuales debido a que las personas con menores ingresos buscan a aspirar a cargos mas importantes en la empresa o a buscar oportunidades laborales con un mejor salario.Por último, incorporamos la variable Antigüedad ya que consideramos que los empleados con mayor antigüedad son los más propensos a rotar entre los cargos, debido a su experiencia en la compañía.

En nuestro dataframe de análisis, hemos incluido la variable categórica de horas extras, ya que consideramos que es un factor fundamental que influye directamente en nuestra variable objetivo, Rotación. También hemos incorporado el Cargo actual, el cual es esencial y requiere un análisis más detallado para comprender su efecto sobre la variable objetivo. Por último, hemos seleccionado el campo de educación, ya que inferimos que los empleados con ciertas profesiones pueden tener una rotación diferente en comparación con profesionales de otros campos.

Conociendo nuestro Datos


Análisis univariado - Variables cuanlitativas.

lista_graficos <- list()
lista_graficos2 <- list()

for (col_name in colnames(rotacion)) {
  
  col_type <- class(rotacion[[col_name]])
  
  if(col_type =="character"){
    
    datos_freq <- as.data.frame(table(rotacion[[col_name]]))
    
    colnames(datos_freq)[1] <- col_name
    
    datos_freq$Porcentaje <- datos_freq$Freq / sum(datos_freq$Freq) * 100
    
    
    grafico <- ggplot(datos_freq, aes(x = "", y = Freq, fill = .data[[col_name]])) +
      geom_bar(width = 1, stat = "identity") +
      coord_polar("y", start=0) +
      labs(title = paste0("Distribución de Campo de ",col_name),  fill = "") +
      geom_text(aes(label = paste(round(Porcentaje, 1), "%")), position = position_stack(vjust = 0.5), size = 4) +
      theme_light() +
      theme(legend.position='none')+   
      theme(axis.text = element_blank(),
            axis.title = element_blank(),
            legend.title = element_blank(),
            legend.text = element_blank(),
            plot.title = element_blank())
    
    lista_graficos[[col_name]] <- grafico
    
    grafico2 <- ggplot(datos_freq, aes(x = " ", y=Freq,fill=.data[[col_name]]) ) +    
      geom_bar(width = 0.9, stat="identity",             
               position = position_dodge()                
      )+ 
      labs(
        x="",
        y= "",
        fill=col_name
      ) + 
      geom_text(aes(label=Freq), vjust=1.6, color="white",   
                position = position_dodge(0.9),  size=4
      )+
      theme_light() +
      theme(legend.position='top')+                                     
      facet_grid(~paste0("Frecuncia de ", col_name))
    
    lista_graficos2[[col_name]] <- grafico2
    
    #grid.arrange(grafico2,grafico, ncol=2)
    
  }
  if(col_type =="numeric"){
    
    if(col_name=="Ingreso_Mensual"){bin<-1000}else{bin<-1}
    
    grafico3<-  ggplot(data = rotacion, aes(x = .data[[col_name]])) +
      geom_histogram(binwidth = bin,fill = "#88CCEE", color = "black") +
      labs(x = " ", y = "Frecuencia", title = paste0("Distribucion de ", col_name))
    lista_graficos[[col_name]] <- grafico3
    
    grafico4 <- ggplot(data = rotacion, aes(x = " ", y = .data[[col_name]], fill = .data[[col_name]])) +
      geom_boxplot(fill = "#88CCEE") +
      geom_jitter(color="red", size=0.4, alpha=0.9) +
      labs(x = "")+
      theme(legend.position = "none")
    
    
    lista_graficos2[[col_name]] <- grafico4
    #grid.arrange(grafico3,grafico4, ncol=2)
    
  }
  
}
par(mfrow= c(1,2))

grid.arrange(
lista_graficos2[["Rotación"]],
lista_graficos[["Rotación"]],
 ncol=2)

par(mfrow= c(1,2))

grid.arrange(
  lista_graficos[["Edad"]],
  lista_graficos2[["Edad"]],
 ncol=2)

par(mfrow= c(1,2))

grid.arrange(
  lista_graficos[["Ingreso_Mensual"]],
  lista_graficos2[["Ingreso_Mensual"]],
 ncol=2)

par(mfrow= c(1,2))

grid.arrange(
  lista_graficos[["Antigüedad"]],
  lista_graficos2[["Antigüedad"]],
 ncol=2)

par(mfrow= c(1,2))

grid.arrange(
  lista_graficos2[["Horas_Extra"]],
  lista_graficos[["Horas_Extra"]],
 ncol=2)

par(mfrow= c(1,2))

grid.arrange(
  lista_graficos2[["Cargo"]],
  lista_graficos[["Cargo"]],
 ncol=2)

par(mfrow= c(1,2))

grid.arrange(
  lista_graficos2[["Campo_Educación"]],
  lista_graficos[["Campo_Educación"]],
 ncol=2)


Analisis univariado para las demas variables en el siguiente boton show ->.

```r
grid.arrange(
  lista_graficos2[["Viaje de Negocios"]],
  lista_graficos[["Viaje de Negocios"]],
 ncol=2)
```



```r
grid.arrange(
  lista_graficos2[["Departamento"]],
  lista_graficos[["Departamento"]],
 ncol=2)
```



```r
grid.arrange(
  lista_graficos2[["Distancia_Casa"]],
  lista_graficos[["Distancia_Casa"]],
 ncol=2)
```



```r
grid.arrange(
  lista_graficos2[["Educación"]],
  lista_graficos[["Educación"]],
 ncol=2)
```



```r
grid.arrange(
  lista_graficos2[["Satisfacción_Ambiental"]],
  lista_graficos[["Satisfacción_Ambiental"]],
 ncol=2)
```



```r
grid.arrange(
  lista_graficos2[["Genero"]],
  lista_graficos[["Genero"]],
 ncol=2)
```



```r
grid.arrange(
  lista_graficos2[["Satisfación_Laboral"]],
  lista_graficos[["Satisfación_Laboral"]],
 ncol=2)
```



```r
grid.arrange(
  lista_graficos2[["Estado_Civil"]],
  lista_graficos[["Estado_Civil"]],
 ncol=2)
```



```r
grid.arrange(
  lista_graficos2[["Trabajos_Anteriores"]],
  lista_graficos[["Trabajos_Anteriores"]],
 ncol=2)
```



```r
grid.arrange(
  lista_graficos2[["Porcentaje_aumento_salarial"]],
  lista_graficos[["Porcentaje_aumento_salarial"]],
 ncol=2)
```



```r
grid.arrange(
  lista_graficos2[["Rendimiento_Laboral"]],
  lista_graficos[["Rendimiento_Laboral"]],
 ncol=2)
```



```r
grid.arrange(
  lista_graficos2[["Años_Experiencia"]],
  lista_graficos[["Años_Experiencia"]],
 ncol=2)
```



```r
grid.arrange(
  lista_graficos2[["Capacitaciones"]],
  lista_graficos[["Capacitaciones"]],
 ncol=2)
```



```r
grid.arrange(
  lista_graficos2[["Equilibrio_Trabajo_Vida"]],
  lista_graficos[["Equilibrio_Trabajo_Vida"]],
 ncol=2)
```



```r
grid.arrange(
  lista_graficos2[["Antigüedad_Cargo"]],
  lista_graficos[["Antigüedad_Cargo"]],
 ncol=2)
```



```r
grid.arrange(
  lista_graficos2[["Antigüedad_Cargo"]],
  lista_graficos[["Antigüedad_Cargo"]],
 ncol=2)
```



```r
grid.arrange(
  lista_graficos2[["Años_ultima_promoción"]],
  lista_graficos[["Años_ultima_promoción"]],
 ncol=2)
```



```r
grid.arrange(
  lista_graficos2[["Años_acargo_con_mismo_jefe"]],
  lista_graficos[["Años_acargo_con_mismo_jefe"]],
 ncol=2)
```


Análisis bivariado.

#rotacion$Rotación <- factor(rotacion$Rotación, levels = c("No", "Si"), labels = c(0, 1))

lista_graficosBI <- list()

for (col_name in colnames(rotacion)) {
  
  col_type <- class(rotacion[[col_name]])
  
 
  if(col_type =="character"){

   graficoCaracter <- PlotXTabs2(
                        data = rotacion,
                        y = Rotación,
                        x = names(rotacion[col_name]),
                        xlab = names(rotacion[col_name]),
                        ylab = NULL,
                        data.label = "both",
                        labels.legend = c("No","Si"),
                        label.fill.alpha = 0.25,
                        legend.title = "Rotación",
                        legend.position = "right",
                        title = paste0("Rotación de acuerdo con ",names(rotacion[col_name])),
                        palette = "Pastel1"
                      )+ 
                        theme(axis.text.x = element_text(angle = 45, hjust = 1))
   #print(graficoCaracter)
   
   lista_graficosBI[[col_name]] <- graficoCaracter

  }
   if(col_type =="numeric"){
     
       rotabi <-  ifelse(rotacion$Rotación == "Si", 1, 0)

        GraficoBivariado <- ggplot(data=rotacion,aes(x=Rotación,y=.data[[col_name]], fill=Rotación))+
                              geom_boxplot(outlier.shape = NA)+
                              geom_jitter(width = 0.05)+
                              theme_bw()+
                              labs(
                                x=paste0("Cor ",names(rotacion[col_name])," ",round(cor(rotabi, rotacion[col_name]),3))
                                   ,y=paste0(names(rotacion[col_name])) ) + 
                                theme(panel.background = element_blank(),
                                panel.grid.major = element_blank(),
                                panel.grid.minor = element_blank())
        #print(GraficoBivariado)
        lista_graficosBI[[col_name]] <- GraficoBivariado
          
   }
  

}
grid.arrange(lista_graficosBI[["Edad"]], ncol=1)

grid.arrange(lista_graficosBI[["Ingreso_Mensual"]], ncol=1)

grid.arrange(lista_graficosBI[["Antigüedad"]], ncol=1)

require(GGally) 

rotacion$rotabi <- rotabi

rotacion$Horas_Extra_BI <-  ifelse(rotacion$Horas_Extra == "Si", 1, 0)

grid.arrange(lista_graficosBI[["Horas_Extra"]], ncol=1)

ggpairs(rotacion, columns = c(25,26),aes(color = Rotación), alpha = 0.5)


Análisis de corralación con respecto a Rotación con variables categoricas:

Para llevar a cabo este análisis, es fundamental convertir inicialmente nuestras variables categóricas en numéricas.
rotacion <- dummy_cols(rotacion, select_columns = c("Cargo"))

Nota: Selecciona el boton de show para ver todos los graficos por favor.


Resaltamos los siguientes cargos destacados de la variable ‘cargo’:

  • Técnico Laboral: Una correlación de 0.098 sugiere una correlación positiva débil entre estas dos variables. Esto indica que puede existir una ligera tendencia de que los empleados con el cargo de “Técnico Laboral” tengan una probabilidad ligeramente mayor de rotación, pero la relación no es muy fuerte.

  • Representante de ventas: Una correlación de 0.157 esto indica que existe una tendencia moderada de que los empleados con el cargo de “Representante de Ventas” tengan una probabilidad moderadamente mayor de rotación en comparación con otros cargos. Sin embargo, la relación no es muy fuerte y puede estar influenciada por otros factores.

  • Director de investigación: Una correlación de -0.083 indica una correlación negativa débil entre estas dos variables. Esto sugiere que puede existir una leve tendencia de que los empleados con el cargo de “Director de Investigación” tengan una probabilidad ligeramente menor de rotación en comparación con otros cargos.


Seleccione el boton show por favor.

  rotacion <- dummy_cols(rotacion, select_columns = c("Campo_Educación"))

  • Tecnicos: Una correlación de 0.069 indica una correlación positiva muy débil entre estas dos variables. Esto sugiere que podría existir una leve tendencia, aunque no muy significativa, de que los empleados con el cargo de “Técnicos” tengan una probabilidad ligeramente mayor de rotación en comparación con otros cargos.


Coeficientes estimados.

Para mejorar la lectura del modelo convertiremos cada de unas de las variables categoricas a binarias 1 - 0.

RotacionModelo <- rotacion
names(RotacionModelo)[names(RotacionModelo) == 'Viaje de Negocios'] <- 'Viaje_de_Negocios'
names(RotacionModelo)[names(RotacionModelo) == 'Satisfación_Laboral'] <- 'Satisfacion_Laboral'


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


RotacionModelo$Viaje_Negocios_Frecuente <- ifelse(RotacionModelo$Viaje_de_Negocios == "Frecuentemente", 1, 0)
RotacionModelo$Viaje_Negocios_NoViaja <- ifelse(RotacionModelo$Viaje_de_Negocios == "No_Viaja", 1, 0)
RotacionModelo$Viaje_Negocios_Raramente <- ifelse(RotacionModelo$Viaje_de_Negocios == "Raramente", 1, 0)

RotacionModelo <- subset(RotacionModelo, select = -Viaje_de_Negocios)

RotacionModelo$Dpto_IyD <- ifelse(RotacionModelo$Departamento == "IyD", 1, 0)
RotacionModelo$Dpto_RH <- ifelse(RotacionModelo$Departamento == "RH", 1, 0)
RotacionModelo$Dpto_Ventas <- ifelse(RotacionModelo$Departamento == "Ventas", 1, 0)

RotacionModelo <- subset(RotacionModelo, select = -Departamento)

RotacionModelo$CampoEd_Ciencias <- ifelse(RotacionModelo$Campo_Educación == "Ciencias", 1, 0)
RotacionModelo$CampoEd_Humanidades <- ifelse(RotacionModelo$Campo_Educación == "Humanidades", 1, 0)
RotacionModelo$CampoEd_Mercadeo <- ifelse(RotacionModelo$Campo_Educación == "Mercadeo", 1, 0)
RotacionModelo$CampoEd_Salud <- ifelse(RotacionModelo$Campo_Educación == "Salud", 1, 0)
RotacionModelo$CampoEd_Tecnicos <- ifelse(RotacionModelo$Campo_Educación == "Tecnicos", 1, 0)

RotacionModelo <- subset(RotacionModelo, select = -Campo_Educación)


RotacionModelo$Genero_bi <- ifelse(RotacionModelo$Genero == "M", 1, 0)

RotacionModelo <- subset(RotacionModelo, select = -Genero)

RotacionModelo$Cargo_Director_Investigación <- ifelse(RotacionModelo$Cargo == "Director_Investigación", 1, 0)
RotacionModelo$Cargo_Director_Manofactura <- ifelse(RotacionModelo$Cargo == "Director_Manofactura", 1, 0)
RotacionModelo$Cargo_Ejecutivo_Ventas <- ifelse(RotacionModelo$Cargo == "Ejecutivo_Ventas", 1, 0)
RotacionModelo$Cargo_Gerente <- ifelse(RotacionModelo$Cargo == "Gerente", 1, 0)
RotacionModelo$Cargo_Investigador_Cientifico <- ifelse(RotacionModelo$Cargo == "Investigador_Cientifico", 1, 0)
RotacionModelo$Cargo_Recursos_Humanos <- ifelse(RotacionModelo$Cargo == "Recursos_Humanos", 1, 0)
RotacionModelo$Cargo_Representante_Salud <- ifelse(RotacionModelo$Cargo == "Representante_Salud", 1, 0)
RotacionModelo$Cargo_Representante_Ventas <- ifelse(RotacionModelo$Cargo == "Representante_Ventas", 1, 0)
RotacionModelo$Cargo_Tecnico_Laboratorio <- ifelse(RotacionModelo$Cargo == "Tecnico_Laboratorio", 1, 0)

RotacionModelo <- subset(RotacionModelo, select = -Cargo)

RotacionModelo$Estado_Civil_Casado <- ifelse(RotacionModelo$Estado_Civil == "Casado", 1, 0)
RotacionModelo$Estado_Civil_Divorciado <- ifelse(RotacionModelo$Estado_Civil == "Divorciado", 1, 0)
RotacionModelo$Estado_Civil_Soltero <- ifelse(RotacionModelo$Estado_Civil == "Soltero", 1, 0)

RotacionModelo <- subset(RotacionModelo, select = -Estado_Civil)

RotacionModelo$Horas_Extra_bi <- ifelse(RotacionModelo$Horas_Extra == "Si", 1, 0)

RotacionModelo <- subset(RotacionModelo, select = -Horas_Extra)

options(scipen = 999)

modelo_glm <- glm(Rotación ~ Edad + Distancia_Casa + Ingreso_Mensual + Trabajos_Anteriores + Porcentaje_aumento_salarial + Años_Experiencia + Capacitaciones + Antigüedad + Antigüedad_Cargo + Años_ultima_promoción + Años_acargo_con_mismo_jefe + Viaje_Negocios_Frecuente + Viaje_Negocios_NoViaja  + Dpto_IyD + Dpto_RH + Educación + CampoEd_Ciencias + CampoEd_Humanidades + CampoEd_Mercadeo + CampoEd_Salud + CampoEd_Tecnicos + Satisfacción_Ambiental + Genero_bi + Cargo_Director_Investigación + Cargo_Director_Manofactura + Cargo_Ejecutivo_Ventas + Cargo_Gerente + Cargo_Investigador_Cientifico + Cargo_Recursos_Humanos + Cargo_Representante_Salud + Cargo_Representante_Ventas  + Satisfacion_Laboral + Estado_Civil_Casado + Estado_Civil_Divorciado + Horas_Extra_bi + Rendimiento_Laboral + Equilibrio_Trabajo_Vida, data = RotacionModelo, family = "binomial")


summary(modelo_glm)
## 
## Call:
## glm(formula = Rotación ~ Edad + Distancia_Casa + Ingreso_Mensual + 
##     Trabajos_Anteriores + Porcentaje_aumento_salarial + Años_Experiencia + 
##     Capacitaciones + Antigüedad + Antigüedad_Cargo + Años_ultima_promoción + 
##     Años_acargo_con_mismo_jefe + Viaje_Negocios_Frecuente + 
##     Viaje_Negocios_NoViaja + Dpto_IyD + Dpto_RH + Educación + 
##     CampoEd_Ciencias + CampoEd_Humanidades + CampoEd_Mercadeo + 
##     CampoEd_Salud + CampoEd_Tecnicos + Satisfacción_Ambiental + 
##     Genero_bi + Cargo_Director_Investigación + Cargo_Director_Manofactura + 
##     Cargo_Ejecutivo_Ventas + Cargo_Gerente + Cargo_Investigador_Cientifico + 
##     Cargo_Recursos_Humanos + Cargo_Representante_Salud + Cargo_Representante_Ventas + 
##     Satisfacion_Laboral + Estado_Civil_Casado + Estado_Civil_Divorciado + 
##     Horas_Extra_bi + Rendimiento_Laboral + Equilibrio_Trabajo_Vida, 
##     family = "binomial", data = RotacionModelo)
## 
## Deviance Residuals: 
##     Min       1Q   Median       3Q      Max  
## -1.7938  -0.5091  -0.2716  -0.0994   3.4048  
## 
## Coefficients:
##                                     Estimate     Std. Error z value
## (Intercept)                     3.2432078991   1.5879002950   2.042
## Edad                           -0.0365539900   0.0132762602  -2.753
## Distancia_Casa                  0.0424979507   0.0104602114   4.063
## Ingreso_Mensual                -0.0000009588   0.0000585421  -0.016
## Trabajos_Anteriores             0.1756117175   0.0374621553   4.688
## Porcentaje_aumento_salarial    -0.0230214318   0.0380532437  -0.605
## Años_Experiencia               -0.0540810559   0.0278169167  -1.944
## Capacitaciones                 -0.1828028412   0.0712523863  -2.566
## Antigüedad                      0.0963034862   0.0374968346   2.568
## Antigüedad_Cargo               -0.1414201807   0.0438629044  -3.224
## Años_ultima_promoción           0.1786631306   0.0411219220   4.345
## Años_acargo_con_mismo_jefe     -0.1563025131   0.0459907641  -3.399
## Viaje_Negocios_Frecuente        0.8214570546   0.2061874452   3.984
## Viaje_Negocios_NoViaja         -0.9414342549   0.3654387664  -2.576
## Dpto_IyD                       -0.1231267101   1.0234135368  -0.120
## Dpto_RH                       -13.0466285416 378.0234598471  -0.035
## Educación                      -0.0114853028   0.0855229000  -0.134
## CampoEd_Ciencias               -0.0597863935   0.4024035606  -0.149
## CampoEd_Humanidades             0.7743988324   0.8445499827   0.917
## CampoEd_Mercadeo                0.3225204218   0.4753172482   0.679
## CampoEd_Salud                  -0.1733992883   0.4093905660  -0.424
## CampoEd_Tecnicos                0.8683546351   0.4565170486   1.902
## Satisfacción_Ambiental         -0.4424230251   0.0811860473  -5.449
## Genero_bi                       0.3248320727   0.1795229061   1.809
## Cargo_Director_Investigación   -2.5871541851   1.0180074380  -2.541
## Cargo_Director_Manofactura     -1.3182344827   0.4461853011  -2.954
## Cargo_Ejecutivo_Ventas         -0.5983120436   1.0581252165  -0.565
## Cargo_Gerente                  -1.3403721700   0.9311674367  -1.439
## Cargo_Investigador_Cientifico  -0.9439182077   0.2607219007  -3.620
## Cargo_Recursos_Humanos         12.6017271917 378.0233601675   0.033
## Cargo_Representante_Salud      -1.5501263959   0.4670962763  -3.319
## Cargo_Representante_Ventas      0.3749646262   1.0703359477   0.350
## Satisfacion_Laboral            -0.4048455666   0.0792460753  -5.109
## Estado_Civil_Casado            -1.0333268372   0.1941161697  -5.323
## Estado_Civil_Divorciado        -1.4305945247   0.2581758605  -5.541
## Horas_Extra_bi                  1.8717339483   0.1869038348  10.014
## Rendimiento_Laboral             0.1702077107   0.3888900832   0.438
## Equilibrio_Trabajo_Vida        -0.3654396982   0.1207257402  -3.027
##                                           Pr(>|z|)    
## (Intercept)                               0.041107 *  
## Edad                                      0.005899 ** 
## Distancia_Casa                        0.0000484835 ***
## Ingreso_Mensual                           0.986932    
## Trabajos_Anteriores                   0.0000027628 ***
## Porcentaje_aumento_salarial               0.545193    
## Años_Experiencia                          0.051874 .  
## Capacitaciones                            0.010301 *  
## Antigüedad                                0.010220 *  
## Antigüedad_Cargo                          0.001264 ** 
## Años_ultima_promoción                 0.0000139455 ***
## Años_acargo_con_mismo_jefe                0.000677 ***
## Viaje_Negocios_Frecuente              0.0000677562 ***
## Viaje_Negocios_NoViaja                    0.009990 ** 
## Dpto_IyD                                  0.904238    
## Dpto_RH                                   0.972468    
## Educación                                 0.893169    
## CampoEd_Ciencias                          0.881890    
## CampoEd_Humanidades                       0.359176    
## CampoEd_Mercadeo                          0.497431    
## CampoEd_Salud                             0.671891    
## CampoEd_Tecnicos                          0.057154 .  
## Satisfacción_Ambiental                0.0000000505 ***
## Genero_bi                                 0.070386 .  
## Cargo_Director_Investigación              0.011041 *  
## Cargo_Director_Manofactura                0.003132 ** 
## Cargo_Ejecutivo_Ventas                    0.571771    
## Cargo_Gerente                             0.150022    
## Cargo_Investigador_Cientifico             0.000294 ***
## Cargo_Recursos_Humanos                    0.973407    
## Cargo_Representante_Salud                 0.000905 ***
## Cargo_Representante_Ventas                0.726095    
## Satisfacion_Laboral                   0.0000003244 ***
## Estado_Civil_Casado                   0.0000001019 ***
## Estado_Civil_Divorciado               0.0000000300 ***
## Horas_Extra_bi                < 0.0000000000000002 ***
## Rendimiento_Laboral                       0.661621    
## Equilibrio_Trabajo_Vida                   0.002470 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 1298.58  on 1469  degrees of freedom
## Residual deviance:  893.23  on 1432  degrees of freedom
## AIC: 969.23
## 
## Number of Fisher Scoring iterations: 14
  • Edad: El coeficiente negativo implica que un aumento en la edad está asociado con una disminución en la probabilidad de rotación de los empleados. En términos de probabilidad, se espera que un incremento unitario en la edad disminuya la probabilidad de rotación de los empleados en un 3.59%. Este resultado es consistente con la hipótesis planteada en el punto número 1.

  • Ingresos mensuales: un coeficiente extremadamente bajo no muy significativo

  • Antigüedad: Coeficiente positivo, asociacion positiva entre la variable rotacion y la variable de Antigüedad, obtenemos que un aumento unitario en la antigüedad está asociado con un incremento del 10.11% en la probabilidad de rotación de los empleados.

  • Horas extras binaria: un coeficiente estimado de 1.8717339483 para la variable de horas extras implica un aumento de aproximadamente 549.17% en la probabilidad de rotación de los empleados asociado con una unidad adicional de horas extras.

  • Cargo_Director_Investigación: un coeficiente estimado de -2.5871541851 para la variable “Cargo_Director_Investigación” implica una disminución de aproximadamente 92.50% en la probabilidad de rotación de los empleados asociada con la ocupación de un cargo como Director de Investigación en comparación con otros cargos.

  • Cargo_Director_Manofactura: un coeficiente estimado de -1.3182344827 para el cargo “Director de Manufactura” implica una disminución de aproximadamente 73.25% en la probabilidad de rotación de los empleados en comparación con otros cargos.

  • Cargo_Ejecutivo_Ventas: un coeficiente estimado de -0.5983120436 para el cargo “Ejecutivo de Ventas” implica un cambio de aproximadamente 45.01% en la probabilidad de rotación de los empleados en comparación con otros cargos.

  • Cargo_Gerente: El coeficiente negativo sugiere una disminución en la probabilidad de rotación en comparación con la categoría de referencia. En términos de probabilidad, se espera que un incremento unitario en la variable “Cargo_Gerente” disminuya la probabilidad de rotación en aproximadamente 73.82% en comparación con la categoría de referencia.

  • Cargo_Investigador_Cientifico: El coeficiente de -0.9439182077 Esto sugiere que los empleados con el cargo de “Investigador Científico” tienen alrededor de un 38.92% menos de probabilidad de rotación en comparación con la categoría de referencia, en otras palabras, aquellos empleados con el cargo de “Investigador Científico” tienden a tener una menor probabilidad de dejar la empresa en comparación con otros cargos.

  • Cargo_Recursos_Humanos: Al aplicar la función exponencial (exp) a este valor, obtenemos un resultado muy alto, aproximadamente 292446.36, se evidencia multicolinealidad, muy atentos a esto para evitar este error en el modelo.

  • Cargo_Representante_Salud: El coeficiente positivo (1.5) significa que tener el cargo de “Representante de Salud” está asociado con una disminución del 78.88% en la probabilidad de rotación de los empleados en comparación con el punto de referencia.

  • Cargo_Representante_Ventas: El coeficiente positivo (0.37) Esto significa que tener el cargo de “Representante de Ventas” está asociado con un aumento del 45.40% en la probabilidad de rotación de los empleados en comparación con el punto de referencia.

  • Campo educación Ciencias: Dado que el coeficiente es negativo, indica que tener educación en el campo de las ciencias está asociado con una disminución en la probabilidad de rotación de los empleados, esto significa que tener educación en el campo de las ciencias está asociado con una disminución del 5.76% en la probabilidad de rotación de los empleados.

  • Campo educación Humanidades: Dado que el coeficiente es positivo, indica que tener educación en el campo de las humanidades está asociado con un aumento en la probabilidad de rotación de los empleados, esto significa que tener educación en el campo de las humanidades está asociado con un aumento del 117.07% en la probabilidad de rotación de los empleados.

  • Campo educación MercadeoDado que el coeficiente es positivo, indica que tener educación en el campo de mercadeo está asociado con un aumento en la probabilidad de rotación de los empleados, esto significa que tener educación en el campo de mercadeo está asociado con un aumento del 38.07% en la probabilidad de rotación de los empleados.

  • Campo educación SaludDado que el coeficiente es negativo, indica que tener educación en el campo de la salud está asociado con una disminución en la probabilidad de rotación de los empleados, esto significa que tener educación en el campo de la salud está asociado con una disminución del 15.95% en la probabilidad de rotación de los empleados.

  • Campo educación TecnicosDado que el coeficiente es positivo, indica que tener educación en el campo técnico está asociado con un aumento en la probabilidad de rotación de los empleados, esto significa que tener educación en el campo técnico está asociado con un aumento del 138.28% en la probabilidad de rotación de los empleados.


Evidencia de multicolinealiadad

vif_values <- vif(modelo_glm)
print(vif_values)
##                          Edad                Distancia_Casa 
##                      1.851721                      1.077098 
##               Ingreso_Mensual           Trabajos_Anteriores 
##                      5.879898                      1.366303 
##   Porcentaje_aumento_salarial              Años_Experiencia 
##                      2.638981                      4.534321 
##                Capacitaciones                    Antigüedad 
##                      1.052358                      5.979732 
##              Antigüedad_Cargo         Años_ultima_promoción 
##                      2.529024                      2.430663 
##    Años_acargo_con_mismo_jefe      Viaje_Negocios_Frecuente 
##                      2.808019                      1.090826 
##        Viaje_Negocios_NoViaja                      Dpto_IyD 
##                      1.082946                     34.697819 
##                       Dpto_RH                     Educación 
##                 925035.972628                      1.105383 
##              CampoEd_Ciencias           CampoEd_Humanidades 
##                      5.235466                      2.288042 
##              CampoEd_Mercadeo                 CampoEd_Salud 
##                      3.516409                      4.838996 
##              CampoEd_Tecnicos        Satisfacción_Ambiental 
##                      2.886146                      1.099173 
##                     Genero_bi  Cargo_Director_Investigación 
##                      1.038726                      1.673732 
##    Cargo_Director_Manofactura        Cargo_Ejecutivo_Ventas 
##                      1.460884                     28.269957 
##                 Cargo_Gerente Cargo_Investigador_Cientifico 
##                      3.416656                      1.551196 
##        Cargo_Recursos_Humanos     Cargo_Representante_Salud 
##                 925034.583919                      1.480231 
##    Cargo_Representante_Ventas           Satisfacion_Laboral 
##                     14.300186                      1.072613 
##           Estado_Civil_Casado       Estado_Civil_Divorciado 
##                      1.255156                      1.247179 
##                Horas_Extra_bi           Rendimiento_Laboral 
##                      1.183229                      2.623331 
##       Equilibrio_Trabajo_Vida 
##                      1.060019

Se evidencia una alta multicolinealidad entre las variables Dpto_RH y Cargo_Recursos_HumanosEn caso de utilizar todo el dataframe de rotación, podría ser necesario excluir una de estas variables para evitar problemas de multicolinealidad en el modelo. Sin embargo, dado que en el punto 1 de la hipótesis hemos seleccionado cuidadosamente nuestras variables predictoras, es poco probable que enfrentemos este problema.


Estimación del modelo

Dividir el conjunto 70% Train 30% Test

#tomamos solo nuestras variables de hipotesis 1
RotacionModeloH <- RotacionModelo[,c(18,2,7,14,19:28,29:34)]

ntrain <- nrow(RotacionModeloH)*0.7
ntest <- nrow(RotacionModeloH)*0.3

index_train<-sample(1:nrow(RotacionModeloH),size = ntrain)

train<-RotacionModeloH[index_train,]  
test<-RotacionModeloH[-index_train,]  

Validamos los datos de train.

   datos_freq <- as.data.frame(table(train$rotabi))
    
    colnames(datos_freq)[1] <- 'Rotacion Binaria'
    col_name <- 'Rotacion Binaria'
    
    datos_freq$Porcentaje <- datos_freq$Freq / sum(datos_freq$Freq) * 100
    
   g1 <- ggplot(datos_freq, aes(x = " ", y=Freq,fill=.data[[col_name]]) ) +    
      geom_bar(width = 0.9, stat="identity",             
                   position = position_dodge()                
          )+ 
          labs(
            x="",
            y= "",
            fill=col_name
          ) + 
          geom_text(aes(label=Freq), vjust=1.6, color="white",   
                    position = position_dodge(0.9),  size=4
          )+
          theme_light() +
          theme(legend.position='top')+                                     
      facet_grid(~paste0("Frecuncia de ", col_name))
    
   g2 <-  ggplot(datos_freq, aes(x = "", y = Freq, fill = .data[[col_name]])) +
      geom_bar(width = 1, stat = "identity") +
      coord_polar("y", start=0) +
      labs(title = paste0("Distribución de Campo de ",col_name),  fill = "") +
      geom_text(aes(label = paste(round(Porcentaje, 1), "%")), position = position_stack(vjust = 0.5), size = 4) +
      theme_light() +
      theme(legend.position='none')+   
      theme(axis.text = element_blank(),
            axis.title = element_blank(),
            legend.title = element_blank(),
            legend.text = element_blank(),
            plot.title = element_blank())
   
   grid.arrange(g1, g2, ncol=2)

Se evidencia un desbalanceo en los datos, lo cual puede distorsionar el modelo al intentar predecir la rotación de empleados. Actualmente, estamos entrenando el modelo con un 83.4% de datos de empleados que no rotan, mientras que solo disponemos del 16.6% (unos 171 datos) de empleados que sí rotan. Para mejorar la precisión del modelo, es necesario abordar este desbalanceo mediante técnicas de balanceo de cargas.


Balanceo de cargas.

train <- na.omit(train)
train_b_smote <- ROSE(rotabi ~ ., data = train, seed = 123)$data


Validamos el balanceo de datos.

   datos_freq <- as.data.frame(table(train_b_smote$rotabi))
    
    colnames(datos_freq)[1] <- 'Rotacion Binaria'
    col_name <- 'Rotacion Binaria'
    
    datos_freq$Porcentaje <- datos_freq$Freq / sum(datos_freq$Freq) * 100
    
   g1 <- ggplot(datos_freq, aes(x = " ", y=Freq,fill=.data[[col_name]]) ) +    
      geom_bar(width = 0.9, stat="identity",             
                   position = position_dodge()                
          )+ 
          labs(
            x="",
            y= "",
            fill=col_name
          ) + 
          geom_text(aes(label=Freq), vjust=1.6, color="white",   
                    position = position_dodge(0.9),  size=4
          )+
          theme_light() +
          theme(legend.position='top')+                                     
      facet_grid(~paste0("Frecuncia de ", col_name))
    
   g2 <-  ggplot(datos_freq, aes(x = "", y = Freq, fill = .data[[col_name]])) +
      geom_bar(width = 1, stat = "identity") +
      coord_polar("y", start=0) +
      labs(title = paste0("Distribución de Campo de ",col_name),  fill = "") +
      geom_text(aes(label = paste(round(Porcentaje, 1), "%")), position = position_stack(vjust = 0.5), size = 4) +
      theme_light() +
      theme(legend.position='none')+   
      theme(axis.text = element_blank(),
            axis.title = element_blank(),
            legend.title = element_blank(),
            legend.text = element_blank(),
            plot.title = element_blank())
   
   grid.arrange(g1, g2, ncol=2)

Al ver los resultados de nuestro balanceo de datos notamos de impacto el aumento en nuestra variable predictora rotación cuando los empleados estan propensos a rotar en este caso 1, casi que igualando a nuestra mayoria de datos 0 que es cuando no rotan, el dataframe final de entrenamiento (train) queda en casi que en igualdad de condiciones para poder hacer un buen pronostico de las dos salidas posibles 0 no rotan, 1 si rotan, procederemos a realizar nuestro modelo logit con los resultados de los datos de entrenamientos balanceados.



Estimación del modelo de regresión logístico.

Seleccionaremos únicamente las variables propuestas en el punto 1, las cuales ya están incluidas en el DataFrame train_b_smote. Este DataFrame ha sido balanceado y está listo para ser utilizado en el modelo.

modelo_hipo <- glm(rotabi ~ Edad  + Ingreso_Mensual + Antigüedad + Horas_Extra_BI + Cargo_Director_Investigación + Cargo_Director_Manofactura + Cargo_Ejecutivo_Ventas + Cargo_Gerente + Cargo_Investigador_Cientifico + Cargo_Tecnico_Laboratorio + Cargo_Recursos_Humanos + Cargo_Representante_Salud + Cargo_Representante_Ventas +
Campo_Educación_Ciencias + Campo_Educación_Humanidades + Campo_Educación_Mercadeo + Campo_Educación_Salud + Campo_Educación_Tecnicos, data = train_b_smote, family = "binomial")

summary(modelo_hipo)
## 
## Call:
## glm(formula = rotabi ~ Edad + Ingreso_Mensual + Antigüedad + 
##     Horas_Extra_BI + Cargo_Director_Investigación + Cargo_Director_Manofactura + 
##     Cargo_Ejecutivo_Ventas + Cargo_Gerente + Cargo_Investigador_Cientifico + 
##     Cargo_Tecnico_Laboratorio + Cargo_Recursos_Humanos + Cargo_Representante_Salud + 
##     Cargo_Representante_Ventas + Campo_Educación_Ciencias + 
##     Campo_Educación_Humanidades + Campo_Educación_Mercadeo + 
##     Campo_Educación_Salud + Campo_Educación_Tecnicos, family = "binomial", 
##     data = train_b_smote)
## 
## Deviance Residuals: 
##     Min       1Q   Median       3Q      Max  
## -2.1388  -1.0099  -0.4827   1.0055   2.4908  
## 
## Coefficients:
##                                  Estimate  Std. Error z value
## (Intercept)                    0.32564018  0.27925118   1.166
## Edad                          -0.01902078  0.00646317  -2.943
## Ingreso_Mensual               -0.00002061  0.00001674  -1.232
## Antigüedad                    -0.01287137  0.01053762  -1.221
## Horas_Extra_BI                 1.03967280  0.12639331   8.226
## Cargo_Director_Investigación  -0.69495851  0.33184521  -2.094
## Cargo_Director_Manofactura    -0.16912837  0.21827035  -0.775
## Cargo_Ejecutivo_Ventas         0.01093418  0.15982254   0.068
## Cargo_Gerente                 -0.49806710  0.29665159  -1.679
## Cargo_Investigador_Cientifico -0.19845839  0.15887466  -1.249
## Cargo_Tecnico_Laboratorio      0.33221973  0.15998592   2.077
## Cargo_Recursos_Humanos         0.26382554  0.28016597   0.942
## Cargo_Representante_Salud     -0.70878665  0.25890200  -2.738
## Cargo_Representante_Ventas     0.47968371  0.23459002   2.045
## Campo_Educación_Ciencias      -0.04527031  0.13301291  -0.340
## Campo_Educación_Humanidades    0.14611368  0.37745243   0.387
## Campo_Educación_Mercadeo       0.39485460  0.19731077   2.001
## Campo_Educación_Salud         -0.04331052  0.14286284  -0.303
## Campo_Educación_Tecnicos       0.83676101  0.18699466   4.475
##                                           Pr(>|z|)    
## (Intercept)                                0.24357    
## Edad                                       0.00325 ** 
## Ingreso_Mensual                            0.21811    
## Antigüedad                                 0.22191    
## Horas_Extra_BI                < 0.0000000000000002 ***
## Cargo_Director_Investigación               0.03624 *  
## Cargo_Director_Manofactura                 0.43842    
## Cargo_Ejecutivo_Ventas                     0.94546    
## Cargo_Gerente                              0.09316 .  
## Cargo_Investigador_Cientifico              0.21161    
## Cargo_Tecnico_Laboratorio                  0.03784 *  
## Cargo_Recursos_Humanos                     0.34636    
## Cargo_Representante_Salud                  0.00619 ** 
## Cargo_Representante_Ventas                 0.04088 *  
## Campo_Educación_Ciencias                   0.73360    
## Campo_Educación_Humanidades                0.69868    
## Campo_Educación_Mercadeo                   0.04537 *  
## Campo_Educación_Salud                      0.76177    
## Campo_Educación_Tecnicos                0.00000765 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 1426.1  on 1028  degrees of freedom
## Residual deviance: 1239.9  on 1010  degrees of freedom
## AIC: 1277.9
## 
## Number of Fisher Scoring iterations: 3


Interpretación de los coeficientes.


  • Edad: El coeficiente negativo implica que un aumento en la edad está asociado con una disminución en la probabilidad de rotación de los empleados. En términos de probabilidad, se espera que un incremento unitario en la edad disminuya la probabilidad de rotación de los empleados en un 1.81%. Este resultado es consistente con la hipótesis planteada en el punto número 1.

  • Ingresos mensuales: Igualmente que con los demas dataframe, tambien nos da un coeficiente muy bajo, por lo cual no explica de la mejor manera la variable rotación.

  • Antigüedad: Coeficiente positivo, asociacion positiva entre la variable rotacion y la variable de Antigüedad, obtenemos que un aumento unitario en la antigüedad está asociado con un incremento del 3.25% en la probabilidad de rotación de los empleados.

  • Horas extras binaria: Un coeficiente estimado de 0.94413638 al transformarlo en exp indica que los empleados que hacen horas extras tienen aproximadamente 2.57 veces más probabilidades de rotar en comparación con aquellos que no las hacen

  • Cargo_Director_Investigación: un coeficiente estimado de −0.66416641 para la variable “Cargo_Director_Investigación” implica una disminución de aproximadamente 51.5% en la probabilidad de rotación de los empleados asociada con la ocupación de un cargo como Director de Investigación en comparación con otros cargos.

  • Cargo_Director_Manofactura: un coeficiente estimado de -0.21406489 para el cargo “Director de Manufactura” implica una disminución de aproximadamente 80.7% en la probabilidad de rotación de los empleados en comparación con otros cargos.

  • Cargo_Ejecutivo_Ventas: un coeficiente estimado de −0.02986070 para el cargo “Ejecutivo de Ventas” implica un cambio de aproximadamente 45.01% en la probabilidad de rotación de los empleados en comparación con otros cargos.

  • Cargo_Gerente: El coeficiente negativo sugiere una disminución en la probabilidad de rotación en comparación con la categoría de referencia. En términos de probabilidad, se espera que un incremento unitario en la variable “Cargo_Gerente” disminuya la probabilidad de rotación en aproximadamente 73.82% en comparación con la categoría de referencia.

  • Cargo_Investigador_Cientifico: El coeficiente de -0.9439182077 Esto sugiere que los empleados con el cargo de “Investigador Científico” tienen alrededor de un 38.92% menos de probabilidad de rotación en comparación con la categoría de referencia, en otras palabras, aquellos empleados con el cargo de “Investigador Científico” tienden a tener una menor probabilidad de dejar la empresa en comparación con otros cargos.

  • Cargo_Recursos_Humanos: Al aplicar la función exponencial (exp) a este valor, obtenemos un resultado muy alto, aproximadamente 292446.36, se evidencia multicolinealidad, muy atentos a esto para evitar este error en el modelo.

  • Cargo_Representante_Salud: El coeficiente positivo (1.5) significa que tener el cargo de “Representante de Salud” está asociado con una disminución del 78.88% en la probabilidad de rotación de los empleados en comparación con el punto de referencia.

  • Cargo_Representante_Ventas: El coeficiente positivo (0.37) Esto significa que tener el cargo de “Representante de Ventas” está asociado con un aumento del 45.40% en la probabilidad de rotación de los empleados en comparación con el punto de referencia.

  • Campo educación Ciencias: Dado que el coeficiente es negativo, indica que tener educación en el campo de las ciencias está asociado con una disminución en la probabilidad de rotación de los empleados, esto significa que tener educación en el campo de las ciencias está asociado con una disminución del 5.76% en la probabilidad de rotación de los empleados.

  • Campo educación Humanidades: Dado que el coeficiente es positivo, indica que tener educación en el campo de las humanidades está asociado con un aumento en la probabilidad de rotación de los empleados, esto significa que tener educación en el campo de las humanidades está asociado con un aumento del 117.07% en la probabilidad de rotación de los empleados.

  • Campo educación MercadeoDado que el coeficiente es positivo, indica que tener educación en el campo de mercadeo está asociado con un aumento en la probabilidad de rotación de los empleados, esto significa que tener educación en el campo de mercadeo está asociado con un aumento del 38.07% en la probabilidad de rotación de los empleados.

  • Campo educación SaludDado que el coeficiente es negativo, indica que tener educación en el campo de la salud está asociado con una disminución en la probabilidad de rotación de los empleados, esto significa que tener educación en el campo de la salud está asociado con una disminución del 15.95% en la probabilidad de rotación de los empleados.

  • Campo educación TecnicosDado que el coeficiente es positivo, indica que tener educación en el campo técnico está asociado con un aumento en la probabilidad de rotación de los empleados, esto significa que tener educación en el campo técnico está asociado con un aumento del 138.28% en la probabilidad de rotación de los empleados.


Análisis de VIF (Varianza Inflación Factor):

# Calcular el VIF para un modelo lineal (lm_model)
vif_values <- vif(modelo_hipo)
print(vif_values)
##                          Edad               Ingreso_Mensual 
##                      1.176866                      1.648474 
##                    Antigüedad                Horas_Extra_BI 
##                      1.171011                      1.037524 
##  Cargo_Director_Investigación    Cargo_Director_Manofactura 
##                      1.160687                      1.155052 
##        Cargo_Ejecutivo_Ventas                 Cargo_Gerente 
##                      1.331596                      1.368218 
## Cargo_Investigador_Cientifico     Cargo_Tecnico_Laboratorio 
##                      1.388241                      1.390298 
##        Cargo_Recursos_Humanos     Cargo_Representante_Salud 
##                      1.304748                      1.132544 
##    Cargo_Representante_Ventas      Campo_Educación_Ciencias 
##                      1.202545                      1.416552 
##   Campo_Educación_Humanidades      Campo_Educación_Mercadeo 
##                      1.275659                      1.335843 
##         Campo_Educación_Salud      Campo_Educación_Tecnicos 
##                      1.358828                      1.166438

Los resultados del Factor de Inflación de la Varianza (VIF) no evidencian multicolinealidad.


5.Evaluación del modelo.

Prediccion <- predict(modelo_hipo, type = "response", newdata = test)

ROC_mod_rotacion <- roc(test$rotabi ~ Prediccion, percent = T, ci=T)
## Setting levels: control = 0, case = 1
## Setting direction: controls < cases
ROC_mod_rotacion
## 
## Call:
## roc.formula(formula = test$rotabi ~ Prediccion, percent = T,     ci = T)
## 
## Data: Prediccion in 377 controls (test$rotabi 0) < 64 cases (test$rotabi 1).
## Area under the curve: 74.33%
## 95% CI: 67.06%-81.6% (DeLong)
plot(ROC_mod_rotacion,
     print.auc=T,
     print.thres = "best",
     col="red",
     xlab = "Tasa de Falsos Positivos (1 - Especificidad)",
     ylab = "Tasa de verdadesdos positivos (Sensibilidad)")

auc_roc <- auc(ROC_mod_rotacion)
print(auc_roc)
## Area under the curve: 74.33%

Un AUC de 0.5 indica que el modelo no tiene capacidad de discriminación, es decir, clasifica las instancias de manera aleatoria. Un AUC de 1.0 indica una capacidad de discriminación perfecta, donde el modelo clasifica todas las instancias positivas antes que las instancias negativas.

Por lo tanto, un AUC del 72.7% indica que el modelo tiene una capacidad de discriminación moderada. Esto significa que en el 72.7% de los casos, el modelo asigna una probabilidad de pertenecer a la clase positiva mayor a las instancias que realmente pertenecen a esa clase, en comparación con las instancias que pertenecen a la clase negativa.


6. Predicciones.

predict(modelo_hipo,
        list(
         Ingreso_Mensual = 4900,
         Antigüedad= 5,
         Edad=35,
         Horas_Extra_BI=1,
         Cargo_Director_Investigación= 0,
         Cargo_Director_Manofactura= 0,
         Cargo_Ejecutivo_Ventas= 0,
         Cargo_Gerente= 0,
         Cargo_Investigador_Cientifico= 0,
         Cargo_Recursos_Humanos = 0,
         Cargo_Tecnico_Laboratorio=0,
         Cargo_Representante_Salud = 0,
         Cargo_Representante_Ventas = 1,
         Campo_Educación_Ciencias = 0,
         Campo_Educación_Humanidades = 0,
         Campo_Educación_Mercadeo = 0,
         Campo_Educación_Salud  = 0,
         Campo_Educación_Tecnicos = 1),
        type = "response")
##         1 
## 0.8642056

Es crucial establecer un umbral de decisión en nuestras predicciones. Si, tras pasar los datos de un empleado por el modelo, la probabilidad predicha es inferior al 50%, se considerará que dicho empleado no requiere intervención y se le permitirá seguir su trayectoria laboral sin alteraciones. Sin embargo, si la probabilidad predicha es superior al 50%, se procederá a intervenir, y el departamento de recursos humanos tomará las medidas adecuadas con respecto a dicho empleado.

El modelo ha demostrado ser eficaz con los nuevos datos que le hemos proporcionado. Nos indica con una precisión del 83.8% que nuestro empleado ficticio podría rotar dentro de la compañía. Esta alta precisión nos brinda confianza en las predicciones del modelo y nos permite tomar decisiones informadas sobre la gestión de los recursos humanos.


7. Conclusiones.

En conclusion nuestro modelo de predicción de rotación de empleados muestra una precisión de aproximadamente el 72.7%. Este resultado sugiere que el modelo es efectivo para identificar empleados con una alta probabilidad de dejar la empresa. Para abordar este problema, una estrategia recomendada es revisar y posiblemente reducir la carga laboral adicional de los empleados, específicamente eliminando las horas extras asignadas. Sin embargo, es crucial realizar una evaluación exhaustiva para asegurarse de que la eliminación de las horas extras no afecte negativamente la productividad y el cumplimiento de los objetivos de la empresa. Además, la empresa podría considerar implementar políticas de gestión del tiempo más efectivas, ofrecer incentivos alternativos o mejorar las condiciones laborales para fomentar la retención del talento y reducir la rotación de empleados a largo plazo. Es importante reconocer que abordar la rotación de empleados es un proceso multifacético que requiere un enfoque estratégico y medidas adaptadas a las necesidades específicas de la organización.