Actividad 3-Rotación de Cargo

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.

Para ello, 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.

Para dar respuesta al problema planteado se procede a realizar el siguiente análisis:

El dataset contiene 24 atributos y 1470 observaciones. Cuenta con 8 variables categoricas, 11 cuantitativas y 5 ordinales.

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

Se verifica datos faltantes del dataset:

grafico <-md.pattern(rotacion, rotate.names = TRUE)
##  /\     /\
## {  `---'  }
## {  O   O  }
## ==>  V <==  No need for mice. This data set is completely observed.
##  \  \|/  /
##   `-----'
title(main="Figura 1. Variables perdidas en dataset rotacion")

No se encuentran datos faltantes.

1. Seleccion inicial de variables

Horas extra: Se relacionan con sobrecarga laboral y se esperaria que las personas que realizan mayor numero de horas extra tengan mas rotacion.

Genero: se espera que los hombres tengan una mayor rotacion que las mujeres acorde con estudios previos de rotacion empresarial

Cargo: Se espera que los cargos mas operativos tengan mayor rotacion que los cargos directivos.

Años experiencia: se espera que las personas con mas años de experiencia presenten menor rotacion.

Edad: Se espera que las personas mas jovenes presenten una mayor rotación

Distancia casa: Se espera que las personas que viven a una mayor distancia del lugar trabajo roten mas que aquellas que viven mas cerca.

2. Analisis Univariado

Se procede a realizar un analisis descriptivo para las variables cuantitativas:

var_cuanti<- rotacion %>% 
    dplyr::select(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 )%>% 
summary(var_cuanti)
var_cuanti
##       Edad       Distancia_Casa   Ingreso_Mensual Trabajos_Anteriores
##  Min.   :18.00   Min.   : 1.000   Min.   : 1009   Min.   :0.000      
##  1st Qu.:30.00   1st Qu.: 2.000   1st Qu.: 2911   1st Qu.:1.000      
##  Median :36.00   Median : 7.000   Median : 4919   Median :2.000      
##  Mean   :36.92   Mean   : 9.193   Mean   : 6503   Mean   :2.693      
##  3rd Qu.:43.00   3rd Qu.:14.000   3rd Qu.: 8379   3rd Qu.:4.000      
##  Max.   :60.00   Max.   :29.000   Max.   :19999   Max.   :9.000      
##  Porcentaje_aumento_salarial Años_Experiencia Capacitaciones    Antigüedad    
##  Min.   :11.00               Min.   : 0.00    Min.   :0.000   Min.   : 0.000  
##  1st Qu.:12.00               1st Qu.: 6.00    1st Qu.:2.000   1st Qu.: 3.000  
##  Median :14.00               Median :10.00    Median :3.000   Median : 5.000  
##  Mean   :15.21               Mean   :11.28    Mean   :2.799   Mean   : 7.008  
##  3rd Qu.:18.00               3rd Qu.:15.00    3rd Qu.:3.000   3rd Qu.: 9.000  
##  Max.   :25.00               Max.   :40.00    Max.   :6.000   Max.   :40.000  
##  Antigüedad_Cargo Años_ultima_promoción Años_acargo_con_mismo_jefe
##  Min.   : 0.000   Min.   : 0.000        Min.   : 0.000            
##  1st Qu.: 2.000   1st Qu.: 0.000        1st Qu.: 2.000            
##  Median : 3.000   Median : 1.000        Median : 3.000            
##  Mean   : 4.229   Mean   : 2.188        Mean   : 4.123            
##  3rd Qu.: 7.000   3rd Qu.: 3.000        3rd Qu.: 7.000            
##  Max.   :18.000   Max.   :15.000        Max.   :17.000

Edad: La menor edad de los empleados es de 18 años y la edad maxima es de 60 años. La media y la mediana es de 36 años. La tercera parte de los empleados de la compañia tienen menos de 43 años.

Distancia casa: los empleados de la compañia viven en promedio a 7 Km del lugar del trabajo. El 25% de los empleados viven cerca de la compañia (menos de 2 Km), no obstante el 75% de los empleados viven a 14 Km del lugar de trabajo y existen personas que viven incluso a 29 Km.

Ingreso mensual: Los salarios promedio de los empleados de la compañia son de 4.919 con una mediana de 6.503. Los trabajadores con salarios mas bajos ganan 1.009 y el salario mas alto de un trabajador en la compañia es de 19.999.

Trabajos anteriores: La mayoria de los trabajadores han tenido dos empleos previos al ingresar a la compañia, tambien se encuentran empleados sin experiencia previa (0 años) y existen empleados que han estado vinculados a 8 empresas previamente.

Porcentaje aumento salarial: la compañia ha realiza aumentos salariales en un promedio del 15% a sus empleados, el menor porcentaje de aumento ha sido del 11% y el mayor porcentaje de aumento para un empleado ha sido del 25%.

Años de experiencia: Se evidencia que la compañia tiene empleados con experiencia para el cargo entre 10 y 11 años.El 75% de los empleados tienen menos de 15 años de experiencia y el empleado con mayor experiencia tiene 40 años.

Capacitaciones: El promedio del numero de capacitaciones por empleado en la compañia es de 3, no obstante se encuentra personal sin capacitaciones y el trabajador con mayor numero de capacitaciones tiene 6.

Antiguedad:La mayoria de trabajadores tienen entre 5 y 7 años de antiguedad en la compañia, se encuentran empleados sin experiencia (0 años) y el empleado con mayor antiguedad lleva 40 años trabajando para la compañia.

Antiguedad en el cargo: Se encuentra que la mayoria de empleados llevan entre 3 y 4 años ejerciendo el cargo actual, no obstante la compañia tambien brinda oportunidades laborales a personal sin experiencia (0 años) y existe un trabajador que lleva ejerciendo su cargo por mas de 18 años.

Años ultima promoción: El promedio de años desde la ultima promocion de los empleados de la compañia es de 2 años, la tercera parte de los empleados llevan 15 años en su actual cargo desde la ultima promocion

Años a cargo con el mismo jefe: Los empleados llevan a cargo con su mismo jefe entre 3 y 4 años, existen empleados que no alcanzan a cumplir un año con el mismo jefe y los empleados con mas años con mismo jefe es de 17 años.

breaks <- pretty(range(rotacion$Ingreso_Mensual/1000),
                 n = nclass.Sturges(rotacion$Ingreso_Mensual/1000),
                 min.n = 1)

 g3= ggplot(rotacion,aes(x=Ingreso_Mensual/1000))+
    geom_histogram(aes(y = ..density..),
                   color = 1, fill = "#D0D1E6",
                   breaks = breaks) +
    geom_density(color = "#74A9CF",lwd  = 0.8)+
    theme_classic()


breaks <- pretty(range(rotacion$Trabajos_Anteriores),
                 n = nclass.Sturges(rotacion$Trabajos_Anteriores),
                 min.n = 1)
 g4= ggplot(rotacion,aes(x=Trabajos_Anteriores))+
    geom_histogram(aes(y = ..density..),
                   color = 1, fill = "#D0D1E6",
                   breaks = breaks) +
    geom_density(color = "#74A9CF",lwd  = 0.8)+
    theme_classic()


breaks <- pretty(range(rotacion$Distancia_Casa),
                 n = nclass.Sturges(rotacion$Distancia_Casa),
                 min.n = 1)
 g2= ggplot(rotacion,aes(x=Distancia_Casa))+
    geom_histogram(aes(y = ..density..),
                   color = 1, fill = "#D0D1E6",
                   breaks = breaks) +
    geom_density(color = "#74A9CF",lwd  = 0.8)+
    theme_classic()

 breaks <- pretty(range(rotacion$Edad),
                 n = nclass.Sturges(rotacion$Edad),
                 min.n = 1)
 g1= ggplot(rotacion,aes(x=Edad))+
    geom_histogram(aes(y = ..density..),
                   color = 1, fill = "#D0D1E6",
                   breaks = breaks) +
    geom_density(color = "#74A9CF",lwd  = 0.8)+
    theme_classic()

 breaks <- pretty(range(rotacion$Porcentaje_aumento_salarial),
                 n = nclass.Sturges(rotacion$Porcentaje_aumento_salarial),
                 min.n = 1)
 g5= ggplot(rotacion,aes(x=Porcentaje_aumento_salarial))+
    geom_histogram(aes(y = ..density..),
                   color = 1, fill = "#D0D1E6",
                   breaks = breaks) +
    geom_density(color = "#74A9CF",lwd  = 0.8)+
    theme_classic()
 
  breaks <- pretty(range(rotacion$Años_Experiencia),
                 n = nclass.Sturges(rotacion$Años_Experiencia),
                 min.n = 1)
 g6= ggplot(rotacion,aes(x=Años_Experiencia))+
    geom_histogram(aes(y = ..density..),
                   color = 1, fill = "#D0D1E6",
                   breaks = breaks) +
    geom_density(color = "#74A9CF",lwd  = 0.8)+
    theme_classic()

  breaks <- pretty(range(rotacion$Capacitaciones),
                 n = nclass.Sturges(rotacion$Capacitaciones),
                 min.n = 1)
 g7= ggplot(rotacion,aes(x=Capacitaciones))+
    geom_histogram(aes(y = ..density..),
                   color = 1, fill = "#D0D1E6",
                   breaks = breaks) +
    geom_density(color = "#74A9CF",lwd  = 0.8)+
    theme_classic()
 
  breaks <- pretty(range(rotacion$Antigüedad),
                 n = nclass.Sturges(rotacion$Antigüedad),
                 min.n = 1)
  
 g9= ggplot(rotacion,aes(x=Antigüedad))+
    geom_histogram(aes(y = ..density..),
                   color = 1, fill = "#D0D1E6",
                   breaks = breaks) +
    geom_density(color = "#74A9CF",lwd  = 0.8)+
    theme_classic()
 
breaks <- pretty(range(rotacion$Antigüedad_Cargo),
                 n = nclass.Sturges(rotacion$Antigüedad_Cargo),
                 min.n = 1)
  
 g10= ggplot(rotacion,aes(x=Antigüedad_Cargo))+
    geom_histogram(aes(y = ..density..),
                   color = 1, fill = "#D0D1E6",
                   breaks = breaks) +
    geom_density(color = "#74A9CF",lwd  = 0.8)+
    theme_classic()

breaks <- pretty(range(rotacion$Años_ultima_promoción),
                 n = nclass.Sturges(rotacion$Años_ultima_promoción),
                 min.n = 1)
  
 g11= ggplot(rotacion,aes(x=Años_ultima_promoción))+
    geom_histogram(aes(y = ..density..),
                   color = 1, fill = "#D0D1E6",
                   breaks = breaks) +
    geom_density(color = "#74A9CF",lwd  = 0.8)+
    theme_classic()

breaks <- pretty(range(rotacion$Años_acargo_con_mismo_jefe),
                 n = nclass.Sturges(rotacion$Años_acargo_con_mismo_jefe),
                 min.n = 1)
  
 g12= ggplot(rotacion,aes(x=Años_acargo_con_mismo_jefe))+
    geom_histogram(aes(y = ..density..),
                   color = 1, fill = "#D0D1E6",
                   breaks = breaks) +
    geom_density(color = "#74A9CF",lwd  = 0.8)+
    theme_classic() 

ggarrange(g1,g2,g3,g4,g5,g6,g7,g9,g10,g11,g12, ncol = 3, nrow = 3)
## Warning: The dot-dot notation (`..density..`) was deprecated in ggplot2 3.4.0.
## ℹ Please use `after_stat(density)` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## $`1`

## 
## $`2`

## 
## attr(,"class")
## [1] "list"      "ggarrange"

En las graficas se puede evidenciar que la variable edad presenta una distribución normal, las demas variables tienen una distribucion asimetrica.

Se realiza analisis de variables categoricas y ordinales:

# Tabla de frecuencias de categoricas
tabla1=table(rotacion$Cargo)
prop.table(tabla1)*100
## 
##  Director_Investigación    Director_Manofactura        Ejecutivo_Ventas 
##                5.442177                9.863946               22.176871 
##                 Gerente Investigador_Cientifico        Recursos_Humanos 
##                6.938776               19.863946                3.537415 
##     Representante_Salud    Representante_Ventas     Tecnico_Laboratorio 
##                8.911565                5.646259               17.619048

En la variable cargo se encuentran 9 categorias, de las cuales tres son directivos, cuatro de nivel intermedio y 1 operativo.El cargo con mas empleados es Ejecutivo de ventas (n=326) seguido de investigador cientifico (n=292) y tecnicos de laboratorio (n=259).

# Visualiciones para  variables numericas
c1=ggplot(rotacion,aes(x=Horas_Extra)) + geom_bar() + theme_gray()
c2=ggplot(rotacion,aes(x=`Viaje de Negocios`)) + geom_bar() + theme_gray()
c3=ggplot(rotacion,aes(x=Departamento)) + geom_bar() + theme_gray()
ggarrange(c1,c2,c3, labels = c("A", "B","C"), ncol = 3, nrow = 1)

El 72% de los empleados refieren que no requieren de horas extras para cumplir con sus actividades laborales.

En cuanto a viajes de negocios, el 71% de los empleados refiere que raramente viaja por motivos laborales, el 10.2% no viaja y el 18.8 indica que viaja de manera frecuente como parte de su trabajo en la compañia.

Se encuentra que el 65% de los empleados pertenecen al departamento de investigacion y desarrollo, el 30% al área de ventas y el 0.04% al departamento de recursos humanos.

c4=ggplot(rotacion,aes(x=Estado_Civil)) + geom_bar() + theme_gray()
c5=ggplot(rotacion,aes(x=Genero)) + geom_bar() + theme_gray()
c6=ggplot(rotacion,aes(x=Rotación)) + geom_bar() + theme_gray()
ggarrange(c4,c5,c6, labels = c("D", "E", "F"), ncol = 3, nrow = 1)

El 46% de los empleados de la compañia se encuentran casados, el 32% son solteros y el porcentaje restante se encuentran divorciados.El 60% de los empleados son hombres y el porcentaje restante mujeres.En cuanto a la distribución de la rotacion se encuentra que el 16% (n=237) empleados han rotado en la compañia y el porcentaje restante no ha rotado.

tabla2=table(rotacion$Campo_Educación)
prop.table(tabla2)*100
## 
##    Ciencias Humanidades    Mercadeo        Otra       Salud    Tecnicos 
##   41.224490    1.836735   10.816327    5.578231   31.564626    8.979592

En cuanto a la formación de los empleados el 41% pertenecen al area de ciencias, seguido de 31.5% que pertenecen al área de la salud, 10.8% al area de mercadeo y 9% al area tecnica. En menor proporcion se encuentran otro tipo de formaciones.

3.Analisis Bivariado

Se realiza un análisis bivariado, teniendo como referencia la variable rotación de los empleados y se contrasta con las demas variables del conjunto de datos:

t1 <- table1::table1(~Antigüedad+Años_Experiencia+Satisfación_Laboral+
Horas_Extra+`Viaje de Negocios`+ Genero + Departamento + Distancia_Casa + Educación + Estado_Civil + Rendimiento_Laboral + Equilibrio_Trabajo_Vida + Edad +  Ingreso_Mensual + Trabajos_Anteriores + Años_ultima_promoción| Rotación, data = rotacion)
t1
No
(N=1233)
Si
(N=237)
Overall
(N=1470)
Antigüedad
Mean (SD) 7.37 (6.10) 5.13 (5.95) 7.01 (6.13)
Median [Min, Max] 6.00 [0, 37.0] 3.00 [0, 40.0] 5.00 [0, 40.0]
Años_Experiencia
Mean (SD) 11.9 (7.76) 8.24 (7.17) 11.3 (7.78)
Median [Min, Max] 10.0 [0, 38.0] 7.00 [0, 40.0] 10.0 [0, 40.0]
Satisfación_Laboral
Mean (SD) 2.78 (1.09) 2.47 (1.12) 2.73 (1.10)
Median [Min, Max] 3.00 [1.00, 4.00] 3.00 [1.00, 4.00] 3.00 [1.00, 4.00]
Horas_Extra
No 944 (76.6%) 110 (46.4%) 1054 (71.7%)
Si 289 (23.4%) 127 (53.6%) 416 (28.3%)
Viaje de Negocios
Frecuentemente 208 (16.9%) 69 (29.1%) 277 (18.8%)
No_Viaja 138 (11.2%) 12 (5.1%) 150 (10.2%)
Raramente 887 (71.9%) 156 (65.8%) 1043 (71.0%)
Genero
F 501 (40.6%) 87 (36.7%) 588 (40.0%)
M 732 (59.4%) 150 (63.3%) 882 (60.0%)
Departamento
IyD 828 (67.2%) 133 (56.1%) 961 (65.4%)
RH 51 (4.1%) 12 (5.1%) 63 (4.3%)
Ventas 354 (28.7%) 92 (38.8%) 446 (30.3%)
Distancia_Casa
Mean (SD) 8.92 (8.01) 10.6 (8.45) 9.19 (8.11)
Median [Min, Max] 7.00 [1.00, 29.0] 9.00 [1.00, 29.0] 7.00 [1.00, 29.0]
Educación
Mean (SD) 2.93 (1.03) 2.84 (1.01) 2.91 (1.02)
Median [Min, Max] 3.00 [1.00, 5.00] 3.00 [1.00, 5.00] 3.00 [1.00, 5.00]
Estado_Civil
Casado 589 (47.8%) 84 (35.4%) 673 (45.8%)
Divorciado 294 (23.8%) 33 (13.9%) 327 (22.2%)
Soltero 350 (28.4%) 120 (50.6%) 470 (32.0%)
Rendimiento_Laboral
Mean (SD) 3.15 (0.360) 3.16 (0.364) 3.15 (0.361)
Median [Min, Max] 3.00 [3.00, 4.00] 3.00 [3.00, 4.00] 3.00 [3.00, 4.00]
Equilibrio_Trabajo_Vida
Mean (SD) 2.78 (0.682) 2.66 (0.816) 2.76 (0.706)
Median [Min, Max] 3.00 [1.00, 4.00] 3.00 [1.00, 4.00] 3.00 [1.00, 4.00]
Edad
Mean (SD) 37.6 (8.89) 33.6 (9.69) 36.9 (9.14)
Median [Min, Max] 36.0 [18.0, 60.0] 32.0 [18.0, 58.0] 36.0 [18.0, 60.0]
Ingreso_Mensual
Mean (SD) 6830 (4820) 4790 (3640) 6500 (4710)
Median [Min, Max] 5200 [1050, 20000] 3200 [1010, 19900] 4920 [1010, 20000]
Trabajos_Anteriores
Mean (SD) 2.65 (2.46) 2.94 (2.68) 2.69 (2.50)
Median [Min, Max] 2.00 [0, 9.00] 1.00 [0, 9.00] 2.00 [0, 9.00]
Años_ultima_promoción
Mean (SD) 2.23 (3.23) 1.95 (3.15) 2.19 (3.22)
Median [Min, Max] 1.00 [0, 15.0] 1.00 [0, 15.0] 1.00 [0, 15.0]

La rotación se presenta más en empleados con 3 a 5 años de antiguedad mientras que quienes no rotaron presentan una antiguedad promedio de 6 a 7 años; en cuanto a los años de experiencia, rotaron mas quienes tienen de 7 a 8 años de experiencia en el cargo frente a quienes no rotaron 10-12 años de experiencia. El puntaje en satisfacción laboral para quienes rotaron oscila entre 2.47 (insatisfecho) y 3 (Satisfecho), el mismo comportamiento se observó para quienes no rotaron. El 53.6% de quienes rotan realizaron horas extra para cumplir con sus actividades laborales frente a 23.4% de quienes no rotaron pese a realizar horas extra. El 65.8% de quienes rotaron raramente realizó viajes de negocios y quienes no rotaron presentaron un 72%. El 63.3% de quienes rotaron corresponden a hombres similar proporcion en comparacion con los hombres que no rotaron 59.4%. De las personas que rotaron el 56.1% pertenecen al departamento de IyD seguido de ventas con 38.8%, sin embargo, en el grupo de quienes no rotaron, la proporcion en ventas es mucho menor 28.7%. Con relacion a la distancia entre la casa y el lugar de trabajo rotaron quienes vivian en promedio a 9 o 10 Km de distancia frente a 7-9 km de las personas que no rotaron.En cuanto al nivel educativo, la media entre las personas que rotaron es de 2.84 es decir quienes presentan secundaria o formación tecnica, la misma distribucion se observa para quienes no rotaron. A su vez, la rotación se dio mas en personas solteras 50.6% frente a quienes no rotaron. El rendimiento laboral promedio de quienes rotaron es 3 (alto) muy similar a quienes no rotaron. En cuanto al equilibrio trabajo-vida de quienes rotaron es medio y se observa el mismo comportamiento frente a quienes no rotaron. La media de la edad de las personas que rotaron es de 34 años, ligeramente menor de quienes no rotaron media de 37 años. En cuanto a los ingresos mensuales quienes rotaron tuvieron una media de 4.790 menor frente a quienes no rotaron con una media 6.830. En cuanto a los trabajos previos quienes rotaron en promedio tuvieron 2.94 trabajos, resultado similar frente a quienes no rotaron 2.65 trabajos. Y por ultimo, frente a los años desde la ultima promocion quienes rotaron presentan en promedio 1.95 años frente a 2.23 de quienes no rotaron, cifras muy similares.

3.1 Selección de variables

Acorde con este análisis se decide escoger las siguientes variables:

Categoricas: Departamento, Horas Extra, Estado Civil

Cuantitativas: Edad, Ingresos_mensuales, Distancia casa

df<- rotacion[,c("Distancia_Casa", "Horas_Extra", "Estado_Civil", "Edad", "Departamento", "Ingreso_Mensual", "Rotación")]
rotacion_select<-as.data.frame(df)
head(rotacion_select, 5)
##   Distancia_Casa Horas_Extra Estado_Civil Edad Departamento Ingreso_Mensual
## 1              1          Si      Soltero   41       Ventas            5993
## 2              8          No       Casado   49          IyD            5130
## 3              2          Si      Soltero   37          IyD            2090
## 4              3          Si       Casado   33          IyD            2909
## 5              2          No       Casado   27          IyD            3468
##   Rotación
## 1       Si
## 2       No
## 3       Si
## 4       No
## 5       No

Se generan tablas de contingencia para las variables categoricas:

Rotación vs Departamento

v1 = table(df$Rotación, df$Departamento)
rownames(v1) <- c("Si", "No")
colnames(v1) <- c("Ventas", "IyD", "RH") 
addmargins(v1)
##      
##       Ventas  IyD   RH  Sum
##   Si     828   51  354 1233
##   No     133   12   92  237
##   Sum    961   63  446 1470
PlotXTabs2(data=rotacion_select,x=Departamento,y=Rotación)

Se determina la significancia de la relacion entre estas variables:

chisq.test(v1)
## 
##  Pearson's Chi-squared test
## 
## data:  v1
## X-squared = 10.796, df = 2, p-value = 0.004526
fisher.test(v1)
## 
##  Fisher's Exact Test for Count Data
## 
## data:  v1
## p-value = 0.00454
## alternative hypothesis: two.sided
assocstats(v1)
##                     X^2 df  P(> X^2)
## Likelihood Ratio 10.490  2 0.0052729
## Pearson          10.796  2 0.0045256
## 
## Phi-Coefficient   : NA 
## Contingency Coeff.: 0.085 
## Cramer's V        : 0.086

El índice V de Cramer es muy habitual para medir la relación entre factores, es menos susceptible a valores muestrales, donde 0 implica independencia y 1 una relación perfecta entre los factores contrastados. Habitualmente valores superiores a 0,30 ya nos están indicando que hay una posible relación entre las variables.En este caso, el valor de p es igual al nivel de significancia, no se acepta ni se rechaza hiposteis nula sobre relacion de las variables. Dado que la mayor rotación, se demuestra más en uno de los 3 departamentos evaluados, se decide continuar el modelo incluyendo esta variable.

Rotación vs Estado civil

v2 = table(df$Rotación, df$Estado_Civil)
rownames(v2) <- c("Si", "No")
colnames(v2) <- c("Casado", "Soltero", "Divorciado")
addmargins(v2)
##      
##       Casado Soltero Divorciado  Sum
##   Si     589     294        350 1233
##   No      84      33        120  237
##   Sum    673     327        470 1470
PlotXTabs2(data=rotacion_select,x=Estado_Civil,y=Rotación)

Se determina la significancia de la relacion entre estas variables:

chisq.test(v2)
## 
##  Pearson's Chi-squared test
## 
## data:  v2
## X-squared = 46.164, df = 2, p-value = 9.456e-11
fisher.test(v2)
## 
##  Fisher's Exact Test for Count Data
## 
## data:  v2
## p-value = 3.024e-10
## alternative hypothesis: two.sided
assocstats(v2)
##                     X^2 df   P(> X^2)
## Likelihood Ratio 44.000  2 2.7899e-10
## Pearson          46.164  2 9.4555e-11
## 
## Phi-Coefficient   : NA 
## Contingency Coeff.: 0.174 
## Cramer's V        : 0.177

En este caso, el valor de p de Chi cuadrado es significante por lo tanto se rechaza hipotesis nula y se acepta hipotesis alterna, donde se evidencia que el estado civil influye en la rotacion.

Rotación vs Horas Extra

v3 = table(df$Rotación, df$Horas_Extra)
rownames(v3) <- c("Si", "No")
colnames(v3) <- c("Si", "No")
addmargins(v3)
##      
##         Si   No  Sum
##   Si   944  289 1233
##   No   110  127  237
##   Sum 1054  416 1470
PlotXTabs2(data=rotacion_select,x=Horas_Extra,y=Rotación)

Se determina la significancia de la relacion entre estas variables:

chisq.test(v3)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  v3
## X-squared = 87.564, df = 1, p-value < 2.2e-16
fisher.test(v3)
## 
##  Fisher's Exact Test for Count Data
## 
## data:  v3
## p-value < 2.2e-16
## alternative hypothesis: true odds ratio is not equal to 1
## 95 percent confidence interval:
##  2.799096 5.078460
## sample estimates:
## odds ratio 
##   3.767353
assocstats(v3)
##                     X^2 df P(> X^2)
## Likelihood Ratio 81.402  1        0
## Pearson          89.044  1        0
## 
## Phi-Coefficient   : 0.246 
## Contingency Coeff.: 0.239 
## Cramer's V        : 0.246

En este caso, el valor de p de Chi cuadrado es significante por lo tanto se rechaza hipotesis nula y se acepta hipotesis alterna, donde se evidencia que las horas extra influyen en la rotacion.

GGally::ggpairs(rotacion_select[,1:7], title="Correlacion entre variables")

Se contrasta la variable rotacion con las variables cuantitativas:

g10=ggplot(data = rotacion_select, aes(x = Ingreso_Mensual/1000, fill = Rotación)) +
  geom_density(alpha = 0.35, color = "black")+
  scale_fill_manual(values = c( "#0570B0","#D0D1E6",
                               "#74A9CF"))

g12=ggplot(data = rotacion_select, aes(x = Rotación, y = Distancia_Casa)) +
  geom_boxplot(fill = "#D0D1E6", colour = "black")+geom_jitter(width = 0.3,size = 0.5)

g13=ggplot(data = rotacion_select, aes(x = Rotación, y = Edad)) +
  geom_boxplot(fill = "#D0D1E6", colour = "black")

ggarrange(g10, g12, g13, labels = c("A", "B"),ncol = 2, nrow = 1)
## $`1`

## 
## $`2`

## 
## attr(,"class")
## [1] "list"      "ggarrange"

En cuanto a los ingresos mensuales, se encuentra que el pico de rotacion se da en las personas que presentan menores ingresos (menor a 3000). La rotacion es menos frecuente en personas con ingresos superiores a 5.000. No obstante, se evidencia un segundo pico de rotacion, en las personas con ingresos de 10.000. Con relación a la distancia del trabajo a casa, se evidencia que las personas que rotan presentan un mayor desplazamiento desde sus viviendas a los lugares de trabajo, comparado con aquellos que no rotan. Por ultimo, en cuanto a la edad de los trabajadores, se encuentra que quienes rotan son mas jovenes que quienes no rotan.

#3.2 Compare estos resultados con la hipotesis planteada en el punto 1.

Horas extra: Se relacionan con sobrecarga laboral y se esperaria que las personas que realizan mayor numero de horas extra tengan mas rotacion, lo cual se evidencia con los resultados obtenidos en chi cuadrado.

Genero: se espera que los hombres tengan una mayor rotacion que las mujeres acorde con estudios previos de rotacion empresarial. Se evidencio a partir del análisis bivariado que esta variable no influye en la rotacion

Cargo: Se espera que los cargos mas operativos tengan mayor rotacion que los cargos directivos.Se evidencio a partir del análisis bivariado que esta variable no influye en la rotacion

Años experiencia: se espera que las personas con mas años de experiencia presenten menor rotacion.Se evidencio a partir del análisis bivariado que esta variable no influye en la rotacion

Edad: Se espera que las personas mas jovenes presenten una mayor rotación. Se evidencio que las personas mas jovenes (media de 37 años) rotan mas que personas con mayor edad.

Distancia casa: Se espera que las personas que viven a una mayor distancia del lugar trabajo roten mas que aquellas que viven mas cerca. Se evidencia que las personas que viven a una distancia maxima de 5 Km a su lugar de trabajo, presentan menos rotacion que quienes viven a una distancia mayor.

4. Particion del dataset

Se realiza partición del dataset (entrenamiento 70%) y (prueba 30%) y se balancea debido a que la clase mayoritaria son personas que no rotan corresponde al 84%.

# separacion de muestras
ntrain <- nrow(rotacion_select)*0.7
ntest <- nrow(rotacion_select)*0.3

set.seed(123)
index_train<-sample(1:nrow(rotacion_select),size = ntrain)
train<-rotacion_select[index_train,]  # muestra de entrenamiento
test<-rotacion_select[-index_train,]  # muestra de prueba

# oversampling
train.blc <- ovun.sample(Rotación~., data=train, 
                         p=0.5, seed=1, 
                         method="over")$data

test.blc <- ovun.sample(Rotación~., data=test, 
                        p=0.5, seed=1, 
                        method="over")$data
table(train.blc$Rotación)
## 
##  No  Si 
## 867 832
table(test.blc$Rotación)
## 
##  No  Si 
## 366 358

Se verifica el balanceo de clases por set de prueba y entrenamiento.

4.1.Estimacion del modelo

Se realiza transformación de variables categóricas en numéricas (binarias) y se estima modelo con el dataset de entrenamiento:

#Se elimina de la variable Rotacion los espacios y se convierte en binaria
df=train
df$Rotación <- trimws(df$Rotación)
df$Rotación <- ifelse(df$Rotación == "No", 0, 1) 

df$Horas_Extra <- trimws(df$Horas_Extra)
df$Horas_Extra <- ifelse(df$Horas_Extra == "No", 0, 1) 

Se estima modelo de regresion logistica con las variables previamente seleccionadas:

logistic_model <- glm(Rotación ~ Horas_Extra + Distancia_Casa + Edad + Departamento + Ingreso_Mensual + Estado_Civil, data = df, family = "binomial", control = list(maxit = 100))
summary(logistic_model)
## 
## Call:
## glm(formula = Rotación ~ Horas_Extra + Distancia_Casa + Edad + 
##     Departamento + Ingreso_Mensual + Estado_Civil, family = "binomial", 
##     data = df, control = list(maxit = 100))
## 
## Coefficients:
##                          Estimate Std. Error z value Pr(>|z|)    
## (Intercept)            -1.031e+00  4.544e-01  -2.268 0.023327 *  
## Horas_Extra             1.441e+00  1.939e-01   7.431 1.08e-13 ***
## Distancia_Casa          3.153e-02  1.146e-02   2.751 0.005947 ** 
## Edad                   -3.620e-02  1.287e-02  -2.812 0.004927 ** 
## DepartamentoRH          9.402e-01  4.310e-01   2.181 0.029167 *  
## DepartamentoVentas      6.000e-01  2.048e-01   2.930 0.003385 ** 
## Ingreso_Mensual        -1.315e-04  3.392e-05  -3.878 0.000105 ***
## Estado_CivilDivorciado -4.161e-01  2.878e-01  -1.445 0.148344    
## Estado_CivilSoltero     9.333e-01  2.077e-01   4.494 6.99e-06 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 896.03  on 1028  degrees of freedom
## Residual deviance: 737.57  on 1020  degrees of freedom
## AIC: 755.57
## 
## Number of Fisher Scoring iterations: 6

De las variables seleccionadas, se encuentra que las horas extra, ingreso mensual y el estado civil soltero son las que mas inciden en la rotación, ya que son las variables que presentan menor valor de p en el estadistico Chi cuadrado. Sin embargo, las otras variables seleccionadas tambien muestran significancia (Edad, Departamento de ventas y RH, Distancia casa) estadistica en la variable respuesta, que en este caso es la rotacion de los trabajadores de la compañia.

4.2 Interpretacion de coeficientes

HE = exp(1.441e+00)
HE
## [1] 4.224919

Por cada unidad de aumento en Horas Extra (1 hora extra) la oportunidad de la rotacion en trabajadores que es 4 veces que la oportunidad de rotacion en las personas que no realizan horas extra, ajustado por el efecto de las otras variables contenidas en el modelo.

DC= exp (3.153e-02)
DC
## [1] 1.032032

Por cada unidad de aumento en Distancia a casa (kilometros) la oportunidad de la rotacion en trabajadores que es 1 vez mas que la oportunidad de rotacion en las personas que viven mas cerca al trabajo, ajustado por el efecto de las otras variables contenidas en el modelo.

edad = exp (-3.620e-02)
edad
## [1] 0.9644474

Por cada unidad de aumento en la Edad (Años) la oportunidad de la rotacion en trabajadores que es 1 vez mas que la oportunidad de rotacion en las personas que tienen mas edad, ajustado por el efecto de las otras variables contenidas en el modelo.

DRH = exp (9.402e-01)
DRH
## [1] 2.560493
DV = exp(6.000e-01)
DV
## [1] 1.822119

Los trabajadores del departamento de recursos humanos presentan una oportunidad de la rotacion 2.5 veces mas que los trabajadores del Departamento IyD.

Los trabajadores del departamento de ventas presentan una oportunidad de la rotacion 1.8 veces mas que los trabajadores del Departamento IyD.

IM = exp(-1.315e-04)
IM
## [1] 0.9998685

Por cada unidad menor en el ingreso mensual (miles pesos) la oportunidad de la rotacion en trabajadores que es 1 vez mas que la oportunidad de rotacion en las personas que reciben mas ingresos, ajustado por el efecto de las otras variables contenidas en el modelo.

EC_DV = exp (-4.161e-01)
EC_DV
## [1] 0.6596143
EC_S = exp (9.333e-01)
EC_S
## [1] 2.542887

Los trabajadores con estado civil divorciado presentan una oportunidad de la rotacion 0.6 veces mas que los trabajadores con estado civil casado.

Los trabajadores con estado civil soltero presentan una oportunidad de la rotacion 2.5 veces mas que los trabajadores con estado civil casado.

4.3 Significancia del modelo

with(logistic_model, null.deviance - deviance)
## [1] 158.4695
with(logistic_model, pchisq(null.deviance - deviance , df.null-df.residual, lower.tail = FALSE))
## [1] 3.341325e-30

Estos resultados indican que se rechaza Hipotesis nula y se acepta la Hipotesis alterna, por lo anterior el modelo es significativo con las variables escogidas para explicar la rotación de los trabajadores a partir de las variables predictoras.

4.4 Evaluación de supuestos del modelo

Linealidad

Uno de los supuestos más importantes en regresión logística es que la relación entre el logit o log-odds de la variable respuesta y cada variable predictora o variable independiente es lineal; este supuesto se verifica únicamente para las variables numéricas continuas que se tengan en el modelo.Para verificar este supuesto, es posible usar el Test Box-Tidwell, el cual plantea en la hipótesis nula el cumplimiento del supuesto de linealidad:

logodds <- logistic_model$linear.predictors
boxTidwell(logodds ~ train$Edad)
##  MLE of lambda Score Statistic (t) Pr(>|t|)  
##        0.38867              2.0961  0.03632 *
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## iterations =  2

Para la variable edad se encuentra que se cumple este supuesto de linealidad, acorde con el p valor, el cual tiene significancia estadistica.Además, es posible apreciar el gráfico de la edad vs. el logaritmo de las probabilidades estimadas:

logEdad <- data.frame(logodds, Edad = train$Edad)
ggplot(data = logEdad, aes(x = Edad, y = logodds)) + 
  geom_point() +
  ggtitle("Edad vs Logaritmo del Odds") +
  theme_bw() +
  theme(plot.title = element_text(hjust = 0.5))

El diagrama de dispersión no parece tener un patrón no lineal tan fuerte, por lo que se puede concluir que no se observa una violación al supuesto de linealidad.

logodds2 <- logistic_model$linear.predictors
boxTidwell(logodds2 ~ train$Ingreso_Mensual)
##  MLE of lambda Score Statistic (t) Pr(>|t|)
##         1.1296             -0.9609   0.3368
## 
## iterations =  3

Para la variable Ingreso mensual se encuentra que no se cumple este supuesto de linealidad, acorde con el p valor, el cual no tiene significancia estadistica.Además, es posible apreciar el gráfico del ingreso mensual vs. el logaritmo de las probabilidades estimadas:

logIM <- data.frame(logodds2, Ingreso_Mensual = train$Ingreso_Mensual)
ggplot(data = logIM, aes(x = Ingreso_Mensual, y = logodds2)) + 
  geom_point() +
  ggtitle("Ingreso Mensual vs Logaritmo del Odds") +
  theme_bw() +
  theme(plot.title = element_text(hjust = 0.5))

El diagrama de dispersión parece tener un patrón no lineal fuerte, por lo que se puede concluir que se observa una violación al supuesto de linealidad.

logodds3 <- logistic_model$linear.predictors
boxTidwell(logodds3 ~ train$Distancia_Casa)
##  MLE of lambda Score Statistic (t) Pr(>|t|)  
##        0.44411             -1.7323  0.08351 .
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## iterations =  4

Para la variable Distancia Casa, se encuentra que no se cumple este supuesto de linealidad, acorde con el p valor, el cual no tiene significancia estadistica.Además, es posible apreciar el gráfico de la Distancia casa vs. el logaritmo de las probabilidades estimadas:

logDC <- data.frame(logodds3, Distancia_Casa = train$Distancia_Casa)
ggplot(data = logDC, aes(x = Distancia_Casa, y = logodds3)) + 
  geom_point() +
  ggtitle("Distancia Casa vs Logaritmo del Odds") +
  theme_bw() +
  theme(plot.title = element_text(hjust = 0.5))

El diagrama de dispersión no parece tener un patrón no lineal fuerte, por lo que se puede concluir que no se observa una violación al supuesto de linealidad para esta variable.

Independencia entre las observaciones

Este es uno de los supuestos más importantes; Suele ser el resultado del proceso de recolección de los datos ,por lo que usualmente no es fácil detectarlo mediante la evaluación de residuales del modelo

Indice <- seq(1,1029,1)
Residuales <- logistic_model$residuals
residuales <- data.frame(Indice, Residuales)
ggplot(data = residuales, aes(x = Indice, y = Residuales)) +
  geom_point() +
  ggtitle("Residuales del modelo ajustado") +
  theme_bw() +
  theme(plot.title = element_text(hjust = 0.5))

El gráfico de dispersión permite observar más residuos positivos que negativos, sin embargo, los puntos se distribuyen de manera homogénea y no se observa ningún patrón aparente que pudiera indicar un grado de dependencia entre las observaciones, por lo que se puede concluir que se cumple el supuesto de independencia entre observaciones para el conjunto de datos.

Ausencia de multicolinealidad

correlacion

La multicolinealidad se presenta cuando dos o más variables dentro del conjunto de datos mantienen una relación lineal. Existe una colinealidad perfecta cuando alguna covariable puede ser representada como combinación lineal de una o más covariables presentes en los datos. Cuando esto sucede, debe eliminarse aquella covariable que genera un grado de dependencia con las demás.

La metodología para probar este supuesto consiste en evaluar inicialmente los coeficientes de correlación entre las variables explicativas. Luego, es necesario verificar colinealidad por medio de los valores de tolerancia o los factores infladores de varianza (VIF). Finalmente, si a partir de estas medidas hay sospecha de multicolinealidad, esto puede ser confirmado por medio del índice de condición, los valores propios y las proporciones de varianza.

correlation_matrix <- cor(rotacion_select[c("Distancia_Casa", "Edad", "Ingreso_Mensual")])
corrplot(correlation_matrix)

correlation_matrix
##                 Distancia_Casa         Edad Ingreso_Mensual
## Distancia_Casa     1.000000000 -0.001559109     -0.01701444
## Edad              -0.001559109  1.000000000      0.49775320
## Ingreso_Mensual   -0.017014445  0.497753202      1.00000000

La edad tiene una correlacion positiva media con los ingresos mensuales 0.49.

Factores infladores de varianza o VIF

Los factores infladores de varianza o VIF determinan el grado de relación entre variables independientes. Además, vienen determinados por el ajuste de una regresión entre ambas variables. La tolerancia está definida como el recíproco de los valores VIF, por lo que se puede verificar el supuesto con cualquiera de estas dos medidas.

A continuación, se presentan los valores para los estadísticos VIF para las variables numéricas que se tienen en el modelo.

library(car)
vif(logistic_model)
##                     GVIF Df GVIF^(1/(2*Df))
## Horas_Extra     1.046031  1        1.022757
## Distancia_Casa  1.031913  1        1.015831
## Edad            1.274728  1        1.129038
## Departamento    1.055497  2        1.013594
## Ingreso_Mensual 1.314551  1        1.146539
## Estado_Civil    1.061058  2        1.014927

Se evidencia que existe cierto grado de correlación entre las variables predictoras no obstante la correlación no es alta (mayor a 5), es decir que no hay redundancia en el modelo y por lo tanto este supuesto se cumple.

4.5 Evaluacion Matriz de confusión

Se genera matriz de confusión a partir de los resultados del modelo obtenidos con el set de entrenamiento y el set de prueba:

# Generar predicciones en el set de datos de entrenamiento
predictions <- predict(logistic_model, type = "response")

# Convirtiendo probabilidades a predicciones binarias
predicted_classes <- ifelse(predictions > 0.5, 1, 0)

# matrix de confusion
conf_matrix <- table(df$Rotación, predicted_classes)
library(caret)
confusionMatrix(conf_matrix)
## Confusion Matrix and Statistics
## 
##    predicted_classes
##       0   1
##   0 849  18
##   1 132  30
##                                           
##                Accuracy : 0.8542          
##                  95% CI : (0.8312, 0.8752)
##     No Information Rate : 0.9534          
##     P-Value [Acc > NIR] : 1               
##                                           
##                   Kappa : 0.2303          
##                                           
##  Mcnemar's Test P-Value : <2e-16          
##                                           
##             Sensitivity : 0.8654          
##             Specificity : 0.6250          
##          Pos Pred Value : 0.9792          
##          Neg Pred Value : 0.1852          
##              Prevalence : 0.9534          
##          Detection Rate : 0.8251          
##    Detection Prevalence : 0.8426          
##       Balanced Accuracy : 0.7452          
##                                           
##        'Positive' Class : 0               
## 

Se esperaba que 30 personas rotaran y fueron correctamente clasificadas por el modelo Se esperaba que 849, no rotaran y fueron correctamente clasificados por el modelo como No rotacion Se esperaba que 132 personas rotaran pero el modelo las clasificó como No rotacion. Se esperaba que 18 personas no rotaran y el modelo predijo que si rotaron

El modelo clasifica de manera correcta a personas que rotaron y no rotaron, con una exactitud del 85% con un intervalo de confianza (83-87%). La prueba de McNemar es una prueba no parametrica que se utiliza para determinar si existen diferencias en una variable dependiente dicotómica entre dos grupos relacionados (tabla de contingencia), en este caso el resultado es estadisticamente significativo, es decir que existe relacion con las variables seleccionadas como predictoras y la rotación del personal.

La sensibilidad del modelo es de 86%, es decir que la capacidad del modelo para identificar correctamente los casos de rotacion (VP) en relación con el total de casos que rotaron reales es de 8.6 trabajadores de cada 10.

La especificidad del modelo es de 62%, es decir que el modelo de cada 10 personas evalua correctamente en 6.2 aquellas que no van a rotar.

barplot(as.matrix(conf_matrix), beside = TRUE, col = c("lightblue", "lightgreen"), legend = rownames(conf_matrix))

En la anterior grafica se muestra comparativo entre la variable respuesta respecto a las predicciones del modelo, identificando que la mayor proporcion de casos el modelo clasifica de forma correcta personas que no rotan como No rotacion. Y en la rotacion se evidencia una mayor prorporcion de falsos positivos que los verdaderos positivos que si rotan en la empresa. Es decir, que el modelo presenta un alto numero de Falsos Negativos, que el modelo no está clasificando correctamente.

4.6 Evaluacion del modelo metricas

# Calculo accuracy
accuracy <- sum(diag(conf_matrix)) / sum(conf_matrix)
print(paste("Accuracy:", accuracy))
## [1] "Accuracy: 0.854227405247813"
# Calculo precision
precision <- conf_matrix[2,2] / sum(predicted_classes)
print(paste("Precision:", precision))
## [1] "Precision: 0.625"
# Calculo recall
recall <- conf_matrix[2,2] / sum(df$Rotación)
print(paste("Recall:", recall))
## [1] "Recall: 0.185185185185185"
# Calculo F1 score
f1_score <- 2 * (precision * recall) / (precision + recall)
print(paste("F1 Score:", f1_score))
## [1] "F1 Score: 0.285714285714286"

Accuracy: la exactitud del modelo en la predicción correcta de la rotación (Si/No) basado en las variables precitoras, es del 85% es decir que clasifica correctamente 8.5 de cada 10 personas en cuanto a la rotación.

Precisión: En cuanto a la proporción de predicciones positivas correctas (VP) en relación con el total de predicciones positivas (VP + FP), el modelo identifica el 62.5%

Recall: Esta métrica mide la capacidad del modelo para identificar correctamente los casos positivos (VP) en relación con el total de casos positivos reales (VP + FN). En este caso, es del 18.5% el cual es bajo dado el alto numero de falsos negativos.

F1-score: es la medida armónica entre la precisión y el Recall, el valor ideal es de 1.En este caso dado que existe alto número de falsos negativos, se ve afectada la métrica de Recall.

5. Evaluacion del modelo AUC-ROC

# curva ROC y AUC
citation("pROC")
## If you use pROC in published research, please cite the following paper:
## 
##   Xavier Robin, Natacha Turck, Alexandre Hainard, Natalia Tiberti,
##   Frédérique Lisacek, Jean-Charles Sanchez and Markus Müller (2011).
##   pROC: an open-source package for R and S+ to analyze and compare ROC
##   curves. BMC Bioinformatics, 12, p. 77.  DOI: 10.1186/1471-2105-12-77
##   <http://www.biomedcentral.com/1471-2105/12/77/>
## 
## A BibTeX entry for LaTeX users is
## 
##   @Article{,
##     title = {pROC: an open-source package for R and S+ to analyze and compare ROC curves},
##     author = {Xavier Robin and Natacha Turck and Alexandre Hainard and Natalia Tiberti and Frédérique Lisacek and Jean-Charles Sanchez and Markus Müller},
##     year = {2011},
##     journal = {BMC Bioinformatics},
##     volume = {12},
##     pages = {77},
##   }
library(pROC)

roc_curve <- roc(df$Rotación, predictions)
## Setting levels: control = 0, case = 1
## Setting direction: controls < cases
plot(roc_curve, main = "Curve ROC")

auc_score <- auc(roc_curve)
print(paste("AUC Score:", auc_score))
## [1] "AUC Score: 0.786150625827673"

El área comprendida entre la curva ROC y la diagonal del cuadrado (AUC = 0.7861), indica un buen ajuste del modelo de predicción, que podría estar influenciada por el alto numero de verdaderos positivos clasificados correctamente.

6. Conclusiones

Teniendo en cuenta los resultados obtenidos, se sugiere para el proceso de contratación del area de recursos humanos que para próximas contrataciones se tenga en cuenta la siguiente caracterización:

1-Personas con estado civil casado, mayores de 37 años y que residan cerca al lugar de trabajo.

2-Se debe realizar un analisis de carga de trabajo a fin de evitar sobreesfuerzos en los trabajadores con el fin de minimizar el numero de horas extras.

3-Dado que el Departamento de IyD presenta una mayor proporcion de rotacion en la compañía, se recomienda evaluar el ambiente laboral y otras variables que pueden estar afectando negativamente la rotación.

4- Identificar incentivos en los trabajadores que tienen menores ingresos con el fin de generar estimular la retención en la empresa.

5- El presente modelo presenta un sesgo respecto a los falsos negativos, lo que incide directamente en el desempeño de clasificación. Por lo anterior, no es tan confiable para identificar los posibles trabajdores que pueden llegar a generar rotación.Se sugiere identificar otro tipo de variables que pueden estar incidiendo en la rotación y no se contemplan en el dataset entregado.