1) Contexto del negocio
Finanx opera dos líneas de crédito: consumo (límites bajos–medios, alto volumen) y pymes (límites medios–altos, mayor documentación). Crecimiento acelerado con originaciones 100% digitales.
- Aprobaciones lentas (24–72h) por revisiones manuales.
- Morosidad creciente en cohortes recientes.
- Costos altos por verificaciones humanas y fraudes sutiles.
- Falta de trazabilidad en decisiones (por qué se aprueba/declina).
2) Problema principal
Mejorar la precisión de riesgo sin frenar el crecimiento.
- ¿A quién aprobar y en qué monto/condiciones?
- ¿Cómo detectar a tiempo créditos con alta probabilidad de mora?
- ¿Cómo explicar la decisión con transparencia y cumplimiento?
3) Objetivo del proyecto (MVP 8–10 semanas)
- Score de riesgo a 90 días con ML.NET, expuesto vía API .NET.
- Reducir NPL y acelerar TAT.
- Explicabilidad por caso y monitoreo por cohortes / drift.
4) Alcance funcional del MVP
Originación y scoring
- Ingreso de solicitud + buró (si aplica).
- Scoring binario a 90 días (moroso / no moroso).
- Motor de decisión con umbrales por segmento.
Observabilidad
- Dashboard (Blazor): KPIs, distribución de scores, AUC/KS.
- Explicabilidad local (per-features).
- Retrain mensual, validación A/B.
5) Datos disponibles y “data gaps”
Históricos de 24–36 meses (solicitudes, transacciones, operación, comportamiento, etiquetas 90d).
Disponibles
- Solicitud (edad, ingresos, ocupación, etc.).
- Banco(s): saldo, variabilidad de ingresos.
- Operación: monto, plazo, producto, canal.
- Comportamiento: pagos, buckets 30/60/90.
Gaps
- Buró externo (si aplica).
- Señales antifraude (device/IP/geo).
- Normalización de ingresos por estacionalidad.
Para el prototipo: mapeo al dataset German Credit (UCI) y posteriormente conexión a datos reales.
6) Variables candidatas (ejemplos)
Sociodemográficas
Edad, estado civil, dependientes.
Ingresos & estabilidad
Ingreso, variabilidad, antigüedad laboral.
Endeudamiento
Cuota/ingreso, préstamos activos, atrasos.
Producto
Monto, plazo, tasa, tipo (consumo/pyme).
Comportamiento
Pagos a tiempo, mínimos, promesas de pago.
Canal & señales
Canal, dispositivo, hora/día.
7) Métricas de éxito
AUC/ROC
≥ 0.78
KS
> 0.35
PSI
< 0.25
TAT
↓ significativo
Negocio: ↓ NPL90, ↑ tasa de aprobación sin incrementar NPL, ↑ ROI.
8) Requerimientos no funcionales y compliance
- Explicabilidad por caso (razones top del score).
- Auditoría: versionado de datasets, features, modelos y decisiones.
- Seguridad: cifrado en tránsito/reposo, Identity/JWT.
- Privacidad: PII minimizada (GDPR/ley local).
- Despliegue: contenedores en Azure App Service; CI/CD.
9) Arquitectura técnica (alto nivel)
Abrir demoPipeline de datos, entrenamiento y servicio de scoring operando con observabilidad continua.
10) Usuarios y casos de uso
Analista de riesgo
Ajuste de umbrales, estabilidad, calibración.
Originación
Uso del score, solicitud de documentación.
Cumplimiento
Auditoría de decisiones, fairness.
Dirección
KPIs de originación, pérdidas, ROI.
Historias
- Ver distribución de score diaria y cutoff óptimo.
- Ver motivos del score por solicitud para pedir docs precisas.
- Auditar una decisión con versión de modelo y features usados.
11) Riesgos y mitigaciones
Técnicos / Datos
- Target leakage → validación temporal, exclusión de variables post-aprobación.
- Drift → PSI, retrain mensual, champion/challenger.
- Calidad → validadores de esquema, outliers, missing.
Éticos / Cumplimiento
- Sesgo/fairness → métricas por segmento y ajustes de políticas.
- Privacidad/seguridad → PII minimizada, cifrado, controles de acceso.
12) Plan por fases (8–10 semanas)
- Sem 1–2: Descubrimiento + contrato de esquema + mapeo a dataset público.
- Sem 3–4: Feature engineering + baseline AutoML ML.NET + evaluación/explicabilidad.
- Sem 5–6: API /score + dashboard Blazor + seguridad.
- Sem 7–8: Monitoreo, UAT con casos reales, documentación y handover.
Sem 1–2
Sem 3–4
Sem 5–6
Sem 7–8
Data mapping → German Credit (UCI) – Prototipo
Label objetivo: default_90d = 1 si hay impago, 0 si no.
Dominio Finanx (real) | Descripción negocio | German Credit | Tipo | Transformación / Notas |
---|---|---|---|---|
applicant_id | Identificador solicitud | (generar) | string | GUID en prototipo |
age | Edad del solicitante | age | int | Validar 18–80 |
employment_years | Antigüedad laboral | employmentDuration | categórica | “>=7years”→7, “1<=”→1… |
income_monthly | Ingreso mensual | (no directa) | decimal | Aproximar c/creditAmount/plazo o simular |
dependents | Dependientes | (no directa) | int | Simular (0–3) |
marital_status | Estado civil | personalStatusAndSex | categórica | Separar sexo/estado civil (opcional) |
housing | Vivienda | housing | categórica | One-hot |
purpose | Propósito del crédito | purpose | categórica | One-hot / bucket |
loan_amount | Monto solicitado | creditAmount | decimal | Escalado log |
loan_term_months | Plazo (meses) | duration | int | Ya viene en meses |
checking_status | Saldo cuenta corriente | checkingStatus | categórica | Ordinal encoding |
savings_status | Ahorros | savings | categórica | Ordinal encoding |
other_debtors | Co-deudores/garantes | otherDebtors | categórica | One-hot |
installment_rate | % cuota/ingreso | installmentRate | int | Valores 1–4 |
existing_credits | Nº créditos existentes | existingCreditsCount | int | Tal cual |
job_type | Tipo de empleo | job | categórica | One-hot |
phone | Teléfono | telephone | binaria | 1/0 |
foreign_worker | Trabajador extranjero | foreignWorker | binaria | 1/0 |
default_90d | Impago 90 días | class | binaria | “bad”→1, “good”→0 |