library(readxl)
Rotacion <- read_excel("Datos_Rotación.xlsx")
View(Rotacion)
names(Rotacion)
## [1] "Rotación" "Edad"
## [3] "Viaje de Negocios" "Departamento"
## [5] "Distancia_Casa" "Educación"
## [7] "Campo_Educación" "Satisfacción_Ambiental"
## [9] "Genero" "Cargo"
## [11] "Satisfación_Laboral" "Estado_Civil"
## [13] "Ingreso_Mensual" "Trabajos_Anteriores"
## [15] "Horas_Extra" "Porcentaje_aumento_salarial"
## [17] "Rendimiento_Laboral" "Años_Experiencia"
## [19] "Capacitaciones" "Equilibrio_Trabajo_Vida"
## [21] "Antigüedad" "Antigüedad_Cargo"
## [23] "Años_ultima_promoción" "Años_acargo_con_mismo_jefe"
1. Estado Civil (Cualitativa): La hipótesis es que las personas solteras pueden recurrir a la rotación por la libertad de no tener familia principal.
2. Departamento (Cualitativa): Dependiendo del departamento al que pertenezca el trabajador puede acceder a la rotación por diferentes motivos.
3. Viaje de Negocios(Cualitativa): Realizar viajes por el trabajo puede generar que las personas se inclinen por la rotación, ya que genera mayor estrés por el cambio del sitio de trabajo, por otro lado, tal vez haya personas que les guste viajar en su trabajo.
4. Edad (Cuantitativa): Se espera que las personas jóvenes estén en constante búsqueda de mejores condiciones, por lo que la rotación es una buena.
5. Ingreso_Mensual (Cuantitativa): El salario es muy importante para un trabajador, por lo que estará en búsqueda de mejores condiciones económicas, siendo la rotación un tema de interés para su objetivo.
6. Trabajos_Anteriores (Cuantitativa): Las personas que han tenido diferentes puestos de trabajo tienen una predisposición hacia la rotación.
library(ggplot2)
library(ggpubr)
g1=ggplot(Rotacion,aes(x=`Viaje de Negocios`, fill =`Viaje de Negocios`))+geom_bar()+geom_text(stat='count', aes(label=..count..), vjust=1)+theme_bw()
g2=ggplot(Rotacion,aes(x=Departamento, fill =`Departamento`))+geom_bar()+geom_text(stat='count', aes(label=..count..), vjust=1)+theme_bw()
g3=ggplot(Rotacion,aes(x=Estado_Civil, fill =`Estado_Civil`))+geom_bar()+geom_text(stat='count', aes(label=..count..), vjust=1)+theme_bw()
g4=ggplot(Rotacion,aes(x=Edad, fill =`Edad`))+geom_histogram(colour = "red")+geom_bar()+theme_bw()
g5=ggplot(Rotacion,aes(x=Ingreso_Mensual))+geom_histogram(colour = "blue")+theme_bw()
g6=ggplot(Rotacion,aes(x=Trabajos_Anteriores))+geom_histogram(colour = "green")+theme_bw()
ggarrange(g1, g2, g3, g4, g5, g6,labels = c("A", "B","C","D","E","F"),ncol = 1, nrow = 3)
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## $`1`
##
## $`2`
##
## attr(,"class")
## [1] "list" "ggarrange"
summary(Rotacion)
## Rotación Edad Viaje de Negocios Departamento
## Length:1470 Min. :18.00 Length:1470 Length:1470
## Class :character 1st Qu.:30.00 Class :character Class :character
## Mode :character Median :36.00 Mode :character Mode :character
## Mean :36.92
## 3rd Qu.:43.00
## Max. :60.00
## Distancia_Casa Educación Campo_Educación Satisfacción_Ambiental
## Min. : 1.000 Min. :1.000 Length:1470 Min. :1.000
## 1st Qu.: 2.000 1st Qu.:2.000 Class :character 1st Qu.:2.000
## Median : 7.000 Median :3.000 Mode :character Median :3.000
## Mean : 9.193 Mean :2.913 Mean :2.722
## 3rd Qu.:14.000 3rd Qu.:4.000 3rd Qu.:4.000
## Max. :29.000 Max. :5.000 Max. :4.000
## Genero Cargo Satisfación_Laboral Estado_Civil
## Length:1470 Length:1470 Min. :1.000 Length:1470
## Class :character Class :character 1st Qu.:2.000 Class :character
## Mode :character Mode :character Median :3.000 Mode :character
## Mean :2.729
## 3rd Qu.:4.000
## Max. :4.000
## Ingreso_Mensual Trabajos_Anteriores Horas_Extra
## Min. : 1009 Min. :0.000 Length:1470
## 1st Qu.: 2911 1st Qu.:1.000 Class :character
## Median : 4919 Median :2.000 Mode :character
## Mean : 6503 Mean :2.693
## 3rd Qu.: 8379 3rd Qu.:4.000
## Max. :19999 Max. :9.000
## Porcentaje_aumento_salarial Rendimiento_Laboral Años_Experiencia
## Min. :11.00 Min. :3.000 Min. : 0.00
## 1st Qu.:12.00 1st Qu.:3.000 1st Qu.: 6.00
## Median :14.00 Median :3.000 Median :10.00
## Mean :15.21 Mean :3.154 Mean :11.28
## 3rd Qu.:18.00 3rd Qu.:3.000 3rd Qu.:15.00
## Max. :25.00 Max. :4.000 Max. :40.00
## Capacitaciones Equilibrio_Trabajo_Vida Antigüedad Antigüedad_Cargo
## Min. :0.000 Min. :1.000 Min. : 0.000 Min. : 0.000
## 1st Qu.:2.000 1st Qu.:2.000 1st Qu.: 3.000 1st Qu.: 2.000
## Median :3.000 Median :3.000 Median : 5.000 Median : 3.000
## Mean :2.799 Mean :2.761 Mean : 7.008 Mean : 4.229
## 3rd Qu.:3.000 3rd Qu.:3.000 3rd Qu.: 9.000 3rd Qu.: 7.000
## Max. :6.000 Max. :4.000 Max. :40.000 Max. :18.000
## Años_ultima_promoción Años_acargo_con_mismo_jefe
## Min. : 0.000 Min. : 0.000
## 1st Qu.: 0.000 1st Qu.: 2.000
## Median : 1.000 Median : 3.000
## Mean : 2.188 Mean : 4.123
## 3rd Qu.: 3.000 3rd Qu.: 7.000
## Max. :15.000 Max. :17.000
Se puede observar la mayor proporción de personas se encuentran casadas, la mayoría de los empleados pertenecen al departamento LyD y los empleados raramente realizan viajes de trabajo. Por otro lado, las edades oscilan entre 30 y 40 años, el promedio de ingresos es 6.5 millones.
ggplot(Rotacion, aes(x=`Viaje de Negocios`, fill = Rotación))+
geom_bar(position="fill")+ylab('Proporción')+theme_bw()
Se puede observar que el mayor porcentaje de Rotación se da en empleados que viajan frecuentemente, lo cual está en correspondencia con la hipótesis inicial.
ggplot(Rotacion, aes(x=Estado_Civil, fill = Rotación))+
geom_bar(position="fill")+
ylab('Proporción')+
theme_bw()
Se observa que los empleados solteros son más propensos a la Rotación, apoyando la hipótesis inicial.
ggplot(Rotacion, aes(x=Departamento, fill = Rotación))+
geom_bar(position="fill")+
ylab('Proporción')+
theme_bw()+
theme(axis.text.x = element_text(angle = 90))
Se observa que de acuerdo al departamento hay diferentes porcentajes de empleados propensos a la Rotación, siendo mayor el de Ventas.
ggplot(Rotacion,aes(x=Rotación,y= Edad,fill=Rotación))+geom_boxplot()+theme_bw()
Se observa que los empleados más jóvenes tienden a rotar más, lo cual va en correspondecia a la hipótesis inicial.
ggplot(Rotacion,aes(x=Rotación,y= Trabajos_Anteriores,fill=Rotación))+geom_boxplot()+theme_bw()
Se observa que las personas con varios trabajos anteriores tienden a rotar más, lo cual apoya la hipótesis inicial sobre dicha variable.
ggplot(Rotacion,aes(x=Rotación,y= Ingreso_Mensual,fill=Rotación))+geom_boxplot()+theme_bw()
Los empleados con bajos salarios tienden a rotar más, lo cual apoya la hipótesis inicial.
library(car)
## Loading required package: carData
Rotacion$Rotación=as.factor(Rotacion$Rotación)
modelo = glm(Rotación ~ `Viaje de Negocios` + Estado_Civil + Departamento + Ingreso_Mensual + Edad + Trabajos_Anteriores, data = Rotacion, family = "binomial")
summary(modelo)
##
## Call:
## glm(formula = Rotación ~ `Viaje de Negocios` + Estado_Civil +
## Departamento + Ingreso_Mensual + Edad + Trabajos_Anteriores,
## family = "binomial", data = Rotacion)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -1.4955 -0.6250 -0.4565 -0.2607 2.9522
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 1.174e-02 3.696e-01 0.032 0.974655
## `Viaje de Negocios`No_Viaja -1.438e+00 3.444e-01 -4.176 2.97e-05 ***
## `Viaje de Negocios`Raramente -6.557e-01 1.738e-01 -3.772 0.000162 ***
## Estado_CivilDivorciado -2.548e-01 2.241e-01 -1.137 0.255587
## Estado_CivilSoltero 7.685e-01 1.650e-01 4.658 3.20e-06 ***
## DepartamentoRH 5.538e-01 3.526e-01 1.570 0.116310
## DepartamentoVentas 6.050e-01 1.615e-01 3.746 0.000180 ***
## Ingreso_Mensual -1.104e-04 2.579e-05 -4.279 1.87e-05 ***
## Edad -3.702e-02 1.025e-02 -3.611 0.000305 ***
## Trabajos_Anteriores 1.294e-01 3.020e-02 4.284 1.84e-05 ***
## ---
## 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: 1153.3 on 1460 degrees of freedom
## AIC: 1173.3
##
## Number of Fisher Scoring iterations: 5
Del resumen del modelo se observar que las variables con mayor fuerza explicativa estadísticamente hablando son la edad, los ingresos mensuales, el estado civil soltero y que el empleado no viaje o raravez lo haga.
Se comparan las varianzas entre las medias de los grupos de las variables del modelo por medio del análisis ANOVA:
anova(modelo, test = "Chisq")
## Analysis of Deviance Table
##
## Model: binomial, link: logit
##
## Response: Rotación
##
## Terms added sequentially (first to last)
##
##
## Df Deviance Resid. Df Resid. Dev Pr(>Chi)
## NULL 1469 1298.6
## `Viaje de Negocios` 2 23.760 1467 1274.8 6.927e-06 ***
## Estado_Civil 2 43.016 1465 1231.8 4.562e-10 ***
## Departamento 2 10.581 1463 1221.2 0.005039 **
## Ingreso_Mensual 1 43.125 1462 1178.1 5.136e-11 ***
## Edad 1 6.989 1461 1171.1 0.008203 **
## Trabajos_Anteriores 1 17.811 1460 1153.3 2.439e-05 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
A partir de los resultados de análisis ANOVA, podemos identificar que todas las variables son significativas para el modelo.
Se complementa lo anterior con el análisis de factores de inflación de la varianza VIF
vif(modelo)
## GVIF Df GVIF^(1/(2*Df))
## `Viaje de Negocios` 1.012010 2 1.002989
## Estado_Civil 1.024485 2 1.006066
## Departamento 1.053125 2 1.013025
## Ingreso_Mensual 1.248549 1 1.117385
## Edad 1.321059 1 1.149373
## Trabajos_Anteriores 1.145700 1 1.070374
Por lo que se confirma que las variables son estadísticamente importantes para el modelo.
predicciones = ifelse(modelo$fitted.values > 0.2, yes = 1, no = 0)
matriz_confusion = table(modelo$model$Rotación, predicciones,
dnn = c('observaciones', 'predicciones'))
matriz_confusion
## predicciones
## observaciones 0 1
## No 932 301
## Si 102 135
library(vcd)
## Loading required package: grid
mosaic(matriz_confusion, shade = TRUE, colorize = TRUE,
gp = gpar(fill = matrix(c('#b5ead7', '#fbb4ae', '#fbb4ae', '#b5ead7'), 2, 2)))
sum(diag(matriz_confusion))/sum(matriz_confusion)
## [1] 0.7258503
Se observa que el modelo ha pronosticado correctamente 932 de 1233 de No Rotación, mientras que 301 son falsos negativos. Por otro lado, identifica 135 casos efectivamente de Rotación de un total de 237, mientras que 102 son falsos positivos.
La bondad del ajuste del modelo de regresión logístico es 72.58%.
Análisis ROC
attach(Rotacion)
library(ROCR)
prediccion_1= predict.glm(modelo, newdata = Rotacion, type = "response")
resultado_1=table(Rotacion$Rotación, ifelse(prediccion_1>0.2,1,0))
resultado_1
##
## 0 1
## No 932 301
## Si 102 135
prediccion_rotacion= ROCR::prediction(prediccion_1,Rotacion$Rotación)
perf= performance(prediction.obj = prediccion_rotacion, "tpr", "fpr")
plot(perf)
abline(a = 0, b = 1,col="red")
grid()
AUC_1= performance(prediccion_rotacion,measure = "auc")@y.values[[1]]
cat("AUC: ",AUC_1,"n")
## AUC: 0.7338727 n
Se observa que el área debajo de la curva refleja la bondad del test para discriminar el personal que rota o no dentro de la empresa, este valor corresponde a 73.38%.
attach(Rotacion)
## The following objects are masked from Rotacion (pos = 4):
##
## Antigüedad, Antigüedad_Cargo, Años_acargo_con_mismo_jefe,
## Años_Experiencia, Años_ultima_promoción, Campo_Educación,
## Capacitaciones, Cargo, Departamento, Distancia_Casa, Edad,
## Educación, Equilibrio_Trabajo_Vida, Estado_Civil, Genero,
## Horas_Extra, Ingreso_Mensual, Porcentaje_aumento_salarial,
## Rendimiento_Laboral, Rotación, Satisfacción_Ambiental,
## Satisfación_Laboral, Trabajos_Anteriores, Viaje de Negocios
NuevaData = list(`Viaje de Negocios` = 'Raramente',
Estado_Civil = 'Casado',
Departamento = 'Ventas',
Ingreso_Mensual = 4000,
Edad = 33,
Trabajos_Anteriores = 1)
predict(modelo,NuevaData, type = 'response')
## 1
## 0.1718187
Se recomienda un beneficio salarial para los empleados que viajan frecuentemente para mejorar la motivación en el trabajo.
Generar mejores condiciones en los diferentes departamentos de la empresa, realizar capacitaciones para retener los empleados y siga su creciemiento profesional.
Para los empleados jóvenes que quieran seguir su formación profesional, darles beneficios de estudio y flexibilidad de los horarios laborales.
Mejorar los salarios de los trabajadores teniendo en cuenta su tiempo de labor, crear incentivos económicos como bonos por metas, diseñar planes de capacitación y hacer reconocimiento de los empleados de acuerdo a su excelencia.