驴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.

- 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
Carga de datos
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)

An谩lisis de DataFrame
datos.info()

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)

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()

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)

Divisi贸n del conjunto de datos (train-test split)
# 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 de modelo
# 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 hiperpar谩metros
# 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'"
Entrenamiento del modelo con los par谩metros ajustados
# 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)

Evaluaci贸n del modelo
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.

