# Librerías necesarias
library(readxl)
library(psych)
require(ggplot2)
require(plotly)
require(CGPfunctions)
require(ggpubr)
# Cargue de los datos
rotacion <- read_excel("Datos_Rotacion.xlsx")
attach(rotacion)
#Exploración de indicadores estadísticos de los datos
summary(rotacion)
## Rotacion 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_Educacion 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 Antiguedad Antiguedad_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
describe(rotacion)
| vars | n | mean | sd | median | trimmed | mad | min | max | range | skew | kurtosis | se | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Rotacion* | 1 | 1470 | 1.161225 | 0.3678630 | 1 | 1.076531 | 0.0000 | 1 | 2 | 1 | 1.8406038 | 1.3887685 | 0.0095946 |
| Edad | 2 | 1470 | 36.923809 | 9.1353735 | 36 | 36.471088 | 8.8956 | 18 | 60 | 42 | 0.4124432 | -0.4103776 | 0.2382691 |
| Viaje de Negocios* | 3 | 1470 | 2.521088 | 0.7917401 | 3 | 2.651361 | 0.0000 | 1 | 3 | 2 | -1.2082798 | -0.3187275 | 0.0206502 |
| Departamento* | 4 | 1470 | 1.649660 | 0.9137684 | 1 | 1.562075 | 0.0000 | 1 | 3 | 2 | 0.7466022 | -1.3851156 | 0.0238329 |
| Distancia_Casa | 5 | 1470 | 9.192517 | 8.1068644 | 7 | 8.084184 | 7.4130 | 1 | 29 | 28 | 0.9561635 | -0.2319182 | 0.2114435 |
| Educación | 6 | 1470 | 2.912925 | 1.0241649 | 3 | 2.975340 | 1.4826 | 1 | 5 | 4 | -0.2890902 | -0.5646107 | 0.0267123 |
| Campo_Educacion* | 7 | 1470 | 3.113605 | 1.9451337 | 3 | 3.029762 | 2.9652 | 1 | 6 | 5 | 0.0542201 | -1.7062999 | 0.0507330 |
| Satisfacción_Ambiental | 8 | 1470 | 2.721769 | 1.0930822 | 3 | 2.777211 | 1.4826 | 1 | 4 | 3 | -0.3209983 | -1.2049578 | 0.0285098 |
| Genero* | 9 | 1470 | 1.600000 | 0.4900647 | 2 | 1.625000 | 0.0000 | 1 | 2 | 1 | -0.4078318 | -1.8349201 | 0.0127819 |
| Cargo* | 10 | 1470 | 5.061224 | 2.5366597 | 5 | 5.019558 | 2.9652 | 1 | 9 | 8 | 0.2682117 | -1.1774465 | 0.0661612 |
| Satisfación_Laboral | 11 | 1470 | 2.728571 | 1.1028461 | 3 | 2.785714 | 1.4826 | 1 | 4 | 3 | -0.3289995 | -1.2245363 | 0.0287645 |
| Estado_Civil* | 12 | 1470 | 1.861905 | 0.8712044 | 2 | 1.827381 | 1.4826 | 1 | 3 | 2 | 0.2703490 | -1.6301341 | 0.0227228 |
| Ingreso_Mensual | 13 | 1470 | 6502.931293 | 4707.9567831 | 4919 | 5667.240646 | 3260.2374 | 1009 | 19999 | 18990 | 1.3670224 | 0.9923007 | 122.7930538 |
| Trabajos_Anteriores | 14 | 1470 | 2.693197 | 2.4980090 | 2 | 2.361395 | 1.4826 | 0 | 9 | 9 | 1.0243772 | 0.0020117 | 0.0651531 |
| Horas_Extra* | 15 | 1470 | 1.282993 | 0.4506065 | 1 | 1.228741 | 0.0000 | 1 | 2 | 1 | 0.9625214 | -1.0742819 | 0.0117527 |
| Porcentaje_aumento_salarial | 16 | 1470 | 15.209524 | 3.6599377 | 14 | 14.801871 | 2.9652 | 11 | 25 | 14 | 0.8194530 | -0.3073229 | 0.0954586 |
| Rendimiento_Laboral | 17 | 1470 | 3.153742 | 0.3608235 | 3 | 3.067177 | 0.0000 | 3 | 4 | 1 | 1.9179623 | 1.6797233 | 0.0094110 |
| Años_Experiencia | 18 | 1470 | 11.279592 | 7.7807817 | 10 | 10.368197 | 5.9304 | 0 | 40 | 40 | 1.1148929 | 0.9057509 | 0.2029386 |
| Capacitaciones | 19 | 1470 | 2.799320 | 1.2892706 | 3 | 2.721088 | 1.4826 | 0 | 6 | 6 | 0.5519959 | 0.4844864 | 0.0336268 |
| Equilibrio_Trabajo_Vida | 20 | 1470 | 2.761224 | 0.7064758 | 3 | 2.769558 | 0.0000 | 1 | 4 | 3 | -0.5513533 | 0.4093130 | 0.0184263 |
| Antiguedad | 21 | 1470 | 7.008163 | 6.1265252 | 5 | 5.985544 | 4.4478 | 0 | 40 | 40 | 1.7609300 | 3.9086474 | 0.1597922 |
| Antiguedad_Cargo | 22 | 1470 | 4.229252 | 3.6231370 | 3 | 3.854592 | 4.4478 | 0 | 18 | 18 | 0.9154918 | 0.4669978 | 0.0944988 |
| Años_ultima_promoción | 23 | 1470 | 2.187755 | 3.2224303 | 1 | 1.482993 | 1.4826 | 0 | 15 | 15 | 1.9802422 | 3.5873464 | 0.0840475 |
| Años_acargo_con_mismo_jefe | 24 | 1470 | 4.123129 | 3.5681361 | 3 | 3.768708 | 4.4478 | 0 | 17 | 17 | 0.8317508 | 0.1620914 | 0.0930642 |
Seleccionar 3 variables categóricas (distintas de rotación) y 3 variables cuantitativas, que consideren estén relacionadas con la rotación. Nota: Justificar por que estas variables están relacionadas y que tipo de relación se espera (Hipótesis). Ejemplo: Se espera que las horas extra se relacionen con la rotación ya que las personas podrían desgastarse mas al trabajar horas extra y descuidan aspectos personales. La hipótesis es que las personas que trabajan horas extra tienen mayor posibilidad de rotar que las que no trabajan extra. (serian 6, una por variable).
Variables Categóricas \(\text{Equilibrio_Trabajo_Vida}\): Es posible que los empleados sientan insatisfacción laboral, personal y familiar, al no encontrar que la empresa brinde posibilidades de equilibrio entre estos factores . Hipótesis: Los empleados que muestran bajo nivel de equilibrio entre trabajo y vida, presentan mayor nivel de rotación.
\(\text{Campo_Educacion}\): Es posible que el campo de educación puede ser un factor de rotación pues el empleado puede estar ejerciendo un cargo no relevante para el área de conocimiento central de la empresa. Hipótesis: Los empleados con formación educativa no relacionada con el área de negocio de la empresa presentan mayor nivel de rotación.
\(\text{Estado_civil}\): Es posible que el estado civil constituya un factor de rotación, pues esta situación puede influir en la toma de decisiones laborales. Hipótesis: Los empelados solteros presentan mayor nivel de rotación.
Variables Cuantitativas \(\text{Ingreso_Mensual}\): El ingreso mensual probablemente sea una variable relacionada directamente con la rotación. Hipótesis: Empleados con ingresos bajos presentan mayor nivel de rotación.
\(\text{Antigüedad}\): Poco tiempo de antigüedad posiblemente no genere arraigo en la empresa, favoreciendo la rotación. Hipótesis: Empleados con menor antigüedad presentan mayor nivel de rotación.
\(\text{Edad}\): Posiblemente esta variable esté relacionada con la Rotación laboral pues para un empleado mas joven generalmente es mas fácil el cambio laboral . Hipótesis: Empleados con menor edad presentan mayor nivel de rotación.
Realizar un análisis univariado (caracterización). Nota: Los indicadores o gráficos se usan dependiendo del tipo de variable (cuantitativa o cualitativa). Incluir interpretaciones de la rotación.
VARIABLE: CARGO
g1=ggplot(rotacion,aes(x=`Equilibrio_Trabajo_Vida`))+geom_bar(fill = "#336699")+theme_bw()+theme(axis.text.x = element_text(angle = 90))
ggplotly(g1)
VARIABLE: CAMPO_EDUCACION
g2=ggplot(rotacion,aes(x=`Campo_Educacion`))+geom_bar(fill = "#336699")+theme_bw()+theme(axis.text.x = element_text(angle = 90))
ggplotly(g2)
VARIABLE: ESTADO_CIVIL
g3=ggplot(rotacion,aes(x=`Estado_Civil`))+geom_bar(fill = "#336699")+theme_bw()
ggplotly(g3)
VARIABLE: INGRESO MENSUAL
#g5=ggplot(rotacion,aes(x=`Ingreso_Mensual`))+geom_histogram(fill = "#336699")+theme_bw()
#ggplotly(g5)
hist(Ingreso_Mensual, probability=TRUE, breaks=32, col="#336699", ylab="Frecuencia", xlab="Ingreso_Mensual", main="Histograma Ingreso Mensual")
x = seq(min(Ingreso_Mensual), max(Ingreso_Mensual), length = 40)
f = dnorm(x, mean = mean(Ingreso_Mensual), sd = sd(Ingreso_Mensual))
lines(x,f, col="black", lwd=3)
l_media = mean(Ingreso_Mensual)
abline(v=l_media, col="red", lwd=3)
qqnorm(Ingreso_Mensual, main = "Ingreso Mensual", col = "blue")
qqline(Ingreso_Mensual)
ks.test(Ingreso_Mensual,pnorm, mean(Ingreso_Mensual), sd(Ingreso_Mensual))
##
## One-sample Kolmogorov-Smirnov test
##
## data: Ingreso_Mensual
## D = 0.16892, p-value < 2.2e-16
## alternative hypothesis: two-sided
VARIABLE: ANTIGÜEDAD
#g5=ggplot(rotacion,aes(x=`Antigüedad`))+geom_histogram(fill = "#336699")+theme_bw()
#ggplotly(g5)
hist(Antiguedad, probability=TRUE, breaks=32, col="#336699", ylab="Frecuencia", xlab="Antigüedad", main="Histograma Antigüedad")
x = seq(min(Antiguedad), max(Antiguedad), length = 40)
f = dnorm(x, mean = mean(Antiguedad), sd = sd(Antiguedad))
lines(x,f, col="black", lwd=3)
l_media = mean(Antiguedad)
abline(v=l_media, col="red", lwd=3)
qqnorm(Antiguedad, main = "Antigüedad", col = "blue")
qqline(Antiguedad)
ks.test(Antiguedad,pnorm, mean(Antiguedad), sd(Antiguedad))
##
## One-sample Kolmogorov-Smirnov test
##
## data: Antiguedad
## D = 0.15635, p-value < 2.2e-16
## alternative hypothesis: two-sided
VARIABLE: EDAD
g6=ggplot(rotacion,aes(x=`Edad`))+geom_histogram(fill = "#336699")+theme_bw()
ggplotly(g6)
hist(Edad, probability=TRUE, breaks=32, col="#336699", ylab="Frecuencia", xlab="Edad", main="Histograma Edad")
x = seq(min(Edad), max(Edad), length = 40)
f = dnorm(x, mean = mean(Edad), sd = sd(Edad))
lines(x,f, col="black", lwd=3)
l_media = mean(Edad)
abline(v=l_media, col="red", lwd=3)
qqnorm(Edad, main = "Edad", col = "blue")
qqline(Edad)
ks.test(Edad,pnorm, mean(Edad), sd(Edad))
##
## One-sample Kolmogorov-Smirnov test
##
## data: Edad
## D = 0.083131, p-value = 3e-09
## alternative hypothesis: two-sided
1.- Variable [Equilibrio_Trabajo_Vida]: El mayor grupo (893 empleados) califica con 3 la variable Equilibrio_Trabajo_Vida. Esta calificación se destaca entre el resto de valores calificados, es decir es dominante. 2.- Variable [Campo_Educación]: Los principales valores son Ciencias (606 empleados) y Salud (464 empleados). Es decir, estos son los campos de educación que mayor cantidad de empleados concentran; y permiten inferir que el área de negocio de la empresa esta en el Sector Salud. 3.- Variable [Estado_Civil]: El principal valor es Casado (673 empleados). Sin embargo, no es un valor notoriamente dominante. 4.- Variable [Ingreso_Mensual]: El promedio del Ingreso Mensual 6502.93 y la mediana es 4919. Se puede observar que estos parámetros no difieren mucho entre si. Por otro lado, se observa que el rango aproximado entre 1900 y 6500 de ingreso mensual, concentra la mayor parte de empleados. Sin embargo, la Desviación Estándar es alta presentando un valor de 4707.95; Se procedió a realizar un diagrama Q-Q de Normalidad y se obtuvo una distribución que se aleja notablemente de la Normal. Ante estos hallazgos, se ejecutó un test de normalidad de Kolmogorov-Smirnov dado que la muestra es mayor a 50, y se obtuvo un P-Valor que permite rechazar la Hipótesis Nula (\(H0\)) de normalidad y posiblemente la variable no es coherente con una Distribución Normal. 5.- Variable [Antigüedad]: El promedio es 7 años y la mediana es 5 años. Se puede observar que estos parámetros no difieren mucho entre si. Por otro lado, se observa que el rango aproximado entre 1 y 10 años de antigüedad, concentra la mayor parte de empleados. Sin embargo, la Desviación Estándar es alta con un valor de 6.12. Se procedió a realizar un diagrama Q-Q de Normalidad y se obtuvo una distribución que se aleja notablemente de la Normal. Ante estos hallazgos, se ejecutó un test de normalidad de Kolmogorov-Smirnov, y se obtuvo un P-Valor que permite rechazar la Hipótesis Nula (\(H0\)) de normalidad y posiblemente la variable no es coherente con una Distribución Normal. 6.- Variable [Edad]: El promedio es 36.92 años y la mediana es 36 años. Se puede observar que estos parámetros no difieren mucho entre si. Por otro lado, se observa que la Desviación Estándar es 9.13. Se procedió a realizar un diagrama Q-Q de Normalidad y se encontró que también se aleja de la Normal. Se ejecutó un test de normalidad de Kolmogorov-Smirnov, y se obtuvo un P-Valor que aunque es mas alto que en las variables anteriores, también permite rechazar la Hipótesis Nula (\(H0\)) de normalidad y posiblemente la variable no es coherente con una Distribución Normal
Realizar un análisis de bivariado en donde la variable respuesta sea la rotación codificada de la siguiente manera (y=1 es si rotación, y=0 es no rotación), con base en estos resultados identifique cuales son las variables determinantes de la rotación e interpretar el signo del coeficiente estimado. Compare estos resultados con la hipótesis planteada en el punto 2.
rotacion$Rotacion <- factor(ifelse(rotacion$Rotacion == "Si", 1, 0))
EQUILIBRIO_TRABAJO_VIDA vs ROTACION
gb1=PlotXTabs2(rotacion, `Equilibrio_Trabajo_Vida`, Rotacion, plottype="percent",x.axis.orientation="vertical")
gb1
CAMPO_EDUCACION vs ROTACION
gb2=PlotXTabs2(rotacion,`Campo_Educacion`,Rotacion,plottype="percent",x.axis.orientation="vertical")
gb2
ESTADO_CIVIL vs ROTACION
gb3=PlotXTabs2(rotacion,`Estado_Civil`,Rotacion,plottype="percent")
gb3
INGRESO_MENSUAL vs ROTACION
gb4 = ggplot(rotacion,aes(x=Rotacion,y= Ingreso_Mensual,fill=Rotacion))+geom_boxplot()+theme_bw()
ggplotly(gb4)
ANTIGÛEDAD vs ROTACION
gb5 = ggplot(rotacion,aes(x=Rotacion,y= Antiguedad,fill=Rotacion))+geom_boxplot()+theme_bw()
ggplotly(gb5)
EDAD vs ROTACION
gb6 = ggplot(rotacion,aes(x=Rotacion,y=Edad,fill=Rotacion))+geom_boxplot()+theme_bw()
ggplotly(gb6)
1.- Variables Equilibrio_trabajo_Vida y Rotación: Se observa que el resultado apoya la hipótesis, pues empelados que indican bajo nivel en el equilibrio entre Trabajo y Vida son los que presentan mayor rotación. 2.- Variables Campo_Educación y Rotación: Se observa que el resultado apoya la hipótesis, pues los campos de formación educativa que mas presentan rotación son Humanidades, Mercadeo y Técnico. 3.- Variables Estado_Civil y Rotación: Se observa que el resultado apoya la hipótesis, pues los empleados solteros presentan mas rotación que los casados y divorciados. 4.- Variables Ingreso_Mensual y Rotación: Se observa que el resultado apoya la hipótesis, pues los empleados con salarios mas bajos presenta mayor rotación. 5.- Variables Antigüedad y Rotación: Se observa que el resultado apoya la hipótesis, pues los empleados con menor antigüedad son los que presentan mayor rotación. 6.- Variables Edad y Rotación: Se observa que el resultado apoya la hipótesis, pues los empleados con menor edad son los que presentan mayor rotación.
Realizar la estimación de un modelo de regresión logístico en el cual la variable respuesta es rotación (y=1 es si rotación, y=0 es no rotación) y las covariables las 6 seleccionadas. Interprete los coeficientes del modelo y la significancia de los parámetros.
A continuación, se plantea el modelo de regresión generalizado con las variables anteriormente analizadas.
modelo_rot=glm(Rotacion~Ingreso_Mensual+Antiguedad+Edad+Equilibrio_Trabajo_Vida+Campo_Educacion+Estado_Civil,data = rotacion,family = binomial(link="logit"))
summary(modelo_rot)
##
## Call:
## glm(formula = Rotacion ~ Ingreso_Mensual + Antiguedad + Edad +
## Equilibrio_Trabajo_Vida + Campo_Educacion + Estado_Civil,
## family = binomial(link = "logit"), data = rotacion)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -1.2385 -0.6256 -0.4731 -0.3004 2.9244
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 2.274e-01 4.491e-01 0.506 0.61257
## Ingreso_Mensual -7.217e-05 2.602e-05 -2.774 0.00555 **
## Antiguedad -4.107e-02 1.849e-02 -2.221 0.02633 *
## Edad -2.532e-02 9.655e-03 -2.622 0.00874 **
## Equilibrio_Trabajo_Vida -2.654e-01 1.027e-01 -2.585 0.00974 **
## Campo_EducacionHumanidades 1.038e+00 4.764e-01 2.178 0.02938 *
## Campo_EducacionMercadeo 6.831e-01 2.352e-01 2.904 0.00368 **
## Campo_EducacionOtra -1.333e-01 3.535e-01 -0.377 0.70600
## Campo_EducacionSalud -1.033e-01 1.846e-01 -0.559 0.57592
## Campo_EducacionTecnicos 5.863e-01 2.458e-01 2.385 0.01708 *
## Estado_CivilDivorciado -2.448e-01 2.222e-01 -1.102 0.27068
## Estado_CivilSoltero 8.100e-01 1.645e-01 4.925 8.43e-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: 1176.4 on 1458 degrees of freedom
## AIC: 1200.4
##
## Number of Fisher Scoring iterations: 5
Los resultados son coherentes con el análisis previo, pues muestran que las variables son significativas y tienen peso en el modelo. Por otro lado, dentro de las variables categóricas Campo_Educacion y Estado_Civil, algunas categorías presentan mayor significancia como era lo previsible (Campo_Educación-Humanidades,Campo_Educacion-Mercadeo,Campo_Educacion-Tecnicos,Estado_Civil-Soltero) El modelo y significancia de las variables, confirman las hipótesis planteadas.
Evaluar el poder predictivo del modelo con base en la curva ROC y el AUC. El Análisis ROC (Receiver Operating Characteristic - Característica Operativa del Receptor) permite evaluar el poder predictivo del modelo, mediante la observación de la sensibilidad frente a la especificidad de una prueba de clasificación. El Área bajo la Curva (AUC -Area Under Curve-) aporta un “valioso indicador estadístico que representa la probabilidad de que la predicción esté en el orden correcto cuando se observa una variable de prueba”.[1][2]
library(pROC)
predic_modrot=predict(modelo_rot,list(Ingreso_Mensual=rotacion$Ingreso_Mensual, Antiguedad=rotacion$ Antiguedad,Edad=rotacion$Edad,Equilibrio_Trabajo_Vida=rotacion$Equilibrio_Trabajo_Vida,Campo_Educacion=rotacion$Campo_Educacion, Estado_Civil=rotacion$Estado_Civil),type = "response")
ROC_modrot=roc(rotacion$Rotacion~predic_modrot, percent = T, ci=T)
ROC_modrot
##
## Call:
## roc.formula(formula = rotacion$Rotacion ~ predic_modrot, percent = T, ci = T)
##
## Data: predic_modrot in 1233 controls (rotacion$Rotacion 0) < 237 cases (rotacion$Rotacion 1).
## Area under the curve: 71.12%
## 95% CI: 67.34%-74.9% (DeLong)
plot(ROC_modrot,print.auc=T,print.thres = "best",col="red"
,xlab = "Specificity", ylab = "Sensitivity")
Los resultados de la curva ROC indica que el modelo tiene un poder predictivo de aproximadamente el 71.1% de clasificar correctamente la Rotación para un determinado individuo con las variables predictorias elegidas.
Predecir la probabilidad de que un individuo (hipotético) rote y defina un corte para decidir si se debe intervenir a este empleado o no (posible estrategia para motivar al empleado).
Para este ejercicio se establece el punto de corte en 0.5. A continuación, se plantean valores para el modelo, con el fin de predecir la probabilidad de Rotación para un empleado con determinadas características.
# EMPLEADO # 1
predict(modelo_rot,list(Ingreso_Mensual=2500,Antiguedad=2, Edad=23, Equilibrio_Trabajo_Vida=1,Campo_Educacion="Humanidades",Estado_Civil="Soltero"),type="response")
## 1
## 0.7240859
# EMPLEADO # 2
predict(modelo_rot,list(Ingreso_Mensual=6000,Antiguedad=2, Edad=27, Equilibrio_Trabajo_Vida=1,Campo_Educacion="Salud",Estado_Civil="Soltero"),type="response")
## 1
## 0.3705249
# EMPLEADO # 3
predict(modelo_rot,list(Ingreso_Mensual=2000,Antiguedad=2, Edad=20, Equilibrio_Trabajo_Vida=1,Campo_Educacion="Tecnicos",Estado_Civil="Soltero"),type="response")
## 1
## 0.6514712
De acuerdo con los resultados obtenidos: La probabilidad de rotación para el Empleado #1 es del 72.4%. Lo que implica que empleados con similares características, pueden ser objeto de atención y mejora de condiciones laborales La probabilidad de rotación para el Empleado #2 es del 37%. Lo que implica que empleados con similares características, por el momento no requieren atención especial La probabilidad de rotación para el Empleado #3 es del 65.14%. Lo que implica que empleados con similares características, pueden ser objeto de atención y mejora de condiciones laborales
En las conclusiones se discute sobre cual sería la estrategia para disminuir la rotación en la empresa (con base en las variables que resultaron significativas en el punto 3). Ejemplo: Mejorar el ambiente laboral, los incentivos económicos, distribuir la carga de horas extra (menos turnos y mas personal). De acuerdo con los resultados del modelo de regresión planteado, a continuación se propone las siguientes recomendaciones para evitar la Rotación en la empresa: 1.- Distribuir las jornadas laborales, posiblemente mediante la implementación de teletrabajo, de tal modo que se mejore el Equilibrio entre Trabajo y Vida. 2.- Diseñar programas especiales (Torneos Deportivos, comisiones, visitas técnicas a empresas externas, etc) e incentivos laborales (Capacitación y formación) para los empleados jóvenes. 3.- Resaltar y promover la importancia del trabajo de empleados de las áreas Humanidades, Mercadeo y Técnicos. Proveer para ellos incentivos y propuestas encaminadas a mejorar el ambiente laboral.
Con base en los datos de créditos proponga un modelo de regresión logístico múltiple que permita predecir el riesgo de default en función de las covariables que considere importantes y seleccionándolas de acuerdo con un proceso adecuado. Tenga en cuenta realizar una evaluación de la significancia de los parámetros, interpretación y proponga un método de evaluación por medio de validación cruzada. Presente métricas apropiadas como el AUC y la curva ROC.
# Cargue de los datos
creditos <- read_excel("Datos_Creditos.xlsx")
attach(creditos)
# Exploración de los indicadores estadísticos de los datos
summary(creditos)
## DEFAULT ANTIGUEDAD EDAD CUOTA_TOTAL
## Min. :0.00 Min. : 0.2548 Min. :26.61 Min. : 387
## 1st Qu.:0.00 1st Qu.: 7.3767 1st Qu.:48.18 1st Qu.: 328516
## Median :0.00 Median :15.1192 Median :57.92 Median : 694460
## Mean :0.05 Mean :18.0353 Mean :56.99 Mean : 885206
## 3rd Qu.:0.00 3rd Qu.:30.6637 3rd Qu.:66.19 3rd Qu.:1244126
## Max. :1.00 Max. :37.3178 Max. :92.43 Max. :6664588
## INGRESOS
## Min. : 633825
## 1st Qu.: 3583324
## Median : 5038962
## Mean : 5366430
## 3rd Qu.: 6844098
## Max. :22197021
describe(creditos)
| vars | n | mean | sd | median | trimmed | mad | min | max | range | skew | kurtosis | se | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| DEFAULT | 1 | 780 | 5.000000e-02 | 2.180848e-01 | 0.000000e+00 | 0.000000e+00 | 0.000000e+00 | 0.000000e+00 | 1.000000e+00 | 1.000000e+00 | 4.1215444 | 15.0063725 | 7.808700e-03 |
| ANTIGUEDAD | 2 | 780 | 1.803525e+01 | 1.193930e+01 | 1.511918e+01 | 1.763579e+01 | 1.478538e+01 | 2.547945e-01 | 3.731781e+01 | 3.706301e+01 | 0.2911285 | -1.3953827 | 4.274956e-01 |
| EDAD | 3 | 780 | 5.698502e+01 | 1.250531e+01 | 5.791918e+01 | 5.720743e+01 | 1.357493e+01 | 2.661370e+01 | 9.243288e+01 | 6.581918e+01 | -0.1201768 | -0.5559846 | 4.477619e-01 |
| CUOTA_TOTAL | 4 | 780 | 8.852059e+05 | 7.402123e+05 | 6.944605e+05 | 7.881392e+05 | 6.726245e+05 | 3.870000e+02 | 6.664588e+06 | 6.664201e+06 | 1.5794364 | 5.1862069 | 2.650385e+04 |
| INGRESOS | 5 | 780 | 5.366430e+06 | 2.652186e+06 | 5.038962e+06 | 5.149139e+06 | 2.399040e+06 | 6.338250e+05 | 2.219702e+07 | 2.156320e+07 | 1.6428550 | 6.4598838 | 9.496349e+04 |
creditos$DEFAULT = as.factor(creditos$DEFAULT)
La variable DEFAULT indica si una personas a la que se le ha otorgado un crédito presenta o ha presentado una mora en su obligación crediticia. Así pues, la variable DEFAULT adquiere los valores 1 (Mora) y 0 (Cumple). A continuación se presenta el análisis bivariado de la variable DEFAULT versus las otras variables de la data
ANTIGUEDAD vs DEFAULT
gc1 = ggplot(creditos,aes(x=DEFAULT,y= ANTIGUEDAD,fill=DEFAULT))+geom_boxplot()+theme_bw()
ggplotly(gc1)
creditos$ANTIGUEDAD=cut(creditos$ANTIGUEDAD,breaks=c(0,5,10,15,20,25,30,35,40))
PlotXTabs2(data=creditos,x="ANTIGUEDAD",y="DEFAULT")
EDAD vs DEFAULT
gc1 = ggplot(creditos,aes(x=DEFAULT,y=EDAD,fill=DEFAULT))+geom_boxplot()+theme_bw()
ggplotly(gc1)
creditos$EDAD=cut(creditos$EDAD,breaks = c(0,10,20,30,40,50,60,70,80,90,100))
PlotXTabs2(data=creditos,x="EDAD",y="DEFAULT")
CUOTA TOTAL vs DEFAULT
gc1 = ggplot(creditos,aes(x=DEFAULT,y=CUOTA_TOTAL,fill=DEFAULT))+geom_boxplot()+theme_bw()
ggplotly(gc1)
INGRESOS vs DEFAULT
gc1 = ggplot(creditos,aes(x=DEFAULT,y=INGRESOS,fill=DEFAULT))+geom_boxplot()+theme_bw()
ggplotly(gc1)
De acuerdo con la exploración gráfica de las variables, todas se traslapan notablemente y no es muy evidente su comportamiento frente a la VARIABLE respuesta DEFAULT. Quizá se observa sutilmente que la variable CUOTA_TOTAL presenta mayor DEFAULT a medida que es mas grande la cuota. Tambien se observa que existen rangos de edad que no presentan DEFAULT (20-30 años y 80 a 100 años)
MATRIZ DE CORRELACIONES Para complementar el análisis gráfico, a continuacion se plantea una matriz para observar el nivel de correlación entre las distintas variables predictoras y la variable respuesta.
library(GGally)
datos_subcred <- transform(creditos,ANTIGUEDAD=as.numeric(ANTIGUEDAD),EDAD=as.numeric(EDAD),CUOTA_TOTAL=as.numeric(CUOTA_TOTAL),INGRESOS=as.numeric(INGRESOS),DEFAULT=as.numeric(DEFAULT))
round(cor(x = datos_subcred, method = "pearson"), 3)
## DEFAULT ANTIGUEDAD EDAD CUOTA_TOTAL INGRESOS
## DEFAULT 1.000 -0.074 -0.035 0.097 -0.062
## ANTIGUEDAD -0.074 1.000 0.733 0.270 0.476
## EDAD -0.035 0.733 1.000 0.157 0.356
## CUOTA_TOTAL 0.097 0.270 0.157 1.000 0.361
## INGRESOS -0.062 0.476 0.356 0.361 1.000
ggpairs(datos_subcred, lower = list(continuous = "smooth"),
diag = list(continuous = "barDiag"), axisLabels = "none")
#correlacion<-cor(creditos)
#correlacion
Según el resultado obtenido, el coeficiente de correlación \(R\) tampoco es muy notable entre las variables. Sin embargo, es necesario considerar que la variable respuesta es de naturaleza categórica y el modelo de regresión es de tipo logístico, que estimará una probabilidad de clasificación frente a la variable respuesta.
A continuación se plantea el modelo de regresión generalizado para las variables analizadas anteriormente.
modelo_cred=glm(DEFAULT~ANTIGUEDAD+EDAD+CUOTA_TOTAL+INGRESOS,data=creditos,family = binomial(link="logit"))
summary(modelo_cred)
##
## Call:
## glm(formula = DEFAULT ~ ANTIGUEDAD + EDAD + CUOTA_TOTAL + INGRESOS,
## family = binomial(link = "logit"), data = creditos)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -1.1266 -0.3624 -0.2645 -0.1585 3.1255
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -1.825e+01 2.649e+03 -0.007 0.9945
## ANTIGUEDAD(5,10] -3.011e-01 5.004e-01 -0.602 0.5473
## ANTIGUEDAD(10,15] -7.550e-01 5.807e-01 -1.300 0.1935
## ANTIGUEDAD(15,20] -1.781e+00 8.755e-01 -2.034 0.0420 *
## ANTIGUEDAD(20,25] -1.190e+00 8.769e-01 -1.357 0.1749
## ANTIGUEDAD(25,30] -1.636e+01 8.463e+02 -0.019 0.9846
## ANTIGUEDAD(30,35] -1.190e+00 8.643e-01 -1.377 0.1686
## ANTIGUEDAD(35,40] -1.019e+00 1.019e+00 -1.000 0.3172
## EDAD(30,40] 1.592e+01 2.649e+03 0.006 0.9952
## EDAD(40,50] 1.588e+01 2.649e+03 0.006 0.9952
## EDAD(50,60] 1.673e+01 2.649e+03 0.006 0.9950
## EDAD(60,70] 1.622e+01 2.649e+03 0.006 0.9951
## EDAD(70,80] 1.668e+01 2.649e+03 0.006 0.9950
## EDAD(80,90] 1.400e+00 3.103e+03 0.000 0.9996
## EDAD(90,100] 7.642e-01 5.304e+03 0.000 0.9999
## CUOTA_TOTAL 1.015e-06 2.547e-07 3.986 6.71e-05 ***
## INGRESOS -2.603e-07 1.077e-07 -2.417 0.0157 *
## ---
## 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: 275.18 on 763 degrees of freedom
## AIC: 309.18
##
## Number of Fisher Scoring iterations: 17
De acuerdo con los resultados, las variables que tienen significancia en el modelos son ANTIGÜEDAD, CUOTA TOTAL E INGRESOS. La EDAD no tiene peso significativo en el modelo. Asi pues a continuacion se plantea un modelo mejorado
mod_cred_v = step(modelo_cred)
## Start: AIC=309.18
## DEFAULT ~ ANTIGUEDAD + EDAD + CUOTA_TOTAL + INGRESOS
##
## Df Deviance AIC
## - EDAD 7 281.45 301.45
## - ANTIGUEDAD 7 286.16 306.16
## <none> 275.18 309.18
## - INGRESOS 1 281.98 313.98
## - CUOTA_TOTAL 1 291.49 323.49
##
## Step: AIC=301.45
## DEFAULT ~ ANTIGUEDAD + CUOTA_TOTAL + INGRESOS
##
## Df Deviance AIC
## - ANTIGUEDAD 7 291.37 297.37
## <none> 281.45 301.45
## - INGRESOS 1 287.38 305.38
## - CUOTA_TOTAL 1 297.94 315.94
##
## Step: AIC=297.37
## DEFAULT ~ CUOTA_TOTAL + INGRESOS
##
## Df Deviance AIC
## <none> 291.37 297.37
## - INGRESOS 1 303.62 307.62
## - CUOTA_TOTAL 1 306.24 310.24
De acuerdo con los resultados el modelo mejorado, incorpora los predictores INGRESOS y CUOTA TOTAL como los que tiene realmente peso significativo en el comportamiento de la variable respuesta DEFAULT. Así pues, el modelo mejorado queda del siguiente modo:
modelo_cred_1=glm(DEFAULT~CUOTA_TOTAL+INGRESOS,data=creditos,family = binomial(link="logit"))
summary(modelo_cred_1)
##
## Call:
## glm(formula = DEFAULT ~ CUOTA_TOTAL + INGRESOS, family = binomial(link = "logit"),
## data = creditos)
##
## 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.353e+00 3.966e-01 -5.933 2.97e-09 ***
## CUOTA_TOTAL 9.341e-07 2.404e-07 3.885 0.000102 ***
## INGRESOS -3.134e-07 1.005e-07 -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
A continuación se evalua el poder predictivo mediante la estimación de la Curva ROC y el área bajo la curva (AUC).
predic_modcred=predict(modelo_cred_1,list(CUOTA_TOTAL=creditos$CUOTA_TOTAL, INGRESOS=creditos$INGRESOS),type = "response")
ROC_modcred=roc(creditos$DEFAULT~predic_modcred, percent = T, ci=T)
ROC_modcred
##
## Call:
## roc.formula(formula = creditos$DEFAULT ~ predic_modcred, percent = T, ci = T)
##
## Data: predic_modcred in 741 controls (creditos$DEFAULT 0) < 39 cases (creditos$DEFAULT 1).
## Area under the curve: 67.91%
## 95% CI: 58.77%-77.05% (DeLong)
plot(ROC_modcred,print.auc=T,print.thres = "best",col="red"
,xlab = "Specificity", ylab = "Sensitivity")
De acuerdo con los resultados obtenidos con el análisis ROC, el modelo tiene un poder predictivo de aproximadamente el 67.9% de clasificar correctamente el DEFAULT para un cliente, con las variables predictoras elegidas.
Para este ejercicio se establece el punto de corte en 0.2, como un valor que vamos a suponer que el Banco asume como máximo riesgo razonable; es decir que a un cliente con una probabilidad superior al 20% de entrar en DEFAULT en algún momento, NO se le otorga un crédito. A continuación, se plantean valores para el modelo:
# CLIENTE # 1
predict(modelo_cred_1,list(CUOTA_TOTAL=2300000, INGRESOS=4500000),type="response")
## 1
## 0.165904
# CLIENTE # 2
predict(modelo_cred_1,list(CUOTA_TOTAL=2700000, INGRESOS=4000000),type="response")
## 1
## 0.2526439
# CLIENTE # 3
predict(modelo_cred_1,list(CUOTA_TOTAL=900000, INGRESOS=1600000),type="response")
## 1
## 0.1177635
Así pues, de acuerdo con los resultados obtenidos, al CLIENTE #2 no es recomendable otorgarle un crédito que tenga una CUOTA TOTAL = 2700000.
[1] IBM. 2021. “Análisis ROC”. Recurso disponible en: https://www.ibm.com/docs/es/spss-statistics/beta?topic=features-roc-analysis. Consultado en octubre de 2022. [2] Hospital Universitario Ramón y Cajal.Comunidad de Madrid. 2022. “Curvas ROC”. Recurso disponible en: http://www.hrc.es/bioest/roc_1.html. Consultado en octubre de 2022.