#Cargue Librerias
library(readxl)
library(ggplot2)
library(CGPfunctions)
## Warning: package 'CGPfunctions' was built under R version 4.1.2
library(sqldf)
## Loading required package: gsubfn
## Loading required package: proto
## Loading required package: RSQLite
PUNTO 1 Hipotesis 1: Se espera que a mayor edad se presente menor Rotacion ya que las personas maduras tienden a rotar en menor proporcion.
Hipotesis 2: Se espera que la gente con menor Antiguedad rote en mayor proporcion ya que puede tratarse de personas con menor tiempo de adaptacion a la cultura de la empresa.
Hipotesis 3: Se espera que la gente con menor Ingreso Mensual rote en mayor proporcion ya que puede tratarse de personas en busqueda de un incremento salarial.
Hipotesis 4: Se espera que exista una mayor incidencia de Rotacion en los Hombres, dado que son la mayor participacion en la base y son normalmente mas inestables en sus labores.
Hipotesis 5: Se espera que exista una mayor incidencia de Rotacion en empleados que tengan horas extras, ya que esto puede representar una sobrecarga laboral.
Hipotesis 6: Se espera que exista una diferenciacion de Rotacion en empleados segun su estado civil, donde personas solteras deberian presentar una mayor incidencia.
PUNTO 2
datos1 = read_excel("G:/ACADEMIA/JAVERIANA CALI/2. SEMESTRE 2022 - II/2. Met. Estad. para la Toma Decisiones/Logistica/Datos_Rotacion.xlsx")
head(datos1)
## # A tibble: 6 x 24
## Rotacion Edad Viaje_Negocios Departamento Distancia_Casa Educacion
## <chr> <dbl> <chr> <chr> <dbl> <dbl>
## 1 Si 41 Raramente Ventas 1 2
## 2 No 49 Frecuentemente IyD 8 1
## 3 Si 37 Raramente IyD 2 2
## 4 No 33 Frecuentemente IyD 3 4
## 5 No 27 Raramente IyD 2 1
## 6 No 32 Frecuentemente IyD 2 2
## # ... with 18 more variables: Campo_Educación <chr>,
## # Satisfaccion_Ambiental <dbl>, Genero <chr>, Cargo <chr>,
## # Satisfacion_Laboral <dbl>, Estado_Civil <chr>, Ingreso_Mensual <dbl>,
## # Trabajos_Anteriores <dbl>, Horas_Extra <chr>,
## # Porcentaje_aumento_salarial <dbl>, Rendimiento_Laboral <dbl>,
## # Anos_Experiencia <dbl>, Capacitaciones <dbl>,
## # Equilibrio_Trabajo_Vida <dbl>, Antiguedad <dbl>, ...
#Analisis Univariado variables Continuas
#Edad
Prom_Edad=mean(datos1$Edad)
Desv_Edad=sd(datos1$Edad)
P25_Edad=quantile(datos1$Edad, prob=c(0.25))
P50_Edad=quantile(datos1$Edad, prob=c(0.50))
P75_Edad=quantile(datos1$Edad, prob=c(0.75))
data.frame(Prom_Edad,Desv_Edad,P25_Edad,P50_Edad,P75_Edad)
## Prom_Edad Desv_Edad P25_Edad P50_Edad P75_Edad
## 25% 36.92381 9.135373 30 36 43
#Ingreso Mensual
Prom_Ingreso=mean(datos1$Ingreso_Mensual)
Desv_Ingreso=sd(datos1$Ingreso_Mensual)
P25_Ingreso=quantile(datos1$Ingreso_Mensual, prob=c(0.25))
P50_Ingreso=quantile(datos1$Ingreso_Mensual, prob=c(0.50))
P75_Ingreso=quantile(datos1$Ingreso_Mensual, prob=c(0.75))
data.frame(Prom_Ingreso,Desv_Ingreso,P25_Ingreso,P50_Ingreso,P75_Ingreso)
## Prom_Ingreso Desv_Ingreso P25_Ingreso P50_Ingreso P75_Ingreso
## 25% 6502.931 4707.957 2911 4919 8379
#Antiguedad
Prom_Antiguedad=mean(datos1$Antiguedad)
Desv_Antiguedad=sd(datos1$Antiguedad)
P25_Antiguedad=quantile(datos1$Antiguedad, prob=c(0.25))
P50_Antiguedad=quantile(datos1$Antiguedad, prob=c(0.50))
P75_Antiguedad=quantile(datos1$Antiguedad, prob=c(0.75))
data.frame(Prom_Antiguedad,Desv_Antiguedad,P25_Antiguedad,P50_Antiguedad,P75_Antiguedad)
## Prom_Antiguedad Desv_Antiguedad P25_Antiguedad P50_Antiguedad
## 25% 7.008163 6.126525 3 5
## P75_Antiguedad
## 25% 9
#Analisis Univariado Categoricas
#Genero
prop.table(table(datos1$Genero))*100
##
## F M
## 40 60
#Horas Extras
prop.table(table(datos1$Horas_Extra))*100
##
## No Si
## 71.70068 28.29932
#Estado Civil
prop.table(table(datos1$Estado_Civil))*100
##
## Casado Divorciado Soltero
## 45.78231 22.24490 31.97279
#Grafico Edad
ggplot(datos1,aes(x=Edad))+geom_histogram()+theme_bw()
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
#Grafico Ingreso Mensual
ggplot(datos1,aes(x=Ingreso_Mensual))+geom_histogram()+theme_bw()
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
#Grafico Antiguedad
ggplot(datos1,aes(x=Antiguedad))+geom_histogram()+theme_bw()
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
#Grafico Genero
ggplot(datos1,aes(x=Genero))+geom_bar()+theme_bw()
#Grafico Horas Extra
ggplot(datos1,aes(x=Horas_Extra))+geom_bar()+theme_bw()
#Grafico Estado Civil
ggplot(datos1,aes(x=Estado_Civil))+geom_bar()+theme_bw()
PUNTO 3
#Analisis Bivariado
#edad vs rotacion
boxplot(datos1$Edad~datos1$Rotacion,
xlab = 'Rotacion',
ylab = 'Edad',
main= 'Rotacion vs Edad',
col= 'ivory')
sqldf('select Rotacion,
avg(Edad) as Edad_Prom,
stdev(Edad) as Edad_desv
from datos1
group by Rotacion
')
## Rotacion Edad_Prom Edad_desv
## 1 No 37.56123 8.88836
## 2 Si 33.60759 9.68935
Se evidencia una edad promedio menor en aquellos empleados que presentan rotacion
boxplot(datos1$Antiguedad~datos1$Rotacion,
xlab = 'Rotacion',
ylab = 'Antiguedad',
main= 'Rotacion vs Antiguedad',
col= 'khaki')
sqldf('select Rotacion,
avg(Antiguedad) as Antiguedad_Prom,
stdev(Antiguedad) as Antiguedad_desv
from datos1
group by Rotacion
')
## Rotacion Antiguedad_Prom Antiguedad_desv
## 1 No 7.369019 6.096298
## 2 Si 5.130802 5.949984
Se evidencia una menor antiguedad en los empleados que presentan rotacion
boxplot(datos1$Ingreso_Mensual~datos1$Rotacion,
xlab = 'Rotacion',
ylab = 'Ingreso Mensual',
main= 'Rotacion vs Ingreso Mensual',
col= 'lightcyan')
sqldf('select Rotacion,
avg(Ingreso_Mensual) as Ingreso_Mensual_Prom,
stdev(Ingreso_Mensual) as Ingreso_Mensual_desv
from datos1
group by Rotacion
')
## Rotacion Ingreso_Mensual_Prom Ingreso_Mensual_desv
## 1 No 6832.740 4818.208
## 2 Si 4787.093 3640.210
Se evidencia que los empleados con rotacion tienen un Ingreso Mensual promedio menor.
PlotXTabs(datos1, Rotacion, Genero, "percent")
## Plotted dataset datos1 variables Rotacion by Genero
NO se evidencia una diferencia significativa en la Rotacion x Genero
PlotXTabs(datos1, Rotacion, Horas_Extra, "percent")
## Plotted dataset datos1 variables Rotacion by Horas_Extra
SI se evidencia una diferencia significativa en la Rotacion x Horas_extra
PlotXTabs(datos1, Rotacion, Estado_Civil, "percent")
## Plotted dataset datos1 variables Rotacion by Estado_Civil
SI se evidencia una diferencia significativa en la Rotacion x Estado Civil, en particular en quienes son Solteros
PUNTO 4
#cambio de la variable objetivo
datos1$Rotacion[datos1$Rotacion=="Si"] = 1
datos1$Rotacion[datos1$Rotacion=="No"] = 0
head(datos1)
## # A tibble: 6 x 24
## Rotacion Edad Viaje_Negocios Departamento Distancia_Casa Educacion
## <chr> <dbl> <chr> <chr> <dbl> <dbl>
## 1 1 41 Raramente Ventas 1 2
## 2 0 49 Frecuentemente IyD 8 1
## 3 1 37 Raramente IyD 2 2
## 4 0 33 Frecuentemente IyD 3 4
## 5 0 27 Raramente IyD 2 1
## 6 0 32 Frecuentemente IyD 2 2
## # ... with 18 more variables: Campo_Educación <chr>,
## # Satisfaccion_Ambiental <dbl>, Genero <chr>, Cargo <chr>,
## # Satisfacion_Laboral <dbl>, Estado_Civil <chr>, Ingreso_Mensual <dbl>,
## # Trabajos_Anteriores <dbl>, Horas_Extra <chr>,
## # Porcentaje_aumento_salarial <dbl>, Rendimiento_Laboral <dbl>,
## # Anos_Experiencia <dbl>, Capacitaciones <dbl>,
## # Equilibrio_Trabajo_Vida <dbl>, Antiguedad <dbl>, ...
datos1$Rotacion=as.factor(datos1$Rotacion)
#estimacion del modelo
mod_glm1 <- glm(Rotacion ~ Edad + Antiguedad + Ingreso_Mensual + Genero +
Horas_Extra + Estado_Civil,
data = datos1, family = "binomial")
summary(mod_glm1)
##
## Call:
## glm(formula = Rotacion ~ Edad + Antiguedad + Ingreso_Mensual +
## Genero + Horas_Extra + Estado_Civil, family = "binomial",
## data = datos1)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -1.5047 -0.5937 -0.4122 -0.2608 3.2002
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -1.026e+00 3.606e-01 -2.846 0.00443 **
## Edad -2.728e-02 9.963e-03 -2.739 0.00617 **
## Antiguedad -3.651e-02 1.829e-02 -1.996 0.04589 *
## Ingreso_Mensual -7.566e-05 2.635e-05 -2.871 0.00409 **
## GeneroM 2.697e-01 1.594e-01 1.692 0.09062 .
## Horas_ExtraSi 1.482e+00 1.566e-01 9.463 < 2e-16 ***
## Estado_CivilDivorciado -2.899e-01 2.270e-01 -1.277 0.20156
## Estado_CivilSoltero 8.438e-01 1.695e-01 4.977 6.46e-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: 1109.7 on 1462 degrees of freedom
## AIC: 1125.7
##
## Number of Fisher Scoring iterations: 5
Las variables incorporadas resultan significativas para el modelo, en una menor medidad el estar Divorciado.
A menor edad, antiguedad e ingreso mensual se aumenta la posibilidad de Rotacion.
El ser Hombre, hacer horas extras y ser soltero aumenta la posibilidad de Rotacion.
PUNTO 5
#CALCULO ROC Y AUC
# estimamos la probabilidad
rotacion_prob <- predict(mod_glm1, type = "response")
# Pintamos ROC of the stepwise model
library(pROC)
## Type 'citation("pROC")' for a citation.
##
## Attaching package: 'pROC'
## The following objects are masked from 'package:stats':
##
## cov, smooth, var
ROC <- roc(datos1$Rotacion, rotacion_prob)
## Setting levels: control = 0, case = 1
## Setting direction: controls < cases
plot(ROC, col = "blue")
auc(ROC)
## Area under the curve: 0.76
Bajo el criterio de AUC, se obtiene un modelo con caracteristicas adecuadas para predecir.
PUNTO 6
predict(mod_glm1,list(
Edad=34,
Antiguedad=6,
Ingreso_Mensual=2500,
Genero="M",
Horas_Extra="Si",
Estado_Civil="Soltero"),
interval="confidence",
level=0.95,
type = "response")
## 1
## 0.5580196
En el caso hipotetico evaluado se obtiene un probabilidad de 55% de Rotacion, por lo que se se considera un corte del 0.5, este empleado seria sujeto a intervenir su rotacion
PUNTO 7 Algunas estrategias: - Brindar planes de carrera a los mas jovenes - Bonos de antiguedad para estimular aquellos que permanecen en la empresa - reducir las horas extras