Predicción de incumplimiento de pagos de tarjetas de crédito mediante técnicas de Machine Learning.
Este proyecto implementa un flujo completo de análisis de datos y modelado predictivo para anticipar el incumplimiento crediticio (default) de clientes de tarjetas de crédito. Se utilizan modelos de clasificación supervisada para identificar patrones de riesgo crediticio.
Predecir la probabilidad de que un cliente incumpla con el pago de su tarjeta de crédito el próximo mes (default_payment_next_month), utilizando información histórica de pagos, datos demográficos y comportamiento financiero.
- Fuente: Default of Credit Card Clients Dataset
- Tamaño: 30,000 registros
- Features: 23 variables predictoras
- Target:
default_payment_next_month(binaria: 0 = No default, 1 = Default) - Desbalance de clases: 77.88% no default, 22.12% default
| Categoría | Variables |
|---|---|
| Historial de pagos | pay_0 a pay_6 (estado de pago en los últimos 6 meses) |
| Montos de facturas | bill_amt1 a bill_amt6 |
| Montos pagados | pay_amt1 a pay_amt6 |
| Información del cliente | limit_bal, age, sex, education, marriage |
credit_default_prediction/
│
├── data/
│ ├── raw/ # Datos originales
│ │ └── default_of_credit_card_clients.xls
│ └── processed/ # Datos limpios
│ └── default_of_credit_card_clients_clean.csv
│
├── notebooks/
│ └── Credit_Default_Prediction.ipynb # Notebook principal
│
├── reports/
│ ├── figures/ # Visualizaciones
│ ├── EDA_report.md # Reporte de análisis exploratorio
│ ├── numeric_summary.csv # Resumen estadístico
│ ├── target_counts.csv # Conteo de clases
│ └── target_proportions.csv # Proporciones de clases
│
├── requirements.txt # Dependencias
└── README.md # Este archivo
- Python 3.8+
- pip
pip install -r requirements.txtpandas>=1.3.0
numpy>=1.21.0
matplotlib>=3.4.0
seaborn>=0.11.0
scikit-learn>=0.24.0
openpyxl>=3.0.0
plotly>=5.0.0import pandas as pd
from pathlib import Path
# Cargar dataset original
raw_path = Path("data/raw/default_of_credit_card_clients.xls")
df = pd.read_excel(raw_path, header=1)
# Normalizar nombres de columnas
df.columns = [c.strip().lower().replace(" ", "_") for c in df.columns]
# Eliminar duplicados y valores nulos
df = df.drop_duplicates()
df = df.dropna()jupyter notebook notebooks/Credit_Default_Prediction.ipynb- Análisis de distribución de la variable objetivo
- Estadísticos descriptivos de variables numéricas
- Análisis de variables categóricas
- Matrices de correlación (Pearson, Spearman, Kendall)
- Mutual Information para selección de features
- Train: 60% (18,000 registros)
- Validation: 20% (6,000 registros)
- Test: 20% (6,000 registros)
- Estratificación para mantener proporciones de clases
from sklearn.linear_model import LogisticRegression
log_reg = LogisticRegression(
random_state=42,
max_iter=1000,
class_weight='balanced'
)
log_reg.fit(X_train_scaled, y_train)from sklearn.ensemble import RandomForestClassifier
rf_clf = RandomForestClassifier(
n_estimators=200,
max_depth=None,
random_state=42,
class_weight='balanced'
)
rf_clf.fit(X_train, y_train)| Modelo | AUC-ROC | F1-Score | Precision | Recall |
|---|---|---|---|---|
| Regresión Logística | 0.7273 | 0.4801 | 0.3856 | 0.6360 |
| Random Forest | 0.7695 | 0.4532 | 0.6681 | 0.3429 |
Random Forest obtiene mejor AUC-ROC y precision
Regresión Logística tiene mejor recall (detecta más incumplimientos)
Variables más importantes: pay_0, limit_bal, age, bill_amt1
El historial de pagos recientes es el predictor más fuerte
Predicción
No Default Default
Real
No Default 4447 226
Default 872 455
Según Random Forest (feature importance):
- pay_0 (0.100) - Estado de pago más reciente
- limit_bal (0.063) - Límite de crédito
- age (0.062) - Edad del cliente
- bill_amt1 (0.061) - Monto de factura más reciente
- bill_amt2 (0.054) - Monto de factura mes anterior
-
Desbalance de clases: Solo el 22% de los clientes incumple, requiere técnicas especiales (class_weight='balanced')
-
Modelos no lineales mejoran la predicción: Random Forest captura interacciones y patrones complejos mejor que regresión logística
-
Trade-off Precision vs Recall:
- Random Forest: Mayor precisión pero detecta menos incumplimientos
- Regresión Logística: Detecta más incumplimientos pero con más falsos positivos
-
Variables clave: El historial de pagos (últimos 6 meses) es el predictor más importante
-
Próximos pasos sugeridos:
- Probar Gradient Boosting (XGBoost, LightGBM)
- Ajuste de hiperparámetros con GridSearchCV
- Optimización del umbral de decisión según costo de negocio
- Ingeniería de features (interacciones, ratios)
Alejandro Isaias Montalvo Lupercio
Para preguntas o sugerencias, por favor abre un issue en el repositorio.
Si este proyecto te fue útil, considera darle una estrella en GitHub!