Workshop 4 - Accounting Architectures - Module 2

Author

Alberto Dorantes, Ph.D.

Published

September 1, 2026

Abstract
El entregable de este workshop es la evidencia a entregar para el Módulo y tiene un peso de 40% en el Módulo. Con esta evidencia cerramos el ciclo analítico del módulo. Primero estudiamos a fondo el análisis de Pareto y cómo implementarlo en DAX (contexto de filtro, ALLSELECTED, ADDCOLUMNS, RANKX y SUMX). Después explicamos conceptualmente cómo descomponer el cambio de Gross Profit de un periodo a otro en sus efectos de volumen, mezcla, precio y costo, y cómo presentarlo en un gráfico de cascada. Finalmente, con un dataset nuevo (Contoso), los alumnos construyen por su cuenta dos dashboards sin instrucciones paso a paso.

1 Introducción

En los Workshops 2 y 3 construiste un modelo semántico correcto, escribiste medidas bien formadas y aprendiste funciones de Time Intelligence para calcular crecimientos anuales. Este workshop cierra el módulo con tres bloques:

  • Parte I - Análisis de Pareto. El concepto, por qué importa en contabilidad, y la implementación completa en DAX. Aquí está la explicación detallada del contexto de filtro, que es el concepto que separa a quien copia fórmulas de quien las entiende.

  • Parte II - El puente de Gross Profit. La explicación conceptual y algebraica del CHALLENGE 3 (opcional) del Workshop 3: cómo se descompone exactamente la diferencia de utilidad bruta entre dos periodos, qué significa cada efecto, por qué aparece el efecto mezcla cuando bajas al detalle, y cómo se construye un gráfico de cascada en Power BI.

  • Parte III - Dos dashboards con un dataset nuevo. A partir de aquí ya no hay instrucciones paso a paso. Se te da un dataset nuevo (Contoso), el contexto de negocio y dos retos con los indicadores que se esperan. Tú decides cómo modelar, qué medidas escribir y qué visuales usar. Esa es exactamente la situación en la que estarás en un trabajo real.

2 PARTE I. El análisis de Pareto

2.1 Por qué esto importa en contabilidad

El principio de Pareto dice que una minoría de las causas produce la mayoría de los efectos. En una empresa eso aparece por todas partes: unos pocos clientes concentran la facturación, unas pocas cuentas concentran el gasto, unos pocos proveedores concentran las cuentas por pagar.

Saber quiénes son esos pocos cambia decisiones reales: a quién visitar primero, qué cuentas auditar, dónde concentrar la gestión de cobranza, qué riesgo de concentración revelar en las notas a los estados financieros. Un análisis de Pareto es la herramienta que los identifica.

La parte difícil no es el concepto, es el cálculo: para saber cuánto lleva acumulado un cliente necesitas mirar a todos los demás clientes al mismo tiempo. Y eso, en Power BI, es exactamente lo que no ocurre por defecto. Toda esta sección trata de resolver ese problema.

2.2 El caso: cartera de clientes 2025

Trabajaremos con ocho clientes. El modelo tiene una tabla de hechos Facturas con la columna Importe, y una tabla de dimensión Clientes con la columna Cliente, relacionadas entre sí.

Ventas del ejercicio, ordenadas de mayor a menor
Cliente Ventas
Distribuidora Álamo 400,000
Grupo Bermejo 250,000
Constructora Cedral 150,000
Textiles del Norte 90,000
Aceros Poniente 50,000
Papelera Quiroga 30,000
Ferretería Solís 20,000
Vidrios Tepeyac 10,000
Total 1,000,000

Esto es lo que queremos obtener al final. Fíjate en las dos últimas columnas: son las que no sabemos calcular todavía.

Tabla objetivo. El corte del 80 % ocurre en el tercer cliente
# Cliente Ventas Acumulado % acumulado
1 Distribuidora Álamo 400,000 400,000 40 %
2 Grupo Bermejo 250,000 650,000 65 %
3 Constructora Cedral 150,000 800,000 80 %
4 Textiles del Norte 90,000 890,000 89 %
5 Aceros Poniente 50,000 940,000 94 %
6 Papelera Quiroga 30,000 970,000 97 %
7 Ferretería Solís 20,000 990,000 99 %
8 Vidrios Tepeyac 10,000 1,000,000 100 %

Gráfico de Pareto. Las barras verdes son los pocos vitales; las grises, los muchos triviales. La línea roja es el % acumulado y cruza la referencia del 80 % justo en el tercer cliente.

Idea clave. El resultado real es 37/80, no 20/80. El “80/20” es una observación empírica frecuente, no una ley. Tu trabajo como analista es reportar la proporción que realmente encuentras, no forzar los datos hacia la cifra que esperabas.

2.3 Antes de escribir DAX: el contexto de filtro

Este concepto es el 90 % de la dificultad. Si lo entiendes, el resto de la sección es mecánico.

Cuando pones una medida en una tabla de Power BI, la medida no se calcula una vez: se calcula muchas veces, una por cada celda. Y en cada una de esas ejecuciones, Power BI aplica automáticamente un filtro invisible que corresponde a la fila (y columna) donde está esa celda.

Piensa en un mayor auxiliar. Cuando ves la línea de “Distribuidora Álamo”, estás viendo un extracto filtrado del mayor general: solo los movimientos de ese cliente. Power BI hace lo mismo, automáticamente, en cada celda. A ese filtro invisible se le llama contexto de filtro.

La misma medida, cuatro resultados distintos, porque el contexto de filtro es distinto en cada celda
Dónde está la celda Filtro invisible que aplica Power BI [Ventas] devuelve
Fila “Distribuidora Álamo” Cliente = "Distribuidora Álamo" 400,000
Fila “Grupo Bermejo” Cliente = "Grupo Bermejo" 250,000
Fila “Vidrios Tepeyac” Cliente = "Vidrios Tepeyac" 10,000
Fila de totales ninguno sobre Cliente 1,000,000

Aquí está el problema. Para calcular el acumulado de “Constructora Cedral” necesito sumar sus ventas más las de Álamo más las de Bermejo. Pero cuando Power BI calcula la celda de Cedral, el contexto de filtro me deja ver únicamente a Cedral. Los otros siete clientes están, literalmente, fuera de mi vista.

Todo lo que sigue son técnicas para recuperar la visión del conjunto desde dentro de una fila individual.

2.4 Paso 1 - La medida base

Empezamos por lo simple. Esta medida suma el importe de las facturas visibles en el contexto actual.

Ventas = SUM( Facturas[Importe] )

Nada más. Todo el resto del análisis se construye reutilizando esta medida, nunca repitiendo el SUM. Eso se llama componer medidas y es la práctica correcta: si mañana “ventas” pasa a ser neto de devoluciones, corriges una sola fórmula y todo el reporte se actualiza.

2.5 Paso 2 - ALLSELECTED: recuperar la vista del conjunto

ALLSELECTED( Clientes[Cliente] ) devuelve una tabla de una sola columna con la lista de clientes, ignorando el filtro que el visual pone en cada fila, pero respetando los filtros que puso el usuario (segmentadores, filtros de página, filtros de otro visual).

En otras palabras: “muéstrame todos los clientes que el usuario decidió mirar, aunque yo esté parado en la fila de uno solo”.

Compara las tres funciones que devuelven listas de valores. Supón que el usuario activó un segmentador de región = Norte, que deja 5 de los 8 clientes, y que estamos calculando la celda de Cedral:

Las tres se parecen, pero obedecen a filtros distintos. Elegir mal es el error nº 1 en un Pareto
Función Qué devuelve aquí ¿Obedece al segmentador? ¿Obedece a la fila del visual?
VALUES( Clientes[Cliente] ) 1 cliente (Cedral)
ALLSELECTED( Clientes[Cliente] ) 5 clientes (los del Norte) No
ALL( Clientes[Cliente] ) 8 clientes (todos) No No
  • VALUES no sirve para el acumulado: desde la fila de Cedral solo veo a Cedral, que es justo el problema que quiero resolver.
  • ALL tampoco: ignora el segmentador, así que si el usuario filtra a la región Norte, el acumulado seguiría calculándose sobre los 8 clientes y los porcentajes nunca llegarían al 100 %.
  • ALLSELECTED es la correcta: quita el filtro del visual, conserva el del usuario.

Con eso ya podemos escribir el denominador del Pareto: el total de la selección completa.

Ventas totales de la selección =
CALCULATE( [Ventas], ALLSELECTED( Clientes[Cliente] ) )

CALCULATE es la función que modifica el contexto de filtro antes de evaluar algo. Aquí le decimos: “calcula [Ventas], pero primero reemplaza el filtro sobre Cliente por la lista completa de la selección”. Resultado: 1,000,000 en todas las filas, que es exactamente lo que necesita un denominador.

2.6 Paso 3 - ADDCOLUMNS: construir una tabla virtual

Ya tenemos la lista de clientes. Pero una lista de nombres no basta: para acumular necesitamos saber cuánto vendió cada uno. ADDCOLUMNS toma una tabla y le agrega columnas calculadas al vuelo.

ADDCOLUMNS(
    ALLSELECTED( Clientes[Cliente] ),   -- tabla de partida
    "@Ventas",  [Ventas],               -- columna nueva 1
    "@Ranking", [Ranking de ventas]     -- columna nueva 2
)

El resultado no existe en ninguna parte del modelo: es una tabla virtual que vive en memoria durante una fracción de segundo, se usa, y desaparece. Se parece a un papel de trabajo temporal: lo armas para resolver un cálculo y luego lo tiras.

La tabla virtual que produce ADDCOLUMNS. Ocho filas, tres columnas. Ninguna existe en el modelo
Cliente @Ventas @Ranking
Distribuidora Álamo 400,000 1
Grupo Bermejo 250,000 2
Constructora Cedral 150,000 3
Textiles del Norte 90,000 4
Aceros Poniente 50,000 5
Papelera Quiroga 30,000 6
Ferretería Solís 20,000 7
Vidrios Tepeyac 10,000 8

Por qué la arroba. El prefijo @ en "@Ventas" no es obligatorio para DAX: es una convención de los profesionales para distinguir a simple vista una columna temporal de una columna real del modelo. Adóptala desde el principio; te ahorrará confusiones cuando las fórmulas crezcan.

2.6.1 La pregunta obligada: ¿por qué [Ventas] da un valor distinto en cada fila?

Buena observación. Dentro de ADDCOLUMNS, DAX recorre la tabla fila por fila. Al escribir [Ventas] -una medida- DAX la envuelve automáticamente en un CALCULATE invisible, y eso dispara un mecanismo llamado transición de contexto: el valor de la fila actual (por ejemplo, “Grupo Bermejo”) se convierte en un filtro real sobre el modelo.

Por eso [Ventas] devuelve 250,000 en la fila de Bermejo y 150,000 en la de Cedral. La regla práctica que debes memorizar: toda referencia a una medida dentro de un iterador se filtra automáticamente por la fila actual.

2.7 Paso 4 - RANKX: ordenar de mayor a menor

Un Pareto exige un orden: del que más vende al que menos. RANKX asigna esa posición.

Ranking de ventas =
RANKX(
    ALLSELECTED( Clientes[Cliente] ),  -- contra quién compito
    [Ventas],                          -- con qué valor compito
    ,                                  -- (argumento omitido)
    DESC,                              -- mayor = lugar 1
    Dense                              -- sin saltos en los empates
)

Argumento por argumento:

  1. tabla - El universo de comparación. Otra vez ALLSELECTED: para saber qué lugar ocupa Cedral necesito verla junto a los demás, no sola.
  2. expresión - El criterio de ordenamiento. Se evalúa para cada fila de la tabla anterior, con transición de contexto, igual que en ADDCOLUMNS.
  3. valor - Opcional, casi nunca se usa. Por eso queda la coma sola. Si lo omites, DAX usa el valor de la fila actual, que es lo que queremos.
  4. orden - DESC = el valor más alto recibe el lugar 1. Si lo olvidas, DAX asume ASC y tu Pareto sale invertido: empieza por el cliente más pequeño.
  5. empates - Dense: dos empatados en 2.º lugar, el siguiente es 3.º. Skip (el valor por defecto): el siguiente sería 4.º. Para acumular, usa Dense.

Por qué rankeamos en vez de comparar importes. La versión que verás en muchos blogs acumula filtrando @Ventas >= ventas actuales. Funciona… hasta que dos clientes facturan exactamente lo mismo. Entonces cada uno se incluye a sí mismo y al otro, el acumulado se dispara y la curva da un salto imposible.

Con importes redondeados -muy comunes en contabilidad: contratos, iguala mensual, rentas- los empates ocurren más de lo que crees. Rankear los elimina.

2.8 Paso 5 - FILTER y SUMX: acumular

Ya tenemos la tabla virtual con ventas y ranking. Acumular es ahora una sola idea: sumar las ventas de todos los que están en mi posición o antes.

  • FILTER( tabla, condición ) recorre la tabla y se queda solo con las filas que cumplen la condición. Devuelve una tabla más chica.
  • SUMX( tabla, expresión ) recorre esa tabla, evalúa la expresión en cada fila y suma los resultados. Es un iterador: la X final siempre significa “fila por fila”.

Aquí está la medida completa:

Ventas acumuladas =
VAR RankActual = [Ranking de ventas]

VAR TablaVirtual =
    ADDCOLUMNS(
        ALLSELECTED( Clientes[Cliente] ),
        "@Ventas",  [Ventas],
        "@Ranking", [Ranking de ventas]
    )

RETURN
    SUMX(
        FILTER( TablaVirtual, [@Ranking] <= RankActual ),
        [@Ventas]
    )

Las VAR son variables: guardan un resultado con un nombre para que la fórmula se lea como un razonamiento y no como un trabalenguas. Además se calculan una sola vez, así que también mejoran el rendimiento. Úsalas siempre.

2.8.1 Traza completa: la celda de “Constructora Cedral”

Sigue el cálculo paso a paso, como si revisaras un asiento contable:

Traza de evaluación de una sola celda
Etapa Qué ocurre
RankActual El contexto de filtro es Cliente = "Constructora Cedral", y su ranking es 3.
TablaVirtual Se construyen las 8 filas con sus ventas y su ranking (la tabla del Paso 3).
FILTER Conserva las filas con @Ranking <= 3: Álamo, Bermejo y Cedral. Quedan 3 filas.
SUMX Suma sus @Ventas: 400,000 + 250,000 + 150,000 = 800,000.

Y ese mismo procedimiento se repite, íntegro, para cada una de las ocho celdas de la columna. Es costoso en cómputo, pero correcto y -lo más importante- se recalcula solo cuando el usuario cambia un filtro.

2.9 Paso 6 - DIVIDE: el porcentaje acumulado

% acumulado =
DIVIDE( [Ventas acumuladas], [Ventas totales de la selección] )

Usa DIVIDE y no el operador /. Si el denominador fuera cero o vacío -por ejemplo, porque el usuario filtró un periodo sin ventas- el operador / produce un error o infinito, y el visual se rompe. DIVIDE devuelve blank y el reporte simplemente muestra la celda vacía.

Dale formato de porcentaje en el panel de formato de la medida. No multipliques por 100: deja el valor como una proporción real para que se pueda comparar y combinar con otras medidas.

2.10 Paso 7 - Las medidas que responden la pregunta de negocio

La curva es bonita, pero un director financiero quiere una cifra. Estas dos medidas la dan:

Clientes que generan el 80% =
COUNTROWS(
    FILTER( VALUES( Clientes[Cliente] ), [% acumulado] <= 0.8 )
)

% de clientes que generan el 80% =
DIVIDE(
    [Clientes que generan el 80%],
    COUNTROWS( ALLSELECTED( Clientes[Cliente] ) )
)

Puestas en dos tarjetas dicen: “3 clientes, el 37 % de la cartera, generan el 80 % de los ingresos”. Ese es el hallazgo; el gráfico solo lo sustenta.

2.10.1 Cómo armar el visual

  • Visual Gráfico de líneas y columnas apiladas.
  • Eje X: Clientes[Cliente] · Columnas: [Ventas] · Línea: [% acumulado].
  • Ordena el visual por [Ventas], descendente (menú ··· → Ordenar eje). Sin esto el Pareto no significa nada.
  • Eje Y secundario: fija inicio 0 y fin 1, para que la línea use toda la altura.
  • Agrega una línea constante en 0.8 desde el panel de formato.
  • Colorea las columnas por regla: Formato → Columnas → Color → fx → Estilo: valor del campo, usando una medida que devuelva "#1F5D4C" si [% acumulado] <= 0.8 y un gris en caso contrario.

2.11 Extensión: la clasificación ABC

El Pareto responde “¿cuántos?”. La clasificación ABC responde “¿y este de aquí, en qué grupo cae?”, que es lo que necesitas para operar: políticas de crédito distintas, frecuencia de visita distinta, alcance de auditoría distinto.

La convención más común en gestión de inventarios y cartera:

Clasificación ABC a partir del % acumulado
Clase Criterio sobre el % acumulado Interpretación
A ≤ 80 % Los pocos vitales. Control individual.
B > 80 % y ≤ 95 % Zona intermedia. Control por excepción.
C > 95 % Los muchos triviales. Control agregado.
Clase ABC =
VAR PctAcum = [% acumulado]
RETURN
SWITCH(
    TRUE(),
    PctAcum <= 0.80,  "A",
    PctAcum <= 0.95,  "B",
                      "C"
)

Como es una medida y no una columna calculada, la clasificación es dinámica: si el usuario filtra a un año o a una región, un cliente puede pasar de C a A. Eso es correcto y es justamente lo que una columna calculada no puede hacer.

2.12 Errores frecuentes

  1. No ordenar el eje. El error más común y el más invisible: la fórmula está bien, pero la curva se ve como ruido.
  2. Usar ALL en lugar de ALLSELECTED. Todo funciona… hasta que alguien mueve un segmentador y los porcentajes ya no cierran en 100 %.
  3. Resolverlo con una columna calculada. Se calcula una sola vez al actualizar y queda congelada. Con cualquier filtro muestra números equivocados sin dar ningún aviso. El Pareto debe hacerse con medidas.
  4. Olvidar DESC en RANKX. Pareto invertido: la curva arranca casi plana y sube al final.
  5. Importes negativos. Notas de crédito y devoluciones pueden dejar a un cliente en neto negativo; entonces la curva acumulada supera el 100 % y baja. No es un error de DAX, es una decisión de negocio: define si el Pareto se hace sobre venta bruta o neta, y decláralo.
  6. Aplicarlo a demasiadas categorías. El patrón ADDCOLUMNS + FILTER crece de forma cuadrática. Con miles de categorías el visual se vuelve lento; conviene agrupar antes.

2.13 (OPCIONAÑ) Ejercicio de calentamiento (individual, antes de la Parte III)

Este reto NO tienes que entregarlo, es práctica para que aterrices más los conceptos y practiques con implementación en PowerBI

Con el modelo de Andina Foods que ya tienes de los Workshops 2 y 3:

  1. Construye las cinco medidas del Pareto sobre Net Sales por cliente y reproduce la tabla objetivo. Verifica a mano que el acumulado del tercer cliente coincide con la suma de los tres primeros.
  2. Cambia ALLSELECTED por ALL en las tres medidas donde aparece, agrega un segmentador de año y explica con números qué se rompe y por qué.
  3. Quita DESC de RANKX. Describe la forma que toma la curva y por qué el análisis pierde sentido.
  4. Repite el Pareto sobre gastos de marketing por país en lugar de ventas por cliente. ¿La concentración es mayor o menor? ¿Qué implica eso para la planeación de una auditoría?

3 PARTE II. El puente de Gross Profit (waterfall)

Esta parte explica en detalle el CHALLENGE 3 (opcional) del Workshop 3. Ahí se te dieron las fórmulas; aquí se explica de dónde salen, qué significan, y por qué el resultado cambia según el nivel de detalle al que las calcules.

3.1 Por qué un puente y no una tabla de variaciones

Reportar que “el gross profit bajó 11,805 dólares” no es análisis: es aritmética. La pregunta del CFO nunca es cuánto cambió, es por qué. Y “por qué” en contabilidad de gestión significa: ¿qué palanca del negocio se movió, y cuánto aportó cada una?

El puente (bridge o waterfall) es la herramienta estándar para responder eso. Es la misma lógica del análisis DuPont -descomponer un indicador en factores accionables- aplicada a una diferencia en lugar de a un nivel.

Un puente es útil solo si cumple dos condiciones:

  • Es exacto: los efectos suman exactamente la diferencia observada. Sin residuos, sin “otros”.
  • Es accionable: cada efecto corresponde a una decisión que alguien en la empresa toma. Volumen es del área comercial; precio es de pricing; costo es de compras/producción; mezcla es de estrategia de portafolio.

3.2 La identidad contable de partida

El gross profit de un periodo es:

\[ GP = \text{Net Sales} - \text{COGS} \]

Si definimos, para el periodo completo:

  • \(Q\) = unidades vendidas
  • \(P = \dfrac{\text{Net Sales}}{Q}\) = precio promedio realizado (ya neto de descuentos)
  • \(C = \dfrac{\text{COGS}}{Q}\) = costo unitario promedio

entonces, por construcción:

\[ GP = Q \cdot P - Q \cdot C = Q\,(P - C) \]

Esto no es una aproximación: es una identidad. \(P\) y \(C\) son promedios ponderados definidos como cociente de dos sumas, exactamente la regla que venimos aplicando desde el Workshop 2 (nunca el promedio de una columna de razones).

El margen unitario \(m = P - C\) es la utilidad bruta que deja cada unidad vendida. El gross profit es simplemente cuántas unidades vendiste por cuánto te deja cada una.

3.3 La descomposición algebraica

Queremos explicar:

\[ \Delta GP = Q_1(P_1 - C_1) - Q_0(P_0 - C_0) \]

donde el subíndice 0 es el periodo base (por ejemplo 2024) y el 1 el periodo actual (2025). Sumamos y restamos el término \(Q_1(P_0 - C_0)\) -es decir, “¿cuánto habría sido el GP si hubiéramos vendido las unidades de 2025 con el margen unitario de 2024?”:

\[ \Delta GP = \underbrace{\big[Q_1(P_0-C_0) - Q_0(P_0-C_0)\big]}_{\text{cambio por unidades}} + \underbrace{\big[Q_1(P_1-C_1) - Q_1(P_0-C_0)\big]}_{\text{cambio por margen unitario}} \]

El primer corchete se factoriza como \((Q_1-Q_0)(P_0-C_0)\). El segundo se abre en su parte de precio y su parte de costo. El resultado es la descomposición que usaste en el Workshop 3:

\[ \Delta GP = \underbrace{(Q_1-Q_0)(P_0-C_0)}_{\text{efecto volumen}} + \underbrace{(P_1-P_0)\,Q_1}_{\text{efecto precio}} + \underbrace{-(C_1-C_0)\,Q_1}_{\text{efecto costo}} \]

Lee cada término como una frase:

Interpretación de los tres efectos
Efecto Fórmula Cómo se lee
Volumen \((Q_1-Q_0)(P_0-C_0)\) “Vendí \(\Delta Q\) unidades más, y cada una me dejaba el margen del año pasado.”
Precio \((P_1-P_0)\,Q_1\) “Mi precio realizado cambió \(\Delta P\), aplicado a todas las unidades que vendí este año.”
Costo \(-(C_1-C_0)\,Q_1\) “Mi costo unitario cambió \(\Delta C\); el signo va invertido porque un costo que sube resta utilidad.”

Dos detalles que casi nadie explica y que debes entender:

  • El efecto volumen usa el margen del año base (\(P_0 - C_0\)) y no el del año actual. Es deliberado: queremos aislar el crecimiento puro, valuado a las condiciones que ya conocíamos. Si usáramos el margen actual estaríamos mezclando dos cambios en un solo número.
  • Los efectos precio y costo usan la cantidad del año actual (\(Q_1\)) y no la del año base. También es deliberado, y es lo que hace que la descomposición cierre exactamente. Más abajo se explica por qué.

3.4 Ejemplo numérico

Una empresa de un solo producto:

Datos del ejemplo
Concepto 2024 2025
Unidades \(Q\) 100,000 110,000
Precio promedio \(P\) 10.00 9.60
Costo unitario \(C\) 6.00 6.30
Net Sales 1,000,000 1,056,000
COGS 600,000 693,000
Gross Profit 400,000 363,000

\[\text{Volumen} = (110{,}000 - 100{,}000)\times(10.00-6.00) = +40{,}000\] \[\text{Precio} = (9.60-10.00)\times 110{,}000 = -44{,}000\] \[\text{Costo} = -(6.30-6.00)\times 110{,}000 = -33{,}000\]

Suma: \(+40{,}000 - 44{,}000 - 33{,}000 = -37{,}000\), que es exactamente \(363{,}000 - 400{,}000\). Cierra.

Gráfico de cascada del ejemplo. Se lee de izquierda a derecha: se parte del GP del año base, se aplican los efectos, y se llega al GP del año actual.

La lectura ejecutiva es inmediata y no requiere que nadie mire una tabla: “crecimos 10 % en volumen, lo que aportó 40 mil dólares, pero lo perdimos todo y más: bajamos el precio realizado 4 %, que costó 44 mil, y el costo unitario subió 5 %, que costó otros 33 mil.”

3.5 El término de interacción: por qué desaparece

Si eres cuidadoso notarás que la descomposición no es única. Podemos escribirla también así:

\[ \Delta GP = \underbrace{\Delta Q\,(P_0-C_0)}_{\text{volumen}} + \underbrace{Q_0\,(\Delta P - \Delta C)}_{\text{margen}} + \underbrace{\Delta Q\,(\Delta P - \Delta C)}_{\text{interacción}} \]

El tercer término -el efecto de interacción o joint effect- es la parte del cambio que no se puede atribuir limpiamente a una sola causa: es “el efecto de haber vendido más unidades y además a distinto margen”. En el ejemplo vale \(10{,}000 \times (-0.40 - 0.30) = -7{,}000\).

Existen tres convenciones para tratarlo, y debes declarar cuál usas:

Convenciones para el término de interacción
Convención Qué hace con la interacción Uso típico
Laspeyres (base) La deja como un cuarto efecto explícito. Análisis técnico, índices de precios.
Paasche (actual) La absorbe en precio y costo, usando \(Q_1\). La que usamos aquí y la estándar en reportes de gestión.
Shapley / promedio La reparte a la mitad entre los efectos. Literatura académica; poco común en la práctica.

Usar \(Q_1\) en los efectos precio y costo es, precisamente, absorber la interacción dentro de ellos. Es la convención de reporting: un cuarto efecto llamado “interacción” no le dice nada a nadie en un comité de dirección, y no corresponde a ninguna decisión que alguien pueda tomar. Lo importante es la consistencia: elige una y úsala siempre, y menciónala en las notas del reporte.

3.6 El efecto mezcla: por qué el puente a nivel compañía puede mentir

Este es el punto conceptual más importante de toda la Parte II, y es lo que se preguntaba en el Q5 del Workshop 3.

El precio promedio \(P\) de la compañía no es un precio: es un promedio ponderado de los precios de todos los productos, donde las ponderaciones son las cantidades vendidas. Y esas ponderaciones cambian de un año a otro. Entonces \(P\) puede moverse sin que ningún producto haya cambiado de precio, simplemente porque vendiste más de los baratos y menos de los caros.

Cuando eso pasa, el puente a nivel compañía sigue siendo exacto (suma bien), pero atribuye mal: reporta un “efecto precio” negativo enorme que ningún gerente de pricing provocó.

3.6.1 Ejemplo mínimo que lo demuestra

Dos productos, y ningún precio ni costo cambió en todo el periodo:

Solo cambió la mezcla: más unidades de A, menos de B
Producto \(P\) \(C\) margen \(m\) \(Q_{2024}\) \(Q_{2025}\)
A (económico) 10 6 4 100,000 150,000
B (premium) 20 12 8 100,000 50,000
  • GP 2024 \(= 100{,}000(4) + 100{,}000(8) = 1{,}200{,}000\)
  • GP 2025 \(= 150{,}000(4) + 50{,}000(8) = 1{,}000{,}000\)
  • \(\Delta GP = -200{,}000\)

Ahora el puente a nivel compañía. Las unidades totales son 200,000 en ambos años, así que \(\Delta Q = 0\):

  • \(P_0 = \frac{1{,}000{,}000+2{,}000{,}000}{200{,}000} = 15.00\) ; \(P_1 = \frac{1{,}500{,}000+1{,}000{,}000}{200{,}000} = 12.50\)
  • \(C_0 = \frac{600{,}000+1{,}200{,}000}{200{,}000} = 9.00\) ; \(C_1 = \frac{900{,}000+600{,}000}{200{,}000} = 7.50\)

\[\text{Volumen} = 0 \qquad \text{Precio} = -2.50\times200{,}000 = -500{,}000 \qquad \text{Costo} = +1.50\times200{,}000 = +300{,}000\]

Suma \(-200{,}000\): exacto. Y sin embargo el diagnóstico es completamente falso: dice que perdiste medio millón por precio y recuperaste 300 mil por costo, cuando en realidad ningún precio y ningún costo se movió un centavo.

Panel A: el puente calculado con promedios de compañía. Panel B: el mismo cambio, descompuesto correctamente. Los dos suman -200,000, pero solo uno dice la verdad.

3.6.2 La versión correcta

Si calculas el puente producto por producto y sumas, cada producto tiene \(\Delta P = \Delta C = 0\), así que los efectos precio y costo son cero, y todo el cambio queda en volumen:

\[\text{Volumen}_A = +50{,}000 \times 4 = +200{,}000 \qquad \text{Volumen}_B = -50{,}000 \times 8 = -400{,}000\]

Total \(-200{,}000\). También exacto, pero ahora el diagnóstico es correcto: el problema es de portafolio, no de pricing ni de compras.

Y todavía se puede afinar. El efecto volumen agregado por producto contiene en realidad dos cosas mezcladas, y se separan así:

\[ \underbrace{\sum_i \Delta Q_i\,m_{i,0}}_{\text{volumen por producto}} = \underbrace{\Delta Q_{\text{total}} \cdot \bar{m}_0}_{\textbf{volumen puro}} + \underbrace{\left(\sum_i \Delta Q_i\,m_{i,0} - \Delta Q_{\text{total}}\cdot\bar{m}_0\right)}_{\textbf{efecto mezcla}} \]

donde \(\bar m_0\) es el margen unitario promedio de la compañía en el año base.

  • Volumen puro: cuánto habría cambiado el GP si hubieras vendido \(\Delta Q\) unidades adicionales manteniendo la misma mezcla de productos.
  • Mezcla: cuánto cambió el GP porque la composición de lo que vendes se movió hacia productos de mayor o menor margen.

En el ejemplo: volumen puro \(= 0 \times 6 = 0\), y mezcla \(= -200{,}000 - 0 = -200{,}000\). Todo el deterioro es mezcla. Eso sí es un hallazgo que un CFO puede accionar.

La regla que debes recordar. El puente calculado sobre promedios de compañía siempre suma bien y frecuentemente diagnostica mal. Calcula los efectos precio y costo al nivel de detalle donde el precio y el costo realmente existen -el producto, o al menos la subcategoría- y agrégalos hacia arriba. La diferencia entre el efecto volumen agregado y el volumen puro tiene un nombre en contabilidad administrativa: efecto mezcla (sales mix variance).

3.7 Las medidas DAX

Primero las auxiliares del año anterior (mismo patrón del Workshop 3):

Units Sold LY  = CALCULATE( [Units Sold],    SAMEPERIODLASTYEAR('Calendar'[Date]) )
Net Sales LY   = CALCULATE( [Net Sales],     SAMEPERIODLASTYEAR('Calendar'[Date]) )
COGS LY        = CALCULATE( [COGS],          SAMEPERIODLASTYEAR('Calendar'[Date]) )
Gross Profit LY= CALCULATE( [Gross Profit],  SAMEPERIODLASTYEAR('Calendar'[Date]) )

Avg Price LY   = DIVIDE( [Net Sales LY], [Units Sold LY] )
Avg Cost LY    = DIVIDE( [COGS LY],      [Units Sold LY] )

GP Change      = [Gross Profit] - [Gross Profit LY]

Versión a nivel del contexto actual (la del Workshop 3):

Volume Effect = ( [Units Sold] - [Units Sold LY] ) * ( [Avg Price LY] - [Avg Cost LY] )
Price Effect  = ( [Avg Price]  - [Avg Price LY]  ) *   [Units Sold]
Cost Effect   = - ( [Avg Cost] - [Avg Cost LY]   ) *   [Units Sold]

Puestas en una matriz por producto, estas tres medidas se evalúan dentro del contexto de cada producto y por lo tanto son correctas. El problema aparece en la fila de totales, donde se recalculan con los promedios de la compañía. Por eso el total de la matriz no coincide con la suma de sus filas: no es un error de Power BI, es el efecto mezcla apareciendo.

Versión correcta a cualquier nivel: se itera sobre el producto y se suma, de modo que el total sea la suma de los detalles.

Price Effect (por producto) =
SUMX(
    VALUES( Products[ProductID] ),
    ( [Avg Price] - [Avg Price LY] ) * [Units Sold]
)

Cost Effect (por producto) =
SUMX(
    VALUES( Products[ProductID] ),
    - ( [Avg Cost] - [Avg Cost LY] ) * [Units Sold]
)

Volume + Mix Effect =
SUMX(
    VALUES( Products[ProductID] ),
    ( [Units Sold] - [Units Sold LY] ) * ( [Avg Price LY] - [Avg Cost LY] )
)

Pure Volume Effect =
( [Units Sold] - [Units Sold LY] )
* DIVIDE( [Gross Profit LY], [Units Sold LY] )

Mix Effect = [Volume + Mix Effect] - [Pure Volume Effect]

Recuerda por qué esto funciona: dentro de SUMX( VALUES(...) ) cada medida se evalúa con transición de contexto, es decir, filtrada por el producto de la fila actual -exactamente el mismo mecanismo que estudiamos en el Paso 3 del Pareto.

Verificación obligatoria. Escribe esta medida y ponla en una tarjeta; debe dar cero (o un redondeo despreciable) en cualquier selección de filtros:

Bridge Check =
[GP Change]
 - ( [Pure Volume Effect] + [Mix Effect]
   + [Price Effect (por producto)] + [Cost Effect (por producto)] )

Si no da cero, tu puente no es un puente: es una lista de números sueltos.

3.8 Cómo construir el gráfico de cascada en Power BI

El visual nativo Waterfall chart de Power BI no sabe descomponer nada por sí solo: solo dibuja la secuencia de valores que le des. La técnica estándar es una tabla puente desconectada.

1. Crea una tabla manual (Inicio → Escribir datos / Enter data), sin ninguna relación con el resto del modelo:

Tabla Bridge (desconectada del modelo)
Orden Paso
1 GP año anterior
2 Volumen
3 Mezcla
4 Precio
5 Costo

Ordena la columna Paso por la columna Orden (Herramientas de columna → Ordenar por columna). Sin esto los pasos aparecerán en orden alfabético y la cascada no tendrá sentido.

2. Escribe una medida despachadora que devuelva el valor que corresponde al paso visible:

Bridge Value =
SWITCH(
    SELECTEDVALUE( Bridge[Paso] ),
    "GP año anterior", [Gross Profit LY],
    "Volumen",         [Pure Volume Effect],
    "Mezcla",          [Mix Effect],
    "Precio",          [Price Effect (por producto)],
    "Costo",           [Cost Effect (por producto)],
    BLANK()
)

SELECTEDVALUE devuelve el único valor visible de una columna, o BLANK() si hay más de uno. Como la tabla está desconectada, no filtra a Sales: solo sirve como eje de categorías, y cada categoría “pregunta” por su propia medida.

3. Configura el visual: Waterfall chart, Categoría = Bridge[Paso], Eje Y = [Bridge Value]. Power BI dibuja cada barra como un delta sobre la anterior y agrega automáticamente una barra Total al final, que será el gross profit del año actual. Formatea en verde los aumentos, en rojo las disminuciones, y en gris/negro las barras de total.

4. Añade contexto: al lado del waterfall, una matriz con los mismos efectos por división o subcategoría, ordenada por el efecto que domine. La cascada dice qué pasó; la matriz dice dónde.

3.9 Cómo se lee un puente (y errores frecuentes)

  • Se lee de izquierda a derecha como una narración, no como una tabla. El orden convencional es: volumen → mezcla → precio → costo, es decir, de lo más “comercial” a lo más “operativo”.
  • Escala: nunca dejes que Power BI empiece el eje en cero si los efectos son pequeños frente al nivel del GP; las barras se vuelven invisibles. Ajusta el mínimo del eje.
  • Etiqueta cada barra con su valor. Un waterfall sin etiquetas de datos obliga al lector a estimar alturas, que es justo lo que un puente debe evitar.

Errores frecuentes:

  1. Comparar periodos de distinta duración. Si 2025 solo tiene datos hasta octubre y 2024 está completo, el efecto volumen absorberá la diferencia de calendario y el puente será basura. Usa SAMEPERIODLASTYEAR con un rango equivalente, o DATESYTD.
  2. Usar precio de lista en lugar de precio realizado. \(P\) debe salir de Net Sales, ya neto de descuentos y devoluciones. Si usas el precio de lista, el efecto descuento desaparece del análisis.
  3. Olvidar el signo del efecto costo. Es el error aritmético más común: un costo que sube produce un efecto negativo.
  4. Productos nuevos y descontinuados. Si un producto solo existe en un año, \(P_0\) o \(Q_0\) no están definidos y las divisiones producen blank. Decide explícitamente cómo tratarlos -lo habitual es asignarles todo su GP al efecto volumen- y decláralo en las notas.
  5. Presentar el puente sin la verificación. Siempre muestra que los efectos suman la diferencia. Es lo primero que revisa un auditor.

4 PARTE III. Retos con un dataset nuevo: Contoso

A partir de aquí no hay instrucciones paso a paso. Ya sabes importar, modelar, escribir medidas y construir visuales. Lo que sigue son objetivos de negocio; el camino lo eliges tú.

4.1 El caso

Contoso Electronics es un minorista global de electrónica de consumo: cámaras, computadoras, audio, video, telefonía y electrodomésticos. Vende a través de cuatro canales -tiendas físicas, tienda en línea, catálogo y distribuidores (reseller)- en 32 países.

La dirección general te plantea dos preocupaciones:

“Primera: sospecho que dependemos de muy pocos productos y de muy pocos mercados, pero nadie me ha puesto un número encima de esa sospecha.

Segunda, y más urgente: en el último año vendimos más unidades que nunca y aun así la utilidad bruta no creció. Necesito saber si eso fue precio, costo o algo más, y quiero verlo en una sola imagen.”

4.2 Los datos

El archivo W4_ContosoSalesData.xlsx está en la carpeta datosWorkshops y contiene seis hojas. Es un extracto limpio: no hay duplicados, no hay claves huérfanas y las fechas están bien tipificadas. Aun así, verifícalo con la auditoría de cinco puntos del Workshop 2 y repórtalo.

4.2.1 Sales Data - TABLA DE HECHOS (1,006 filas)

Columna Significado
SalesKey Identificador único de la línea de venta
DateKey Fecha de la transacción
channelKey Canal de venta (ver catálogo abajo)
StoreKey FK → Stores
ProductKey FK → Product
PromotionKey Promoción aplicada (sin tabla de dimensión en este extracto)
CurrencyKey Moneda (constante = 1, USD)
UnitCost Costo unitario de la transacción
UnitPrice Precio unitario de venta de la transacción
SalesQuantity Unidades vendidas
ReturnQuantity Unidades devueltas de esa línea
ReturnAmount Importe devuelto ( = ReturnQuantity × UnitPrice )
DiscountAmount Descuento otorgado, importe total de la línea (no unitario)

4.2.2 Product - DIMENSIÓN (1,690 filas)

ProductKey, ProductName, ProductDescription, ProductSubcategoryKey, UnitCost, UnitPrice, Shipping fee.

Ojo: UnitCost y UnitPrice aquí son valores de lista del catálogo. Los de Sales Data son los realizados en cada transacción. Todo cálculo monetario se hace con los de Sales Data; los de Product te sirven para medir desviaciones contra lista.

4.2.3 Subcategory - DIMENSIÓN (44 filas)

ProductSubcategoryKey, ProductSubcategoryName, ProductSubcategoryDescription.

4.2.4 Stores - DIMENSIÓN (306 filas)

StoreKey, GeographyKey, StoreManager, StoreType, StoreName.

4.2.5 Geography - DIMENSIÓN (674 filas)

GeographyKey, GeographyType, ContinentName, CityName, StateProvinceName, RegionCountryName.

Cuidado con esta tabla. Contiene filas de granularidad mixta: continentes, países, estados y ciudades, marcadas en GeographyType. Solo las filas de tipo City son referenciadas por Stores; en las demás, CityName y StateProvinceName vienen vacías. La relación con Stores sigue siendo 1:N válida, pero si arrastras CityName sin pensar tendrás categorías en blanco en tus visuales. Decide cómo tratarlo y justifícalo.

4.2.6 Calendar - DIMENSIÓN DE FECHA (1,096 filas)

Una sola columna, Date, del 2007-01-01 al 2009-12-31. Tendrás que enriquecerla tú con año, trimestre, número de mes y nombre de mes, y marcarla como tabla de fechas.

4.2.7 Catálogo de canales

No hay tabla de dimensión para el canal. El catálogo del ERP es:

Crea esta tabla manualmente (Escribir datos) y relaciónala
channelKey Canal
1 Store
2 Online
3 Catalog
4 Reseller

4.3 Convenciones que debes definir (y declarar)

Antes de escribir una sola medida, decide y documenta en una nota tu definición de:

  • Net Sales. La convención recomendada: \(\text{SalesQuantity}\times\text{UnitPrice} - \text{DiscountAmount} - \text{ReturnAmount}\).
  • Unidades netas: \(\text{SalesQuantity} - \text{ReturnQuantity}\).
  • COGS: unidades netas × UnitCost de la transacción.
  • Gross Profit y GP Margin como en los workshops anteriores.

Puedes elegir otra convención, pero entonces explica por qué y sé consistente en los dos dashboards.

Checkpoint de validación. Con todo el periodo 2007-2009 y sin filtros, tu Net Sales consolidado debe quedar entre USD 3.7 y 3.8 millones y tu GP Margin alrededor del 57 %. Si no es así, detente y depura antes de construir cualquier visual.

Nota sobre moneda. A diferencia de Andina Foods, aquí todo está en una sola moneda: no hay conversión que hacer. La complejidad de este dataset está en otro lado -granularidad mixta de geografía, dimensión de canal inexistente, calendario incompleto, devoluciones.

4.4 RETO 1 - Dashboard “Concentración y riesgo de portafolio”

Página de reporte: 1-CONCENTRACIÓN.

Objetivo: cuantificar de qué tan pocas cosas depende Contoso, y si las cosas de las que depende para vender son las mismas de las que depende para ganar.

Indicadores y visuales que como mínimo debe contener:

  1. Un análisis de Pareto completo de Net Sales por producto: barras ordenadas descendentemente, línea de % acumulado, línea de referencia en 80 %.
  2. Tarjetas con: número de productos que generan el 80 % de las ventas, y ese número como porcentaje del catálogo vendido.
  3. Una clasificación ABC de productos y una tabla o matriz que muestre, por clase A / B / C: número de productos, Net Sales, Gross Profit, GP Margin y unidades. La pregunta que debe contestar esa tabla es si los productos de clase A son también los más rentables.
  4. Un segundo Pareto, sobre Gross Profit en vez de Net Sales, en la misma página o en una comparativa. Los “pocos vitales” de una y otra lista no son los mismos; tu dashboard debe hacer visible esa diferencia.
  5. Concentración geográfica y de canal: cuántos países concentran el 80 % de las ventas, y cómo se reparten las ventas y el margen entre los cuatro canales.
  6. Al menos un indicador de riesgo diseñado por ti (por ejemplo, participación del país o del producto número uno, un índice de concentración, o el número de tiendas necesarias para llegar al 80 %). Justifica por qué lo elegiste.
  7. Segmentadores: año, canal, continente y subcategoría. Verifica que todos los porcentajes acumulados siguen cerrando en 100 % al mover cualquier segmentador; si no, revisa tu uso de ALLSELECTED.

4.4.1 Preguntas del Reto 1

Q1. ¿Cuántos productos generan el 80 % de las ventas y qué porcentaje del catálogo vendido representan? ¿Se cumple el “80/20”? Reporta la proporción que realmente encontraste e interprétala.

Q2. Construye el Pareto sobre Gross Profit. ¿Cuántos productos de los que están en el 80 % de ventas no están en el 80 % de utilidad? Nombra dos de ellos y explica qué los caracteriza.

Q3. ¿Cuál es el GP Margin de la clase A frente al de la clase C? Si tuvieras que descontinuar la mitad de los productos clase C, ¿qué porcentaje de las ventas y qué porcentaje de la utilidad estarías arriesgando?

Q4. ¿Qué porcentaje de las ventas viene del país número uno? ¿Qué riesgo genera esa concentración y qué indicador propondrías monitorear mensualmente para vigilarlo?

Q5. Explica tu indicador de riesgo propio: qué mide, cómo lo calculaste y qué valor te parecería una señal de alerta.

4.5 RETO 2 - Dashboard “Crecimiento y puente de Gross Profit”

Página de reporte: 2-CRECIMIENTO Y PUENTE.

Objetivo: explicar, con una sola imagen, por qué la utilidad bruta no creció aunque el negocio movió más unidades.

Advertencia de periodo. El dataset arranca en 2007, así que ese año no tiene comparativo. Todo tu análisis de crecimiento vive en 2008 y 2009.

Indicadores y visuales que como mínimo debe contener:

  1. Tarjetas de crecimiento anual: % de crecimiento de Net Sales, de unidades netas, de Gross Profit, y la variación del GP Margin en puntos porcentuales. Todas con Time Intelligence, no con columnas calculadas.
  2. Un gráfico de líneas o columnas de Net Sales y Gross Profit por año/trimestre, que haga visible simultáneamente la tendencia y la estacionalidad.
  3. El gráfico de cascada del cambio de Gross Profit del último año contra el anterior, construido con la técnica de la Parte II (tabla puente desconectada + SWITCH), con al menos los efectos volumen puro, mezcla, precio y costo.
  4. Una medida de verificación (Bridge Check) visible en una tarjeta, que demuestre que los efectos suman exactamente el cambio de gross profit.
  5. Una matriz de los mismos efectos por subcategoría, ordenada por el efecto dominante, para localizar dónde se originó el cambio.
  6. Un análisis de crecimiento por país y por canal: quién creció, quién cayó, y cuánto contribuyó cada uno al cambio total de gross profit (no solo su % de crecimiento: también su contribución en dólares).
  7. Un visual o tabla, diseñado por ti, que sustente tu explicación del cambio en el precio promedio realizado de la compañía.
  8. Segmentadores: año, canal, continente, subcategoría.

4.5.1 Preguntas del Reto 2

Q6. ¿Cuánto cambió el Gross Profit del último año contra el anterior, en dólares y en porcentaje? ¿Y las unidades netas? Describe la aparente contradicción en una frase.

Q7. Calcula el puente usando los promedios de la compañía (efecto volumen, precio y costo, sin abrir por producto). Reporta los tres números. ¿Qué diagnóstico sugieren? ¿Te parece creíble?

Q8. Ahora calcula los efectos precio y costo iterando por producto. Compáralos con los del punto anterior. ¿Qué tan grandes resultaron? Con eso en la mano, ¿cuál es la explicación verdadera de lo que pasó con la utilidad bruta? Nombra el efecto responsable.

Q9. Cuantifica el efecto mezcla y explícalo en términos de negocio: ¿hacia qué subcategorías se movieron las ventas y qué margen unitario tienen esas subcategorías frente a las que perdieron participación?

Q10. Escribe una nota de hallazgos de media página dirigida a la dirección general con: (a) el diagnóstico cuantificado con el puente; (b) un objetivo SMART para el año siguiente; (c) una acción concreta, el supuesto sobre el que descansa, y su impacto esperado sobre el gross profit en dólares; (d) las limitaciones de tu análisis -al menos: qué hiciste con productos que solo existen en un año, cómo trataste las devoluciones, y qué implica que el extracto tenga solo 1,006 líneas de venta.

Una nota que dice “el margen se deterioró, hay que mejorarlo” no vale nada. Una nota que dice “el gross profit cayó USD X (-X %) pese a vender X % más unidades; el efecto volumen puro aportó +USD X, pero un efecto mezcla de -USD X lo anuló, porque las ventas se desplazaron de subcategoría A (margen unitario USD X) hacia subcategoría B (margen unitario USD X); recuperar la mezcla de 2008 en subcategoría A valdría aproximadamente USD X” es una nota por la que te contratan. Llena cada número en cursivas con tu propio modelo.

5 Entregables

Entrega por Canvas:

  1. El archivo .pbix del reporte de Contoso (Archivo → Descargar este archivo).
  2. Un documento PDF o Word que contenga:
    • Capturas de las dos páginas del reporte.
    • Tu bitácora de decisiones: resultado de la auditoría de integridad, tratamiento de la geografía de granularidad mixta, definición de Net Sales / unidades netas / COGS que adoptaste, y tratamiento de productos que solo existen en un año.
    • Tus respuestas escritas a Q1-Q10, con números.
    • La nota de hallazgos de Q10.
    • Evidencia de que tu Bridge Check da cero.

6 Rúbrica de evaluación

Rúbrica de calificación
Criterio Peso Qué obtiene el crédito completo
Pareto (calentamiento + Reto 1) 20 % Medidas de Pareto correctas con ALLSELECTED y RANKX; % acumulado que cierra en 100 % bajo cualquier segmentador; clasificación ABC como medida, no como columna calculada
Modelo semántico de Contoso 15 % Relaciones con cardinalidad y dirección correctas; calendario enriquecido y marcado como tabla de fechas; tabla de canales creada y relacionada; geografía de granularidad mixta tratada y justificada; columnas técnicas ocultas
DAX del puente 30 % Medidas LY con Time Intelligence; efectos precio y costo iterados por producto; volumen puro y mezcla correctamente separados; Bridge Check en cero
Dashboards 20 % Dos páginas completas, legibles, formateadas, ordenadas con sentido, segmentadores funcionales; waterfall bien construido y etiquetado
Hallazgos y nota 15 % Q1-Q10 respondidas con números; el efecto responsable correctamente identificado y explicado en términos de negocio; objetivo SMART; limitaciones reconocidas

Deducciones automáticas. Cualquier razón calculada como promedio aritmético de una columna de razones: -10 %. Un Pareto resuelto con columna calculada en lugar de medidas: -10 %. Un waterfall cuyos efectos no suman el cambio de gross profit, sin declararlo: -10 %. Un reporte sin formato -decimales crudos, títulos por defecto, sin separadores de miles: -5 %.


7 Apéndice - Referencia rápida de DAX

Patrones de DAX que necesitarás
Tarea Patrón
División segura DIVIDE( [Numerador], [Denominador] )
Traer una columna del lado uno RELATED( Dim[Columna] )
Conteo distinto DISTINCTCOUNT( Ventas[OrderID] )
Mismo periodo del año anterior CALCULATE( [Medida], SAMEPERIODLASTYEAR('Calendar'[Date]) )
Crecimiento anual % DIVIDE( [Medida] - [Medida LY], [Medida LY] )
Lista de la selección del usuario ALLSELECTED( Dim[Columna] )
Ignorar todos los filtros ALL( Tabla )
Participación sobre el total visible DIVIDE( [Medida], CALCULATE([Medida], ALLSELECTED()) )
Tabla virtual con columnas al vuelo ADDCOLUMNS( Tabla, "@Col", [Medida] )
Ranking descendente sin saltos RANKX( ALLSELECTED(Dim[Col]), [Medida], , DESC, Dense )
Acumulado tipo Pareto SUMX( FILTER( TablaVirtual, [@Ranking] <= RankActual ), [@Ventas] )
Top N por una medida TOPN( 10, VALUES(Dim[Clave]), [Medida], DESC )
Iterar sobre una dimensión SUMX( VALUES(Dim[Clave]), <expresión> )
Clasificación por umbrales SWITCH( TRUE(), cond1, val1, cond2, val2, valDefault )
Valor único visible de una columna SELECTEDVALUE( Bridge[Paso] )

8 Qué sigue

Con este workshop cierras el ciclo del módulo: sabes construir un modelo correcto, escribir medidas que respetan el contexto de filtro, medir concentración y descomponer un cambio en las palancas que lo provocaron. Esas tres habilidades -modelar, medir, descomponer- son el núcleo de la analítica contable. Lo que sigue en el curso es aplicarlas a decisiones: presupuestos, escenarios y proyecciones.