Cómo crear una columna con clasificación por percentil en Power BI
Este tutorial muestra cómo crear una columna que clasifica observaciones en percentiles (por ejemplo, decis o percentiles personalizados) en Power BI usando DAX. La clasificación por percentil es útil para segmentar clientes, valores o métricas y preparar análisis comparativos.
Prerequisitos
- Power BI Desktop instalado.
- Modelo con una tabla fact/valor (p. ej.: Sales, con campo Amount o Value) cargada.
- Noociones básicas de DAX (medidas frente a columnas).
Paso 1: Elegir la lógica de percentil (rank continuo vs buckets)
Antes de escribir DAX, decide si quieres un percentil continuo (0-100) o buckets (p. ej.: decil 1..10). Los buckets son más fáciles para filtros y visualizaciones. Aquí vamos a crear ambos: primero el percentil continuo normalizado y después el bucket de decil.
Paso 2: Crear la medida o columna para Rank relativo
Si necesitas que el percentil se calcule por contexto de filtro o por grupo (p. ej.: por región), usa medidas. Para crear una columna persistente por fila (independiente de filtros), crea una columna calculada. Primer ejemplo: columna con Rank Percentil continuo entre 0 y 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)
Explicación: usamos ALL(Sales) para ignorar filtros y comparar con todo el conjunto. RowCountLess cuenta cuántos tienen valor menor; RowCountEqual cuenta cuántos son iguales. RankPos se basa en el método medio (mid-rank). El resultado se normaliza a 0-100.
Paso 3: Crear buckets (p. ej.: deciles) con SWITCH o INT
Para facilitar el análisis, transforma el percentil continuo en buckets (deciles 1..10). Usa la columna anterior o calcula directamente en 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 con INT (muy útil para percentiles regulares):
DecileBucketCompact =
VAR P = Sales[PercentileRank (coluna)]
RETURN
IF(ISBLANK(P), BLANK(), INT((P - 0.000001) / 10) + 1)
Ajustamos por 0.000001 para asegurar que 10.0 cae en el decil 1..10 correctamente sin bordes ambiguos.
Paso 4: Calcular percentil por grupo (p. ej.: por Region)
Cuando quieres percentiles dentro de cada grupo (Region, Category), sustituye ALL(Sales) por ALL(Sales[GroupColumn]) para mantener la comparación solo en el grupo. Ejemplo 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) con condición mantiene la escala solo dentro del grupo. Si tu modelo tiene una tabla Region relacionada, prefieres usar RELATED o calcular en el contexto apropiado.
Paso 5: Evitar errores comunes y optimizar
Errores comunes: divisiones por cero (sin filas), duplicados que crean percentiles idénticos, y rendimiento en tablas grandes. Para mejorar el rendimiento, considera crear una tabla de ranking agregada o usar RANKX con ALL o ALLSELECTED cuando tenga 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 puede ser suficiente para muchos escenarios; elige entre DENSE o SKIP según cómo quieras tratar los empates.
Verificar el resultado
Crea una tabla visual en Power BI con columnas: identificador, Amount, PercentileRank (coluna) y DecileBucket. Ordena por Amount. Verifica que los percentiles aumentan monotónicamente y que aproximadamente el 10% de las filas cae en cada decil (si tienes muchos valores únicos). Prueba con filtros por Region para confirmar percentiles por grupo.
Conclusión
Crear percentiles en Power BI con DAX permite segmentar datos para análisis e informes. Puedes ampliar a cuantiles personalizados (tertiles, quintiles) ajustando los límites de los buckets, o transformar estas columnas en filtros y leyendas en gráficos. Consejo: valida siempre con agregados (COUNT por bucket) para confirmar la distribución — ¿quieres explorar percentiles por cliente o por región primero?