Lección 32 de 36Dashboard de Finanzas

Proyecto: P&L y Budget vs Real

Proyecto hands-on con datos contables.

45 minutos

Es momento de poner en práctica todo lo aprendido. En este proyecto construirás un dashboard financiero completo desde cero, usando un dataset realista de una empresa de tecnología.

Objetivo del proyecto

Construirás un dashboard ejecutivo de finanzas que permita:

  1. Visualizar el Estado de Resultados (P&L) completo
  2. Comparar resultados reales contra presupuesto
  3. Analizar variaciones por departamento y período
  4. Hacer drill-down hasta el detalle de transacciones

Al finalizar, tendrás un dashboard que podrías presentar a un CFO.

El escenario: TechFlow Solutions

TechFlow Solutions es una empresa de software B2B con:

  • 3 líneas de producto: Platform, Analytics, Consulting
  • 5 departamentos: Sales, Marketing, Engineering, G&A, Support
  • Año fiscal: Enero - Diciembre
  • Ingresos anuales: ~$15M

Tu trabajo: Crear el dashboard financiero para el equipo de finanzas.

Paso 1: Preparar los datos

Dataset del proyecto

Trabajarás con 4 archivos CSV que representan los datos financieros de TechFlow:

Archivo 1: chart_of_accounts.csv

AccountID,AccountName,AccountType,AccountCategory,ParentAccount,SortOrder
4000,Total Revenue,Revenue,Revenue,null,1000
4100,Product Revenue,Revenue,Revenue,4000,1100
4110,Platform Revenue,Revenue,Revenue,4100,1110
4120,Analytics Revenue,Revenue,Revenue,4100,1120
4200,Service Revenue,Revenue,Revenue,4000,1200
4210,Consulting Revenue,Revenue,Revenue,4200,1210
4220,Support Revenue,Revenue,Revenue,4200,1220
5000,Cost of Goods Sold,COGS,COGS,null,2000
5100,Direct Costs - Products,COGS,COGS,5000,2100
5110,Hosting & Infrastructure,COGS,COGS,5100,2110
5120,Third-party Licenses,COGS,COGS,5100,2120
5200,Direct Costs - Services,COGS,COGS,5000,2200
5210,Consultant Salaries,COGS,COGS,5200,2210
5220,Support Salaries,COGS,COGS,5200,2220
6000,Operating Expenses,OPEX,OPEX,null,3000
6100,Sales Expenses,OPEX,Sales,6000,3100
6110,Sales Salaries,OPEX,Sales,6100,3110
6120,Sales Commissions,OPEX,Sales,6100,3120
6130,Travel & Entertainment,OPEX,Sales,6100,3130
6200,Marketing Expenses,OPEX,Marketing,6000,3200
6210,Marketing Salaries,OPEX,Marketing,6200,3210
6220,Advertising,OPEX,Marketing,6200,3220
6230,Events & Conferences,OPEX,Marketing,6200,3230
6300,Engineering Expenses,OPEX,R&D,6000,3300
6310,Engineering Salaries,OPEX,R&D,6300,3310
6320,Dev Tools & Software,OPEX,R&D,6300,3320
6400,G&A Expenses,OPEX,G&A,6000,3400
6410,Admin Salaries,OPEX,G&A,6400,3410
6420,Office & Facilities,OPEX,G&A,6400,3420
6430,Professional Services,OPEX,G&A,6400,3430
6440,Insurance,OPEX,G&A,6400,3440
6500,Depreciation & Amortization,OPEX,D&A,6000,3500
6510,Depreciation,OPEX,D&A,6500,3510
6520,Amortization,OPEX,D&A,6500,3520
7000,Other Income/Expenses,Other,Other,null,4000
7100,Interest Income,Other,Other,7000,4100
7200,Interest Expense,Other,Other,7000,4200
7300,Income Taxes,Other,Tax,7000,4300

Archivo 2: departments.csv

DeptID,DeptName,Manager,CostCenter
D001,Sales,Maria Garcia,CC100
D002,Marketing,Carlos Rodriguez,CC200
D003,Engineering,Ana Martinez,CC300
D004,G&A,Juan Lopez,CC400
D005,Support,Laura Sanchez,CC500
D006,Executive,Pedro Fernandez,CC600

Archivo 3: actual_transactions.csv

Este archivo contiene miles de transacciones. Aquí un extracto representativo:

TransactionID,Date,AccountID,DeptID,Amount,Description
TRX001,2025-01-15,4110,D001,125000,Platform license - Acme Corp
TRX002,2025-01-15,4110,D001,85000,Platform license - Beta Inc
TRX003,2025-01-20,4120,D001,45000,Analytics module - Gamma LLC
TRX004,2025-01-25,4210,D005,35000,Consulting project - Delta Co
TRX005,2025-01-31,5110,D003,28000,AWS hosting - January
TRX006,2025-01-31,5120,D003,12000,Third-party API licenses
TRX007,2025-01-31,6110,D001,95000,Sales team salaries - January
TRX008,2025-01-31,6120,D001,18500,Sales commissions - January
TRX009,2025-01-31,6210,D002,45000,Marketing team salaries - January
TRX010,2025-01-31,6220,D002,25000,Google Ads - January
...

Archivo 4: budget.csv

Date,AccountID,DeptID,BudgetAmount
2025-01-01,4110,D001,200000
2025-01-01,4120,D001,80000
2025-01-01,4210,D005,50000
2025-01-01,4220,D005,30000
2025-01-01,5110,D003,30000
2025-01-01,5120,D003,15000
2025-01-01,6110,D001,90000
2025-01-01,6120,D001,20000
2025-01-01,6210,D002,45000
2025-01-01,6220,D002,30000
2025-02-01,4110,D001,210000
2025-02-01,4120,D001,85000
...

Nota: Para este ejercicio, puedes crear estos archivos manualmente o usar el generador de datos en el repositorio del curso.

Paso 2: Cargar y transformar datos

2.1 Importar archivos

  1. Abre Power BI Desktop
  2. Inicio > Obtener datos > Texto/CSV
  3. Importa los 4 archivos CSV

2.2 Transformaciones en Power Query

Tabla chart_of_accounts

let
    Source = Csv.Document(File.Contents("chart_of_accounts.csv")),
    Headers = Table.PromoteHeaders(Source, [PromoteAllScalars=true]),
    TypedColumns = Table.TransformColumnTypes(Headers,{
        {"AccountID", Int64.Type},
        {"AccountName", type text},
        {"AccountType", type text},
        {"AccountCategory", type text},
        {"ParentAccount", Int64.Type},
        {"SortOrder", Int64.Type}
    }),
    // Reemplazar null en ParentAccount
    ReplaceNulls = Table.ReplaceValue(TypedColumns, null, 0, Replacer.ReplaceValue, {"ParentAccount"})
in
    ReplaceNulls

Renombra la tabla como DimCuentas.

Tabla actual_transactions

let
    Source = Csv.Document(File.Contents("actual_transactions.csv")),
    Headers = Table.PromoteHeaders(Source, [PromoteAllScalars=true]),
    TypedColumns = Table.TransformColumnTypes(Headers,{
        {"TransactionID", type text},
        {"Date", type date},
        {"AccountID", Int64.Type},
        {"DeptID", type text},
        {"Amount", type number},
        {"Description", type text}
    }),
    // Agregar columnas de tiempo
    AddYear = Table.AddColumn(TypedColumns, "Year", each Date.Year([Date]), Int64.Type),
    AddMonth = Table.AddColumn(AddYear, "Month", each Date.Month([Date]), Int64.Type),
    AddYearMonth = Table.AddColumn(AddMonth, "YearMonth", each Date.ToText([Date], "yyyy-MM"), type text)
in
    AddYearMonth

Renombra la tabla como FactActual.

Tabla budget

let
    Source = Csv.Document(File.Contents("budget.csv")),
    Headers = Table.PromoteHeaders(Source, [PromoteAllScalars=true]),
    TypedColumns = Table.TransformColumnTypes(Headers,{
        {"Date", type date},
        {"AccountID", Int64.Type},
        {"DeptID", type text},
        {"BudgetAmount", type number}
    })
in
    TypedColumns

Renombra la tabla como FactBudget.

2.3 Crear tabla de calendario

En Power Query, crea una nueva consulta en blanco:

let
    StartDate = #date(2025, 1, 1),
    EndDate = #date(2025, 12, 31),
    NumberOfDays = Duration.Days(EndDate - StartDate) + 1,
    DateList = List.Dates(StartDate, NumberOfDays, #duration(1, 0, 0, 0)),
    DateTable = Table.FromList(DateList, Splitter.SplitByNothing(), {"Date"}, null, ExtraValues.Error),
    TypedDate = Table.TransformColumnTypes(DateTable, {{"Date", type date}}),
    AddYear = Table.AddColumn(TypedDate, "Year", each Date.Year([Date]), Int64.Type),
    AddMonth = Table.AddColumn(AddYear, "Month", each Date.Month([Date]), Int64.Type),
    AddMonthName = Table.AddColumn(AddMonth, "MonthName", each Date.MonthName([Date]), type text),
    AddMonthShort = Table.AddColumn(AddMonthName, "MonthShort", each Text.Start(Date.MonthName([Date]), 3), type text),
    AddQuarter = Table.AddColumn(AddMonthShort, "Quarter", each "Q" & Text.From(Date.QuarterOfYear([Date])), type text),
    AddYearMonth = Table.AddColumn(AddQuarter, "YearMonth", each Date.ToText([Date], "yyyy-MM"), type text),
    AddYearQuarter = Table.AddColumn(AddYearMonth, "YearQuarter", each Text.From(Date.Year([Date])) & "-Q" & Text.From(Date.QuarterOfYear([Date])), type text),
    AddDayOfMonth = Table.AddColumn(AddYearQuarter, "DayOfMonth", each Date.Day([Date]), Int64.Type),
    AddIsCurrentMonth = Table.AddColumn(AddDayOfMonth, "IsCurrentMonth", each Date.Year([Date]) = Date.Year(DateTime.LocalNow()) and Date.Month([Date]) = Date.Month(DateTime.LocalNow()), type logical)
in
    AddIsCurrentMonth

Renombra la tabla como DimCalendario.

Paso 3: Crear el modelo de datos

3.1 Establecer relaciones

En la vista de Modelo, crea estas relaciones:

Desde Hacia Tipo
DimCalendario[Date] FactActual[Date] 1:*
DimCalendario[Date] FactBudget[Date] 1:* (Inactiva)
DimCuentas[AccountID] FactActual[AccountID] 1:*
DimCuentas[AccountID] FactBudget[AccountID] 1:*
DimDepartamentos[DeptID] FactActual[DeptID] 1:*
DimDepartamentos[DeptID] FactBudget[DeptID] 1:*
┌──────────────────────────────────────────────────────────────────┐
│                        MODELO DE DATOS                           │
│                                                                  │
│     ┌─────────────┐                    ┌───────────────┐        │
│     │DimCalendario│                    │DimDepartamentos│        │
│     │   [Date]    │                    │   [DeptID]     │        │
│     └──────┬──────┘                    └───────┬────────┘        │
│            │                                   │                 │
│            │ 1:*                          1:*  │                 │
│            ▼                                   ▼                 │
│     ┌─────────────────────────────────────────────────┐         │
│     │                   FactActual                     │         │
│     │  [Date, AccountID, DeptID, Amount]               │         │
│     └─────────────────────────────────────────────────┘         │
│            ▲                                   ▲                 │
│            │ 1:*                          1:*  │                 │
│            │                                   │                 │
│     ┌──────┴──────┐                    ┌───────┴────────┐        │
│     │ DimCuentas  │                    │  FactBudget    │        │
│     │ [AccountID] │                    │ [Date,AcctID]  │        │
│     └─────────────┘                    └────────────────┘        │
│                                                                  │
└──────────────────────────────────────────────────────────────────┘

3.2 Marcar tabla de fechas

  1. Selecciona DimCalendario
  2. Herramientas de tabla > Marcar como tabla de fechas
  3. Columna de fecha: Date

3.3 Crear jerarquías

En DimCuentas, crea la jerarquía:

  1. Click derecho en AccountType > Crear jerarquía
  2. Arrastra AccountCategory a la jerarquía
  3. Arrastra AccountName a la jerarquía
  4. Renombra como "Jerarquía de Cuentas"

En DimCalendario, crea la jerarquía de tiempo:

  1. Year > Quarter > Month > Date
  2. Renombra como "Jerarquía de Tiempo"

3.4 Ordenar cuentas

En DimCuentas, ordena AccountName por SortOrder:

  1. Selecciona columna AccountName
  2. Herramientas de columna > Ordenar por columna > SortOrder

Paso 4: Crear medidas DAX

Crea una tabla de medidas para organización:

  1. Modelado > Nueva tabla
  2. Medidas = {0} (tabla vacía para organizar medidas)

4.1 Medidas base

Actual = SUM(FactActual[Amount])

Budget =
CALCULATE(
    SUM(FactBudget[BudgetAmount]),
    USERELATIONSHIP(DimCalendario[Date], FactBudget[Date])
)

4.2 Medidas de P&L

Total Revenue =
CALCULATE(
    [Actual],
    DimCuentas[AccountType] = "Revenue"
)

Total COGS =
CALCULATE(
    [Actual],
    DimCuentas[AccountType] = "COGS"
)

Gross Profit = [Total Revenue] - [Total COGS]

Gross Margin % =
DIVIDE([Gross Profit], [Total Revenue], 0)

Total OPEX =
CALCULATE(
    [Actual],
    DimCuentas[AccountType] = "OPEX"
)

Operating Income = [Gross Profit] - [Total OPEX]

Operating Margin % =
DIVIDE([Operating Income], [Total Revenue], 0)

Depreciation =
CALCULATE(
    [Actual],
    DimCuentas[AccountCategory] = "D&A"
)

EBITDA = [Operating Income] + [Depreciation]

EBITDA Margin % =
DIVIDE([EBITDA], [Total Revenue], 0)

Interest Net =
CALCULATE(
    [Actual],
    DimCuentas[AccountCategory] = "Other"
)

Taxes =
CALCULATE(
    [Actual],
    DimCuentas[AccountCategory] = "Tax"
)

Net Income = [Operating Income] - [Interest Net] - [Taxes]

Net Margin % =
DIVIDE([Net Income], [Total Revenue], 0)

4.3 Medidas de variación

Variance = [Actual] - [Budget]

Variance % =
VAR Var = [Actual] - [Budget]
VAR Bud = [Budget]
RETURN
DIVIDE(Var, ABS(Bud), 0)

Variance Status =
VAR Var = [Variance]
VAR AcctType = SELECTEDVALUE(DimCuentas[AccountType])
RETURN
SWITCH(
    TRUE(),
    ISBLANK(Var), "Neutral",
    AcctType = "Revenue" && Var > 0, "Favorable",
    AcctType = "Revenue" && Var < 0, "Desfavorable",
    AcctType IN {"COGS", "OPEX"} && Var < 0, "Favorable",
    AcctType IN {"COGS", "OPEX"} && Var > 0, "Desfavorable",
    "Neutral"
)

Variance Color =
VAR Status = [Variance Status]
RETURN
SWITCH(
    Status,
    "Favorable", "#27AE60",
    "Desfavorable", "#E74C3C",
    "#95A5A6"
)

4.4 Medidas de tiempo

Actual YTD =
CALCULATE(
    [Actual],
    DATESYTD(DimCalendario[Date])
)

Budget YTD =
CALCULATE(
    [Budget],
    DATESYTD(DimCalendario[Date])
)

Actual PY =
CALCULATE(
    [Actual],
    SAMEPERIODLASTYEAR(DimCalendario[Date])
)

YoY Growth % =
VAR Current = [Actual]
VAR Previous = [Actual PY]
RETURN
DIVIDE(Current - Previous, ABS(Previous), 0)

Actual MTD =
CALCULATE(
    [Actual],
    DATESMTD(DimCalendario[Date])
)

4.5 Medidas de KPI para tarjetas

Revenue KPI =
VAR Rev = [Total Revenue]
VAR Bud = CALCULATE([Budget], DimCuentas[AccountType] = "Revenue")
VAR Var = DIVIDE(Rev - Bud, ABS(Bud), 0)
RETURN
FORMAT(Rev, "$#,##0,.0K") & " | " & FORMAT(Var, "+0.0%;-0.0%")

EBITDA KPI =
VAR Val = [EBITDA]
VAR Margin = [EBITDA Margin %]
RETURN
FORMAT(Val, "$#,##0,.0K") & " | " & FORMAT(Margin, "0.0%")

Net Income KPI =
VAR Val = [Net Income]
VAR Margin = [Net Margin %]
RETURN
FORMAT(Val, "$#,##0,.0K") & " | " & FORMAT(Margin, "0.0%")

Paso 5: Construir las visualizaciones

Página 1: Executive Summary

Crea una nueva página llamada "Executive Summary".

5.1 Header con filtros

┌────────────────────────────────────────────────────────────────────┐
│  [Logo TechFlow]  FINANCIAL DASHBOARD         [Year ▼] [Quarter ▼]│
│                   Executive Summary                                │
└────────────────────────────────────────────────────────────────────┘
  1. Inserta un rectángulo de encabezado (color: #35286B)
  2. Agrega un cuadro de texto con el título
  3. Inserta dos Slicers:
    • DimCalendario[Year] - Estilo: Dropdown
    • DimCalendario[Quarter] - Estilo: Dropdown

5.2 Tarjetas de KPI

┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐
│ Revenue  │ │ Gross    │ │ EBITDA   │ │ Net      │ │ Operating│
│ $1.2M    │ │ Margin   │ │ $420K    │ │ Income   │ │ Margin   │
│ +8.5%    │ │ 58.5%    │ │ +12.0%   │ │ $280K    │ │ 28.5%    │
└──────────┘ └──────────┘ └──────────┘ └──────────┘ └──────────┘

Para cada tarjeta:

  1. Inserta visualización Tarjeta
  2. Valor: Medida correspondiente
  3. Formato:
    • Color de fondo: Blanco
    • Borde: Sí
    • Sombra: Sí

5.3 Gráfico de tendencia

┌─────────────────────────────────────────────────────────────┐
│  Revenue vs Budget (Monthly Trend)                          │
│                                                             │
│  $500K ┤                              ●───●                 │
│        │                         ●───●         Actual       │
│  $400K ┤                    ●───●                           │
│        │               ○───○───○───○───○ Budget             │
│  $300K ┤          ○───○                                     │
│        │     ●───●                                          │
│  $200K ┤●───●                                               │
│        └────────────────────────────────────────────────    │
│         Jan  Feb  Mar  Apr  May  Jun  Jul  Aug  Sep  Oct    │
└─────────────────────────────────────────────────────────────┘
  1. Inserta Gráfico de líneas
  2. Eje X: DimCalendario[MonthShort]
  3. Valores: [Total Revenue], CALCULATE([Budget], DimCuentas[AccountType]="Revenue")
  4. Formato:
    • Línea Actual: Sólida, #AE4291
    • Línea Budget: Punteada, #95A5A6

5.4 P&L Summary

┌────────────────────────────────────────────────┐
│  P&L Summary                                   │
│  ──────────────────────────────────────────    │
│  Revenue              $4,250,000    ███████    │
│  COGS                ($1,700,000)   ████       │
│  Gross Profit         $2,550,000               │
│  OPEX                ($1,500,000)   ████       │
│  Operating Income     $1,050,000               │
│  EBITDA               $1,200,000               │
│  Net Income             $850,000               │
└────────────────────────────────────────────────┘
  1. Inserta Matriz
  2. Filas: DimCuentas[AccountType]
  3. Valores: [Actual]
  4. Ordenar por DimCuentas[SortOrder]

5.5 Variación por departamento

┌────────────────────────────────────────────────┐
│  Budget Variance by Department                 │
│  ──────────────────────────────                │
│  Sales       ████████████████  +$125,000       │
│  Marketing   ██████████       -$45,000         │
│  Engineering ████████         -$32,000         │
│  G&A         ██████████████   +$85,000         │
│  Support     ██████████       +$22,000         │
└────────────────────────────────────────────────┘
  1. Inserta Gráfico de barras
  2. Eje Y: DimDepartamentos[DeptName]
  3. Valores: [Variance]
  4. Formato condicional: Verde para positivo, rojo para negativo

Página 2: P&L Detail

Crea una nueva página llamada "P&L Detail".

Matriz de P&L completo

┌────────────────────────────────────────────────────────────────────┐
│  ESTADO DE RESULTADOS DETALLADO                                    │
├────────────────────────────────────────────────────────────────────┤
│  Cuenta              Actual      Budget    Variance   Var %   YoY  │
│  ──────────────────────────────────────────────────────────────────│
│  ▼ Revenue          $4,250,000  $4,000,000  $250,000   6.3%  12.5% │
│     Product Rev     $3,200,000  $3,000,000  $200,000   6.7%  10.2% │
│       Platform      $2,100,000  $2,000,000  $100,000   5.0%   8.5% │
│       Analytics     $1,100,000  $1,000,000  $100,000  10.0%  15.3% │
│     Service Rev     $1,050,000  $1,000,000   $50,000   5.0%  18.2% │
│       Consulting      $750,000    $700,000   $50,000   7.1%  22.1% │
│       Support         $300,000    $300,000        $0   0.0%  10.5% │
│  ▼ COGS             $1,700,000  $1,600,000 -$100,000  -6.3%  -5.2% │
│  Gross Profit       $2,550,000  $2,400,000  $150,000   6.3%  18.3% │
│  ▼ OPEX             $1,500,000  $1,450,000  -$50,000  -3.4%  -4.1% │
│  Operating Income   $1,050,000    $950,000  $100,000  10.5%  28.5% │
│  EBITDA             $1,200,000  $1,100,000  $100,000   9.1%  25.2% │
│  Net Income           $850,000    $780,000   $70,000   9.0%  32.1% │
└────────────────────────────────────────────────────────────────────┘
  1. Inserta Matriz
  2. Filas: Jerarquía de Cuentas
  3. Valores: [Actual], [Budget], [Variance], [Variance %], [YoY Growth %]
  4. Activa expansión de filas
  5. Formato condicional en Variance:
    • Escala de color basada en [Variance Color]

Gráficos de margen

┌─────────────────────────────────┐ ┌─────────────────────────────────┐
│  Margin Trends                  │ │  Revenue Mix                    │
│  ─────────────                  │ │  ───────────                    │
│                                 │ │                                 │
│  60% ─●──●──●──●──● Gross       │ │  Platform ████████████  49%     │
│  35% ──○──○──○──○── EBITDA      │ │  Analytics ██████      26%      │
│  20% ───△──△──△──△─ Net         │ │  Consulting █████      18%      │
│                                 │ │  Support ███           7%       │
│  Jan Feb Mar Apr May            │ │                                 │
└─────────────────────────────────┘ └─────────────────────────────────┘

Página 3: Budget Analysis

Crea una nueva página llamada "Budget Analysis".

Waterfall de variaciones

┌────────────────────────────────────────────────────────────────────┐
│  Variance Waterfall: Budget to Actual                              │
│                                                                    │
│                     +$250K                                         │
│  Budget  ████████  ─────►  ████  Revenue                          │
│  $4.0M   ████████         ████                                    │
│          ████████  ◄─────  ██  COGS                               │
│          ████████  -$100K  ██                                      │
│          ████████  ◄─────  █   OPEX                               │
│          ████████  -$50K   █                                       │
│          ████████  ─────►  █   Other                              │
│                    +$30K   ████████  Actual                       │
│                            ████████  $4.13M                        │
└────────────────────────────────────────────────────────────────────┘
  1. Inserta Gráfico de cascada
  2. Categoría: DimCuentas[AccountType]
  3. Y-axis: [Variance]

Tabla de top variaciones

┌────────────────────────────────────────────────────────────────────┐
│  Top 10 Variaciones (Mayor Impacto)                                │
├────────────────────────────────────────────────────────────────────┤
│  #  Cuenta                Dept        Variance    Status           │
│  1  Platform Revenue      Sales       +$100,000   ▲ Favorable     │
│  2  Analytics Revenue     Sales       +$100,000   ▲ Favorable     │
│  3  Admin Salaries        G&A         +$50,000    ▲ Favorable     │
│  4  Consulting Revenue    Support     +$50,000    ▲ Favorable     │
│  5  Hosting & Infra       Eng         -$35,000    ▼ Desfavorable  │
│  6  Sales Commissions     Sales       -$28,000    ▼ Desfavorable  │
│  7  Advertising           Marketing   -$25,000    ▼ Desfavorable  │
│  8  Engineering Salaries  Eng         -$22,000    ▼ Desfavorable  │
│  9  Dev Tools             Eng         -$18,000    ▼ Desfavorable  │
│  10 Events                Marketing   -$15,000    ▼ Desfavorable  │
└────────────────────────────────────────────────────────────────────┘
  1. Inserta Tabla
  2. Columnas: AccountName, DeptName, [Variance], [Variance Status]
  3. Ordena por ABS([Variance]) descendente
  4. Usa Top N filter: Top 10 por ABS([Variance])

Página 4: Drill-Through Details

Esta página permite ver el detalle de transacciones.

  1. Crea nueva página "Transaction Details"
  2. En Formato > Información de página > Drill through: Activado
  3. Agrega DimCuentas[AccountName] al área de drill through
  4. Agrega DimDepartamentos[DeptName] al área de drill through

Contenido de la página

┌────────────────────────────────────────────────────────────────────┐
│  [◄ Back]  Detalle de Transacciones                                │
│                                                                    │
│  Cuenta: {AccountName}    Departamento: {DeptName}                 │
│                                                                    │
│  ┌──────────────────────────────────────────────────────────────┐ │
│  │  Date        Description              Amount    Running Tot   │ │
│  │  ──────────────────────────────────────────────────────────  │ │
│  │  2025-01-15  Platform license Acme   $125,000    $125,000    │ │
│  │  2025-01-20  Platform license Beta    $85,000    $210,000    │ │
│  │  2025-02-05  Platform license Gamma  $110,000    $320,000    │ │
│  │  2025-02-18  Platform renewal Delta   $95,000    $415,000    │ │
│  │  ...                                                          │ │
│  └──────────────────────────────────────────────────────────────┘ │
│                                                                    │
│  ┌────────────────────────────┐ ┌────────────────────────────────┐│
│  │  Monthly Trend             │ │  Summary                       ││
│  │  ─────────────             │ │  ───────                       ││
│  │                            │ │  Total: $2,100,000             ││
│  │  $200K ●───●───●           │ │  Budget: $2,000,000            ││
│  │        │   │               │ │  Variance: +$100,000           ││
│  │  Jan Feb Mar Apr           │ │  Var %: +5.0%                  ││
│  └────────────────────────────┘ └────────────────────────────────┘│
└────────────────────────────────────────────────────────────────────┘

Paso 6: Formato y pulido final

6.1 Tema de colores

Crea un tema personalizado con los colores de TechFlow:

{
  "name": "TechFlow Finance",
  "dataColors": [
    "#AE4291",
    "#35286B",
    "#2ECC71",
    "#E74C3C",
    "#3498DB",
    "#F39C12"
  ],
  "background": "#FFFFFF",
  "foreground": "#2C3E50",
  "tableAccent": "#AE4291"
}
  1. Vista > Temas > Buscar temas
  2. Selecciona el archivo JSON del tema

6.2 Tooltips personalizados

Crea una página tooltip para mostrar información adicional:

  1. Nueva página "Tooltip Info"
  2. Formato > Información de página:
    • Permitir uso como información sobre herramientas: Sí
    • Tamaño: 300 x 200 px
  3. Agrega tarjetas con: Account, Budget, Actual, Variance

6.3 Navegación

Agrega botones de navegación entre páginas:

  1. Inserta botones en cada página
  2. Acción: Navegación de página
  3. Destino: Página correspondiente

Paso 7: Validación final

Checklist de validación

Antes de considerar el proyecto completo, verifica:

Elemento Verificado
Todas las relaciones están activas y correctas [ ]
La tabla de calendario está marcada como tabla de fechas [ ]
Las cuentas aparecen en orden lógico del P&L [ ]
Los totales de P&L cuadran (Revenue - COGS - OPEX = Op. Income) [ ]
Las variaciones tienen el signo correcto [ ]
El formato condicional funciona correctamente [ ]
Los filtros afectan todas las visualizaciones [ ]
El drill-through funciona correctamente [ ]
No hay errores de medidas DAX [ ]
El rendimiento es aceptable (< 3 segundos de carga) [ ]

Fórmulas de verificación

// Verificar que P&L cuadra
P&L Check =
VAR Rev = [Total Revenue]
VAR COGS = [Total COGS]
VAR OPEX = [Total OPEX]
VAR OpIncome = [Operating Income]
VAR Calculated = Rev - COGS - OPEX
RETURN
IF(OpIncome = Calculated, "OK", "ERROR: Diferencia de " & FORMAT(OpIncome - Calculated, "$#,##0"))

// Verificar que no hay transacciones sin cuenta
Orphan Transactions =
CALCULATE(
    COUNTROWS(FactActual),
    ISBLANK(RELATED(DimCuentas[AccountName]))
)

Entregables del proyecto

Al finalizar, deberías tener:

  1. Archivo Power BI (.pbix) con:

    • 4 tablas de datos
    • Modelo estrella correctamente relacionado
    • 20+ medidas DAX
    • 4 páginas de dashboard
  2. Dashboard funcional que permite:

    • Ver P&L con drill-down por cuenta
    • Comparar Actual vs Budget
    • Identificar variaciones significativas
    • Filtrar por período y departamento
    • Ver detalle de transacciones

Puntos clave del proyecto

  • Un modelo de datos bien estructurado es la base de un buen dashboard
  • Las medidas DAX deben calcularse correctamente considerando el signo de gastos vs ingresos
  • El formato visual debe seguir las convenciones financieras
  • El drill-through permite explorar datos sin saturar las visualizaciones principales
  • La validación de datos es crítica en reportes financieros

Extensiones sugeridas

Si quieres llevar el proyecto más allá:

  1. Agregar forecast: Proyección para el resto del año
  2. Incluir balance general: Assets, Liabilities, Equity
  3. Cash flow statement: Operating, Investing, Financing activities
  4. Alertas automáticas: Notificaciones cuando variaciones excedan umbrales
  5. Row-level security: Diferentes vistas por departamento

Quiz de comprensión

  1. ¿Por qué es importante usar USERELATIONSHIP cuando trabajas con la tabla de Budget?

  2. ¿Cómo ordenas las cuentas del P&L para que aparezcan en orden lógico y no alfabético?

  3. ¿Cuál es la diferencia entre una variación favorable en Revenue vs en OPEX?

  4. Describe los pasos para crear una página de drill-through en Power BI.

  5. ¿Cómo verificarías que el P&L del dashboard está calculando correctamente?

Completaste esta leccion?

Marca esta leccion como completada. Tu progreso se guardara en tu navegador.