从一组数据中排除异常值的有效且准确的算法是什么?

时间:2010-01-15 06:09:15

标签: statistics outliers

我有200个数据行(意味着一小组数据)。我想进行一些统计分析,但在此之前我想排除异常值。

为此目的有哪些潜在的算法?准确性是一个值得关注的问题。

我对Stats很新,所以需要非常基本的帮助。

7 个答案:

答案 0 :(得分:22)

总的来说,提出这样一个难题的问题是,对异常值没有严格的定义。我实际上建议不要使用一定数量的标准偏差作为截止值,原因如下:

  1. 一些异常值可能会对您的标准差估计产生巨大影响,因为标准偏差不是一个可靠的统计数据。
  2. 标准差的解释在很大程度上取决于数据的分布。如果您的数据是正态分布的,那么3个标准差很多,但如果它是,例如,对数正态分布,那么3个标准偏差不是很多。
  3. 有一些好的方法可以继续:

    1. 保留所有数据,并使用健壮的统计数据(中位数代替均值,Wilcoxon检验代替T检验等)。如果您的数据集很大,可能会很好。

    2. 修剪或温度化您的数据。修剪意味着去除顶部和底部x%。 Winsorizing意味着将顶部和底部x%分别设置为xth和1-xth百分位值。

    3. 如果你有一个小数据集,你可以只绘制你的数据并手动检查它是否有不可信的值。

    4. 如果您的数据看起来相当接近正态分布(没有重尾和大致对称),那么使用median absolute deviation代替标准差作为您的测试统计,并过滤到3或4个中位数绝对偏差远离中位数。

答案 1 :(得分:5)

首先绘制异常值的leverage,然后进行一些良好的“眼间创伤”(也就是看散点图)。

很多统计软件包都有异常/残留诊断,但我更喜欢Cook's D.如果您想使用this formula from mtsu.edu,您可以手动计算(原始链接已死,这来自archive.org)

答案 2 :(得分:2)

您可能听过“六西格玛”这个词。

这是指平均值附近的正负3西格玛(即标准偏差)。

“六西格玛”范围以外的任何内容都可以作为异常值处理

经过反思,我认为'六西格玛'太宽了。

This article描述了它如何相当于“每百万机会中有缺陷的零件数量”。

对于认证目的而言,这似乎是一项非常严格的要求。只有你可以决定它是否适合你。

答案 3 :(得分:2)

根据您的数据及其含义,您可能需要查看RANSAC(随机样本共识)。这在计算机视觉中被广泛使用,并且当试图将具有大量异常值的数据拟合到模型时通常给出优异的结果。

概念化和解释非常简单。另一方面,它是非确定性的,可能会根据应用程序引起问题。

答案 4 :(得分:1)

计算集合的标准差,并排除第一,第二或第三标准差之外的所有内容。

答案 5 :(得分:0)

以下是我将如何在SQL Server中进行此操作

下面的查询将从虚构的比例表中得到每个人的单一称重的平均重量,同时不允许那些过胖或瘦的人甩掉更现实的平均值:

  select w.Gender, Avg(w.Weight) as AvgWeight
    from ScaleData w
    join ( select d.Gender, Avg(d.Weight) as AvgWeight, 
                  2*STDDEVP(d.Weight) StdDeviation
             from ScaleData d
            group by d.Gender
         ) d
      on w.Gender = d.Gender
     and w.Weight between d.AvgWeight-d.StdDeviation 
                      and d.AvgWeight+d.StdDeviation
   group by w.Gender  

可能有更好的方法来解决这个问题,但它运作良好。如果您遇到了另一种更有效的解决方案,我很乐意听到它。

注意:为了达到平均值,以上将5%的异常值从图片中移除。您可以通过调整2 * STDDEVP中的2 *来调整删除的异常值数量:http://en.wikipedia.org/wiki/Standard_deviation

答案 6 :(得分:0)

如果你想分析它,比如想要计算与另一个变量的相关性,可以排除异常值。但是如果你想模拟/预测,那么直接排除它们并不总是最好的。

尝试使用封顶等方法对待它,或者如果您怀疑异常值包含信息/模式,则将其替换为缺失,并对其进行建模/预测。我已经写了一些例子,说明如何使用R来实现这个here