Como criar uma coluna com classificação por percentil em Power BI
Este tutorial mostra como criar uma coluna que classifica observações em percentis (por exemplo, decis ou percentis personalizados) em Power BI usando DAX. A classificação por percentil é útil para segmentar clientes, valores ou métricas e preparar análises comparativas.
Pré-requisitos
- Power BI Desktop instalado.
- Modelo com uma tabela fact/valor (ex.: Sales, com campo Amount ou Value) carregada.
- Noções básicas de DAX (medidas versus colunas).
Passo 1: Escolher a lógica de percentil (rank contínuo vs buckets)
Antes de escrever DAX, decide se queres um percentil contínuo (0-100) ou buckets (ex.: decil 1..10). Os buckets são mais fáceis para filtros e visualizações. Aqui vamos criar ambos: primeiro o percentil contínuo normalizado e depois o bucket de decil.
Passo 2: Criar a medida ou coluna para Rank relativo
Se precisares que o percentil seja calculado por contexto de filtro ou por grupo (ex.: por região), usa medidas. Para criar uma coluna persistente por linha (independente de filtros), cria uma coluna calculada. Primeiro exemplo: coluna com Rank Percentil contínuo entre 0 e 100.
// Substitui 'Sales' e 'Amount' pelos nomes da tua tabela e coluna
PercentileRank (coluna) =
VAR ThisValue = Sales[Amount]
VAR RowCountLess =
COUNTROWS(
FILTER(
ALL(Sales),
Sales[Amount] < ThisValue
)
)
VAR RowCountEqual =
COUNTROWS(
FILTER(
ALL(Sales),
Sales[Amount] = ThisValue
)
)
VAR TotalRows = COUNTROWS(ALL(Sales))
// Usamos método de interpolação para valores iguais: rank médio
VAR RankPos = RowCountLess + (RowCountEqual / 2)
RETURN
IF(TotalRows = 0, BLANK(), (RankPos - 1) / (TotalRows - 1) * 100)
Explicação: usamos ALL(Sales) para ignorar filtros e comparar com todo o conjunto. RowCountLess conta quantos têm valor menor; RowCountEqual conta quantos são iguais. RankPos baseia-se no método médio (mid-rank). O resultado é normalizado para 0-100.
Passo 3: Criar buckets (ex.: decis) com SWITCH ou INT
Para facilitar a análise, transforma o percentil contínuo em buckets (decis 1..10). Usa a coluna anterior ou calcula diretamente em DAX:
DecileBucket =
VAR P = Sales[PercentileRank (coluna)]
RETURN
SWITCH(
TRUE(),
P <= 10, 1,
P <= 20, 2,
P <= 30, 3,
P <= 40, 4,
P <= 50, 5,
P <= 60, 6,
P <= 70, 7,
P <= 80, 8,
P <= 90, 9,
10
)
Alternativa compacta com INT (muito útil para percentis regulares):
DecileBucketCompact =
VAR P = Sales[PercentileRank (coluna)]
RETURN
IF(ISBLANK(P), BLANK(), INT((P - 0.000001) / 10) + 1)
Ajustamos por 0.000001 para garantir que 10.0 fica no decil 1..10 corretamente sem bordas ambíguas.
Passo 4: Calcular percentil por grupo (ex.: por Region)
Quando queres percentis dentro de cada grupo (Region, Category), substitui ALL(Sales) por ALL(Sales[GroupColumn]) para manter a comparação apenas no grupo. Exemplo por Region:
PercentileRank_ByRegion =
VAR ThisValue = Sales[Amount]
VAR ThisRegion = Sales[Region]
VAR RowCountLess =
COUNTROWS(
FILTER(
ALL(Sales),
Sales[Region] = ThisRegion && Sales[Amount] < ThisValue
)
)
VAR RowCountEqual =
COUNTROWS(
FILTER(
ALL(Sales),
Sales[Region] = ThisRegion && Sales[Amount] = ThisValue
)
)
VAR TotalRows = COUNTROWS(FILTER(ALL(Sales), Sales[Region] = ThisRegion))
VAR RankPos = RowCountLess + (RowCountEqual / 2)
RETURN
IF(TotalRows = 0, BLANK(), (RankPos - 1) / (TotalRows - 1) * 100)
Nota: usar ALL(Sales) com condição mantém a escala apenas dentro do grupo. Se o teu modelo tiver uma tabela Region relacionada, preferes usar RELATED ou calcular em contexto apropriado.
Passo 5: Evitar erros comuns e optimizar
Erros comuns: divisões por zero (sem linhas), duplicados que criam percentis idênticos, e performance em tabelas grandes. Para melhorar a performance, considera criar uma tabela de ranking agregada ou usar RANKX com ALL ou ALLSELECTED quando fizer sentido.
// Exemplo alternativo usando RANKX (pode ser mais simples mas menos controlável para empates)
Percentile_RANKX =
VAR Total = COUNTROWS(ALL(Sales))
VAR RankVal = RANKX(ALL(Sales), Sales[Amount], , ASC, DENSE)
RETURN
IF(Total = 0, BLANK(), (RankVal - 1) / (Total - 1) * 100)
RANKX pode ser suficiente para muitos cenários; escolhe entre DENSE ou SKIP consoante como queres tratar empates.
Verificar o resultado
Cria uma tabela visual em Power BI com colunas: identificador, Amount, PercentileRank (coluna) e DecileBucket. Ordena por Amount. Verifica que os percentis aumentam monotonicamente e que aproximadamente 10% das linhas caem em cada decil (se tens muitos valores únicos). Testa com filtros por Region para confirmar percentis por grupo.
Conclusão
Criar percentis em Power BI com DAX permite segmentar dados para análises e relatórios. Podes expandir para quantis personalizados (tertis, quintis) ajustando os limites dos buckets, ou transformar estas colunas em filtros e legendas em gráficos. Dica: valida sempre com agregados (COUNT por bucket) para confirmar a distribuição — queres explorar percentis por cliente ou por região primeiro?