library(readxl)
Datos_Rotacion<- read_excel("C:/Users/asus/Desktop/talleres/Datos_Rotacion.xlsx")
View(Datos_Rotacion)
Datos_Rotacion$Rotación <- factor(ifelse(Datos_Rotacion$Rotación == "Si", 1, 0))
head(Datos_Rotacion$Rotación)
## [1] 1 0 1 0 0 0
## Levels: 0 1
data.frame(table(Datos_Rotacion$Horas_Extra))
## Var1 Freq
## 1 No 1054
## 2 Si 416
require(CGPfunctions)
## Loading required package: CGPfunctions
PlotXTabs2(data = Datos_Rotacion,x = "Horas_Extra",y="Rotación")
En la tabla se observa que el total de personas que si realizan horas extras asciende a (416), es decir el 28.3% de las personas de la empresa, y de ellas el 31% si rotan.
data.frame(table(Datos_Rotacion$Genero))
## Var1 Freq
## 1 F 588
## 2 M 882
PlotXTabs2(data = Datos_Rotacion,x = "Genero",y="Rotación")
En la tabla se observa que el total de personas de género femenino es de
588, es decir el 40% del total de empleados de la empresa, y el 15% de
ellas rota.
data.frame(table(Datos_Rotacion$Estado_Civil))
## Var1 Freq
## 1 Casado 673
## 2 Divorciado 327
## 3 Soltero 470
PlotXTabs2(data = Datos_Rotacion,x = "Estado_Civil",y="Rotación")
En la tabla se observa que 673 personas son casadas, es decir el 45.8%, 327 personas son divorciadas 22.2% y 32% son solteros, de los cuales el 26% rotan.
Datos_Rotacion$Ingreso_Mensual2=Datos_Rotacion$Ingreso_Mensual/1000
Datos_Rotacion$Ingreso_rango=cut(Datos_Rotacion$Ingreso_Mensual2,breaks = c(0,5,10,15,20))
data.frame(table(Datos_Rotacion$Ingreso_rango))
## Var1 Freq
## 1 (0,5] 749
## 2 (5,10] 440
## 3 (10,15] 148
## 4 (15,20] 133
PlotXTabs2(data = Datos_Rotacion,x = "Ingreso_rango",y="Rotación")
El rango de ingreso se observa que a menor salario mayor rotación.
Datos_Rotacion$Edad_rango=cut(Datos_Rotacion$Edad,breaks = c(0,20,40,60))
data.frame(table(Datos_Rotacion$Edad_rango))
## Var1 Freq
## 1 (0,20] 28
## 2 (20,40] 977
## 3 (40,60] 465
PlotXTabs2(data = Datos_Rotacion,x = "Edad_rango",y="Rotación")
Se observa que la edad en que más rotación es de 0 a 20 con un 57%.
Datos_Rotacion$Años_Experiencia_rango=cut(Datos_Rotacion$Años_Experiencia,breaks = c(0,5,10,15,20,25,30,35,40))
data.frame(table(Datos_Rotacion$Años_Experiencia_rango))
## Var1 Freq
## 1 (0,5] 305
## 2 (5,10] 607
## 3 (10,15] 191
## 4 (15,20] 149
## 5 (20,25] 109
## 6 (25,30] 52
## 7 (30,35] 33
## 8 (35,40] 13
PlotXTabs2(data = Datos_Rotacion,x = "Años_Experiencia_rango",y="Rotación")
Se observa que la mayor rotación se encuentra entre 0 a 5 años de experiencia con un 28%.
mod1=glm(Rotación~Horas_Extra+Genero+Estado_Civil+Ingreso_rango+Edad_rango+
Años_Experiencia_rango,data = Datos_Rotacion,family = "binomial")
summary(mod1)
##
## Call:
## glm(formula = Rotación ~ Horas_Extra + Genero + Estado_Civil +
## Ingreso_rango + Edad_rango + Años_Experiencia_rango, family = "binomial",
## data = Datos_Rotacion)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -1.7006 -0.5837 -0.4023 -0.2757 2.9230
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -1.11267 0.52988 -2.100 0.03574 *
## Horas_ExtraSi 1.47221 0.15893 9.263 < 2e-16 ***
## GeneroM 0.25414 0.16156 1.573 0.11572
## Estado_CivilDivorciado -0.30211 0.22787 -1.326 0.18491
## Estado_CivilSoltero 0.81795 0.17374 4.708 2.5e-06 ***
## Ingreso_rango(5,10] -0.53463 0.21097 -2.534 0.01127 *
## Ingreso_rango(10,15] -0.07875 0.37698 -0.209 0.83453
## Ingreso_rango(15,20] -1.47623 0.66429 -2.222 0.02627 *
## Edad_rango(20,40] -0.82496 0.51912 -1.589 0.11202
## Edad_rango(40,60] -0.94472 0.55533 -1.701 0.08891 .
## Años_Experiencia_rango(5,10] -0.53603 0.20699 -2.590 0.00961 **
## Años_Experiencia_rango(10,15] -0.50208 0.30416 -1.651 0.09879 .
## Años_Experiencia_rango(15,20] -1.03701 0.35323 -2.936 0.00333 **
## Años_Experiencia_rango(20,25] -0.72444 0.56659 -1.279 0.20104
## Años_Experiencia_rango(25,30] -1.27088 0.87407 -1.454 0.14595
## Años_Experiencia_rango(30,35] -0.63035 0.79550 -0.792 0.42813
## Años_Experiencia_rango(35,40] 0.33407 0.96524 0.346 0.72927
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 1278.2 on 1458 degrees of freedom
## Residual deviance: 1088.8 on 1442 degrees of freedom
## (11 observations deleted due to missingness)
## AIC: 1122.8
##
## Number of Fisher Scoring iterations: 6
Se observa que las variables Horas_ extrasSi, Estado_civil_Soltero, años de experiencia_rango 5_10 y de 15_20 son significativas para el modelo y logran brindar una explicación de la variable respuesta rotación. Mientras que la variable género no brindan valor dentro del modelo.
Hipótesis Cualitativas Hipótesis 1 : Se evidencia que las personas que realizan horas extras son más propensas a rotar. Hipótesis 2 : Las personas de género masculino rotan más, pero no es significativo en el modelo. Hipótesis 3 : Se observa que las personas solteras rotan más.
Hipótesis Cuantitativas
Hipótesis 4 : En general se comprueba la hipótesis que a mayor salario menor rotación, pero es más significativo en los grupos (5,10] y (15,20] (millones). Hipótesis 5 : En general se comprueba la hipótesis que a mayor edad menor rotación, pero no son significativas en el modelo. Hipótesis 6 : En general se comprueba la hipótesis que a mayor años de experiencia menor rotación, pero solo son significativos en el modelo los rangos de (5,10] y (15,20].
exp(mod1$coefficients)
## (Intercept) Horas_ExtraSi
## 0.3286794 4.3588787
## GeneroM Estado_CivilDivorciado
## 1.2893475 0.7392597
## Estado_CivilSoltero Ingreso_rango(5,10]
## 2.2658405 0.5858860
## Ingreso_rango(10,15] Ingreso_rango(15,20]
## 0.9242702 0.2284967
## Edad_rango(20,40] Edad_rango(40,60]
## 0.4382522 0.3887886
## Años_Experiencia_rango(5,10] Años_Experiencia_rango(10,15]
## 0.5850661 0.6052688
## Años_Experiencia_rango(15,20] Años_Experiencia_rango(20,25]
## 0.3545122 0.4845980
## Años_Experiencia_rango(25,30] Años_Experiencia_rango(30,35]
## 0.2805844 0.5324059
## Años_Experiencia_rango(35,40]
## 1.3966361
Según los coeficientes del modelo, aquellos empleados que han tenido horas extras tienen una mayor posibilidad de aumentar su rotación en 4.6%, mientras que los empelados solteros su probabilidad es del 2,2% de rotar. También, los empleados con un rango de experiencia de entre los 35 y 40 años tienen 1,39% posibilidad de rotar más que los empleados con años de experiencia entre los 5 y 10 años.
modelo_rotacion_b=glm(Rotación~Horas_Extra+Genero+Estado_Civil+
Años_Experiencia_rango,data = Datos_Rotacion,family = "binomial"(link="logit"))
summary(modelo_rotacion_b)
##
## Call:
## glm(formula = Rotación ~ Horas_Extra + Genero + Estado_Civil +
## Años_Experiencia_rango, family = binomial(link = "logit"),
## data = Datos_Rotacion)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -1.4723 -0.5914 -0.3973 -0.2800 2.9141
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -1.8782 0.2108 -8.909 < 2e-16 ***
## Horas_ExtraSi 1.4626 0.1571 9.308 < 2e-16 ***
## GeneroM 0.2232 0.1601 1.395 0.163121
## Estado_CivilDivorciado -0.3033 0.2274 -1.334 0.182244
## Estado_CivilSoltero 0.8632 0.1698 5.085 3.68e-07 ***
## Años_Experiencia_rango(5,10] -0.8445 0.1823 -4.634 3.59e-06 ***
## Años_Experiencia_rango(10,15] -0.8834 0.2668 -3.311 0.000931 ***
## Años_Experiencia_rango(15,20] -1.3474 0.3139 -4.293 1.76e-05 ***
## Años_Experiencia_rango(20,25] -1.5642 0.3864 -4.048 5.16e-05 ***
## Años_Experiencia_rango(25,30] -2.2731 0.7462 -3.046 0.002317 **
## Años_Experiencia_rango(30,35] -1.4200 0.6444 -2.204 0.027555 *
## Años_Experiencia_rango(35,40] -0.9071 0.8366 -1.084 0.278242
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 1278.2 on 1458 degrees of freedom
## Residual deviance: 1104.4 on 1447 degrees of freedom
## (11 observations deleted due to missingness)
## AIC: 1128.4
##
## Number of Fisher Scoring iterations: 5
prediccion1= predict(modelo_rotacion_b,list( Horas_Extra=Datos_Rotacion$Horas_Extra, Estado_Civil=Datos_Rotacion$Estado_Civil, Años_Experiencia_rango = Datos_Rotacion$Años_Experiencia_rango, Genero = Datos_Rotacion$Genero ),type = "response")
require(pROC)
ROC_rotacion= roc(Datos_Rotacion$Rotación~prediccion1, percent = T, ci=T)
ROC_rotacion
##
## Call:
## roc.formula(formula = Datos_Rotacion$Rotación ~ prediccion1, percent = T, ci = T)
##
## Data: prediccion1 in 1227 controls (Datos_Rotacion$Rotación 0) < 232 cases (Datos_Rotacion$Rotación 1).
## Area under the curve: 74.82%
## 95% CI: 71.17%-78.47% (DeLong)
plot(ROC_rotacion,print.auc=T,print.thres = "best",col="red"
,xlab = "Specificity", ylab = "Sensitivity")
La curva ROC para el modelo indica que este modelo tiene un buen poder discriminatorio, puesto que el trazo es cercano a la línea horizontal, de hecho el área bajo la curva (AUROC) es 0,74.
Realiza horas extras. Género masculino. Soltero. Rango de ingreso (5,10]. Rango de edad (20,40]. *Rango Años de experiencia (5,10].
(predict(modelo_rotacion_b,list(Horas_Extra ="Si", Genero="M",Estado_Civil="Soltero",Ingreso_rango= "(5,10]", Edad_rango = "(20,40]", Años_Experiencia_rango = "(5,10]"),type = "response"))*100
## 1
## 45.66864
Una empleado con las caracteristica anteriores tiene la probabilidad de rotar un 45.6%.
Como estrategia para disminuir la rotación del personal de la compañía se podría plantear disminuir las horas extras de los trabajadores o distribuirlas más equitativamente, para que un empleado no quede sobre cargado de turnos. Tambièn, para evitar que las personas solteras renuncien a la empresa, esta última tiene que tener en consideración las necesidades de este grupo de personas. Primero, debe implementar políticas igualitarias, tanto para casados como para solteros, pues la expectativa de que los solteros deben trabajar más que sus compañeros con pareja, puede desincentivar su compromiso con la compañía. Además, es necesario que la compañía incentive a los solteros, reconociendo sus habilidades y proyecciones. Así mismo, podría incentivar la comunicación y la interacción entre los empleados para que e generen lazos laborales y con ello sentido de pertenencia, lo cual favorece la permanencia en la empresa. Adicionalmente, para evitar que quienes tienen menos años en la compañía roten más, la empresa podría emplear incentivos por antigüedad. Es decir, incentivos que demuestren lo valioso que es hacer carrera en la empresa, puede ir desde ascensos o mejores salarios. Esto mantendrá motivado al colaborador, sintiéndose parte de la empresa y verá un crecimiento en su vida profesional
library(readxl)
library(readxl)
datos_creditos <- read_excel("Datos_Creditos.xlsx",
col_types = c("numeric", "numeric", "numeric",
"numeric", "numeric"))
View(datos_creditos)
datos_creditos$DEFAULT = as.factor(datos_creditos$DEFAULT)
summary(datos_creditos)
## DEFAULT ANTIUEDAD EDAD CUOTA_TOTAL INGRESOS
## 0:741 Min. : 0.2548 Min. :26.61 Min. : 387 Min. : 633825
## 1: 39 1st Qu.: 7.3767 1st Qu.:48.18 1st Qu.: 328516 1st Qu.: 3583324
## Median :15.1192 Median :57.92 Median : 694460 Median : 5038962
## Mean :18.0353 Mean :56.99 Mean : 885206 Mean : 5366430
## 3rd Qu.:30.6637 3rd Qu.:66.19 3rd Qu.:1244126 3rd Qu.: 6844098
## Max. :37.3178 Max. :92.43 Max. :6664588 Max. :22197021
Se puede observar que el dataset cuenta con (5) variables. Default (entre 1 y 0) muestra la probabilidad de impago, la variable Antiguedad cuenta con un mínimo de 0,25 años y un máximo de 37 años con el producto, la variable edad muestra minimos de edad de 26 años, media de 56 años y máximo de 92 años. Frente a la variable de cuota inicial se identifica una media de 885.206$. Finalmente, frente a los ingresos los usuarios tienen un promedio de 5.366.430 en sus ingresos.
Default. La Variable Default indica si la persona en algun momento estuvo en mor. Esta variables es binaria (1=Default y 0=No Default).
datos_creditos$ANTIUEDAD=cut(datos_creditos$ANTIUEDAD,breaks = c(0,10,20,30,40))
data.frame(table(datos_creditos$ANTIUEDAD))
## Var1 Freq
## 1 (0,10] 265
## 2 (10,20] 201
## 3 (20,30] 104
## 4 (30,40] 210
PlotXTabs2(data = datos_creditos,x = "ANTIUEDAD",y="DEFAULT")
Se observa que las personas con antiguedad entre el rango de 0-10 años tienen un mayor Default (8%) que quienes tienes màs años de antiguedad, en este grupo también se ubica la mayor proporcion de usuarios.
str(datos_creditos$EDAD)
## num [1:780] 77 73.8 78.9 51.5 39 ...
datos_creditos$EDAD=cut(datos_creditos$EDAD,breaks = c(0,10,20,30,40,50,60,70,80,90,100))
data.frame(table(datos_creditos$EDAD))
## Var1 Freq
## 1 (0,10] 0
## 2 (10,20] 0
## 3 (20,30] 6
## 4 (30,40] 83
## 5 (40,50] 140
## 6 (50,60] 210
## 7 (60,70] 225
## 8 (70,80] 100
## 9 (80,90] 14
## 10 (90,100] 2
PlotXTabs2(data = datos_creditos,x = "EDAD",y="DEFAULT")
Se observa que las personas que están en el rango de edad de 50-60 años
son quienes tienen mayor Default con el 7%. Estas personas hacen parte
del 26% del total de clientes.
require(ggplot2)
g1=ggplot(datos_creditos, aes(x = DEFAULT, y = CUOTA_TOTAL)) + geom_boxplot(aes(fill = DEFAULT))
require(plotly)
ggplotly(g1)
El 50% de las personas que están en Default tienen una cuota de 1.074.994\(, mientras que la cuota de las personas que no estan en default el promedio es de 600.000\).
require(ggplot2)
g2=ggplot(datos_creditos, aes(x = DEFAULT, y = INGRESOS)) + geom_boxplot(aes(fill = DEFAULT))
require(plotly)
ggplotly(g2)
eL 50% de las personas que están en DEAFULT tienen ingresos en primedio de 4.799.180$, mientras que el promedio de ingresos de quienes no estàn en DEFAULT es de 5.038.000. De esta manera entre mayor ingreso menos riesgo de caer en DEFAULT.
mod_credito1=glm(DEFAULT~EDAD+ INGRESOS+ ANTIUEDAD+ CUOTA_TOTAL,
data = datos_creditos,family = "binomial")
summary(mod_credito1)
##
## Call:
## glm(formula = DEFAULT ~ EDAD + INGRESOS + ANTIUEDAD + CUOTA_TOTAL,
## family = "binomial", data = datos_creditos)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -1.0235 -0.3614 -0.2667 -0.1726 3.0808
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -1.725e+01 1.609e+03 -0.011 0.9914
## EDAD(30,40] 1.488e+01 1.609e+03 0.009 0.9926
## EDAD(40,50] 1.478e+01 1.609e+03 0.009 0.9927
## EDAD(50,60] 1.560e+01 1.609e+03 0.010 0.9923
## EDAD(60,70] 1.501e+01 1.609e+03 0.009 0.9926
## EDAD(70,80] 1.545e+01 1.609e+03 0.010 0.9923
## EDAD(80,90] 1.024e+00 1.897e+03 0.001 0.9996
## EDAD(90,100] 7.169e-01 3.202e+03 0.000 0.9998
## INGRESOS -2.700e-07 1.080e-07 -2.500 0.0124 *
## ANTIUEDAD(10,20] -8.431e-01 4.584e-01 -1.839 0.0659 .
## ANTIUEDAD(20,30] -1.603e+00 8.139e-01 -1.969 0.0489 *
## ANTIUEDAD(30,40] -7.676e-01 7.432e-01 -1.033 0.3017
## CUOTA_TOTAL 9.775e-07 2.446e-07 3.996 6.45e-05 ***
## ---
## 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: 279.96 on 767 degrees of freedom
## AIC: 305.96
##
## Number of Fisher Scoring iterations: 16
Se observa que las variables INGRESOS, ANTIGUEDAD Y CUOTA_TOTAL son significativas para el modelo y logran brindar una explicación de la variable respuesta para el DEFAULT. Mientras que la variable EDAD no brinda valor dentro del modelo. Podemos entonces elegir la función step() para que el modelo selecciones las variables que le son utiles.
mod_credito_mejorado = step(mod_credito1)
## Start: AIC=305.96
## DEFAULT ~ EDAD + INGRESOS + ANTIUEDAD + CUOTA_TOTAL
##
## Df Deviance AIC
## - EDAD 7 285.93 297.93
## <none> 279.96 305.96
## - ANTIUEDAD 3 286.16 306.16
## - INGRESOS 1 287.36 311.35
## - CUOTA_TOTAL 1 296.00 320.00
##
## Step: AIC=297.93
## DEFAULT ~ INGRESOS + ANTIUEDAD + CUOTA_TOTAL
##
## Df Deviance AIC
## - ANTIUEDAD 3 291.37 297.37
## <none> 285.93 297.93
## - INGRESOS 1 292.49 302.49
## - CUOTA_TOTAL 1 302.38 312.38
##
## Step: AIC=297.37
## DEFAULT ~ INGRESOS + CUOTA_TOTAL
##
## Df Deviance AIC
## <none> 291.37 297.37
## - INGRESOS 1 303.62 307.62
## - CUOTA_TOTAL 1 306.24 310.24
summary(mod_credito_mejorado)
##
## Call:
## glm(formula = DEFAULT ~ INGRESOS + CUOTA_TOTAL, family = "binomial",
## data = datos_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 ***
## INGRESOS -3.134e-07 1.005e-07 -3.119 0.001817 **
## CUOTA_TOTAL 9.341e-07 2.404e-07 3.885 0.000102 ***
## ---
## 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
Mejorando el modelo se elimina la variable edad. Es posible observar que entre mas alto sean los ingresos hay menos posibilidad de default. Tambièn, si la persona tiene mayor antiguedad menor posibilidad de default. En cuanto a la cuota, entre esta sea mas alta, hay mayor probabilidad de default.
OR=exp(mod_credito_mejorado$coefficients)
OR
## (Intercept) INGRESOS CUOTA_TOTAL
## 0.09508185 0.99999969 1.00000093
Según los coeficientes, cualquier aumento en una unidad de la variable cuota_total aumenta la posibilidad en 1% de generar riesgo de crédito.
library(ROCR)
prediccion_credito= predict.glm(mod_credito_mejorado, newdata = datos_creditos, type = "response")
resultado_cre=table(datos_creditos$DEFAULT, ifelse(prediccion_credito>0.2,1,0))
resultado_cre
##
## 0 1
## 0 738 3
## 1 38 1
sum(diag(resultado_cre)/sum(resultado_cre))
## [1] 0.9474359
prediccion_default= ROCR::prediction(prediccion_credito,datos_creditos$DEFAULT)
perf_credito= performance(prediction.obj = prediccion_default, "tpr", "fpr")
plot(perf_credito)
abline(a = 0, b = 1,col="red")
grid()
AUC= performance(prediccion_default,measure = "auc")@y.values[[1]]
cat("AUC: ",AUC,"n")
## AUC: 0.6791238 n
Conclusión: ELa curva ROC para el modelo indica que este modelo tiene un bajo poder discriminatorio, puesto que el trazo no está cercano a la línea horizontal, de hecho el área bajo la curva (AUROC) es 0,67.