Power BI:按Activity组基于标准差动态剔除异常值的方案问询
按Activity分组过滤2倍标准差异常值的解决方案
计算列方案(直接用于切片器)
通过行级计算列按Activity分组统计均值和标准差,生成异常值状态字段供切片器使用:
- 创建计算列,计算每个Activity的平均时长:
Activity Mean = CALCULATE( AVERAGE(Table1[Activity Duration]), ALLEXCEPT(Table1, Table1[Activity]) )
ALLEXCEPT确保仅保留当前行的Activity筛选上下文,只计算同一Activity分组内的均值。
- 创建计算列,计算每个Activity的总体标准差(若为样本数据,替换为
STDEV.S):
Activity StdDev = CALCULATE( STDEV.P(Table1[Activity Duration]), ALLEXCEPT(Table1, Table1[Activity]) )
- 创建异常值状态判断列:
Outlier Status = VAR LowerBound = [Activity Mean] - 2 * [Activity StdDev] VAR UpperBound = [Activity Mean] + 2 * [Activity StdDev] RETURN IF( Table1[Activity Duration] >= LowerBound && Table1[Activity Duration] <= UpperBound, "Within 2 SDs", "Outlier" )
- 将
Outlier Status字段拖入切片器,选择对应状态即可实现按Activity分组的异常值过滤。
度量值方案(适合大数据量场景)
若数据集较大,计算列会占用过多内存,推荐使用度量值+独立维度表的动态过滤方案:
- 创建独立的状态维度表(无需与原始表建立关系):
StatusTable = DATATABLE( "Status", STRING, {{"Within 2 SDs"}, {"Outlier"}} )
- 创建度量值,判断当前行是否匹配切片器选中的状态:
IsSelectedStatus = VAR CurrentActivity = SELECTEDVALUE(Table1[Activity]) VAR CurrentDuration = SELECTEDVALUE(Table1[Activity Duration]) -- 计算当前Activity分组的全局均值与标准差 VAR ActivityMean = CALCULATE( AVERAGE(Table1[Activity Duration]), ALL(Table1), Table1[Activity] = CurrentActivity ) VAR ActivityStdDev = CALCULATE( STDEV.P(Table1[Activity Duration]), ALL(Table1), Table1[Activity] = CurrentActivity ) VAR LowerBound = ActivityMean - 2 * ActivityStdDev VAR UpperBound = ActivityMean + 2 * ActivityStdDev VAR CurrentStatus = IF( CurrentDuration >= LowerBound && CurrentDuration <= UpperBound, "Within 2 SDs", "Outlier" ) RETURN IF(SELECTEDVALUE(StatusTable[Status]) = CurrentStatus, 1, 0)
- 将
StatusTable的Status字段拖入切片器,然后在矩阵可视化的视觉筛选器中添加IsSelectedStatus度量值,设置筛选条件为等于1,即可实现动态分组过滤。
注意事项
- 标准差函数选择:
STDEV.P用于总体数据,STDEV.S用于样本数据,根据你的数据集类型调整。 - 性能权衡:计算列是预计算,刷新时更新,适合小数据集;度量值实时计算,更灵活但大数据量下会增加可视化加载时间。
内容的提问来源于stack exchange,提问作者Victor G
相关产品推荐
相关产品推荐

