Planteamiento del problema

La Cooperativa Financiera XYZ, otorga a sus asociados créditos de libre inversión, sobre los cuales estima que el 20% presentan incumplimiento con su obligación. Estos impagos afectan la cartera morosa y conllevan a un incremento de las provisiones de segidad, reduciendo la liquidez de la organización. Motivado por lo anterior, la cooperativa requiere construir un modelo de clasificación que identifique a priori, desde el proceso de estudio de crédito, aquellos clientes con mayor riesgo de incurrir en impago.

En el archivo adjunto (Data Clientes Cooperativa.txt) se encuentra la información histórica de los clientes de la Cooperativa Financiera XYZ con algunas características sociodemográficas, además de la etiqueta de Impago (V: Impago, F: Cumplimiento).

Ustedes han sido contratados como consultores analistas. El producto que deben desarrollar es un modelo validado con las mejores características de pronóstico de clientes morosos. Para ello debe utilizar toda su creatividad y atender los siguientes pasos sugeridos.

Entendimiento del problema

¿Qué es un crédito de libre inversión?

Es un préstamo de dinero con el que puedes financiar cualquier proyecto. Como su nombre lo indica, al ser de libre inversión eliges el propósito, puede ser para un viaje, remodelar tu vivienda, estudiar o en general para lo que quieras.

Requisitos

  • Montos desde $1.000.000
  • Elige el plazo de pago entre 24 y 72 meses.
  • Tasa fija durante la vigencia del crédito.
  • Cuota fija mensual que incluye capital e intereses.
  • Seguro de vida que ampara el crédito en caso de calamidad.
  • Puedes hacer abonos extraordinarios sin incurrir en ningún cobro adicional.
  • Puedes ver el valor aproximado de cuota con nuestro simulador de préstamo.
  • Cobro por desembolso de crédito mediante cheque de gerencia o transferencias ACH.

Desarrollo

Punto 1

Se trabaja con la base de datos “Data Clientes Cooperativa.txt”, esta consta de 4117 observaciones y 11 variables, las cuales son las siguientes:

  • id
  • Edad
  • Ingresos
  • Género
  • Estado Civil
  • Número de hijos
  • Cantidad de tarjetas
  • Modalidad
  • Hipoteca
  • Prestamos
  • Riesgos
#estructura
Datos = Datos %>% mutate_if(is.character,as.factor) ##Convertir cadenas de texto a caracteres
Datos = Datos %>% mutate_all(na_if," ") ##Datos vacíos a NA

## Nombres de las variables
level_GENERO=c("m"="M","M"="M","f"="F", "F"="F")
level_MODALIDAD=c("monthly"="Monthly","weekly"="Weekly")
level_CIVIL=c("divsepwid"="Divsepwid","married"="Married","single"="Single")
level_HIPOTECA=c("n"="No","y"="Yes")
level_RIESGO=c("V"="Impago","F"="Cumplimiento")

De acuerdo a la revisión de datos faltantes se halló un dato faltante en la variable GENERO y según nuestro criterio, esta variable es necesaria para lograr clasificar a los individuos morosos, por tal razón se procede a eliminar este individuo y generando una base de datos limpia con 4116 filas (individuos) y una estructura correcta.

Punto 2

En la base de datos, el riesgo está distribuido el 20 % en impago y el 80 % en cumplimiento, se observa el riesgo con cada una de las variables cuantitativas pudiendose plantear hipótesis apriori como la mediana de la edad de los clientes morosos o que presentan impago, es mayor a los clientes cumplidos. Además, puede resultar impactante para el estudio, sin embargo es un hallazgo, donde los clientes morosos tienden a ser aquellos que presentan mayores ingresos. Un dato curioso se halla en los prestamos, donde el 25 % de los clientes con impago no presentan prestamos.

## [[1]]
## NULL
## 
## [[2]]
## NULL
## 
## [[3]]
## NULL
## 
## [[4]]
## NULL
## 
## [[5]]
## NULL

El análisis de las variables cualitativas con relación al riesgo de impago (clientes morosos) no presentan diferencias significativas a excepción de las variables hipoteca y modalidad de pago, donde la mayor cantidad de clientes morosos tienen hipoteca y pago mensual.

## [[1]]
## [[1]]$rect
## [[1]]$rect$w
## [1] 0.5741744
## 
## [[1]]$rect$h
## [1] 433.2826
## 
## [[1]]$rect$left
## [1] 5.625826
## 
## [[1]]$rect$top
## [1] 1676
## 
## 
## [[1]]$text
## [[1]]$text$x
## [1] 6.006763 6.006763
## 
## [[1]]$text$y
## [1] 1531.572 1387.145
## 
## 
## 
## [[2]]
## [[2]]$rect
## [[2]]$rect$w
## [1] 0.9725778
## 
## [[2]]$rect$h
## [1] 481.8848
## 
## [[2]]$rect$left
## [1] 5.227422
## 
## [[2]]$rect$top
## [1] 1864
## 
## 
## [[2]]$text
## [[2]]$text$x
## [1] 5.60836 5.60836
## 
## [[2]]$text$y
## [1] 1703.372 1542.743
## 
## 
## 
## [[3]]
## [[3]]$rect
## [[3]]$rect$w
## [1] 0.7107699
## 
## [[3]]$rect$h
## [1] 646.3047
## 
## [[3]]$rect$left
## [1] 5.48923
## 
## [[3]]$rect$top
## [1] 2500
## 
## 
## [[3]]$text
## [[3]]$text$x
## [1] 5.870168 5.870168
## 
## [[3]]$text$y
## [1] 2284.565 2069.130

Punto 3

Para entrenar y comparar múltiples modelos de clasificación, primero se realiza el proceso de balanceo de datos, debido a que los datos están desbalanceados desfavoreciendo a los que incumplen en razón de 1 (imcumple):4 (cumple), se genera una base de datos balanceada (aumentando la cantidad de impagos).

Posteriormente se empieza considerando modelos estadísticos, primero una regresión logística y luego un análisis discriminante.

El modelo seleccionado para la regresión logística es el modelo saturado, presentando la mayoría de las variables significativas a excepción del Género. Sin embargo, teniendo en cuenta que deseamos clasificar a los individuos, el género parece ser una variable necesaria, por lo tanto se dejará en el estudio.

\[Riesgo_i=\beta_0+\beta_1EDAD+\beta_2INGRESOS+\beta_3GENERO+\beta_4ESTADO\_CIVIL+\beta_5NUM\_HIJOS+\beta_6NUM\_TARJETAS+\beta_7MODALIDAD\_PAGO+\beta_8HIPOTECA+\beta_9PRESTAMO+\epsilon\]

## Start:  AIC=4873.79
## RIESGO ~ EDAD + INGRESOS + GENERO + ESTADO_CIVIL + NUM_HIJOS + 
##     NUM_TARJETAS + MODALIDAD_PAGO + HIPOTECA + PRESTAMOS
## 
##                  Df Deviance    AIC
## <none>                4851.8 4873.8
## - GENERO          1   4854.8 4874.8
## - HIPOTECA        1   4860.2 4880.2
## - MODALIDAD_PAGO  1   4860.6 4880.6
## - NUM_HIJOS       1   4889.3 4909.3
## - NUM_TARJETAS    1   4891.2 4911.2
## - EDAD            1   4895.8 4915.8
## - PRESTAMOS       1   5009.3 5029.3
## - INGRESOS        1   5115.8 5135.8
## - ESTADO_CIVIL    2   5305.3 5323.3

Del resumen del modelo, se puede observar que las variables que disminuyen el riesgo son estar casado, soltero, la cantidad de hijos, el número de tarjetas y los prestamos, teniendo en cuenta que esta variable es el número de prestamos que presenta el cliente. Por otro lado, la edad, los ingresos, ser de género masculino, contar con hipoteca y modalidad de pago, aumentan el riesgo de ser un cliente moroso. Adicionalmente, hubo cuatro iteraciones antes de que el proceso se detuviera y generara los resultados, puesto que no encontró diferencias al seguir iterando.

## 
## Call:
## glm(formula = RIESGO ~ EDAD + INGRESOS + GENERO + ESTADO_CIVIL + 
##     NUM_HIJOS + NUM_TARJETAS + MODALIDAD_PAGO + HIPOTECA + PRESTAMOS, 
##     family = "binomial", data = Datos_Balan_Entr)
## 
## Deviance Residuals: 
##     Min       1Q   Median       3Q      Max  
## -2.9783  -0.6651  -0.2548   0.6603   2.6481  
## 
## Coefficients:
##                       Estimate Std. Error z value Pr(>|z|)    
## (Intercept)          1.187e+00  4.138e-01   2.869  0.00412 ** 
## EDAD                 3.656e-02  5.513e-03   6.633 3.29e-11 ***
## INGRESOS             9.108e-05  5.934e-06  15.349  < 2e-16 ***
## GENEROM              1.250e-01  7.211e-02   1.734  0.08299 .  
## ESTADO_CIVILMarried -4.012e+00  2.126e-01 -18.873  < 2e-16 ***
## ESTADO_CIVILSingle  -3.992e+00  2.607e-01 -15.314  < 2e-16 ***
## NUM_HIJOS           -3.337e-01  5.486e-02  -6.083 1.18e-09 ***
## NUM_TARJETAS        -2.771e-01  4.441e-02  -6.239 4.40e-10 ***
## MODALIDAD_PAGO.L     2.403e-01  8.147e-02   2.949  0.00318 ** 
## HIPOTECAYes          2.901e-01  1.002e-01   2.896  0.00378 ** 
## PRESTAMOS           -9.711e-01  7.902e-02 -12.289  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 7345.6  on 5298  degrees of freedom
## Residual deviance: 4851.8  on 5288  degrees of freedom
## AIC: 4873.8
## 
## Number of Fisher Scoring iterations: 4

Se puede mejorar el performance de la regresión sintonizando (Tuning) el punto de corte pc, donde se establece un pc de 0.25 para intentar mejorar los indicadores de correcta clasificación de sensibilidad y accuracy para dicho modelo.

Por medio de los indicadores de correcta clasificación, se observa que el modelo logístico presenta un Accuracy del 75.61 % y una sensibilidad de aproximadamente 90.67 %, la cual es bastante alta porque nuestro objetivo es clasificar clientes morosos.

## $RLG
##          Sensitivity          Specificity       Pos Pred Value 
##            0.9067055            0.6056338            0.7116705 
##       Neg Pred Value            Precision               Recall 
##            0.8580931            0.7116705            0.9067055 
##                   F1           Prevalence       Detection Rate 
##            0.7974359            0.5177358            0.4694340 
## Detection Prevalence    Balanced Accuracy 
##            0.6596226            0.7561697

Realizando un análisis discriminante, se obtiene un accuracy de aproximadamente 81.1 % y una sensibilidad mucho más alta que en la regresión logística, presentando un valor de 78.86 %.

##Segundo modelo estadístico: Analisis Discriminante        

Modelo_LDA <- MASS::lda(formula= RIESGO~., data=Datos_Balan_Entr,CV=FALSE)

Mediante la Curva ROC se explora un punto de corte alternativo - LDA-Fisher, donde se obtuvo un valor de -0.188 con una sensibilidad y un accuracy más altos de 82.65 % y 81.78 % respectivamente, lo cual indica que el análisis discriminante está clasificando mejor a los clientes morosos cuando en realidad lo son.

Performance - Indicadores de correcta clasificación - LDA- Bayes con pc=-0.188

##          Sensitivity          Specificity       Pos Pred Value 
##            0.8265306            0.8090767            0.8229318 
##       Neg Pred Value            Precision               Recall 
##            0.8128931            0.8229318            0.8265306 
##                   F1           Prevalence       Detection Rate 
##            0.8247273            0.5177358            0.4279245 
## Detection Prevalence    Balanced Accuracy 
##            0.5200000            0.8178036

Aplicando un algoritmo de aprendizaje automático, se decidió generar un árbol de clasificación, donde se empieza desde el árbol más complejo y se va “podando”

Modelo_Arbol<- rpart::rpart(formula = RIESGO ~ ., data=Datos_Balan_Entr,control = rpart.control(cp = 0.0001))

rpart.plot::rpart.plot(Modelo_Arbol,type=1)

Se determina realizar el árbol de clasificación con un cp de 0.00418888, el cual nos parece bueno, debido a que buscar un error esperado más bajo se puede lograr, sin embargo el árbol será demasiado complejo.

Se puede observar que clasifica a los clientes morosos cuando

## 
## Classification tree:
## rpart::rpart(formula = RIESGO ~ ., data = Datos_Balan_Entr, control = rpart.control(cp = 1e-04))
## 
## Variables actually used in tree construction:
## [1] EDAD           ESTADO_CIVIL   GENERO         HIPOTECA       INGRESOS      
## [6] MODALIDAD_PAGO NUM_HIJOS      NUM_TARJETAS   PRESTAMOS     
## 
## Root node error: 2626/5299 = 0.49557
## 
## n= 5299 
## 
##            CP nsplit rel error  xerror      xstd
## 1  0.57425743      0   1.00000 1.00000 0.0138597
## 2  0.01865956      1   0.42574 0.42574 0.0113102
## 3  0.00990099      2   0.40708 0.40708 0.0111242
## 4  0.00837776      3   0.39718 0.40594 0.0111125
## 5  0.00637852      4   0.38880 0.39947 0.0110456
## 6  0.00533130      8   0.36329 0.38271 0.0108673
## 7  0.00418888     10   0.35263 0.37471 0.0107794
## 8  0.00342727     12   0.34425 0.37471 0.0107794
## 9  0.00285605     13   0.34082 0.37167 0.0107455
## 10 0.00228484     17   0.32940 0.36976 0.0107241
## 11 0.00190404     21   0.32026 0.35567 0.0105627
## 12 0.00171363     29   0.30427 0.34539 0.0104410
## 13 0.00152323     33   0.29627 0.33359 0.0102972
## 14 0.00139629     39   0.28675 0.32407 0.0101778
## 15 0.00133283     52   0.26085 0.32102 0.0101390
## 16 0.00114242     59   0.24943 0.31493 0.0100603
## 17 0.00106626     68   0.23915 0.31188 0.0100205
## 18 0.00104722     73   0.23382 0.30998 0.0099954
## 19 0.00095202     77   0.22963 0.30998 0.0099954
## 20 0.00088855     79   0.22772 0.30541 0.0099348
## 21 0.00076161     82   0.22506 0.30236 0.0098939
## 22 0.00066641     89   0.21973 0.30236 0.0098939
## 23 0.00057121     96   0.21439 0.29970 0.0098578
## 24 0.00038081     98   0.21325 0.29855 0.0098423
## 25 0.00022848    113   0.20602 0.30160 0.0098836
## 26 0.00019040    123   0.20373 0.30427 0.0099195
## 27 0.00012694    136   0.20107 0.30731 0.0099601
## 28 0.00010000    139   0.20069 0.30960 0.0099904

Generando los indicadores para evaluar la clasificación del modelo, con el árbol seleccionado se obtiene un accuracy aproximado de 82.0 % y una sensibilidad de 78.1 % aproximadamente, será necesario comparar cada uno de estos indicadores con el análisis discriminante y con los siguientes modelos para tomar una decisión óptima y acertada.

##          Sensitivity          Specificity       Pos Pred Value 
##            0.7730829            0.8513120            0.8288591 
##       Neg Pred Value            Precision               Recall 
##            0.8010974            0.8288591            0.7730829 
##                   F1           Prevalence       Detection Rate 
##            0.8000000            0.4822642            0.3728302 
## Detection Prevalence    Balanced Accuracy 
##            0.4498113            0.8121974

Se realiza una máquina de soporte vectorial (SVM), donde por medio de esta se optiene la sensibilidad más alta hallada hasta el momento de 82.94 % y un accuracy del 80.76 % aproximadamente. Este caso es un punto a discutir con la Cooperativa contratante, porque se necesita que solamente clasifique a los clientes morosos o necesita saber el por qué o cómo clasificó a cada cliente?, de ser así se toma una decisión.

Modelo_svm= e1071::svm(formula = RIESGO ~ ., data=Datos_Balan_Entr, type = 'C-classification', kernel = 'linear')
##          Sensitivity          Specificity       Pos Pred Value 
##            0.8294210            0.7857143            0.7828656 
##       Neg Pred Value            Precision               Recall 
##            0.8317901            0.7828656            0.8294210 
##                   F1           Prevalence       Detection Rate 
##            0.8054711            0.4822642            0.4000000 
## Detection Prevalence    Balanced Accuracy 
##            0.5109434            0.8075676

Realizando por último el modelo de ensamble Random Forest, empleando un 10-fold repetido 10 veces haciendo una sintonización del cp entre valores de 0.001 y 0.07, donde gráficamente podemos determinar que 0.022 con el objetivo de presentar un accuracy alto sin tanta complejidad.

Los indicadores de correcta clasificación para los datos entrenamiento presentan una sensibilidad y un accuracy mayor al 84 %.

##          Sensitivity          Specificity       Pos Pred Value 
##            0.8563412            0.9166032            0.9126794 
##       Neg Pred Value            Precision               Recall 
##            0.8624149            0.9126794            0.8563412 
##                   F1           Prevalence       Detection Rate 
##            0.8836132            0.5044348            0.4319683 
## Detection Prevalence    Balanced Accuracy 
##            0.4732968            0.8864722

Los indicadores de correcta clasificación de los datos de Test siguen presentando unos valores altos en la sensibilidad y en el accuracy, del 82.78 % y 85.85 % respectivamente.

##          Sensitivity          Specificity       Pos Pred Value 
##            0.8278560            0.8892128            0.8743802 
##       Neg Pred Value            Precision               Recall 
##            0.8472222            0.8743802            0.8278560 
##                   F1           Prevalence       Detection Rate 
##            0.8504823            0.4822642            0.3992453 
## Detection Prevalence    Balanced Accuracy 
##            0.4566038            0.8585344

Al realizar el bosque aleatorio para mejorar el modelo planteado, la medida de Gini de impureza, proporciona más información acerca de la distribución de los datos por nodo, es decir la precisión de clasificación utilizada y por tanto, las variables con esta medida más alta son ingresos, edad y prestamos, seguidas del número de tarjetas y número de hijos.

Los indicadores de correcta clasificación para nuevos datos demuestran que el random forest sintonizado presenta un accuracy del 85.63 % y una sensibilidad del 88.65 %.

##          Sensitivity          Specificity       Pos Pred Value 
##            0.8841941            0.9897959            0.9877622 
##       Neg Pred Value            Precision               Recall 
##            0.9017264            0.9877622            0.8841941 
##                   F1           Prevalence       Detection Rate 
##            0.9331131            0.4822642            0.4264151 
## Detection Prevalence    Balanced Accuracy 
##            0.4316981            0.9369950

Punto 3.1

Al generar una matriz con todos los indicadores de clasificación correcta para cada uno de los modelos empleados, se pueden observar los siguientes resultados, los cuales serán analizados en conjunto en el Punto 4 y de forma individual, fueron analizados en los puntos anteriores.

##                            RLG       LDA      Tree       SVM   Tree.tr
## Sensitivity          0.9067055 0.8265306 0.7730829 0.8294210 0.8563412
## Specificity          0.6056338 0.8090767 0.8513120 0.7857143 0.9166032
## Pos Pred Value       0.7116705 0.8229318 0.8288591 0.7828656 0.9126794
## Neg Pred Value       0.8580931 0.8128931 0.8010974 0.8317901 0.8624149
## Precision            0.7116705 0.8229318 0.8288591 0.7828656 0.9126794
## Recall               0.9067055 0.8265306 0.7730829 0.8294210 0.8563412
## F1                   0.7974359 0.8247273 0.8000000 0.8054711 0.8836132
## Prevalence           0.5177358 0.5177358 0.4822642 0.4822642 0.5044348
## Detection Rate       0.4694340 0.4279245 0.3728302 0.4000000 0.4319683
## Detection Prevalence 0.6596226 0.5200000 0.4498113 0.5109434 0.4732968
## Balanced Accuracy    0.7561697 0.8178036 0.8121974 0.8075676 0.8864722
##                        Tree.te   RF_tune
## Sensitivity          0.8278560 0.8841941
## Specificity          0.8892128 0.9897959
## Pos Pred Value       0.8743802 0.9877622
## Neg Pred Value       0.8472222 0.9017264
## Precision            0.8743802 0.9877622
## Recall               0.8278560 0.8841941
## F1                   0.8504823 0.9331131
## Prevalence           0.4822642 0.4822642
## Detection Rate       0.3992453 0.4264151
## Detection Prevalence 0.4566038 0.4316981
## Balanced Accuracy    0.8585344 0.9369950

Punto 4

Para generar una recomendación a la cooperativa respecto al modelo que debe emplear para el otorgamiento del crédito nos apoyaremos del Punto 3.1 y se explicará las ventajas y desventajas de los modelos probados.

Debido a que para la cooperativa lo más importante es lograr clasificar los clientes morosos, nos fijaremos con prioridad en la sensibilidad más que en la especificidad debido a que la sensibilidad nos representa los clientes clasificados como morosos cuando en realidad son morosos, en segunda instancia estaremos teniendo en cuenta el accuracy, el cual mide el porcentaje de casos que el modelo ha acertado en su clasificación.

Teniendo en cuenta lo anteriormente mencionado, los modelos con los valores del accuracy más altos son la Regresión logística, Random Forest y Máquina de soporte vectorial. Por lo tanto, la sugerencia para lograr la clasificación de los clientes morosos es con la realización de un modelo logístico tuneado como se realizó anteriormente y la gran ventaje de este modelo es que se podrán analizar los coeficientes de las variables predictoras.