Construyendo el dashboard paso a paso
Implementación guiada del dashboard financiero.
Ahora que entiendes las métricas financieras, es momento de construir un dashboard profesional. En esta lección crearás el modelo de datos, las medidas DAX y las visualizaciones que esperan ver los equipos de finanzas.
Estructura de datos financieros
Los datos financieros tienen una estructura particular que debes respetar para que el dashboard funcione correctamente.
El catálogo de cuentas (Chart of Accounts)
Toda empresa tiene un catálogo de cuentas que organiza todas las transacciones financieras. Esta es la base de tu modelo.
┌─────────────────────────────────────────────────────────────┐
│ ESTRUCTURA DEL CATÁLOGO DE CUENTAS │
├─────────────────────────────────────────────────────────────┤
│ Cuenta Nombre Tipo Grupo │
│ ───────────────────────────────────────────────────────── │
│ 4000 Ingresos Revenue P&L │
│ 4100 Ventas de productos Revenue P&L │
│ 4200 Servicios Revenue P&L │
│ 4300 Otros ingresos Revenue P&L │
│ ───────────────────────────────────────────────────────── │
│ 5000 Costo de ventas COGS P&L │
│ 5100 Materiales COGS P&L │
│ 5200 Mano de obra directa COGS P&L │
│ ───────────────────────────────────────────────────────── │
│ 6000 Gastos operativos OPEX P&L │
│ 6100 Ventas y marketing OPEX P&L │
│ 6200 G&A OPEX P&L │
│ 6300 R&D OPEX P&L │
│ 6400 Depreciación OPEX P&L │
│ ───────────────────────────────────────────────────────── │
│ 7000 Otros gastos Other P&L │
│ 7100 Intereses Other P&L │
│ 7200 Impuestos Other P&L │
└─────────────────────────────────────────────────────────────┘
Tablas necesarias para el modelo
Para un dashboard financiero robusto, necesitas estas tablas:
| Tabla | Descripción | Campos clave |
|---|---|---|
| DimCuentas | Catálogo de cuentas | AccountID, AccountName, AccountType, ParentAccount |
| DimTiempo | Calendario | Date, Year, Month, Quarter, YearMonth |
| DimDepartamento | Centros de costo | DeptID, DeptName, Manager |
| FactActual | Transacciones reales | Date, AccountID, DeptID, Amount |
| FactBudget | Presupuesto | Date, AccountID, DeptID, BudgetAmount |
Paso 1: Crear la tabla de calendario
La tabla de calendario es fundamental para análisis temporales correctos.
DAX para tabla de calendario financiero
DimCalendario =
VAR MinDate = MIN(FactActual[Date])
VAR MaxDate = MAX(FactActual[Date])
VAR FiscalYearStartMonth = 1 // Cambiar si año fiscal empieza otro mes
RETURN
ADDCOLUMNS(
CALENDAR(
DATE(YEAR(MinDate), 1, 1),
DATE(YEAR(MaxDate), 12, 31)
),
"Year", YEAR([Date]),
"Month", MONTH([Date]),
"MonthName", FORMAT([Date], "MMMM"),
"MonthShort", FORMAT([Date], "MMM"),
"Quarter", "Q" & QUARTER([Date]),
"YearMonth", FORMAT([Date], "YYYY-MM"),
"YearQuarter", YEAR([Date]) & "-Q" & QUARTER([Date]),
"MonthNumber", MONTH([Date]),
"DayOfMonth", DAY([Date]),
"IsCurrentMonth", IF(
YEAR([Date]) = YEAR(TODAY()) && MONTH([Date]) = MONTH(TODAY()),
TRUE,
FALSE
),
"FiscalYear", IF(
MONTH([Date]) >= FiscalYearStartMonth,
YEAR([Date]),
YEAR([Date]) - 1
),
"FiscalQuarter", "FQ" & (
INT((MONTH([Date]) - FiscalYearStartMonth + 12) / 3) + 1
)
)
Marcar como tabla de fechas
Después de crear la tabla, márcala como tabla de fechas:
- Selecciona la tabla
DimCalendario - Ve a Herramientas de tabla > Marcar como tabla de fechas
- Selecciona la columna
Date
Paso 2: Crear jerarquía de cuentas
Las cuentas financieras tienen una jerarquía natural que debes modelar.
Estructura de jerarquía
┌────────────────────────────────────────────────────────────┐
│ JERARQUÍA DE CUENTAS │
├────────────────────────────────────────────────────────────┤
│ │
│ ► Total P&L │
│ ├── Revenue │
│ │ ├── Product Revenue │
│ │ │ ├── Product A │
│ │ │ └── Product B │
│ │ └── Service Revenue │
│ │ ├── Consulting │
│ │ └── Support │
│ ├── COGS │
│ │ ├── Materials │
│ │ └── Direct Labor │
│ ├── Gross Profit (calculado) │
│ ├── Operating Expenses │
│ │ ├── Sales & Marketing │
│ │ ├── G&A │
│ │ └── R&D │
│ └── Operating Income (calculado) │
│ │
└────────────────────────────────────────────────────────────┘
Crear jerarquía en Power BI
- En la tabla
DimCuentas, arrastraAccountTypesobreAccountCategory - Luego arrastra
AccountNamesobreAccountType - Renombra la jerarquía como "Jerarquía de Cuentas"
Ordenar cuentas correctamente
Las cuentas deben aparecer en orden lógico del P&L, no alfabético.
// Agregar columna de orden en DimCuentas
AccountOrder =
SWITCH(
TRUE(),
DimCuentas[AccountType] = "Revenue", 1,
DimCuentas[AccountType] = "COGS", 2,
DimCuentas[AccountType] = "OPEX", 3,
DimCuentas[AccountType] = "Other", 4,
5
) * 1000 + DimCuentas[AccountID]
Luego ordena AccountName por AccountOrder:
- Selecciona la columna
AccountName - Herramientas de columna > Ordenar por columna >
AccountOrder
Paso 3: Modelo de datos estrella
Construye las relaciones correctamente para un modelo eficiente.
┌─────────────────────────────────────────────────────────────┐
│ MODELO ESTRELLA │
│ │
│ ┌──────────────┐ │
│ │ DimCalendario│ │
│ │ (Date) │ │
│ └──────┬───────┘ │
│ │ 1:* │
│ ┌──────────────┐ │ ┌──────────────┐ │
│ │ DimCuentas │ │ │DimDepartamento│ │
│ │ (AccountID) │ │ │ (DeptID) │ │
│ └──────┬───────┘ │ └──────┬───────┘ │
│ │ 1:* │ 1:* │ 1:* │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌─────────────────────────────────────────┐ │
│ │ FactActual │ │
│ │ (Date, AccountID, DeptID, Amount) │ │
│ └─────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────┐ │
│ │ FactBudget │ │
│ │ (Date, AccountID, DeptID, BudgetAmount) │ │
│ └─────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
Configurar relaciones
| Desde | Hacia | Cardinalidad | Dirección |
|---|---|---|---|
| DimCalendario[Date] | FactActual[Date] | 1:* | Single |
| DimCalendario[Date] | FactBudget[Date] | 1:* | Single (Inactiva) |
| DimCuentas[AccountID] | FactActual[AccountID] | 1:* | Single |
| DimCuentas[AccountID] | FactBudget[AccountID] | 1:* | Single |
| DimDepartamento[DeptID] | FactActual[DeptID] | 1:* | Single |
| DimDepartamento[DeptID] | FactBudget[DeptID] | 1:* | Single |
Nota: La relación con FactBudget desde DimCalendario puede ser inactiva si ambas tablas comparten la misma dimensión de tiempo. Usa USERELATIONSHIP cuando necesites activarla.
Paso 4: Medidas DAX financieras
Ahora crearemos todas las medidas necesarias para el dashboard.
Medidas base
// Monto actual
Actual =
SUM(FactActual[Amount])
// Presupuesto
Budget =
CALCULATE(
SUM(FactBudget[BudgetAmount]),
USERELATIONSHIP(DimCalendario[Date], FactBudget[Date])
)
Medidas de P&L
// Revenue
Total Revenue =
CALCULATE(
[Actual],
DimCuentas[AccountType] = "Revenue"
)
// COGS
Total COGS =
CALCULATE(
[Actual],
DimCuentas[AccountType] = "COGS"
)
// Gross Profit
Gross Profit = [Total Revenue] - [Total COGS]
// Gross Margin %
Gross Margin % =
DIVIDE(
[Gross Profit],
[Total Revenue],
0
)
// Operating Expenses
Total OPEX =
CALCULATE(
[Actual],
DimCuentas[AccountType] = "OPEX"
)
// Operating Income
Operating Income = [Gross Profit] - [Total OPEX]
// Operating Margin %
Operating Margin % =
DIVIDE(
[Operating Income],
[Total Revenue],
0
)
// Depreciación y Amortización
Depreciation =
CALCULATE(
[Actual],
DimCuentas[AccountCategory] = "Depreciation"
)
// EBITDA
EBITDA = [Operating Income] + [Depreciation]
// EBITDA Margin %
EBITDA Margin % =
DIVIDE(
[EBITDA],
[Total Revenue],
0
)
// Net Income
Net Income =
CALCULATE(
[Actual],
DimCuentas[AccountGroup] = "P&L"
)
Medidas de variación
// Variación absoluta
Variance = [Actual] - [Budget]
// Variación porcentual
Variance % =
DIVIDE(
[Actual] - [Budget],
ABS([Budget]),
0
)
// Variación favorable (para ingresos)
Variance Favorable Revenue =
VAR Var = [Actual] - [Budget]
RETURN
IF(
SELECTEDVALUE(DimCuentas[AccountType]) = "Revenue",
IF(Var > 0, Var, BLANK()),
BLANK()
)
// Variación favorable (para gastos - invertido)
Variance Favorable Expense =
VAR Var = [Budget] - [Actual]
RETURN
IF(
SELECTEDVALUE(DimCuentas[AccountType]) IN {"COGS", "OPEX"},
IF(Var > 0, Var, BLANK()),
BLANK()
)
// Indicador de variación (para formato condicional)
Variance Status =
VAR Var = [Variance]
VAR AccountType = SELECTEDVALUE(DimCuentas[AccountType])
RETURN
SWITCH(
TRUE(),
AccountType = "Revenue" && Var > 0, "Favorable",
AccountType = "Revenue" && Var < 0, "Desfavorable",
AccountType IN {"COGS", "OPEX"} && Var < 0, "Favorable",
AccountType IN {"COGS", "OPEX"} && Var > 0, "Desfavorable",
"Neutral"
)
Medidas de tiempo
// Año anterior
Actual PY =
CALCULATE(
[Actual],
SAMEPERIODLASTYEAR(DimCalendario[Date])
)
// Crecimiento Year-over-Year
YoY Growth =
DIVIDE(
[Actual] - [Actual PY],
ABS([Actual PY]),
0
)
// YTD (Year to Date)
Actual YTD =
CALCULATE(
[Actual],
DATESYTD(DimCalendario[Date])
)
// MTD (Month to Date)
Actual MTD =
CALCULATE(
[Actual],
DATESMTD(DimCalendario[Date])
)
// Running Total
Running Total =
CALCULATE(
[Actual],
FILTER(
ALL(DimCalendario[Date]),
DimCalendario[Date] <= MAX(DimCalendario[Date])
)
)
Paso 5: Visualización del P&L
El P&L requiere una visualización especial tipo "matriz" con formato condicional.
Layout del P&L
┌────────────────────────────────────────────────────────────────────┐
│ ESTADO DE RESULTADOS │
│ Enero 2026 │
├────────────────────────────────────────────────────────────────────┤
│ │
│ Cuenta Actual Budget Variance Var % │
│ ──────────────────────────────────────────────────────────────── │
│ ▼ Revenue $1,200,000 $1,100,000 $100,000 9.1% │
│ Product Revenue $800,000 $750,000 $50,000 6.7% │
│ Service Revenue $400,000 $350,000 $50,000 14.3% │
│ ──────────────────────────────────────────────────────────────── │
│ ▼ COGS $480,000 $440,000 ($40,000) -9.1% │
│ Materials $300,000 $280,000 ($20,000) -7.1% │
│ Direct Labor $180,000 $160,000 ($20,000)-12.5% │
│ ──────────────────────────────────────────────────────────────── │
│ Gross Profit $720,000 $660,000 $60,000 9.1% │
│ Gross Margin % 60.0% 60.0% │
│ ──────────────────────────────────────────────────────────────── │
│ ▼ Operating Expenses $350,000 $330,000 ($20,000) -6.1% │
│ Sales & Marketing $150,000 $145,000 ($5,000) -3.4% │
│ G&A $120,000 $115,000 ($5,000) -4.3% │
│ R&D $80,000 $70,000 ($10,000)-14.3% │
│ ──────────────────────────────────────────────────────────────── │
│ Operating Income $370,000 $330,000 $40,000 12.1% │
│ Operating Margin % 30.8% 30.0% │
│ ──────────────────────────────────────────────────────────────── │
│ EBITDA $420,000 $375,000 $45,000 12.0% │
│ EBITDA Margin % 35.0% 34.1% │
│ │
└────────────────────────────────────────────────────────────────────┘
Crear la matriz en Power BI
- Inserta una visualización Matriz
- Filas: Jerarquía de Cuentas (AccountType > AccountName)
- Valores: Actual, Budget, Variance, Variance %
- Aplica formato condicional a Variance y Variance %
Formato condicional para variaciones
- Selecciona la columna
Varianceen la matriz - Formato > Formato condicional > Color de fondo
- Configura:
- Regla: Si valor > 0, color verde claro
- Regla: Si valor < 0, color rojo claro
Para valores invertidos (gastos):
// Medida para formato condicional inteligente
Variance Color Value =
VAR Var = [Variance]
VAR AccountType = SELECTEDVALUE(DimCuentas[AccountType])
RETURN
IF(
AccountType = "Revenue",
Var, // Para revenue, positivo es bueno
-Var // Para gastos, negativo es bueno (invertimos)
)
Paso 6: Dashboard completo - Layout
Diseña un dashboard ejecutivo con toda la información relevante.
Página 1: Executive Summary
┌────────────────────────────────────────────────────────────────────┐
│ [Logo] FINANCIAL DASHBOARD [Filtro: Año] [Filtro: Mes] │
├────────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ Revenue │ │ Gross │ │ EBITDA │ │ Net │ │ Cash │ │
│ │ $1.2M │ │ Margin │ │ $420K │ │ Income │ │ Flow │ │
│ │ +9.1% vs │ │ 60.0% │ │ +12.0% │ │ $280K │ │ $195K │ │
│ │ budget │ │ vs 60.0% │ │ vs budget│ │ +8.5% │ │ +15.2% │ │
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
│ │
│ ┌────────────────────────────────┐ ┌────────────────────────────┐│
│ │ Revenue Trend │ │ P&L Summary ││
│ │ ─────────────── │ │ ───────────── ││
│ │ Actual vs Budget │ │ Revenue $1.2M ││
│ │ │ │ COGS ($480K) ││
│ │ $1.2M ─────● │ │ Gross Profit $720K ││
│ │ ─────○ $1.1M Budget │ │ OPEX ($350K) ││
│ │ Jan Feb Mar Apr │ │ Op. Income $370K ││
│ └────────────────────────────────┘ └────────────────────────────┘│
│ │
│ ┌────────────────────────────────┐ ┌────────────────────────────┐│
│ │ Budget Variance by Dept │ │ Top Variances ││
│ │ ───────────────────── │ │ ─────────────── ││
│ │ │ │ ▲ Service Rev +$50K ││
│ │ Sales ████████ +$45K │ │ ▲ Product Rev +$50K ││
│ │ Ops ████ -$12K │ │ ▼ R&D Expense -$10K ││
│ │ R&D ███ -$10K │ │ ▼ Materials -$20K ││
│ └────────────────────────────────┘ └────────────────────────────┘│
│ │
└────────────────────────────────────────────────────────────────────┘
Página 2: P&L Detallado
┌────────────────────────────────────────────────────────────────────┐
│ ESTADO DE RESULTADOS DETALLADO [Año] [Trimestre] [Mes] │
├────────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────────────────────────────────────────────────────┐ │
│ │ Cuenta Actual Budget Var Var% YoY │ │
│ │ ────────────────────────────────────────────────────────── │ │
│ │ ▼ Revenue $1,200K $1,100K $100K 9.1% 12.3% │ │
│ │ Product Rev $800K $750K $50K 6.7% 10.5% │ │
│ │ Service Rev $400K $350K $50K 14.3% 16.2% │ │
│ │ ▼ COGS $480K $440K -$40K -9.1% -8.2% │ │
│ │ Gross Profit $720K $660K $60K 9.1% 15.1% │ │
│ │ ▼ OPEX $350K $330K -$20K -6.1% -5.5% │ │
│ │ Operating Income $370K $330K $40K 12.1% 18.2% │ │
│ │ EBITDA $420K $375K $45K 12.0% 16.8% │ │
│ └──────────────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────┐ ┌─────────────────────────────┐ │
│ │ Margin Trends │ │ Revenue by Category │ │
│ │ ───────────── │ │ ───────────────── │ │
│ │ │ │ │ │
│ │ Gross ───●───●───● 60% │ │ Product ████████ 67% │ │
│ │ EBITDA ──○───○───○ 35% │ │ Service ████ 33% │ │
│ │ Net ────△───△───△ 23% │ │ │ │
│ │ Jan Feb Mar Apr May │ │ │ │
│ └─────────────────────────────┘ └─────────────────────────────┘ │
│ │
└────────────────────────────────────────────────────────────────────┘
Página 3: Budget Analysis
┌────────────────────────────────────────────────────────────────────┐
│ ANALISIS DE PRESUPUESTO [Año] [Departamento] │
├────────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌─────────────────────────┐│
│ │ Total │ │ Favorable│ │Desfavorab│ │ % de Ejecución ││
│ │ Variance │ │ │ │ │ │ ││
│ │ +$80K │ │ +$150K │ │ -$70K │ │ ████████████░░ 85% ││
│ └──────────┘ └──────────┘ └──────────┘ └─────────────────────────┘│
│ │
│ ┌────────────────────────────────────────────────────────────────┐│
│ │ Variance Waterfall ││
│ │ ────────────────── ││
│ │ ││
│ │ Budget ████████████████████████████████ $1,000K ││
│ │ Rev + ████ +$100K ││
│ │ COGS - ██ -$40K ││
│ │ OPEX - ██ -$20K ││
│ │ Other + █ +$10K ││
│ │ Actual ██████████████████████████████████████ $1,050K ││
│ │ ││
│ └────────────────────────────────────────────────────────────────┘│
│ │
│ ┌─────────────────────────────┐ ┌─────────────────────────────┐ │
│ │ Variance by Department │ │ Monthly Variance Trend │ │
│ │ ────────────────── │ │ ───────────────────── │ │
│ │ │ │ │ │
│ │ Sales █████████ +$85K │ │ +$100K │ │
│ │ Ops ██████ -$45K │ │ ● │ │
│ │ Marketing███████ +$30K │ │ ● ● │ │
│ │ R&D ███ -$10K │ │ ● ● │ │
│ │ G&A ████ +$20K │ │ J F M A M │ │
│ └─────────────────────────────┘ └─────────────────────────────┘ │
│ │
└────────────────────────────────────────────────────────────────────┘
Paso 7: Best practices para reportes financieros
Convenciones de signos
Hay dos convenciones comunes. Elige una y sé consistente:
| Convención | Ingresos | Gastos | Notas |
|---|---|---|---|
| Natural | Positivo (+) | Positivo (+) | Más intuitivo para negocio |
| Contable | Positivo (+) | Negativo (-) | Suma directa = Net Income |
// Si usas convención natural y necesitas calcular Net Income
Net Income Natural =
[Total Revenue] - [Total COGS] - [Total OPEX] - [Other Expenses]
// Si usas convención contable
Net Income Contable =
CALCULATE(
SUM(FactActual[Amount]), // Simplemente suma todo
DimCuentas[AccountGroup] = "P&L"
)
Formato de números financieros
// Medida para formato automático (K, M, B)
Revenue Display =
VAR Value = [Total Revenue]
RETURN
SWITCH(
TRUE(),
ABS(Value) >= 1000000000, FORMAT(Value / 1000000000, "$#,##0.0B"),
ABS(Value) >= 1000000, FORMAT(Value / 1000000, "$#,##0.0M"),
ABS(Value) >= 1000, FORMAT(Value / 1000, "$#,##0.0K"),
FORMAT(Value, "$#,##0")
)
Alertas visuales
Configura alertas para variaciones significativas:
Variance Alert =
VAR VarPct = [Variance %]
RETURN
SWITCH(
TRUE(),
ABS(VarPct) > 0.20, "CRITICAL", // > 20%
ABS(VarPct) > 0.10, "WARNING", // > 10%
"OK"
)
Drill-through para detalles
Configura una página de drill-through para que usuarios puedan ver transacciones específicas:
- Crea una nueva página "Detalle de Transacciones"
- Agrega una tabla con: Date, AccountName, DeptName, Description, Amount
- En Formato > Información de página, activa Drill through
- Arrastra
AccountNameal área de drill through
Puntos clave de esta lección
- Un modelo de datos financiero requiere: DimCuentas, DimCalendario, DimDepartamento, y tablas de hechos para Actual y Budget
- La jerarquía de cuentas es fundamental para drill-down en el P&L
- Las medidas de variación deben considerar que para gastos el signo es inverso
- El formato condicional ayuda a identificar problemas rápidamente
- Usa convenciones de signos consistentes en todo el modelo
- El layout del dashboard debe seguir la estructura lógica del P&L
Próxima lección
En la siguiente lección pondrás todo en práctica con un proyecto completo: construirás un dashboard de P&L y Budget vs Real usando datos de ejemplo realistas.
Quiz de comprensión
¿Por qué es importante marcar la tabla de calendario como "tabla de fechas" en Power BI?
En el análisis de variaciones, ¿cómo interpretas una variación positiva en gastos vs una variación positiva en ingresos?
¿Cuál es la fórmula DAX para calcular el EBITDA?
¿Por qué se recomienda usar una columna de orden para las cuentas en lugar de ordenar alfabéticamente?
Describe dos best practices para reportes financieros mencionadas en esta lección.
Completaste esta leccion?
Marca esta leccion como completada. Tu progreso se guardara en tu navegador.