Lección 31 de 36Dashboard de Finanzas

Construyendo el dashboard paso a paso

Implementación guiada del dashboard financiero.

30 minutos

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:

  1. Selecciona la tabla DimCalendario
  2. Ve a Herramientas de tabla > Marcar como tabla de fechas
  3. 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

  1. En la tabla DimCuentas, arrastra AccountType sobre AccountCategory
  2. Luego arrastra AccountName sobre AccountType
  3. 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:

  1. Selecciona la columna AccountName
  2. 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

  1. Inserta una visualización Matriz
  2. Filas: Jerarquía de Cuentas (AccountType > AccountName)
  3. Valores: Actual, Budget, Variance, Variance %
  4. Aplica formato condicional a Variance y Variance %

Formato condicional para variaciones

  1. Selecciona la columna Variance en la matriz
  2. Formato > Formato condicional > Color de fondo
  3. 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:

  1. Crea una nueva página "Detalle de Transacciones"
  2. Agrega una tabla con: Date, AccountName, DeptName, Description, Amount
  3. En Formato > Información de página, activa Drill through
  4. Arrastra AccountName al á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

  1. ¿Por qué es importante marcar la tabla de calendario como "tabla de fechas" en Power BI?

  2. En el análisis de variaciones, ¿cómo interpretas una variación positiva en gastos vs una variación positiva en ingresos?

  3. ¿Cuál es la fórmula DAX para calcular el EBITDA?

  4. ¿Por qué se recomienda usar una columna de orden para las cuentas en lugar de ordenar alfabéticamente?

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