馃幆 Predicci贸n de Riesgo de Cr茅dito

Objetivo principal: Identificar los factores clave que predicen el incumplimiento de pago mediante el an谩lisis de datos financieros y sociodemogr谩ficos.
Acci贸n propuesta: Desarrollar un modelo de machine learning para predecir la probabilidad de que un pr茅stamo caiga en morosidad.
Prop贸sito: Automatizar la evaluaci贸n del riesgo crediticio para instituciones financieras, permiti茅ndoles tomar decisiones m谩s informadas y reducir su cartera vencida.
驴C贸mo predecir el riesgo de incumplimiento de pago de un cliente antes de otorgarle un cr茅dito, utilizando sus caracter铆sticas personales y financieras?

Objetivo: Predecir el nivel de riesgo crediticio de clientes a partir de sus caracter铆sticas financieras y personales, utilizando modelos de clasificaci贸n.

1. Carga de Datos

- Importar las librer铆as usadas para generar este modelo. Se cargan los datos limpios al entorno de trabajo.

Librer铆as usadas

import pandas as pd
import numpy as np
from dateutil.relativedelta import relativedelta
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.svm import SVC
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import GridSearchCV
import matplotlib.ticker as ticker
from sklearn.metrics import classification_report, confusion_matrix, ConfusionMatrixDisplay

from google.colab import drive
drive.mount('/content/drive')

datos_respaldo = pd.read_csv('drive/MyDrive/Colab Notebooks/An谩lisis de riesgo en banco/df_lendingclub_limpio.csv')
datos = datos_respaldo.copy()
pd.options.display.max_columns = None
datos.head(3)

2. An谩lisis Exploratorio de Datos (EDA)

 An谩lisis de variables, identificaci贸n de outliers, revisi贸n de datos faltantes y correlaciones entre variables.

An谩lisis de DataFrame

datos.info()

 An谩lisis de variables, identificaci贸n de outliers, revisi贸n de datos faltantes y correlaciones entre variables.

3. Ingenier铆a de Caracter铆sticas

Creaci贸n de nuevas variables, codificaci贸n de datos categ贸ricos, escalado de variables num茅ricas y tratamiento de valores nulos.

Codificaci贸n de Variables Categ贸ricas

# Separar por categor铆a el tipo de vivienda
dummies = pd.get_dummies(datos['tipo_vivienda'], prefix='vivienda_').astype(int)
dummies.head(3)
# Como ya tenemos todas las variables como int o float, eliminar columnas categoricas
df_completo = pd.concat([datos, dummies], axis = 1)
df_completo.drop(['estados_prestamo', 'tipo_vivienda'], axis = 1, inplace = True)
df_completo.head(3)

4.Analisis de correlaci贸n

Se analiza la correlaci贸n para:

- Visualizar las relaciones entre las variables principales.

- Identificar variables muy correlacionadas que puedan afectar el desempe帽o del modelo.

- Tomar decisiones informadas sobre qu茅 variables mantener o eliminar

Correlaci贸n entre variables

# Calcular matriz de correlaci贸n
matriz_corr = df_completo.corr()
matriz_corr.head(3)
plt.figure(figsize=(10, 8))
sns.heatmap(matriz_corr, annot=False, cmap='viridis', fmt=".2f")
plt.show()

驴Qu茅 se observa?

– Las variables monto_prestamo y monto_financiado presentan una correlaci贸n alta, lo cual es l贸gico ya que est谩n relacionadas directamente con el cr茅dito otorgado.

– La mayor铆a de las variables tienen baja correlaci贸n entre s铆, lo que es favorable para el modelo, ya que evita problemas de multicolinealidad.

– Las variables generadas por One-Hot Encoding (tipo de vivienda) no presentan correlaciones significativas con otras variables.

Se analiza la correlaci贸n para:

- Visualizar las relaciones entre las variables principales.

- Identificar variables muy correlacionadas que puedan afectar el desempe帽o del modelo.

- Tomar decisiones informadas sobre qu茅 variables mantener o eliminar

5. Modelado Predictivo

Entrenamiento y evaluaci贸n de distintos modelos de Machine Learning (Regresi贸n Log铆stica, Decision tree, Random Forest), con comparaci贸n de m茅tricas de desempe帽o (accuracy, f1-score, etc.)

Normalizado de datos con MinMaxScaler

df_completo.columns
# Crear el objeto MinMaxScaler
scaler = MinMaxScaler()

# Normalizar los datos
df_normalizados = scaler.fit_transform(df_completo)

# Convertir el resultado a un DataFrame, especificando las columnas seleccionadas
df_normalizados = pd.DataFrame(df_normalizados, columns=df_completo.columns)
df_normalizados.head(5)

# Separaci贸n de los datosn en datos prueba y datos de muestra
x_entrenamiento, x_prueba, y_entrenamiento, y_prueba = train_test_split(
    df_normalizados.drop('estado_prestamo', axis=1),            # Variables independientes (X)
    df_normalizados['estado_prestamo'],                         # Variable dependiente (y)
    test_size=0.25,                            # 25% para prueba, 75% para entrenamiento
    random_state=42                            # Semilla para reproducibilidad
)
print(f'Tama帽o "y_entrena" {y_entrenamiento.shape}\n Tama帽o de "x_entrena"  {x_entrenamiento.shape}')

# Selecci贸n del modelo de predicci贸n
modelos = {
    "Regresi贸n Log铆stica": LogisticRegression(),
    "脕rbol de Decisi贸n": DecisionTreeClassifier(),
    "Random Forest": RandomForestClassifier()
}

# Evaluar cada modelo en un pipeline
for nombre, modelo in modelos.items():
    pipeline = Pipeline([
        ('escalado', StandardScaler()),  # Paso 1: Escalar los datos
        ('modelo', modelo)               # Paso 2: Modelo de ML
    ])

    # Evaluar con validaci贸n cruzada
    puntajes = cross_val_score(pipeline, x_entrenamiento, y_entrenamiento, cv=5, scoring='accuracy')
    print(f"{nombre}: Precisi贸n promedio = {puntajes.mean():.4f}")
Se usar谩 "Regresi贸n Log铆stica" ya que obtuvo la mejor evaluaci贸n.

# Ajuste de hiperparametros
modelo = LogisticRegression(random_state=42)

parametros = {
    'penalty': ['l1', 'l2'],                     # Regularizaci贸n
    'C': [0.1, 1.0],                       # Fuerza de regularizaci贸n
    'solver': ['liblinear', 'lbfgs'],            # Algoritmo de optimizaci贸n
    'max_iter': [50, 100],                      # N煤mero de iteraciones
    'class_weight': ['balanced', None]           # Peso de clases
}

# Creacion del estimador (GridSerch)
grid_search = GridSearchCV(modelo, parametros, cv=5, scoring='accuracy')

# Entrenamiento de grid_search
grid_search.fit(x_prueba,y_prueba)
Los mejores resultados se obtuvieron con:  "C=0.1, max_iter=50, random_state=42, solver='liblinear'"

# Definiendo el final del modelo
modelo_final = LogisticRegression(C=0.1, max_iter=50, random_state=42, solver='liblinear')

# Entrenamiento de modelo
modelo_final.fit(x_entrenamiento, y_entrenamiento)

accuracy = modelo_final.score(x_prueba, y_prueba)
print(f"Accuracy del modelo: {accuracy:.2f}")
CONCLUSI脫N

El modelo desarrollado tiene como objetivo predecir el riesgo de cr茅dito de un cliente a partir de sus caracter铆sticas personales y socioecon贸micas. Durante el proceso se realiz贸 un an谩lisis exploratorio de los datos, identificando las variables m谩s relevantes y su relaci贸n con el riesgo crediticio.

Para mejorar el rendimiento del modelo, se aplic贸 la t茅cnica de MinMaxScaler, con el fin de escalar los datos dentro de un rango definido y garantizar que todas las variables tuvieran un peso equitativo en el proceso de entrenamiento.

Los resultados obtenidos permiten clasificar de manera eficiente a los clientes seg煤n su nivel de riesgo, lo cual representa una herramienta 煤til para las instituciones financieras al momento de tomar decisiones sobre la aprobaci贸n o rechazo de cr茅ditos.