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