Credito

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.

library(readxl)
Creditos <- read_excel("E:/Data Science/Estadistica/Mod3/Datos_Creditos.xlsx")
head(Creditos)
## # A tibble: 6 x 5
##   DEFAULT ANTIUEDAD  EDAD CUOTA_TOTAL INGRESOS
##     <dbl>     <dbl> <dbl>       <dbl>    <dbl>
## 1       1     37.3   77.0     3020519  8155593
## 2       1     37.3   73.8     1766552  6181263
## 3       1     31.0   78.9     1673786  4328075
## 4       1      9.73  51.5      668479  5290910
## 5       1      8.44  39.0     1223559  5333818
## 6       1      6.61  44.9     3517756  2710736

** Analisis exploratorio**

##   Antiguedad_promedio Antiguedad_mediana Antiguedad_min Antiguedad_max
## 1            18.03525           15.11918      0.2547945       37.31781

##   Edad_promedio Edad_mediana Edad_min Edad_max
## 1      56.98502     57.91918  26.6137 92.43288

##   Cuota_promedio Cuota_mediana Cuota_min Cuota_max
## 1       885205.9      694460.5       387   6664588

##   Ingresos_promedio Ingresos_mediana Ingresos_min Ingresos_max
## 1           5366430          5038962       633825     22197021

Analisis Bivariado

require(PerformanceAnalytics)
chart.Correlation(Creditos, histogram=TRUE, pch="+")

Creditos$DEFAULT=as.factor(Creditos$DEFAULT)
require(plotly)
#Antiguedad
g1=ggplot(Creditos,aes(x=DEFAULT, y=ANTIUEDAD,fill=DEFAULT))+geom_boxplot()+theme_bw()
ggplotly(g1)
#Edad
g2=ggplot(Creditos,aes(x=DEFAULT, y=EDAD,fill=DEFAULT))+geom_boxplot()+theme_bw()
ggplotly(g2)
#Cuota
g3=ggplot(Creditos,aes(x=DEFAULT, y=CUOTA_TOTAL,fill=DEFAULT))+geom_boxplot()+theme_bw()
ggplotly(g3)
#Ingresos
g4=ggplot(Creditos,aes(x=DEFAULT, y=INGRESOS,fill=DEFAULT))+geom_boxplot()+theme_bw()
ggplotly(g4)

con base en los graficos bivariados se puede ver que el default se presenta en promedio para: Menores ingresos, Mayores cuotas, Menor edad y menor antiguedad

con base en el analisis de correlación se encuentra que la unica correlacion significativa del Default se presenta con el valor de Cuota, con las variables antiguedad e ingresos la correlacion es menor. Por otro lado las demas variables tienen alta correlación positiva entre si. En este sentido no se considerara la variable Edad en el modelo

Modelo

mod_creditos=glm(DEFAULT~INGRESOS+ANTIUEDAD+CUOTA_TOTAL,
                 data = Creditos,family = "binomial")
summary(mod_creditos)
## 
## Call:
## glm(formula = DEFAULT ~ INGRESOS + ANTIUEDAD + CUOTA_TOTAL, family = "binomial", 
##     data = Creditos)
## 
## Deviance Residuals: 
##     Min       1Q   Median       3Q      Max  
## -0.8147  -0.3724  -0.2868  -0.1938   3.1088  
## 
## Coefficients:
##               Estimate Std. Error z value Pr(>|z|)    
## (Intercept) -2.244e+00  3.933e-01  -5.707 1.15e-08 ***
## INGRESOS    -2.542e-07  1.059e-07  -2.400   0.0164 *  
## ANTIUEDAD   -2.817e-02  1.803e-02  -1.562   0.1183    
## CUOTA_TOTAL  9.860e-07  2.456e-07   4.014 5.96e-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: 288.78  on 776  degrees of freedom
## AIC: 296.78
## 
## Number of Fisher Scoring iterations: 6

se encuentra que la Antiguedad tampoco presenta significancia por tanto procedemos a simplificar el modelo

mod_creditos2 = glm(DEFAULT~INGRESOS+CUOTA_TOTAL,
                 data = Creditos,family = "binomial")
summary(mod_creditos2)
## 
## Call:
## glm(formula = DEFAULT ~ INGRESOS + CUOTA_TOTAL, family = "binomial", 
##     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 ***
## 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

Validación cruzada

library(vcd)
prediccion= predict.glm(mod_creditos2, newdata = Creditos, type = "response")
resultado=table(Creditos$DEFAULT, ifelse(prediccion>0.2,1,0),dnn = c("observaciones", "predicciones"))
resultado
##              predicciones
## observaciones   0   1
##             0 738   3
##             1  38   1
mosaic(resultado, shade = T, colorize = T,
gp = gpar(fill = matrix(c("blue", "black", "black", "blue"), 2, 2)))

sum(diag(resultado)/sum(resultado))
## [1] 0.9474359

se encuentra que entre los resultados se presentan 3 falsos negativos (se predice falsamente que entra en default), y 38 falsos positivos (se predice que no entra en default cuando en realidad si lo hace)

el modelo clasifica de manera adecuada el 94,7% de las observaciones

Metricas

library(ROCR)
prediccion_rot= ROCR::prediction(prediccion,Creditos$DEFAULT)
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.6791238 n

El area bajo la curva de 0,68 nos indica que el modelo no es lo suficientemente bueno para realizar predicciones.