Proyecto: P&L y Budget vs Real
Proyecto hands-on con datos contables.
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:
- Visualizar el Estado de Resultados (P&L) completo
- Comparar resultados reales contra presupuesto
- Analizar variaciones por departamento y período
- 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
- Abre Power BI Desktop
- Inicio > Obtener datos > Texto/CSV
- 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
- Selecciona
DimCalendario - Herramientas de tabla > Marcar como tabla de fechas
- Columna de fecha:
Date
3.3 Crear jerarquías
En DimCuentas, crea la jerarquía:
- Click derecho en
AccountType> Crear jerarquía - Arrastra
AccountCategorya la jerarquía - Arrastra
AccountNamea la jerarquía - Renombra como "Jerarquía de Cuentas"
En DimCalendario, crea la jerarquía de tiempo:
- Year > Quarter > Month > Date
- Renombra como "Jerarquía de Tiempo"
3.4 Ordenar cuentas
En DimCuentas, ordena AccountName por SortOrder:
- Selecciona columna
AccountName - Herramientas de columna > Ordenar por columna >
SortOrder
Paso 4: Crear medidas DAX
Crea una tabla de medidas para organización:
- Modelado > Nueva tabla
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 │
└────────────────────────────────────────────────────────────────────┘
- Inserta un rectángulo de encabezado (color: #35286B)
- Agrega un cuadro de texto con el título
- Inserta dos Slicers:
DimCalendario[Year]- Estilo: DropdownDimCalendario[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:
- Inserta visualización Tarjeta
- Valor: Medida correspondiente
- 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 │
└─────────────────────────────────────────────────────────────┘
- Inserta Gráfico de líneas
- Eje X:
DimCalendario[MonthShort] - Valores:
[Total Revenue],CALCULATE([Budget], DimCuentas[AccountType]="Revenue") - 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 │
└────────────────────────────────────────────────┘
- Inserta Matriz
- Filas:
DimCuentas[AccountType] - Valores:
[Actual] - 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 │
└────────────────────────────────────────────────┘
- Inserta Gráfico de barras
- Eje Y:
DimDepartamentos[DeptName] - Valores:
[Variance] - 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% │
└────────────────────────────────────────────────────────────────────┘
- Inserta Matriz
- Filas: Jerarquía de Cuentas
- Valores:
[Actual],[Budget],[Variance],[Variance %],[YoY Growth %] - Activa expansión de filas
- Formato condicional en Variance:
- Escala de color basada en
[Variance Color]
- Escala de color basada en
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 │
└────────────────────────────────────────────────────────────────────┘
- Inserta Gráfico de cascada
- Categoría:
DimCuentas[AccountType] - 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 │
└────────────────────────────────────────────────────────────────────┘
- Inserta Tabla
- Columnas:
AccountName,DeptName,[Variance],[Variance Status] - Ordena por
ABS([Variance])descendente - Usa Top N filter: Top 10 por
ABS([Variance])
Página 4: Drill-Through Details
Esta página permite ver el detalle de transacciones.
- Crea nueva página "Transaction Details"
- En Formato > Información de página > Drill through: Activado
- Agrega
DimCuentas[AccountName]al área de drill through - 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"
}
- Vista > Temas > Buscar temas
- Selecciona el archivo JSON del tema
6.2 Tooltips personalizados
Crea una página tooltip para mostrar información adicional:
- Nueva página "Tooltip Info"
- Formato > Información de página:
- Permitir uso como información sobre herramientas: Sí
- Tamaño: 300 x 200 px
- Agrega tarjetas con: Account, Budget, Actual, Variance
6.3 Navegación
Agrega botones de navegación entre páginas:
- Inserta botones en cada página
- Acción: Navegación de página
- 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:
Archivo Power BI (.pbix) con:
- 4 tablas de datos
- Modelo estrella correctamente relacionado
- 20+ medidas DAX
- 4 páginas de dashboard
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á:
- Agregar forecast: Proyección para el resto del año
- Incluir balance general: Assets, Liabilities, Equity
- Cash flow statement: Operating, Investing, Financing activities
- Alertas automáticas: Notificaciones cuando variaciones excedan umbrales
- Row-level security: Diferentes vistas por departamento
Quiz de comprensión
¿Por qué es importante usar USERELATIONSHIP cuando trabajas con la tabla de Budget?
¿Cómo ordenas las cuentas del P&L para que aparezcan en orden lógico y no alfabético?
¿Cuál es la diferencia entre una variación favorable en Revenue vs en OPEX?
Describe los pasos para crear una página de drill-through en Power BI.
¿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.