Cómo crear percentil (P90) en DAX: paso a paso
Calcular percentiles como el P90 en DAX es útil para identificar valores extremos (por ejemplo tiempos de respuesta, latencia o ventas) sin dejarse engañar por la media. Esta guía muestra cómo calcular P90 en DAX de forma filtrable y correcta en un informe Power BI.
Requisitos previos
- Power BI Desktop con un modelo de datos simple (tablas de Fact y Dim).
- Una tabla de fact con la métrica numérica (ej.: TiempoSegundos, ValorVenda).
- Conocimientos básicos de medidas en DAX y uso de visualizaciones.
Paso 1: Entender qué es un percentil y por qué P90
Un percentil (ej.: P90) es el valor por debajo del cual se encuentran el 90% de las observaciones. P90 es útil para medir rendimiento en colas superiores. En DAX usamos funciones como PERCENTILEX.INC o PERCENTILEX.EXC, o técnicas alternativas cuando la función no esté disponible en su versión.
Paso 2: Medida simple con PERCENTILEX.INC
Si su versión de Power BI/Analysis Services incluye PERCENTILEX.INC, esta es la forma directa. Suponga una tabla FactSales con la columna ValorVenda. La medida calcula el P90 sobre el contexto de filtro actual.
Percentil P90 =
PERCENTILEX.INC(
ALLSELECTED(FactSales),
FactSales[ValorVenda],
0.9
)
Paso 3: Hacer el percentil resistente a filtros indeseados
A veces quiere respetar filtros de dimensión (ej.: Producto, Región) pero ignorar filtros de otras medidas. Use ALLSELECTED o REMOVEFILTERS para controlar eso. Ejemplo: respetar selecciones de Producto y Fecha, pero ignorar filtros de CategoriaCustom:
Percentil P90 (controlado) =
VAR Base = ALLSELECTED(FactSales)
-- si quiere eliminar solo un filtro específico: REMOVEFILTERS(DimCategoria)
RETURN
PERCENTILEX.INC(
Base,
FactSales[ValorVenda],
0.9
)
Paso 4: Alternativa sin PERCENTILEX (compatibilidad)
No todas las versiones tienen PERCENTILEX.INC. Puede calcular un P90 aproximado usando MEDIANX en conjuntos acumulados o crear percentil por distribución acumulativa. Ejemplo simple que usa TOPN para llegar al valor que deja el 90% por debajo — método discreto:
Percentil P90 (sin PERCENTILEX) =
VAR T =
ADDCOLUMNS(
SUMMARIZE(ALLSELECTED(FactSales), FactSales[ValorVenda]),
"CountVal", CALCULATE(COUNTROWS(FactSales))
)
VAR Total = SUMX(T, [CountVal])
VAR Target = Total * 0.9
VAR Sorted =
ADDCOLUMNS(
T,
"Cum", SUMX(
FILTER(T, FactSales[ValorVenda] <= EARLIER(FactSales[ValorVenda])),
[CountVal]
)
)
VAR Result = MINX(FILTER(Sorted, [Cum] >= Target), FactSales[ValorVenda])
RETURN
Result
Paso 5: P90 por grupo (ej.: por Producto)
Para calcular el percentil por grupo, coloque la medida en un visual con la dimensión (ej.: DimProduto[Nome]) — el contexto de fila se encargará del grupo. Si quiere forzar el cálculo por grupo independientemente de otros filtros, use SUMMARIZE y EARLIER o GROUPBY. Ejemplo usando PERCENTILEX.INC por producto:
Percentil P90 por Produto =
PERCENTILEX.INC(
VALUES(FactSales[IDVenda]),
FactSales[ValorVenda],
0.9
)
-- o, más robusto:
Percentil P90 por Produto (robusto) =
VAR ProdutoContext = VALUES(DimProduto[ProdutoID])
RETURN
PERCENTILEX.INC(
CALCULATETABLE(FactSales, ProdutoContext),
FactSales[ValorVenda],
0.9
)
Verificar el resultado
Validar P90: 1) Compare con cálculo manual en Excel o Python para un conjunto pequeño; 2) Use una tabla visual en Power BI con la dimensión y la medida P90 y verifique si los valores parecen correctos (ej.: el 90% de las filas tienen ValorVenda <= P90). Puede probar creando una tarjeta con el conteo de filas por debajo del P90:
Linhas <= P90 =
VAR P = [Percentil P90]
RETURN
CALCULATE(COUNTROWS(FactSales), FactSales[ValorVenda] <= P)
Percentagem abaixo P90 =
DIVIDE([Linhas <= P90], CALCULATE(COUNTROWS(FactSales), ALLSELECTED(FactSales)))
Conclusión
Ahora sabe calcular P90 en DAX con PERCENTILEX.INC y alternativas para compatibilidad, además de controlar filtros y calcular por grupo. Próximos pasos: experimentar con P50/P95, comparar PERCENTILEX.INC con métodos discretos y usar P90 en alertas o segmentación. Consejo: verifique siempre el contexto de filtro — es la causa más común de resultados inesperados.