Los modelos estadísticos han sido utilizados como métodos prédictivos para la probabilidad de que un prestatario incumpla en el pago de sus obligaciones al prestamista [1]. La empresas dedicadas a las finanzas y, en particular, las prestamistas buscan métricas que les ayuden a evaluar si un cliente es un riesgo potencial para su negocio. Estas métricas se pueden resumir en un tarjeta de puntuación (scorecard), la cual presenta rangos de riesgo con base a los criterios críticos de cada empresa. En este proyecto se presenta el entrenamiento y la validación de un modelo de regresión logística para la probabilidad que una persona cumpla o incumpla los pagos. Después, este modelo se convierte en un scorecard el cual asigna unos puntos con base a las características que se seleccionaron de cada cliente.
Los datos que se utilizan provienen de la base de datos loan_data_2007_2014. Esta base de datos contiene más de 450000 observaciones. Los datos corresponden a características de los préstamos a clientes que la compañía Lending Club realizó entre los años 2007 y 2014. Cuenta con 74 variables (numéricas y categóricas) que describen cada préstamo realizado. Sin embargo, luego de analizar las características predictoras, se encontró que varias de estas eran redundantes o estaban contenidas en otras, por lo que se descartaron del modelo. Además, la variable objetivo del modelo contenía varias categorías que describían si el estado de un cliente había sido bueno o malo, así que se decidió llevar esta variable a binaria (bueno o malo) y se construyó teniendo en cuenta las categorías que esta tenía. Finalmente, se obtiene un conjunto de datos con 22 variables: 21 predictoras y 1 objetivo.
El procesamiento de los datos se llevó a cabo en Python. En este link se puede analizar al detalle cada procedimiento realizado. A continuación se presentan las ideas generales de lo que se realizó:
Figura 1: Histograma variable Installments. Figura 2: Histograma variable Cantidad del préstamo
Con el propósito de validar el modelo predictivo se realiza una división de los datos en entrenamiento y validación. Se utilizó una distribución del 75% para los datos de entrenamiento y 25% para validación. Este procedimiento se llevó a cabo con la ayuda del método split_df del paquete scorecard.
Se presenta resumen de las variables númericas para los datos de entrenamiento:Figura 3: Distribución de la partición de los datos
Uno de los pasos más importantes para la creación del scorecard es lograr agrupar las variables en categorías. Este proceso se conoce como Bining. El cálculo de los bins se hace con el objetivo de calcular el Weight of Evidence Method (WoE) de las variables. En particular, se obtienen por separado los bins y los WoEs asociados a los bins para luego transformar el conjunto de datos con estos nuevos valores. La fórmula que se utiliza para la transformación de los datos en categóricos tiene la siguiente estructura: \[\begin{align} \text{WoE:} \qquad &\ln \frac{\text{Distr Good}}{\text{Distr Bad}} \cdot 100 \\[10pt] \end{align}\]
Estos cálculos se llevan a cabo con la ayuda de la función woebin del paquete scorecard. Para transformar los datos se utiliza woebin_ply.
Comunmente en Estadística la selección de variables se realiza con
los métodos AIC o BIC [2]. Sin embargo en los modelos de scorecard se
emplean otra técnicas. En particular:
1. Information Values
2. Population Stability Analyses
3. Correlation Analyses.
En el proyecto se hace uso principalmente de la primera, sin embargo con la tercera opción se refuerza la selección que se hizo.
El cálculo de estos valores para cada variable se obtienen con la
siguiente fórmula:
\[\begin{align} \text{IV:} \qquad
&\sum_{i=1}^n \left( \text{Distr Good}_i - \text{Distr Bad}_i
\right) \cdot \ln \frac{\text{Distr Good}_i}{\text{Distr
Bad}_i}\end{align}\] Según [3], si el IV para una variable es
inferior a 0.02, entonces esta variable se puede descartar del modelo.
Para calcular estos valores se utilizó la función
feature_selector del paquete creditmodel. Estas fueron
las variables seleccionadas:
## -- Feature filtering by IV
| Variable | IV |
|---|---|
| int_rate_woe | 0.280 |
| grade_woe | 0.272 |
| annual_inc_woe | 0.044 |
| purpose_woe | 0.022 |
| dti_woe | 0.025 |
| inq_last_6mths_woe | 0.045 |
Se presenta las correlaciones de las variables que se eligieron con el método de IV.
Figura 4: Gráfico de correlaciones de las variables elegidas por IV
A las variables numéricas se les asignan unos intervalos para categorizarlas. A continuación se muestra un ejemplo con la variable annual_inc
| bin | count_distr | neg | pos | posprob | woe |
|---|---|---|---|---|---|
| [-Inf,45000) | 0.2352 | 70717 | 11512 | 0.1400 | 0.2824 |
| [45000,75000) | 0.3904 | 120868 | 15652 | 0.1146 | 0.0536 |
| [75000,105000) | 0.2187 | 69533 | 6938 | 0.0907 | -0.2071 |
| [105000, Inf) | 0.1557 | 50315 | 4124 | 0.0758 | -0.4038 |
## $annual_inc
Figura 5: Distribución de los bins de anuual_inc con su respectiva etiqueta
La gráfica muestra los porcentajes de valores positivos y negativos para cada categoría creada. En este ámbito los positivos son la cantidad de personas que incumplen el pago, y los negativos son quienes los cumplen.
Los modelos de regresión logística son lo más usados para realizar predicciones de scorecard [4]. Por esta razón se utilizó este modelo, el cual se implementa con la función glm.
##
## Call:
## glm(formula = good_bad ~ ., family = binomial(), data = train_woes)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -0.912 -0.537 -0.426 -0.308 2.888
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -2.1000 0.0057 -368.4 <0.0000000000000002 ***
## int_rate_woe 0.6703 0.0245 27.3 <0.0000000000000002 ***
## grade_woe 0.2626 0.0255 10.3 <0.0000000000000002 ***
## annual_inc_woe 0.8761 0.0251 34.9 <0.0000000000000002 ***
## purpose_woe 0.4732 0.0310 15.2 <0.0000000000000002 ***
## dti_woe 0.3991 0.0355 11.3 <0.0000000000000002 ***
## inq_last_6mths_woe 0.6103 0.0250 24.4 <0.0000000000000002 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 241334 on 349658 degrees of freedom
## Residual deviance: 228803 on 349652 degrees of freedom
## AIC: 228817
##
## Number of Fisher Scoring iterations: 5
El desempeño de los modelos de regresión logístico se puede medir de varias formas, cada una de ellas brinda información relevante para diferentes escenarios. Sin embargo, las cuatro métricas más usadas para este análisis son: accuracy, precision, recall y F1-score. Adicionalmente, se tiene confusion matrix, es una técnica sencilla para visualizar el rendimiento de la clasificación de los modelos. A continuación se presentan estas métricas y la gráfica del ROC para determinar cómo se comportan las predicciones entre buenas y malas.
Figura 6: Gráfico ROC. Figura 7: Gráfico de rendimiento F1-score
Con base a esta tabla se puede determinar un AUC de 0.6682. Para tener valores númericos se presentan las siguientes métricas:
| MSE | RMSE | LogLoss | R2 | KS | AUC | Gini |
|---|---|---|---|---|---|---|
| 0.094 | 0.3067 | 0.3276 | 0.0337 | 0.25 | 0.6682 | 0.3365 |
También se presenta la distribución de las probabilidades predichas, agrupas con las etiquetas reales:
Figura 8: Distribución de las probabilidades predichas con su respectiva etiqueta
Se puede observar que los valores positivos están solapados con los negativos y muy a la izquierda, lo cual no debería suceder. Un indicio de este comportamiento es que el porcentaje inicial de registros con la variable objetivo positiva es aproximadamente 8%.
Para analizar más al detalle las predicciones del modelo se realiza una matriz de confusión.
## [INFO] The threshold of confusion matrix is 0.1287.
| Etiqueta | Predicción = 0 | Predicción = 1 | Error |
|---|---|---|---|
| 0 | 72130 | 31754 | 0.3057 |
| 1 | 5886 | 6856 | 0.4619 |
| total | 78016 | 38610 | 0.3227 |
Como análisis final se calculan las métricas de precision, recall y F1 score con base en la matrix de confusión:
| Precision | F1 Score | Recall |
|---|---|---|
| 0.1776 | 0.267 | 0.5381 |
El último paso para completar el modelo de riesgo es pasar del modelo logístico al scorecard. Esto se obtiene asignándoles unos puntos a cada bin calculado y el puntaje total es la suma sobre todas las característica que cumpla el registro en cuestión. Para implementar esta transformación se utiliza la función scorecard, a la cual se le pasa los bins calculados junto con el modelo previamente entrenado. Para predecir el puntaje se utiliza el método scorecard_ply al cual se le pasan las características del registro a predecir y el modelo de scorecard obtenido con la función scorecard.
En esta sección se le pasalos datos y el modelo de scorecard. Este modelo devuelve un puntaje total y los puntajes que le asignó en cada característica.
Un ejemplo de predicción con los datos de entrenamiento:
| int_rate_points | grade_points | annual_inc_points | purpose_points | dti_points | inq_last_6mths_points | score |
|---|---|---|---|---|---|---|
| -5 | -1 | -3 | -14 | -5 | -3 | 598 |
| 47 | 21 | -18 | -1 | 4 | -20 | 662 |
| -5 | -1 | -3 | -1 | -5 | -3 | 611 |
| -32 | -15 | -3 | 9 | 7 | -11 | 584 |
| -32 | -15 | -18 | -14 | 7 | -11 | 546 |
| 19 | 7 | -18 | -14 | -1 | 9 | 631 |
Y con los datos de validación:
| int_rate_points | grade_points | annual_inc_points | purpose_points | dti_points | inq_last_6mths_points | score |
|---|---|---|---|---|---|---|
| 19 | 7 | -18 | 9 | -5 | -3 | 638 |
| -5 | -1 | -18 | 9 | 7 | -20 | 601 |
| -5 | -1 | -18 | -14 | 7 | -11 | 587 |
| 19 | 7 | 13 | -14 | -1 | 9 | 662 |
| -5 | -1 | -18 | -1 | 4 | -3 | 605 |
| 76 | 21 | 26 | 4 | 4 | 9 | 769 |
Veamos los puntos asignados por el scorecard a cada bin de cada variable.
| Variable | BIN | Points |
|---|---|---|
| int_rate | From -Inf to 7.5 | 76 |
| int_rate | From 7.5 to 9.5 | 47 |
| int_rate | From 9.5 to 13 | 19 |
| int_rate | From 13 to 17 | -5 |
| int_rate | From 17 to Inf | -32 |
| grade | A | 21 |
| grade | B | 7 |
| grade | C | -1 |
| grade | D | -8 |
| grade | E | F | G | -15 |
| annual_inc | From -Inf to 45000 | -18 |
| annual_inc | From 45000 to 75000 | -3 |
| annual_inc | From 75000 to 105000 | 13 |
| annual_inc | From 105000 to Inf | 26 |
| purpose | credit_card | car | 9 |
| purpose | major_purchase | home_improvement | 4 |
| purpose | debt_consolidation | vacation | wedding | medical | -1 |
| purpose | house | other | moving | renewable_energy | educational | small_business | -14 |
| dti | From -Inf to 9 | 7 |
| dti | From 9 to 16 | 4 |
| dti | From 16 to 20 | -1 |
| dti | From 20 to Inf | -5 |
| inq_last_6mths | From -Inf to 1 | 9 |
| inq_last_6mths | From 1 to 2 | -3 |
| inq_last_6mths | From 2 to 3 | -11 |
| inq_last_6mths | From 3 to Inf | -20 |
Analizando los puntos que fueron asignados a cada bin de cada variable, llegamos a lo siguiente:
Finalmente, se presenta el resumen de los puntajes que utilizó el modelo:
| bin | cum_count | neg | cum_neg | pos | cum_pos | posprob | approval_rate |
|---|---|---|---|---|---|---|---|
| [704, Inf) | 14745 | 14320 | 14320 | 425 | 425 | 0.0288 | 0.1264 |
| [671,704) | 29657 | 14074 | 28394 | 838 | 1263 | 0.0562 | 0.2543 |
| [652,671) | 44626 | 13924 | 42318 | 1045 | 2308 | 0.0698 | 0.3826 |
| [637,652) | 58414 | 12506 | 54824 | 1282 | 3590 | 0.0930 | 0.5009 |
| [621,637) | 72948 | 12893 | 67717 | 1641 | 5231 | 0.1129 | 0.6255 |
| [605,621) | 88073 | 13013 | 80730 | 2112 | 7343 | 0.1396 | 0.7552 |
| [585,605) | 102096 | 11693 | 92423 | 2330 | 9673 | 0.1662 | 0.8754 |
| [-Inf,585) | 116626 | 11461 | 103884 | 3069 | 12742 | 0.2112 | 1.0000 |
Se ilustra por medio de un Gráfico de barras de la cantidad de personas (las no Default) agrupadas por el puntaje obtenido:
Figura 9: Gráfico de barras personas No Default por grupo
Similarmente, se ilustran las personas con estado Default agrupadas por el puntaje obtenido:
Figura 10: Gráfico de barras personas Default por grupo
El modelo de regresión logística utilizado para predecir la probabilidad de que un usuario esté en default, sin ser demasiado deficiente, no tuvo el rendimiento que se esperaba obtener, con, por ejemplo, un área bajo la curva ROC del 0.6682. Dicho rendimiento se puede explicar, en parte, por lo poco equitativo que están esparcidos los datos entre los dos posibles valores de la variable objetivo, con 50.968 datos para clientes en estado default y 415.317 datos para la otra categoría y es posible que esta distribución no represente adecuadamente la probabilidad que estámos buscando, pues muchos de estos datos pertenecen a clientes que ya cumplieron con el pago total de la deuda. Cómo recomendación y trabajo futuro, se propone hacer un filtrado más detallado para la construcción de la variable objetivo buscando un mejor rendimiento en el modelo de regresión logística y, así, un mejor resultado para el ScoreCard.
PrediCrédito cumple de forma eficiente y satisfactoria sus funciones, logrando un valor de un puntaje crediticio de forma rápida y optima, además de compararlo globalmente con los prestatarios registrados de nuestra base de datos y obteniendo su percentil inmediato de acuerdo al puntaje obtenido, todo esto utilizando como preguntas las variables de riesgo más importantes para la predicción del mismo.
[1] Practical Guide to Logistic Regression Analysis in R (2022). https://www.hackerearth.com/practice/machine-learning/machine-learning-algorithms/logistic-regression-analysis-r/tutorial/.
[2] Gero Szepannek (2022). An Overview on the Landscape of R Packages for Open Source Scorecard Modelling. Stralsund University of Applied Sciences. https://www.researchgate.net/publication/359375581_An_Overview_on_the_Landscape_of_R_Packages_for_Open_Source_Scorecard_Modelling.
[3] Asad Mumtaz (2020). How to Develop a Credit Risk Model and Scorecard. https://towardsdatascience.com/how-to-develop-a-credit-risk-model-and-scorecard-91335fc01f03
[4] Tina | Kinden Property (2019). Intro to Credit Scorecard. https://towardsdatascience.com/intro-to-credit-scorecard-9afeaaa3725f
[5] Thomas Brock (2022). Credit Risk. https://www.investopedia.com/terms/c/creditrisk.asp.