过滤度量(或删除异常值)

Posted

技术标签:

【中文标题】过滤度量(或删除异常值)【英文标题】:Filtering a Measure (or Removing Outliers) 【发布时间】:2009-11-20 15:37:03 【问题描述】:

假设我在一个多维数据集中有一个度量 foo,并且我有一个报告要求,即用户希望在报告中看到以下度量:

total foo
total foo excluding instances where foo > 10
total foo excluding instances where foo > 30

处理此问题的最佳方法是什么? 过去,我添加了命名计算,如果 foo > 10 则返回 NULL,否则返回 foo。 我觉得必须有一种方法可以在 MDX 中实现这一点(类似于Filter([Measures].[foo], [Measures].[foo] > 10)),但我一辈子都想不通。

有什么想法吗?

【问题讨论】:

【参考方案1】:

诀窍是您需要在您的集合上应用过滤器,而不是在您的度量上。

例如,使用通常的 Microsoft“仓库和销售”演示立方体,以下 MDX 将显示销售额超过 2000 美元的所有商店的销售额。

SELECT Filter([Store].[Stores].[Store].members, [Unit Sales] > 2000) ON COLUMNS, [单位销售] ON ROWS FROM [仓库和销售]

【讨论】:

感谢您的意见,这根本不是我想要的效果。您的示例过滤了一组商店,但我正在寻找的是一种过滤事实记录的方法。使用您的示例,假设我想显示每家商店的平均单位销售额,我仍然想显示每家商店,但我不希望平均总销售额 > 2000。【参考方案2】:

我在使用saiku(使用Mondrain的后端)时遇到了类似的问题,因为我还没有找到任何明确的“在度量上添加过滤器”的解决方案,我在这里添加了它,这可能对其他人有用。

在Saiku3.8中,你可以在UI上添加过滤器:“column”->“filter”->“custom”,然后你可能会看到一个Filter MDX Expression。

假设我们希望广告中的点击次数大于 1000,然后在此处添加以下行:

[Measures].[clicks] > 1000

保存并关闭,那么该过滤器将对点击次数大于 1000 的 find elem 有效。

MDX like below(假设dt为维度,点击为度量,我们要找到点击次数超过1000的dt)

WITH
SET [~ROWS] AS
    Filter([Dt].[dt].[dt].Members, ([Measures].[clicks] > 1000))
SELECT
NON EMPTY [Measures].[clicks] ON COLUMNS,
NON EMPTY [~ROWS] ON ROWS
FROM [OfflineData]

【讨论】:

谢谢。它工作得很好。我有兴趣在名为 SoldQty 的度量上放置一个过滤器,并希望允许最终用户在 s-s-rS 报告中将此过滤器用作报告参数。 WITH SET [~ROWS] AS Filter([Dt].[dt].[dt].Members, ([Measures].[clicks] > STRTOVALUE(@SoldQty))) SELECT NON EMPTY [Measures].[点击] 列,非空 [~ROWS] 来自 [OfflineData] 的行【参考方案3】:

我认为你有两个选择:

1- 将列添加到您的事实(或基于事实表的数据源视图上的视图),例如:

case when unit_Price>2000 then 1 
     else 0  
end as Unit_Price_Uper_Or_Under_10 

并根据此列值添加一个虚构的维度。 并为新维度添加命名查询(比如 datasourceview 中的 Range_Dimension : 选择 1 作为范围 联合所有 选择0作为范围

之后你就不能像其他维度和属性一样使用这个过滤器了。

 SELECT [Store].[Stores].[Store].members ON COLUMNS,
[Unit Sales] ON ROWS
FROM [Warehouse and Sales]
WHERE [Test_Dimension].[Range].&[1]

问题是对于每个范围,您必须添加When 条件,并且仅当范围是静态的时,此解决方案才是一个好的解决方案。 对于动态范围,最好制定范围(基于离散化方法)

2-基于事实表在事实表附近添加粒度维度 例如,如果我们有主键Sale_id的事实表。我们可以添加 基于事实表的维度,只有一列 sale_Iddimension Usage tab 我们可以将此new dimensionmeasure group 与关系类型Fact 和 之后在 mdx 中我们可以使用类似的东西:

filter([dim Sale].[Sale Id].[Sale Id].members,[Measures].[Unit Price]>2000)

【讨论】:

以上是关于过滤度量(或删除异常值)的主要内容,如果未能解决你的问题,请参考以下文章

有啥方法可以减少 Radius 异常值删除 [pcl 异常值删除] 的执行时间?

异常点检测方法

如何删除 Python boxplot 图形图像中的异常值?

Python异常值删除

R boxplot:如何自定义盒须图的外观(例如,删除线条或边框,更改异常值的符号)

在 MySQL 中是不是可以找到最小值/最大值但首先删除异常值?