MODELO CREDIT SCORING - LAGOBO LIBRANZAS

1. INTRODUCCIÓN

Este informe presenta el desarrollo de un modelo de credit scoring (Sistema automatizado de calificación de crédito), que le permitirá a la entidad identificar la probabilidad de incumplimiento de un cliente en la etapa de otorgación del crédito por libranza y se desarrollará con la información de los clientes que han solicitado algún crédito entre los años 2020 y 2024. La metodología a implementar pretende identificar las principales variables a tener en cuenta al momento de medir la probabilidad de ocurrencia en pago de estos clientes y así poderlos clasificar en diferentes perfiles de riesgo.

2. MODELO REGRESION LOGISTICA:

Un modelo de regresión logística es una técnica estadística utilizada para predecir la probabilidad de que ocurra un evento, basándose en uno o más predictores. Este modelo es especialmente útil cuando la variable dependiente es binaria (es decir, toma dos posibles valores, como “Buen cliente” o “Mal cliente”, “0” o “1”, “Al dia” o “En mora”).

3. Balanceo de clases:

En un principio se tienen en cuenta un total de 14.239 registros, de los cuales 13.571 fueron clasificados como clientes al día y 668 como clientes morosos. Si nuestra base de datos está desbalanceada (por ejemplo, si hay muchos más clientes buenos que morosos), el modelo puede aprender a predecir siempre la clase mayoritaria (clientes buenos) y fallar en identificar correctamente a los clientes morosos. Esto se debe a que el modelo intenta minimizar el error general y, en un conjunto de datos desbalanceado, puede lograrlo fácilmente ignorando la clase minoritaria.

¿Cómo balancear las clases?

Se realiza un submuestreo, donde reducimos el número de ejemplos de la clase mayoritaria para igualar el número de ejemplos de la clase minoritaria.

A partir del submestreo tenemos una base de 2.090 registros donde 1.427 son clientes al día y 663 de clientes morosos.

4. DESCRIPCION DATOS:

En el estudio fueron seleccionados 2092 clientes de manera aleatoria, quienes fueron categorizados como buenos y malos clientes, dependiendo su comportamiendo de pago histórico con la entidad. Para categorizar un cliente como malo, se tomó como principal criterio aquellos que llegaron a un atraso mayor a 60 días (>60 días), los demás clientes que no cumplen este criterio, fueron clasificados como buenos clientes. Así mismo del presente análisis se excluyen los clientes que fueron identificados como fallecidos.

A continuación se mencionan las variables a tener en cuenta para la elaboración del modelo de regresión logistica.

Variables Sociodemograficas y de crédito

Todas las variables de hábito de pago corresponden al comportamiento de pago que tenía el cliente al momento de la aprobación del crédito con la empresa. Se aclara que toda la información fue extraida de la central de riesgo Datacredito ya que hoy en día el estudio y análisis de crédito se realiza sobre esta central de información.

Nombre Tipo variable Desc. Variable
Genero Cualitativa Genero del cliente
Escolaridad Cualitativa Nivel de educación
Estado_civil Cualitativa Estado civil del cliente
Vivienda Cualitativa Tipo de vivienda en la que reside el cliente
Zona_Nacimiento Cualitativa Zona geográfica donde nació el cliente
Zona_residencia Cualitativa Zona geográfica donde vive el cliente
Edad Numerica Edad del cliente al momento del crédito
Tipo_Pagaduria Cualitativa Tipo de fondo de pensión
Destino Cualitativa Destino que se le dará al crédito
Canal Cualitativa Destino que se le dará al crédito
Agencia Cualitativa Oficina donde se tramitó el crédito
Perfil Cualitativa Perfil dado por la empresa según su riesgo
Monto Cualitativa Monto solicitado por el cliente
Plazo Cualitativa Plazo solicitado por el cliente
Default Cualitativa 0 = Al dia ; 1 = En mora

Variables de hábito de pago

Nombre Tipo variable Desc. Variable
Score Numerica Puntaje crediticio en Datacredito
Cuentas_ahorro Numerica Numero cuentas ahorro o corrientes
Cuent_embargadas Numerica Numero de cuentas embargadas
Creditos_vigentes Numerica Numero de créditos vigentes en centrales
SaldoMora Numerica Saldo de las obligaciones vigentes en mora
Creditos_mora Numerica Numero de créditos en mora
SaldoTotal Numerica Saldo total adeudado a la fecha de consulta
CuotaMensual Numerica Valor del pago mensual a realizar
HuellasConsulta Numerica Numero de huellas de consulta
MoraSF Numerica Valor de la mora en el sector financiero
MoraSR Numerica Valor de la mora en el sector real
MoraST Numerica Valor de la mora en el sector telcos
5. Cargue de información:

Obtenida la muestra de los 2.090 registros a continuación se realiza el cargue de la base de datos utilizada para la elaboracion del modelo predictivo.

5. Analisis exploratorio de datos:

Exploramos los datos para entender mejor las relaciones entre las variables y detectar cualquier inconsistencia o valores atípicos que puedan existir. Esta etapa incluye la visualización de datos y el cálculo de estadísticas descriptivas.

Distribucion variables cualitativas

# Estado
(t_Estado =table(df_lb$Estado))
## 
## AL DIA   MORA 
##   1427    663
round(prop.table(t_Estado),3)*100 #el 24.9% son clientes en Default
## 
## AL DIA   MORA 
##   68.3   31.7

Distribucion variables cuantitativas

Conocer la distribución de las variables numéricas es esencial para un análisis de datos efectivo y la construcción de modelos predictivos robustos. Nos ayuda a entender la naturaleza de los datos, detectar valores atípicos, seleccionar métodos estadísticos adecuados, visualizar datos de manera efectiva e identificar relaciones y patrones importantes. En resumen, proporciona una base sólida para tomar decisiones informadas en el análisis y modelado de datos.

## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

## corrplot 0.92 loaded

6. Division de datos:

Dividimos los datos en dos conjuntos: uno para entrenamiento (entrenar el modelo) y otro para prueba (evaluar el modelo). Una división común es 70% para entrenamiento y 30% para prueba.

¿Por qué se realiza la división de datos?

Dividir el conjunto de datos en conjuntos de entrenamiento y prueba es crucial para construir modelos predictivos robustos y fiables. Nos permite evitar el sobreajuste, evaluar el desempeño del modelo de manera justa y tener una mejor estimación del error de generalización cuando se enfrenta a nuevos datos. Esta práctica asegura que el modelo no solo aprende bien de los datos que ya tiene, sino que también se desempeña bien con datos nuevos y desconocidos.

tasa_de_malos = mean(train$Default)
tasa_de_malos
## [1] 0.317623
7. Riesgo en grupos:

Explicación del Gráfico y Cálculo del Porcentaje

Los gráficos que se muestran a continuación permite conocer la tasa de clientes “malos” (o en mora) por categoria. En otras palabras, está visualizando el porcentaje de clientes que han incurrido en un “default” (morosidad) dentro de cada grupo que se analice. La barra de cada categoria indica el porcentaje de clientes morosos en comparación con el total de clientes de ese mismo grupo.

Razón de cálculo: Proporciona una visión clara de cómo varía la morosidad entre diferentes grupos, lo que puede ser útil para análisis de riesgo y toma de decisiones en la gestión de clientes.

## `summarise()` has grouped output by 'Genero'. You can override using the
## `.groups` argument.

## `summarise()` has grouped output by 'Escolaridad'. You can override using the
## `.groups` argument.

## `summarise()` has grouped output by 'Estado_civil'. You can override using the
## `.groups` argument.

## `summarise()` has grouped output by 'Zona_nacimiento'. You can override using
## the `.groups` argument.

## `summarise()` has grouped output by 'Zona_residencia'. You can override using
## the `.groups` argument.

## `summarise()` has grouped output by 'Tipo_pagaduria'. You can override using
## the `.groups` argument.

## `summarise()` has grouped output by 'Destino'. You can override using the
## `.groups` argument.

## `summarise()` has grouped output by 'Perfil'. You can override using the
## `.groups` argument.

8. METODO DE CLASIFICACION - ARBOLES DE DECISION:

Una de sus funciones es utilizada para validar los puntos de Corte Óptimos con el fin de dividir Variables Cuantitativas en Variables categóricas.

¿Qué es y para qué sirve?

El proceso de encontrar puntos de corte óptimos para convertir variables cuantitativas en categóricas se conoce como binarización o discretización. Este método se utiliza para simplificar los datos, hacerlos más interpretables y, en algunos casos, mejorar el rendimiento de los modelos predictivos. Aquí te explico cómo se realiza este proceso y su propósito.

Para el caso en estudio se utilizara el método de optimización de modelos, que utiliza modelos predictivos (como árboles de decisión) para determinar los puntos de corte que mejor separan las clases objetivo.

plot(ctree( as.factor(Default) ~ Plazo, train))

plot(ctree( as.factor(Default) ~ Creditos_vigentes, train))

plot(ctree( as.factor(Default) ~ SaldoTotal, train))

plot(ctree( as.factor(Default) ~ HuellasConsulta, train))

plot(ctree( as.factor(Default) ~ MoraSF, train))

plot(ctree( as.factor(Default) ~ Cuent_embagadas, train))

plot(ctree( as.factor(Default) ~ MoraSR, train))

plot(ctree( as.factor(Default) ~ Creditos_mora, train))

8. CREACIÓN DE CATEGORIAS:

Identificados los puntos de corte óptimos, se realiza la creación de las difrentes categorias teniendo en cuenta los cortes que estableció el modelo de arboles de decisión para cada una de las variablas numéricas.

datatable(test, options = list(pageLength = 5, autoWidth = TRUE))

Weight of Evidence (WOE) y su Uso en Modelos de Score de Crédito

El Weight of Evidence (WOE) es una técnica estadística utilizada para transformar variables categóricas y continuas en variables más útiles y predictivas para modelos de clasificación, especialmente en el contexto de modelos de scoring de crédito. El WOE mide la fuerza de una característica para separar las clases objetivo (por ejemplo, buenos y malos pagadores) y es calculado utilizando la proporción de buenos y malos en cada grupo de la variable.

La formula para calcular el WOE para un grupo específico es:

\[ \text{WOE}_i = \ln\left(\frac{\text{Distribución de Buenos en el Grupo } i}{\text{Distribución de Malos en el Grupo } i}\right) \]

Donde:

  • \(\text{Distribución de Buenos en el Grupo } i = \frac{\text{Número de Buenos en el Grupo } i}{\text{Número Total de Buenos}}\)

  • \(\text{Distribución de Malos en el Grupo } i = \frac{\text{Número de Malos en el Grupo } i}{\text{Número Total de Malos}}\)

Interpretabilidad del WOE:

Las transformaciones WOE son intuitivas y fáciles de interpretar. Un WOE positivo indica que la proporción de buenos es mayor que la de malos en ese grupo, mientras que un WOE negativo indica lo contrario.

Además el WOE, mejora la transparencia del modelo y permite una mejor comunicación de los resultados a partes interesadas no técnicas.

A continuación se muestra la interpretabilidad del information value (IV) para mirar el nivel predictivo de cada variable.

Information Value (IV) Poder prediccion
< 0.02 Poder predicitivo insignificante
0.02 - 0.1 Bajo poder predictivo
0.1 - 0.3 Medio poder predictivo
0.3 - 0.5 Fuerte poder predictivo
>5 Nivel predictivo sospechoso, revisar la variable
#WOE e IV de las categorias SCORE
print(WOE7_lb)
##       malos buenos buenos_prop malos_prop        WOE          IV  IV_total
## <=150    31     51  0.05105105 0.06666667 -0.2668789 0.004167479 0.3811987
## <=298   109    107  0.10710711 0.23440860 -0.7832364 0.099707167 0.3811987
## <=649   255    483  0.48348348 0.54838710 -0.1259643 0.008175536 0.3811987
## <=778    52    165  0.16516517 0.11182796  0.3899844 0.020800678 0.3811987
## >778     18    193  0.19319319 0.03870968  1.6076011 0.248347863 0.3811987
#WOE e IV de las categorias SALDO TOTAL
print(WOE14_lb)
##         malos buenos buenos_prop malos_prop          WOE           IV  IV_total
## <=16424   102    450   0.4504505  0.2193548  0.719557396 1.662866e-01 0.3178774
## <=41285   139    299   0.2992993  0.2989247  0.001252267 4.690594e-07 0.3178774
## >41285    224    250   0.2502503  0.4817204 -0.654902507 1.515904e-01 0.3178774
#WOE e IV de las categorias CREDITOS EN MORA
print(WOE13_lb)
##     malos buenos buenos_prop malos_prop        WOE         IV  IV_total
## <=0    83    393   0.3933934  0.1784946  0.7902516 0.16982410 0.2349939
## >0    382    606   0.6066066  0.8215054 -0.3032580 0.06516977 0.2349939
#WOE e IV de las categorias VALOR MORA SECTOR FINANCIERO
print(WOE16_lb)
##         malos buenos buenos_prop malos_prop        WOE        IV IV_total
## <=11783   389    939  0.93993994  0.8365591  0.1165188 0.0120458 0.115541
## >11783     76     60  0.06006006  0.1634409 -1.0011062 0.1034952 0.115541

¿Para qué se utiliza? Clasificación Binaria: Se utiliza principalmente para problemas donde el resultado es binario (sí/no, verdadero/falso, 1/0). Ejemplos comunes incluyen la predicción de si un cliente incumplirá con un préstamo (default/no default), si un correo es spam (spam/no spam), o si un paciente tiene una enfermedad (enfermo/no enfermo).

¿Cómo funciona? La regresión logística modela la relación entre una o más variables independientes 𝑋 X (que pueden ser continuas o categóricas) y una variable dependiente binaria 𝑌 Y. La fórmula básica es:

\[ \text{logit}(p) = \ln\left(\frac{p}{1 - p}\right) \]

Donde: - \(p\) es la probabilidad de que el evento ocurra.

La función logit se utiliza para transformar la probabilidad \(p\) en una escala logarítmica que permite modelar una relación lineal con las variables independientes.

summary(modelo_niveles)
## 
## Call:
## glm(formula = Default ~ Genero + rango_score + rango_plazo + 
##     Estado_civil + Tipo_pagaduria + Perfil + rango_cred_vig + 
##     rango_moraSR + rango_creditos_mora + rango_Saldo_total + 
##     rango_huellas + Zona_residencia + rango_monto + rango_moraSF, 
##     family = binomial(link = "logit"), data = train)
## 
## Coefficients:
##                                     Estimate Std. Error z value Pr(>|z|)    
## (Intercept)                         -2.22773    0.77521  -2.874 0.004057 ** 
## GeneroMasculino                      0.34186    0.16231   2.106 0.035179 *  
## rango_score<=298                    -0.15637    0.35928  -0.435 0.663388    
## rango_score<=649                    -0.44198    0.32357  -1.366 0.171952    
## rango_score<=778                    -0.77693    0.46009  -1.689 0.091289 .  
## rango_score>778                     -1.76468    0.50306  -3.508 0.000452 ***
## rango_plazo<=132                     0.86764    0.22710   3.821 0.000133 ***
## rango_plazo<=144                     0.65511    0.19166   3.418 0.000631 ***
## rango_plazo>144                     -2.05052    0.35392  -5.794 6.88e-09 ***
## Estado_civilSeparado                 0.29754    0.30282   0.983 0.325812    
## Estado_civilSoltero                 -0.24215    0.19728  -1.227 0.219667    
## Estado_civilUnion Libre              0.57901    0.25059   2.311 0.020853 *  
## Estado_civilViudo                   -0.08886    0.24339  -0.365 0.715038    
## Tipo_pagaduriaDEPARTAMENTALES        0.62989    0.45059   1.398 0.162133    
## Tipo_pagaduriaFONDO PRIVADO         -1.29735    0.18259  -7.105 1.20e-12 ***
## Tipo_pagaduriaFUERZAS MILITARES     -0.82373    0.25881  -3.183 0.001459 ** 
## Tipo_pagaduriaNACIONALES            -0.36760    0.22623  -1.625 0.104184    
## PerfilTIPO B                         1.40403    0.27291   5.145 2.68e-07 ***
## PerfilTIPO C                        -0.20848    0.18211  -1.145 0.252308    
## PerfilTIPO D                         0.68930    0.24994   2.758 0.005817 ** 
## rango_cred_vig>2                    -0.13666    0.22689  -0.602 0.546960    
## rango_moraSR<=57395                  0.23446    0.18378   1.276 0.202049    
## rango_moraSR>57395                   1.00599    0.51014   1.972 0.048611 *  
## rango_creditos_mora>0                0.13999    0.36146   0.387 0.698532    
## rango_Saldo_total<=41285             0.55762    0.19142   2.913 0.003578 ** 
## rango_Saldo_total>41285              0.76268    0.21645   3.524 0.000426 ***
## rango_huellas<=4                     0.55465    0.18211   3.046 0.002321 ** 
## rango_huellas>4                      0.92136    0.17248   5.342 9.20e-08 ***
## Zona_residenciaCENTRO                0.58347    0.59295   0.984 0.325109    
## Zona_residenciaCOSTA                 1.04371    0.59130   1.765 0.077547 .  
## Zona_residenciaEJE CAFETERO Y VALLE  0.26508    0.59759   0.444 0.657340    
## Zona_residenciaESTE                  0.22343    0.61307   0.364 0.715525    
## Zona_residenciaOESTE                 0.61521    0.61866   0.994 0.320018    
## rango_monto<=22951000                1.18748    0.18611   6.381 1.76e-10 ***
## rango_monto>22951000                 1.34570    0.32608   4.127 3.68e-05 ***
## rango_moraSF>11783                   0.10023    0.25357   0.395 0.692635    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 1830.2  on 1463  degrees of freedom
## Residual deviance: 1267.3  on 1428  degrees of freedom
## AIC: 1339.3
## 
## Number of Fisher Scoring iterations: 5

Análisis del Modelo de Regresión Logística

Resumen del Modelo Este modelo de regresión logística predice la probabilidad de default (incumplimiento de pago) basado en diversas características del cliente. Las variables predictoras incluyen género, edad, rango de score, plazo, estado civil, tipo de pagaduría, perfil, número de créditos vigentes, mora, saldo total, número de huellas de consulta, zona de residencia.

Coeficientes del Modelo

Genero Coeficiente: 0.372657 Significativo a nivel 5% (*). Los hombres tienen una mayor probabilidad de default en comparación con las mujeres.

Edad Coeficiente: -0.018763 Muy significativo (p < 0.01) (**). A medida que aumenta la edad, la probabilidad de default disminuye. rango_score:

Los diferentes rangos de score tienen diversos efectos sobre la probabilidad de default. Los coeficientes negativos indican que a mayor score, menor es la probabilidad de default, con rangos altos (rango_score>778) siendo muy significativos (p < 0.01) (**). rango_plazo:

Plazos más cortos (<=132 y <=144) están asociados con una mayor probabilidad de default, siendo altamente significativos (p < 0.001) (***). Estado_civil:

Las categorías de estado civil tienen diferentes efectos, con “Union Libre” siendo significativa al nivel 5% (*), sugiriendo una mayor probabilidad de default en comparación con los casados. Tipo_pagaduria:

Diferentes tipos de pagaduría tienen efectos variados. Por ejemplo, “FONDO PRIVADO” tiene un coeficiente negativo muy significativo, indicando una menor probabilidad de default.

Perfil:

Los perfiles tienen efectos significativos. “TIPO B” y “TIPO D” muestran una mayor probabilidad de default, con coeficientes muy significativos (p < 0.001) (***).

rango_Saldo_total:

Los saldos totales menores y mayores tienen coeficientes positivos y significativos, indicando una mayor probabilidad de default.

rango_huellas:

Un mayor número de huellas está asociado con una mayor probabilidad de default, siendo muy significativo (p < 0.001) (***). Zona_residencia:

Algunas zonas, como la COSTA, muestran una tendencia a una mayor probabilidad de default, con significancia marginal (p < 0.1) (.).

## Type 'citation("pROC")' for a citation.
## 
## Adjuntando el paquete: 'pROC'
## The following objects are masked from 'package:stats':
## 
##     cov, smooth, var

¿Qué es la Curva de ROC?

La curva de ROC (Receiver Operating Characteristic) es una representación gráfica utilizada para evaluar la capacidad de un modelo de clasificación binaria para distinguir entre las dos clases. Esta curva traza la tasa de verdaderos positivos (True Positive Rate, TPR) contra la tasa de falsos positivos (False Positive Rate, FPR) a diferentes umbrales de decisión.

## Setting levels: control = 0, case = 1
## Setting direction: controls < cases
## Area under the curve: 0.8072

## [1] 0.4890966

Sensibilidad y Especificidad

Sensibilidad (Sensitivity) Definición:

La sensibilidad, también conocida como recall o verdaderos positivos (TPR), es la proporción de verdaderos positivos que son correctamente identificados por el modelo. Es una medida de la capacidad del modelo para detectar correctamente los casos positivos (eventos de interés).

Especificidad (Specificity)

Definición: La especificidad, también conocida como verdaderos negativos (TNR), es la proporción de verdaderos negativos que son correctamente identificados por el modelo. Es una medida de la capacidad del modelo para identificar correctamente los casos negativos (no eventos de interés).

# Punto de Corte (sens = Espe)
data_roc %>% 
  mutate(diff_risk = abs(sensibilidad - especificidad) ) %>% 
  filter(!(is.infinite(punto_corte))) %>% 
  arrange(diff_risk) %>% 
  head(1)
##   sensibilidad especificidad punto_corte    diff_risk
## 1    0.7424242     0.7429907   0.2824237 0.0005664118

Matriz de Confusión

¿Qué es? Una matriz de confusión es una herramienta utilizada para evaluar el desempeño de un modelo de clasificación. Presenta una tabla que permite visualizar y comparar las predicciones del modelo frente a los valores reales de las etiquetas. Esta matriz ayuda a identificar los tipos de errores que comete el modelo.

## 
##   0   1 
## 428 198
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction   1   0
##          1 147 110
##          0  51 318
##                                           
##                Accuracy : 0.7428          
##                  95% CI : (0.7067, 0.7766)
##     No Information Rate : 0.6837          
##     P-Value [Acc > NIR] : 0.0007115       
##                                           
##                   Kappa : 0.4494          
##                                           
##  Mcnemar's Test P-Value : 4.853e-06       
##                                           
##             Sensitivity : 0.7424          
##             Specificity : 0.7430          
##          Pos Pred Value : 0.5720          
##          Neg Pred Value : 0.8618          
##              Prevalence : 0.3163          
##          Detection Rate : 0.2348          
##    Detection Prevalence : 0.4105          
##       Balanced Accuracy : 0.7427          
##                                           
##        'Positive' Class : 1               
## 
##           Conc Estado Originador    Genero   Escolaridad Estado_civil Vivienda
## 1  89039186819 AL DIA     LAGOBO Masculino  Bachillerato      Soltero Familiar
## 2  42548396214   MORA     LAGOBO Masculino         Otras        Viudo Familiar
## 3  87902462908 AL DIA     LAGOBO Masculino  Bachillerato       Casado Familiar
## 4  69532474632 AL DIA    SOCOMIR Masculino  Bachillerato       Casado   Propia
## 5  88645914099 AL DIA     LAGOBO Masculino Universitaria       Casado   Propia
## 6 318801098299   MORA     LAGOBO Masculino  Bachillerato  Union Libre Familiar
##     Ciudad_nacimiento Dept_nacimiento Zona_nacimiento Ciudad_residencia
## 1            ANOLAIMA    CUNDINAMARCA          CENTRO      BOGOTA, D.C.
## 2        BOGOTA, D.C.          BOGOTA          CENTRO     VILLAVICENCIO
## 3           CHAPARRAL          TOLIMA          CENTRO             VIOTA
## 4             CUMARAL            META          CENTRO     VILLAVICENCIO
## 5 SAN JUAN DE BETULIA           SUCRE           COSTA         SINCELEJO
## 6            TIBASOSA          BOYACA          CENTRO           DUITAMA
##   Depto_residencia Zona_residencia Edad
## 1           BOGOTA          CENTRO   69
## 2             META          CENTRO   67
## 3     CUNDINAMARCA          CENTRO   76
## 4             META          CENTRO   67
## 5            SUCRE           COSTA   71
## 6           BOYACA          CENTRO   63
##                                               Pagaduria    Tipo_pagaduria
## 1                                       CONSORCIO FOPEP        NACIONALES
## 2 COLPENSIONES - ADMINISTRADORA COLOMBIANA DE PENSIONES      COLPENSIONES
## 3               CAJA DE RETIRO FUERZAS MILITARES CREMIL FUERZAS MILITARES
## 4                                                 CASUR FUERZAS MILITARES
## 5 COLPENSIONES - ADMINISTRADORA COLOMBIANA DE PENSIONES      COLPENSIONES
## 6 COLPENSIONES - ADMINISTRADORA COLOMBIANA DE PENSIONES      COLPENSIONES
##     Canal         Destino       Agencia Perfil    Monto Plazo Score
## 1 INTERNO       RETANQUEO BOGOTÁ CENTRO TIPO B 13279400   156   596
## 2 EXTERNO       RETANQUEO VILLAVICENCIO TIPO A 12000000   144   420
## 3 EXTERNO LIBRE INVERSION BOGOTÁ CENTRO TIPO D  5448000   144   386
## 4 INTERNO LIBRE INVERSION VILLAVICENCIO TIPO A  5073200   120   877
## 5 EXTERNO LIBRE INVERSION     SINCELEJO TIPO A  2300000    36   790
## 6 EXTERNO LIBRE INVERSION         TUNJA TIPO A  7000000   144   584
##   Cuentas_ahorro Cuent_embagadas Creditos_vigentes Creditos_mora SaldoTotal
## 1              9               0                18             2     223908
## 2              5               0                 4             1       4746
## 3              3               0                 7             3     154416
## 4              2               0                 3             0      52258
## 5              6               0                 6             0      13255
## 6              8               0                 7             0      51825
##   HuellasConsulta MoraSF MoraSR MoraST Default rango_score rango_monto
## 1               6   1923      0      0       0       <=649  <=22951000
## 2               5      0   2684      0       1       <=649  <=12789800
## 3               2  76958   5339    110       0       <=649  <=12789800
## 4               0      0      0      0       0        >778  <=12789800
## 5               6      0      0      0       0        >778  <=12789800
## 6              11      0      0      0       1       <=649  <=12789800
##   rango_plazo rango_cuentas_ahorro rango_cuentas_emb rango_cred_vig
## 1        >144                   >8               <=0             >2
## 2       <=144                  <=8               <=0             >2
## 3       <=144                  <=8               <=0             >2
## 4       <=132                  <=8               <=0             >2
## 5       <=108                  <=8               <=0             >2
## 6       <=144                  <=8               <=0             >2
##   rango_creditos_mora rango_Saldo_total rango_huellas rango_moraSF rango_moraSR
## 1                  >0            >41285            >4      <=11783         <=74
## 2                  >0           <=16424            >4      <=11783      <=57395
## 3                  >0            >41285           <=2       >11783      <=57395
## 4                 <=0            >41285           <=2      <=11783         <=74
## 5                 <=0           <=16424            >4      <=11783         <=74
## 6                 <=0            >41285            >4      <=11783         <=74
##   rango_moraST puntajes
## 1        <=170 524.6972
## 2        <=170 497.6177
## 3        <=170 523.9966
## 4        <=170 916.0660
## 5        <=170 859.3873
## 6        <=170 250.6908
## Dataframe guardado en el archivo mi_dataframe.xlsx
df_lb$estado_cliente <- factor(df_lb$Default, levels = c(0, 1), labels = c("al día", "en mora"))

# Crear el gráfico de histograma con una capa de densidad coloreado por el estado del cliente
ggplot(df_lb, aes(x = puntajes, fill = estado_cliente)) +
  geom_histogram(aes(y = ..density..), alpha = 0.5, position = "identity", bins = 30) +
  geom_density(aes(color = estado_cliente), alpha = 0.7, size = 1) +
  scale_fill_manual(values = c("al día" = "blue", "en mora" = "red")) +
  scale_color_manual(values = c("al día" = "blue", "en mora" = "red")) +
  labs(
    title = "Distribución de Puntajes por Estado de Clientes",
    x = "Puntaje",
    y = "Densidad",
    fill = "Estado del Cliente",
    color = "Estado del Cliente"
  ) +
  theme_minimal()