首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >寻找数值数据集中的“异常值”

寻找数值数据集中的“异常值”
EN

Stack Overflow用户
提问于 2015-01-15 06:35:57
回答 2查看 6.1K关注 0票数 3

我想要比较(排序)增长率和非常低的起始值的高增长率和劣势。

示例:

  1. 开始: 1.000.000结束: 1.100.000增长:+10%

  1. 开始: 100.000结束: 120.000增长:+20%

  1. 开始:1结束: 10增长:+900%

  1. 开始: 10结束: 15增长:+50%

仅按增长排序,降序结果为: 900% (3.),50% (4.),20% (2.),10% (1.)

但我想要的是: 20% (2.),10% (1.),900% ( 3. ),50% ( 4. ),因为在我的情况下概率很高,3.和4.是统计上的异常值。

解决这个问题的最好方法是什么?我需要为起始值定义一个阈值吗?

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-01-15 06:43:58

根据您提供的描述,问题可以分为两部分:

  1. 从数据集中查找和排除Statistical Outliers
  2. 将结果值按降序(或任意)排序

使用Microsoft Excel的第一个问题和示例的一般解决方案在: Microsoft Excel worksheet (http://www.codeproject.com/Tips/214330/Statistical-Outliers-detection)中的统计异常值检测。以下是与您的案例相关的一些理论和示例。

在数据集中找到“异常值”可以通过计算每个数字的偏差来完成,表示为“Z分数”或“修改的Z分数”,并根据某些预定义的阈值对其进行测试。Z-score通常是指相对于统计平均值的标准差的数量(换句话说,它是以“西格玛”来衡量的)。改进的Z-score应用中值计算技术来测量偏差,并在许多情况下提供了更健壮的异常值统计检测。在数学上,修改后的Z-score可以写成(根据Iglewicz和Hoaglin的建议-参见参考文章):

代码语言:javascript
复制
Mi = 0.6745 * (Xi - Median(Xi)) / MAD,

其中MAD代表中位数绝对偏差。修正Z分数绝对值超过3.5的数据集中的任何数字都被认为是“异常值”。修改后的Z-score可用于检测Microsoft Excel工作表中与您的情况相关的异常值,如下所述。

步骤1.打开Microsoft Excel工作表,在单元格A1、A2、A3、A4中分别输入数值: 900%、50%、20%、10%。

步骤2.在C1中输入公式:=MEDIAN(A1:A4)。此单元格中的值对应于在步骤1输入的数据集上计算的中位数。

步骤3.在C2中输入数组公式:{=MEDIAN(ABS(MEDIAN(A1:A4)-A1:A4))}。需要提醒的是,为了输入数组公式,请选择单元格,在Excel公式栏中键入公式,然后单击组合键: CTRL-SHIFT-ENTER (请注意表达式周围的花括号,它表示数组公式)。此单元格中的值(C2)对应于MAD。

步骤4.在B列的第一行输入公式:=IF((0.6745*ABS(C$1-A1)>3.5*C$2), "OUTLIER", "NORMAL"),并将其向下扩展到第四行。“异常值检测”的最终结果应显示在B栏中。

代码语言:javascript
复制
A       B           C
900%    OUTLIER     35%
50%     NORMAL      0.35
20%     NORMAL  
10%     NORMAL  

因此,值900%被发现是“异常值”,而其他值是正常的。对结果集进行排序将是一项微不足道的任务。

为了解释清楚起见,本文还提供了Excel工作表示例。算法本身可以用任何编程语言(VBA、C#、Java等)实现。希望这能有所帮助。

票数 3
EN

Stack Overflow用户

发布于 2016-06-13 23:33:15

我的独处

代码语言:javascript
复制
private static List<double> StatisticalOutLierAnalysis(List<double> allNumbers)
{
    List<double> normalNumbers = new List<double>();
    List<double> outLierNumbers = new List<double>(); 
    double avg = allNumbers.Average();
    double standardDeviation = Math.Sqrt(allNumbers.Average(v => Math.Pow(v - avg, 2)));
    foreach (double number in allNumbers)
    {
        if ((Math.Abs(number - avg)) > (2 * standardDeviation))
            outLierNumbers.Add(number);
        else
            normalNumbers.Add(number);
    }

    return normalNumbers;
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27953724

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档