Modelado y DAX: modelo estrella y medidas que cuadran. En la sesión 2 dejamos fCartera limpia. Hoy la convertimos en un modelo estrella: tres dimensiones, una tabla calendario y las medidas clave de cartera, mora y PAR30, cada una validada contra un número de control.
📁 Materiales del proyecto
La base, el PDF de esta sesión (Clase 3 · Modelado y DAX), Controles_Sucursal.csv y los archivos de trabajo están en la carpeta del proyecto (es la misma para las 4 sesiones):
1. El punto de partida
Una fila de fCartera describe una operación presente al corte del 30/04/2018. La clave de cada operación es cod_su + nro_operacion. Antes de modelar, confirmá que tu tabla limpia de la sesión 2 da estos números:
2. Hechos, dimensiones y modelo estrella
Las dimensiones filtran y agrupan (quién, qué, dónde, cuándo); la tabla de hechos aporta los números que suma DAX. En el centro queda fCartera y alrededor, cuatro dimensiones:
| Dimensión | Columnas | Filas | Para qué sirve |
|---|---|---|---|
| dSucursal | cod_su | 63 | Comparar sucursales |
| dProducto | cod_producto, producto | 17 | Comparar productos (una descripción por código) |
| dOficial | id_oficial | 802 | Comparar oficiales (solo IDs, sin nombres inventados) |
| dCalendario | Date, Anio, NroMes, Mes, AnioMes, AnioMesOrden | 3.652 | Organizar las fechas de origen (2009–2018) |
¿Por qué area queda en fCartera?
45 de las 63 sucursales tienen varias áreas. Si pusiéramos area en dSucursal, la clave dejaría de ser única. Por eso dSucursal contiene solo cod_su.
Reglas de las relaciones
- Cada dimensión se relaciona 1 a muchos con fCartera.
- Relaciones activas y con filtro simple (de la dimensión hacia los hechos).
- Las claves de ambos lados deben tener el mismo tipo de dato.
- No hacen falta relaciones entre dimensiones.
3. La tabla calendario y el orden
- Columna de fecha:
dCalendario[Date], del 01/01/2009 al 31/12/2018. - Marcar como tabla de fechas.
- Relación activa
dCalendario[Date] → fCartera[fec_operacion].
| Buena práctica | Cómo |
|---|---|
| Mes | Ordenar por NroMes |
| AnioMes | Ordenar por AnioMesOrden |
| Medidas | Guardarlas en la tabla _Medidas |
| Códigos visibles | Resumen: No resumir |
4. Medidas base
Una columna calcula un valor por fila; una medida calcula bajo los filtros de cada visual: una tarjeta evalúa el contexto completo y una matriz evalúa cada segmento.
Cartera Total = SUM ( fCartera[saldo_capital_cuota] ) Operaciones = COUNTROWS ( fCartera ) Clientes = DISTINCTCOUNT ( fCartera[cod_cliente] ) Ticket Promedio = DIVIDE ( [Cartera Total], [Operaciones] )
Control del contexto de filtro
Filtrá una sucursal: cambian saldo y operaciones, y los porcentajes usan el saldo de esa selección. Compará contra Controles_Sucursal.csv. Al quitar los filtros tenés que volver al control general.
5. Mora y PAR30
Una operación está en mora cuando ddm > 0 (con ddm <= 0 está al día). La Cartera PAR30 usa ddm > 30: con 30 días queda fuera, con 31 entra.
Cartera en Mora = CALCULATE ( [Cartera Total], KEEPFILTERS ( fCartera[ddm] > 0 ) ) % Mora = DIVIDE ( [Cartera en Mora], [Cartera Total] ) Cartera PAR30 = CALCULATE ( [Cartera Total], KEEPFILTERS ( fCartera[ddm] > 30 ) ) PAR30 % = DIVIDE ( [Cartera PAR30], [Cartera Total] )
Por qué KEEPFILTERS
Conserva la intersección con el filtro que ya tenga el visual sobre ddm (por ejemplo, un tramo). Y el total del % se calcula con saldos totales, no como promedio de porcentajes. Formato: Gs sin decimales, % con dos decimales.
6. Meses de origen y mes anterior
Hay operaciones originadas en 96 meses, de 2009-05 a 2018-04. Como el calendario se relaciona con fec_operacion, el saldo por mes es el saldo actual de cada cohorte de origen.
Monto Original Registrado = SUM ( fCartera[monto_original] ) Cartera Mes Anterior = CALCULATE ( [Cartera Total], DATEADD ( dCalendario[Date], -1, MONTH ) )
- Usá meses completos y consecutivos.
DIVIDEcontrola el denominador cero; si falta el mes actual o el anterior, la variación queda en blanco.
⚠ Alcance del análisis temporal
Con un solo corte podés comparar cohortes de origen, pero no la evolución de la mora: para eso hacen falta varios cortes (clave futura: operación + fecha_proceso). El monto histórico completo requiere otra fuente.
7. Controles finales
| Medida | Control sin filtros |
|---|---|
| Operaciones | 124.400 |
| Clientes | 120.955 |
| Cartera Total | 550.762.578.112 Gs |
| Cartera en Mora | 135.863.525.266 Gs (24,67 %) · 35.336 operaciones |
| Cartera PAR30 | 76.710.385.814 Gs (13,93 %) |
| Clientes en Mora | 34.837 |
| Dimensiones | 63 sucursales · 17 productos · 802 oficiales |
8. Con IA: tu copiloto
Compartí los nombres de tablas y columnas, definí ddm > 0 y ddm > 30, pedí que te explique filtros y formato y, sobre todo, validá cada medida contra los controles. Si usás Claude Desktop con el MCP de Power BI conectado y el .pbix abierto con fCartera cargada, este prompt arma el modelo completo:
Usa el MCP de Power BI sobre mi modelo abierto. fCartera ya está cargada. No inventes datos. 1. Crea dSucursal (cod_su), dProducto (cod_producto, producto) y dOficial (id_oficial) desde fCartera. 2. Crea dCalendario del 01/01/2009 al 31/12/2018 con Anio, NroMes, Mes, AnioMes y AnioMesOrden; márcala como tabla de fechas. Ordena Mes por NroMes y AnioMes por AnioMesOrden. 3. Relaciones 1:*, activas y de filtro simple hacia fCartera por cod_su, cod_producto, id_oficial y dCalendario[Date] → fec_operacion. Claves con el mismo tipo de dato; códigos en No resumir. 4. En la tabla _Medidas crea: Cartera Total, Operaciones, Clientes, Ticket Promedio, Cartera en Mora (ddm > 0 con KEEPFILTERS), % Mora, Cartera PAR30 (ddm > 30), PAR30 %, Clientes en Mora y Cartera Mes Anterior (DATEADD -1 MONTH). Formato: Gs sin decimales, % con dos decimales. 5. Valida con consultas DAX y muéstrame una tabla de controles: 124.400 operaciones · 120.955 clientes · 550.762.578.112 Gs cartera · 135.863.525.266 Gs en mora (24,67 %) · 76.710.385.814 Gs PAR30 (13,93 %) · 34.837 clientes en mora. Si un control no cuadra, detente y explica la causa antes de seguir.
Practicá · Tu turno
- Creá la medida Clientes en Mora. Control: 34.837 clientes.
- Armá una matriz por TramoMora con operaciones y saldo.
- Probá el filtro con la sucursal 53 y un producto.
⚠ Clientes por tramo
DISTINCTCOUNT no es aditivo: un cliente puede aparecer en varios tramos, así que la suma de las filas no coincide con el total, que recalcula clientes únicos. Reto opcional: asignar a cada cliente su peor tramo global.
Tarea para la sesión 4
- Guardá Cartera_Taller_Sesion03.pbix.
- Captura del modelo y registro de validaciones.
- Una página de control con cinco KPI.
- Matrices por sucursal y por producto.
En la sesión 4: tablero, concentración y publicación.
Curso Power BI + DAX + IA · Proyecto 1: Cartera de Créditos · Quantux AI · MSc. Oscar González Frutos.
