head(datos, n=3)
## Rotación Edad Viaje.de.Negocios Departamento Distancia_Casa Educación
## 1 Si 41 Raramente Ventas 1 2
## 2 No 49 Frecuentemente IyD 8 1
## 3 Si 37 Raramente IyD 2 2
## Campo_Educación Satisfacción_Ambiental Genero Cargo
## 1 Ciencias 2 F Ventas
## 2 Ciencias 3 M Tecnico_Investigador
## 3 Otra 4 M Tecnico_Investigador
## Satisfación_Laboral Estado_Civil Ingreso_Mensual Trabajos_Anteriores
## 1 4 Soltero 5993 8
## 2 2 Casado 5130 1
## 3 3 Soltero 2090 6
## Horas_Extra Porcentaje_aumento_salarial Rendimiento_Laboral Años_Experiencia
## 1 Si 11 3 8
## 2 No 23 4 10
## 3 Si 15 3 7
## Capacitaciones Equilibrio_Trabajo_Vida Antigüedad Antigüedad_Cargo
## 1 0 1 6 4
## 2 3 3 10 7
## 3 3 3 0 0
## Años_ultima_promoción Años_acargo_con_mismo_jefe
## 1 0 5
## 2 1 7
## 3 0 0
Horas Extras: Se esperaría que aquellos empleados que tengan horas extras tengan una mayor probabilidad de rotación dado a la posible mayor carga laboral, esto podría generar que los empleados busque trabajos que les permitan tener mayor tiempo libre
Estado Civil: Los empleados solteros podrían tener mayor probabilidad de rotación en comparación con las personas casadas, dado que al no tener un compromiso familiar pueden darse la oportunidad de movilizarse con mayor facilidad que otro que se encuentre casado.
Cargo: Algunos cargos por demanda pueden estar relacionados con una mayor probabilidad de rotación, dado a mejores oportunidades salariales.
Edad: Los empleados más jovenes pueden tener una mayor probabilidad de rotación en comparación a los empleados con edades mayores
Ingresos Mensuales: Los empleados que ganan menos pueden tener una mayor probabilidad de rotación, por la necesidad de querer mayor estabilidad economica y mejores oportunidades
Antiguedad: Las personas con mayor antiguedad en la empresa pueden considerar tener mayor estabilidad laboral y por ende decidir continuar con sus empleos actuales, por tanto, tendrian una menor probabilidad de rotación
Realizando una categorización de los empleados de la empresa mediante las variables escogidas en la sección anterior encontramos lo siguiente:
No se observa datos faltantes en ninguna de las variables dentro de la base de datos.
apply(is.na(datos), 2, sum)
## Rotación Edad
## 0 0
## Viaje.de.Negocios Departamento
## 0 0
## Distancia_Casa Educación
## 0 0
## Campo_Educación Satisfacción_Ambiental
## 0 0
## Genero Cargo
## 0 0
## Satisfación_Laboral Estado_Civil
## 0 0
## Ingreso_Mensual Trabajos_Anteriores
## 0 0
## Horas_Extra Porcentaje_aumento_salarial
## 0 0
## Rendimiento_Laboral Años_Experiencia
## 0 0
## Capacitaciones Equilibrio_Trabajo_Vida
## 0 0
## Antigüedad Antigüedad_Cargo
## 0 0
## Años_ultima_promoción Años_acargo_con_mismo_jefe
## 0 0
Podemos observar una mayor prevalencia de clientes con rotación en aquellos que realizan hora extras siendo esta del 30.5%, en comparación a los que no realizan horas extras.
Frente al estado civil, los empleados solteros tienen una mayor prevalencia de clientes con rotación (25.5%) en comparación a los casados o divorsiados.
En cuanto al cargo, los empleados de ventas, tecnicos o investigadores tienen una mayor prevalencia de clientes con rotación (22. y 19.7% respectivamente) en comparación a los otros cargos.
## `summarise()` has grouped output by 'Horas_Extra'. You can override using the
## `.groups` argument.
## `summarise()` has grouped output by 'Estado_Civil'. You can override using the
## `.groups` argument.
## `summarise()` has grouped output by 'Cargo'. You can override using the
## `.groups` argument.
No hay correlaciones muy fuertes entre las variables a considerar en la construcción del modelo.
datos$Edad_cat <- ifelse(datos$Edad <= 32,'Menos 32 años','Mas 32 Años')
datos$Ingreso_Mensual_cat <- ifelse(datos$Ingreso_Mensual <= 3200,'Menos 3200','Mas 3200')
datos$Antigüedad_cat <- ifelse(datos$Antigüedad <= 3,'Menos 3 años','Mas 3 años')
Los empleados con menos de 32 años rotan mas que aquellos que tienen más de 32 años.
Los empleados con ingresos por encima de $ 3.200 rotan menos.
Los que tienen menos de 3 años de antiguedad rotan más que los que son mas antiguos en la empresa.
Se plantea el modelo considerando las variables anteriormente planteadas, dando el siguiente modelo estimado:
modelo_log <- glm(datos$respuesta ~. , datos_modelo, family = "binomial")
summary(modelo_log)
##
## Call:
## glm(formula = datos$respuesta ~ ., family = "binomial", data = datos_modelo)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -1.8799 -0.5510 -0.3751 -0.2159 2.8534
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -4.0537 0.2986 -13.577 < 2e-16 ***
## Edad_catMenos 32 años 0.6328 0.1669 3.793 0.000149 ***
## CargoOtros_Cargos 0.7578 0.3583 2.115 0.034443 *
## CargoTecnico_Investigador 0.6708 0.3124 2.147 0.031781 *
## CargoVentas 1.2688 0.2951 4.299 1.71e-05 ***
## Estado_CivilDivorciado -0.3264 0.2329 -1.402 0.161047
## Estado_CivilSoltero 0.8101 0.1734 4.671 2.99e-06 ***
## Ingreso_Mensual_catMenos 3200 0.7642 0.1981 3.857 0.000115 ***
## Horas_ExtraSi 1.5380 0.1627 9.454 < 2e-16 ***
## Antigüedad_catMenos 3 años 0.6193 0.1679 3.690 0.000224 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 1298.6 on 1469 degrees of freedom
## Residual deviance: 1052.0 on 1460 degrees of freedom
## AIC: 1072
##
## Number of Fisher Scoring iterations: 5
anova(modelo_log, test = "Chisq")
## Analysis of Deviance Table
##
## Model: binomial, link: logit
##
## Response: datos$respuesta
##
## Terms added sequentially (first to last)
##
##
## Df Deviance Resid. Df Resid. Dev Pr(>Chi)
## NULL 1469 1298.6
## Edad_cat 1 44.406 1468 1254.2 2.669e-11 ***
## Cargo 3 37.171 1465 1217.0 4.234e-08 ***
## Estado_Civil 2 33.344 1463 1183.7 5.748e-08 ***
## Ingreso_Mensual_cat 1 25.253 1462 1158.4 5.029e-07 ***
## Horas_Extra 1 92.915 1461 1065.5 < 2.2e-16 ***
## Antigüedad_cat 1 13.451 1460 1052.0 0.0002449 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
El modelo estimado genera un area bajo la ROC del 78.67%, lo que quiere decir que el modelo tiene una probabilidad del 78.67% de clasificar los empleados que rotan vs lo que no lo hacen.
#### Definicion del punto de corte
Con la intencion de poder clasificar los clientes de acuerdo a su
probabilidad si rotan o no, se determina el punto de corte en 0.30
considerando metricas como el accuracy, recall, la precisión y el F1 del
modelo.
Considerando un posible empleado nuevo a ser clasificado por el modelo, con las caracteristicas que se describen a continuacion
## Edad_cat Cargo Estado_Civil Ingreso_Mensual_cat Horas_Extra
## 1 Menos 32 años Ventas Soltero Menos 3200 No
## Antigüedad_cat
## 1 Menos 3 años
Este tendría una probabilidad del 51.04% de rotar, y dado el punto de corte determinado anteriormente, este empleado seria clasificado como un empleado a intervenir dada su probabilidad. Este empleado es del area de ventas y presenta ingresos por debajo de los 3.200 quizás la empresa debería ofrecerle un mayor incremento salarial o una mejor visión de crecimiento al interior de la empresa para que este nuevo empleado decida continuar en la misma.
round(predict(modelo_log, empleado, type = "response")*100,2)
## 1
## 51.04
Dado que los clientes que tienen una mayor incidiencia en la probabilidad de rotar de la empresa son aquellos que presentan ingresos bajos o tienen cargos relacionados con ventas o realizan horas extras. La empresa debería analizar si existe una brecha salarial entre estos empleados que pueda estar incidiendo a que su prevalencia de rotacion sea mayor. Adicional, considerar mayores incentivos para los empleados que realizan horas extras bien sea con una reduccion en la carga horario o un mayor incentivo economico.
## DEFAULT ANTIUEDAD EDAD CUOTA_TOTAL INGRESOS CUOTA_TOTAL_MM INGRESOS_MM
## 1 1 37.31781 76.98356 3020519 8155593 3.020519 8.155593
## 2 1 37.31781 73.77534 1766552 6181263 1.766552 6.181263
## 3 1 30.97808 78.93699 1673786 4328075 1.673786 4.328075
Se realizará una exploración a la información dentro del archivo con la intención de definir las variables a se considerasdas dentro del modelo.
No se identifican datos faltantes dentro del archivo a analizar
apply(is.na(datos), 2, sum)
## DEFAULT ANTIUEDAD EDAD CUOTA_TOTAL INGRESOS
## 0 0 0 0 0
## CUOTA_TOTAL_MM INGRESOS_MM
## 0 0
Los clientes en la entidad cuentan con una antiguedad promedio de
18 años y la distribucion presenta una variabilidad del 66.1%
Los clientes tienen una edad promedio de 56.9 años y la
distribucion presenta una variabilidad del 22.3%
Los clientes paga una cuota promedio en MM de $ 0.89 y la distribucion presenta una variabilidad del 83.1%
No hay correlaciones muy fuertes entre las variables, sin embargo, la antiguedad y la edad presenta la correlacion más alta siendo esta del 75%.
Al construir el modelo con las variables expuestas anteriormente, vemos que la edad no es significativa dentro de esto por tanto se decide excluir del modelo. Al realizar este proceso, la antiguedad tambien pierde correlación, por lo que se decide plantear un modelo con las variables restantes, dando como resultado lo siguiente:
##
## Call:
## glm(formula = DEFAULT ~ ., family = "binomial", data = datos_modelo)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -0.6901 -0.3648 -0.2928 -0.2113 2.9753
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -2.3530 0.3966 -5.933 2.97e-09 ***
## CUOTA_TOTAL_MM 0.9341 0.2404 3.885 0.000102 ***
## INGRESOS_MM -0.3134 0.1005 -3.119 0.001817 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 309.68 on 779 degrees of freedom
## Residual deviance: 291.37 on 777 degrees of freedom
## AIC: 297.37
##
## Number of Fisher Scoring iterations: 6
cv_error <- cv.glm(data = datos_modelo, glmfit = modelo_log, K = 10)
cv_error$delta
## [1] 0.04622733 0.04619913
El modelo estimado genera un area bajo la ROC del 67.91%, lo que quiere decir que el modelo tiene una probabilidad del 67.91% de clasificar los clientes que incumple y los que no.