Como criar percentil (P90) em DAX: passo a passo
Calcular percentis como o P90 em DAX é útil para identificar valores extremos (por exemplo tempos de resposta, latência ou vendas) sem ser enganado pela média. Este guia mostra como calcular P90 em DAX de forma filtrável e correta num relatório Power BI.
Pré-requisitos
- Power BI Desktop com um modelo de dados simples (tabelas de Fact e Dim).
- Uma tabela de fact com a métrica numérica (ex.: TempoSegundos, ValorVenda).
- Conhecimentos básicos de medidas em DAX e uso de visualizações.
Passo 1: Perceber o que é um percentil e porquê P90
Um percentil (ex.: P90) é o valor abaixo do qual se encontram 90% das observações. P90 é útil para medir desempenho em caudas superiores. Em DAX usamos funções como PERCENTILEX.INC ou PERCENTILEX.EXC, ou técnicas alternativas quando a função não estiver disponível na sua versão.
Passo 2: Medida simples com PERCENTILEX.INC
Se a sua versão do Power BI/Analysis Services inclui PERCENTILEX.INC, esta é a forma directa. Suponha uma tabela FactSales com a coluna ValorVenda. A medida calcula o P90 sobre o contexto de filtro actual.
Percentil P90 =
PERCENTILEX.INC(
ALLSELECTED(FactSales),
FactSales[ValorVenda],
0.9
)
Passo 3: Tornar o percentil resistente a filtros indesejados
Às vezes quer respeitar filtros de dimensão (ex.: Produto, Região) mas ignorar filtros de outras medidas. Use ALLSELECTED ou REMOVEFILTERS para controlar isso. Exemplo: respeitar selecções de Produto e Data, mas ignorar filtros de CategoriaCustom:
Percentil P90 (controlado) =
VAR Base = ALLSELECTED(FactSales)
-- se quiser remover apenas um filtro específico: REMOVEFILTERS(DimCategoria)
RETURN
PERCENTILEX.INC(
Base,
FactSales[ValorVenda],
0.9
)
Passo 4: Alternativa sem PERCENTILEX (compatibilidade)
Nem todas as versões têm PERCENTILEX.INC. Pode calcular P90 aproximado usando MEDIANX em conjuntos acumulados ou criar percentil por distribuição cumulativa. Exemplo simples que usa TOPN para chegar ao valor que deixa 90% abaixo — método discreto:
Percentil P90 (sem 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
Passo 5: P90 por grupo (ex.: por Produto)
Para calcular o percentil por grupo, coloque a medida num visual com a dimensão (ex.: DimProduto[Nome]) — o contexto de linha tratará do grupo. Se quiser forçar cálculo por grupo independentemente de outros filtros, use SUMMARIZE e EARLIER ou GROUPBY. Exemplo usando PERCENTILEX.INC por produto:
Percentil P90 por Produto =
PERCENTILEX.INC(
VALUES(FactSales[IDVenda]),
FactSales[ValorVenda],
0.9
)
-- ou, mais robusto:
Percentil P90 por Produto (robusto) =
VAR ProdutoContext = VALUES(DimProduto[ProdutoID])
RETURN
PERCENTILEX.INC(
CALCULATETABLE(FactSales, ProdutoContext),
FactSales[ValorVenda],
0.9
)
Verificar o resultado
Validar P90: 1) Compare com cálculo manual em Excel ou Python para um conjunto pequeno; 2) Use uma tabela visual no Power BI com a dimensão e a medida P90 e verifique se valores parecem correctos (ex.: 90% das linhas têm ValorVenda <= P90). Pode testar criando um cartão com a contagem de linhas abaixo do 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)))
Conclusão
Agora sabe calcular P90 em DAX com PERCENTILEX.INC e alternativas para compatibilidade, além de controlar filtros e calcular por grupo. Próximos passos: experimentar P50/P95, comparar PERCENTILEX.INC com métodos discretos e usar P90 em alertas ou segmentação. Dica: verifique sempre o contexto de filtro — é a causa mais comum de resultados inesperados.