如何在 Power BI 中使用 DAX 计算动态截断均值
Source: Dev.to

为什么需要截断均值
在数据分析中,标准的 AVERAGE 函数是常用工具,但它有一个显著的弱点:对离群值极其敏感。一个极端值(无论是高还是低)都可能扭曲整体结果,导致对数据真实中心趋势的误判。
这正是截断均值发挥作用的地方。它通过在计算时排除一定比例的最小值和最大值,提供了更稳健的平均度量。
虽然现代 Power BI 模型内置了 TRIMMEAN 函数,但在使用对旧版 Analysis Services(SSAS)模型的实时连接时,该函数往往不可用。下面的 DAX 模式复现了该功能,并保持完全动态,能够响应报表中的所有切片器和筛选器。
动态截断均值的 DAX 解决方案
此度量通过在求平均之前去除最低 10 % 和最高 10 % 的值,计算出 20 % 截断均值(即对剩余 80 % 的值求平均)。
您可以直接将以下代码粘贴到 New Measure 公式栏中。
Trimmed Mean (20%) =
VAR TargetTable = 'FactTable'
VAR TargetColumn = 'FactTable'[MeasureColumn]
VAR LowerPercentile = 0.10 // Defines the bottom 10% to trim
VAR UpperPercentile = 0.90 // Defines the top 10% to trim (1.0 - 0.10)
// 1. Find the value at the 10th percentile
VAR MinThreshold =
PERCENTILEX.INC(
FILTER(
TargetTable,
NOT( ISBLANK( TargetColumn ) )
),
TargetColumn,
LowerPercentile
)
// 2. Find the value at the 90th percentile
VAR MaxThreshold =
PERCENTILEX.INC(
FILTER(
TargetTable,
NOT( ISBLANK( TargetColumn ) )
),
TargetColumn,
UpperPercentile
)
// 3. Calculate the average, including only values between the thresholds
RETURN
CALCULATE(
AVERAGEX(
FILTER(
TargetTable,
TargetColumn >= MinThreshold &&
TargetColumn <= MaxThreshold
),
TargetColumn
)
)
拆解 DAX 逻辑
该公式分为三个独立步骤,全部在当前筛选上下文中执行(例如,用户选择的任何切片器)。
1. 定义关键变量
- TargetTable & TargetColumn – 将表名和列名分配给变量,以实现简洁、可复用的代码。将
'FactTable'[MeasureColumn]替换为模型中相应的列。 - LowerPercentile / UpperPercentile – 定义边界。
0.10和0.90用于去除最低 10 % 和最高 10 %。若要两端各去除 5 %(共计 10 %),使用0.05和0.95。
2. 找到分位阈值
- MinThreshold & MaxThreshold – 保存对应于分位边界的实际数值。
- PERCENTILEX.INC – 作为迭代器使用,以便我们先 FILTER 表。
- FILTER(…, NOT(ISBLANK(…))) – 确保仅对目标列非空的行计算分位数,防止
BLANK()值扭曲计算。
结果是 MinThreshold 保存第 10 百分位的值(例如 4.5),MaxThreshold 保存第 90 百分位的值(例如 88.2),对应当前可见的数据。
3. 计算最终平均值
- RETURN CALCULATE(…) – 使度量值动态化,遵循切片器或可视化对象所施加的任何筛选。
- AVERAGEX(FILTER(…)) – 在过滤后的表上迭代,计算满足修剪条件的行的
TargetColumn的简单平均值。 - 内部 FILTER 仅保留
TargetColumn≥ MinThreshold AND ≤ MaxThreshold 的行。
结论
通过实现此 DAX 模式,您可以创建一个稳健、动态且对异常值具有抵抗力的 KPI。该度量提供了更准确的数据中心趋势图,并将在用户与 Power BI 报表交互时自动重新计算。