library(readxl)
Rotacion <- read_excel("E:/Data Science/Estadistica/Mod3/Datos_Rotacion.xlsx")
head(Rotacion)
| Rotación | Edad | Viaje de Negocios | Departamento | Distancia_Casa | Educación | Campo_Educación | Satisfacción_Ambiental | Genero | Cargo | Satisfación_Laboral | Estado_Civil | Ingreso_Mensual | Trabajos_Anteriores | Horas_Extra | Porcentaje_aumento_salarial | Rendimiento_Laboral | Años_Experiencia | Capacitaciones | Equilibrio_Trabajo_Vida | Antigüedad | Antigüedad_Cargo | Años_ultima_promoción | Años_acargo_con_mismo_jefe |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Si | 41 | Raramente | Ventas | 1 | 2 | Ciencias | 2 | F | Ejecutivo_Ventas | 4 | Soltero | 5993 | 8 | Si | 11 | 3 | 8 | 0 | 1 | 6 | 4 | 0 | 5 |
| No | 49 | Frecuentemente | IyD | 8 | 1 | Ciencias | 3 | M | Investigador_Cientifico | 2 | Casado | 5130 | 1 | No | 23 | 4 | 10 | 3 | 3 | 10 | 7 | 1 | 7 |
| Si | 37 | Raramente | IyD | 2 | 2 | Otra | 4 | M | Tecnico_Laboratorio | 3 | Soltero | 2090 | 6 | Si | 15 | 3 | 7 | 3 | 3 | 0 | 0 | 0 | 0 |
| No | 33 | Frecuentemente | IyD | 3 | 4 | Ciencias | 4 | F | Investigador_Cientifico | 3 | Casado | 2909 | 1 | Si | 11 | 3 | 8 | 3 | 3 | 8 | 7 | 3 | 0 |
| No | 27 | Raramente | IyD | 2 | 1 | Salud | 1 | M | Tecnico_Laboratorio | 2 | Casado | 3468 | 9 | No | 12 | 3 | 6 | 3 | 3 | 2 | 2 | 2 | 2 |
| No | 32 | Frecuentemente | IyD | 2 | 2 | Ciencias | 4 | M | Tecnico_Laboratorio | 4 | Soltero | 3068 | 0 | No | 13 | 3 | 8 | 2 | 2 | 7 | 7 | 3 | 6 |
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"
VARIABLES CATEGORICAS
A. se espera que el Estado civil se relacione con la rotación puesto que las personas solteras podrian presentar menor temor a modificar su estabilidad laboral
H1: Las personas solteras tienen mayor posibilidad de rotar
B. se espera que el Departamento se relacione con la rotación puesto que algunos cargos demandan mas presion y nivel de estres
H2: Las personas en el departamento de ventas tienen mayor posibilidad de rotar
C. se espera que las Horas_Extra se relacionen con la rotación puesto que trabajar continuamente en horas extra afecta la disponibilidad de tiempo personal, familiar y de otras actividades de recreación
H3: las personas que trabajan horas extra tienen mayor posiblidad de rotar
VARIABLES CUANTITATIVAS
D. se espera que el ingreso mensual se relacione con la rotación puesto que un alto ingreso puede incidir en no tomar la decision de dejar un puesto y viceversa
H4:Las personas de menor ingreso mensual tienen mayor posibilidad de rotar
E. se espera que la Edad se relacione con la rotacion puesto que para una persona de mayor edad las ofertas de empleo se vuelven mas rigurosas lo cual puede desincentivar la rotacion
H5. las personas con menor edad tienen mayor posibilidad de rotar.
F. se espera que la Distancia_casa se relacione con la rotación puesto que a una persona que viva significativamente lejos del lugar de trabajao se inclinaria por cambiar de empleo a uno que le resulte mas cercano
H6: las personas con mayor distancia a su casa tienen mayor posibilidad de rotar
#Ingreso
data.frame(Ingreso_promedio=mean(Rotacion$Ingreso_Mensual),Ingreso_mediana=median(Rotacion$Ingreso_Mensual),Ingreso_min=min(Rotacion$Ingreso_Mensual),Ingreso_max=max(Rotacion$Ingreso_Mensual))
| Ingreso_promedio | Ingreso_mediana | Ingreso_min | Ingreso_max |
|---|---|---|---|
| 6502.931 | 4919 | 1009 | 19999 |
require(ggplot2)
require(ggpubr)
ggplot(Rotacion,aes(x=Ingreso_Mensual))+geom_histogram(bins=50)+theme_bw()
#Edad
data.frame(Edad_promedio=mean(Rotacion$Edad),Edad_mediana=median(Rotacion$Edad),Edad_min=min(Rotacion$Edad),Edad_max=max(Rotacion$Edad))
| Edad_promedio | Edad_mediana | Edad_min | Edad_max |
|---|---|---|---|
| 36.92381 | 36 | 18 | 60 |
ggplot(Rotacion,aes(x=Edad))+geom_histogram(bins=20)+theme_bw()
#Distancia_Casa
data.frame(Distancia_Casa_promedio=mean(Rotacion$Distancia_Casa),Distancia_Casa_mediana=median(Rotacion$Distancia_Casa),Distancia_Casa_min=min(Rotacion$Distancia_Casa),Distancia_Casa_max=max(Rotacion$Distancia_Casa))
| Distancia_Casa_promedio | Distancia_Casa_mediana | Distancia_Casa_min | Distancia_Casa_max |
|---|---|---|---|
| 9.192517 | 7 | 1 | 29 |
ggplot(Rotacion,aes(x=Distancia_Casa))+geom_histogram(bins=20)+theme_bw()
#Estado Civil
tabla1=prop.table(table(Rotacion$Estado_Civil))*100
lbls=paste(names(tabla1), "\n", round(tabla1),"%", sep="")
pie(tabla1, labels = lbls, main="Grafico\n (Estado Civil)")
#Departamento
tabla2=prop.table(table(Rotacion$Departamento))*100
lbls=paste(names(tabla2), "\n", round(tabla2),"%", sep="")
pie(tabla2, labels = lbls, main="Grafico\n (Departamento)")
#Horas Extra
tabla3=prop.table(table(Rotacion$Horas_Extra))*100
lbls=paste(names(tabla3), "\n", round(tabla3),"%", sep="")
pie(tabla3, labels = lbls, main="Grafico\n (Horas Extra)")
#Rotación
round(prop.table(table(Rotacion$Rotación))*100,digits=1)
##
## No Si
## 83.9 16.1
tabla4=prop.table(table(Rotacion$Rotación))*100
lbls=paste(names(tabla4), "\n", round(tabla4),"%", sep="")
pie(tabla3, labels = lbls, main="Grafico\n (Rotación)")
require(CGPfunctions)
#Estado Civil
tabla4=table(Rotacion$Estado_Civil,Rotacion$Rotación)
prop.table(tabla4,margin=1)*100
##
## No Si
## Casado 87.51857 12.48143
## Divorciado 89.90826 10.09174
## Soltero 74.46809 25.53191
PlotXTabs2(Rotacion,Estado_Civil,Rotación,plottype = "percent")
#Departamento
tabla5=table(Rotacion$Departamento,Rotacion$Rotación)
prop.table(tabla5,margin=1)*100
##
## No Si
## IyD 86.16025 13.83975
## RH 80.95238 19.04762
## Ventas 79.37220 20.62780
PlotXTabs2(Rotacion,Departamento,Rotación,plottype = "percent")
#Horas_Extra
tabla6=table(Rotacion$Horas_Extra,Rotacion$Rotación)
prop.table(tabla6,margin=1)*100
##
## No Si
## No 89.56357 10.43643
## Si 69.47115 30.52885
PlotXTabs2(Rotacion,Horas_Extra,Rotación,plottype = "percent")
#Ingreso
g1=ggplot(Rotacion,aes(x=Rotación, y=Ingreso_Mensual,fill=Rotación))+geom_boxplot()+theme_bw()
require(plotly)
ggplotly(g1)
tapply(Rotacion$Ingreso_Mensual,Rotacion$Rotación,mean,na.rm=TRUE)
## No Si
## 6832.740 4787.093
#Edad
g2=ggplot(Rotacion,aes(x=Rotación, y=Edad,fill=Rotación))+geom_boxplot()+theme_bw()
ggplotly(g2)
tapply(Rotacion$Edad,Rotacion$Rotación,mean,na.rm=TRUE)
## No Si
## 37.56123 33.60759
#Distancia_Casa
g3=ggplot(Rotacion,aes(x=Rotación, y=Distancia_Casa,fill=Rotación))+geom_boxplot()+theme_bw()
ggplotly(g3)
tapply(Rotacion$Distancia_Casa,Rotacion$Rotación,mean,na.rm=TRUE)
## No Si
## 8.915653 10.632911
H1: Las personas solteras tienen mayor posibilidad de rotar: Los resultados del analisis bivariado involucrando la variable Estado Civil refuerzan la hipotesis planteada al tener un 26% de rotacion entre los solteros lo cual es significativamente superior frente a los casados y divorciados.
H2: Las personas en el departamento de ventas tienen mayor posibilidad de rotar: De acuerdo con los resultados se refuerza la hipotesis planteada al ser ventas el departamento que presenta la mayor rotación. frente al dpto de IyD (que presenta el doble de numero de empleados) el porcentaje de rotación es un 50% superior (14% vs 21% )
H3: las personas que trabajan hora extra tienen mayor posiblidad de rotar: Los resultados Refuerzan la hipotesis planteada pues la rotacion es de 31% entre quienes si trabajan horas extra vs 10% entre quienes no trabajan
H4:Las personas de menor ingreso mensual tienen mayor posibilidad de rotar: Los resultados refuerzan la hipotesis pues, De acuerdo con el analisis las personas que rotaron presentaron un promedio de ingresos significativamente menor a las que no rotaron (4787 vs 6832)
H5. las personas con menor edad tienen mayor posibilidad de rotar: los datos refuerzan la hiportesis puesto que quienes si rotan tienen una edad promedio de 33,6 años mientras que quienes no rotan su promedio de edad es de 37,6 años. entre un promedio de edad general de 36,9 años
H6: las personas con mayor distancia hasta su casa tienen mayor posibilidad de rotar: se refuerza la hipotesis puesto que las personas que rotaron se encuentran en promedio a 10,6 km de su casa, mientras que quiens no rotan se encuentra a 8,9 km
Rotacion$Rotación=as.numeric(Rotacion$Rotación=="Si")
mod=glm(Rotación~Edad+Ingreso_Mensual+Distancia_Casa+Horas_Extra+Departamento+Estado_Civil,data=Rotacion,family = "binomial")
summary(mod)
##
## Call:
## glm(formula = Rotación ~ Edad + Ingreso_Mensual + Distancia_Casa +
## Horas_Extra + Departamento + Estado_Civil, family = "binomial",
## data = Rotacion)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -1.5641 -0.5913 -0.4015 -0.2399 3.0078
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -1.405e+00 3.647e-01 -3.854 0.000116 ***
## Edad -2.742e-02 1.010e-02 -2.714 0.006654 **
## Ingreso_Mensual -1.187e-04 2.666e-05 -4.453 8.46e-06 ***
## Distancia_Casa 3.129e-02 9.264e-03 3.378 0.000730 ***
## Horas_ExtraSi 1.499e+00 1.580e-01 9.488 < 2e-16 ***
## DepartamentoRH 6.898e-01 3.594e-01 1.919 0.054956 .
## DepartamentoVentas 6.124e-01 1.671e-01 3.665 0.000247 ***
## Estado_CivilDivorciado -2.902e-01 2.295e-01 -1.264 0.206116
## Estado_CivilSoltero 8.709e-01 1.709e-01 5.095 3.49e-07 ***
## ---
## 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: 1090.7 on 1461 degrees of freedom
## AIC: 1108.7
##
## Number of Fisher Scoring iterations: 5
De acuerdo con el modelo se encuentra que las variables seleccionadas presentan una alta significancia, siendo las mas significativas: Ingreso_mensual, Horas_ExtraSI, Estado_CivilSoltero, seguido de Distancia_Casa, DepartamentoVentas y Edad
1-exp(mod$coefficients)
## (Intercept) Edad Ingreso_Mensual
## 0.7547478945 0.0270436057 0.0001187305
## Distancia_Casa Horas_ExtraSi DepartamentoRH
## -0.0317881893 -3.4763482105 -0.9933267067
## DepartamentoVentas Estado_CivilDivorciado Estado_CivilSoltero
## -0.8448504360 0.2519000504 -1.3890460781
se observa que el ingreso presenta baja probabilidad de producir cambios en la rotación mientas que Horas_ExtraSi, Estado_CivilSoltero y DepartamentoVentas tienen una alta probabilidad de producir cambios en la variable de rotación
Evaluar el poder predictivo del modelo con base en la curva ROC y el AUC.
library(vcd)
Predict1= predict.glm(mod, newdata = Rotacion, type = "response")
Matriz_Resultado = table(Rotacion$Rotación, ifelse(Predict1 >0.2, 1, 0), dnn = c("observaciones", "predicciones"))
Matriz_Resultado
## predicciones
## observaciones 0 1
## 0 952 281
## 1 88 149
mosaic(Matriz_Resultado, shade = TRUE, colorize = TRUE,
gp = gpar(fill = matrix(c("green", "blue", "blue", "green"), 2, 2)))
Se identifica entre los resultados 952 observaciones correspondientes a la no rotación y 281 falsos negativos (No rota y el resultado da que si), Entre las observaciones que efectivamente rotan se encontraron 149 observaciones y 88 falsos positivos (si rotan y la prediccion da como resultado que no)
sum(diag(Matriz_Resultado))/sum(Matriz_Resultado)
## [1] 0.7489796
El modelo propuesto es es capaz de clasificar correctamente el 74.9% de las observaciones al utilizar los datos de entrenamiento.
library(ROCR)
prediccion_rot= ROCR::prediction(Predict1,Rotacion$Rotación)
perf= performance(prediction.obj = prediccion_rot, "tpr", "fpr")
plot(perf)
abline(a=0, b=1, col="red")
grid()
AUClog= performance(prediccion_rot, measure = "auc")@y.values[[1]]
cat("AUC: ", AUClog, "n")
## AUC: 0.7670633 n
El modelo tiene una Area bajo la curva (AUC) de 0,707
datapredict = data.frame(
Departamento = 'Ventas',
Estado_Civil = 'Soltero',
Edad=25,
Ingreso_Mensual = 1000,
Distancia_Casa = 30,
Horas_Extra='Si', check.names = FALSE)
#caracteristicas del trabajador
datapredict
| Departamento | Estado_Civil | Edad | Ingreso_Mensual | Distancia_Casa | Horas_Extra |
|---|---|---|---|---|---|
| Ventas | Soltero | 25 | 1000 | 30 | Si |
prob_rotacion=(predict(mod,list(Departamento = 'Ventas',Estado_Civil = 'Soltero', Edad=25, Ingreso_Mensual = 1000, Distancia_Casa = 30, Horas_Extra='Si'),type = "response"))*100
#predict(object = mod, newdata = datapredict, type = 'response')
cat("Probabilidad de Rotación: ", prob_rotacion,"%")
## Probabilidad de Rotación: 84.70042 %
prob_Corte=(predict(mod,list(Departamento = 'Ventas',Estado_Civil = 'Soltero', Edad=mean(Rotacion$Edad), Ingreso_Mensual = mean(Rotacion$Ingreso_Mensual), Distancia_Casa = mean(Rotacion$Distancia_Casa), Horas_Extra='Si'),type = "response"))*100
cat("Probabilidad de corte: ", prob_Corte,"%")
## Probabilidad de corte: 51.9952 %
La probablidad de rotar de un trabajador con las caracteristicas mencionadas es de 84% se define la probabilidad de corte prediciendo la rotación para una persona con caracteristicas promedio (52%), la probabilidad obtenida para el trabajador es mayor que esta probabilidad de corte y por tanto deberia intervenirse este trabajador para disminuir esta probabilidad de rotacion.
Realizar estudio de intereses dirigido al grupo de trabajadores solteros para conocer sus proyecciones personales, se pueden establecerr actividades de esparcimiento asociadas a las preferencias de este grupo que presumiblemente tiene un estilo de vida menos rigido.
Se deben revisar las politicas del departamento de ventas, asi como el direccionamiento y estrategias de los jefes y coordinadores de éste, puede evaluarse modificar las politicas de incentivos y condiciones de ingresos frente al equilibrio de su vida personal.
Dirigir a los empleados de menor ingresos, mayor oportunidad de capacitación sobre manejo financiero y proyeccion de crecimiento personal y profesional
Verificar las politicas de horas extra puesto que tienen alta incidencia en la rotación, verificar que sea equitativo entre los trabajadores y de ser posible tener un incentivo para cuando se requiere trabajar horas extras, se puede evaluar la flexibilizacion de ciertas jornadas cuando se presenten horas extras recurrentes en una misma semana,
de ser posible manejar estrategias de alternancia donde puedan aplicar aquellos trabajadores con una mayor distancia hasta su casa en determinados dias de la semana.