在数字数据集中查找 'Outliers'

Finding the 'Outliers' in numeric data set

我想比较(排序依据)增长率和不利的高利率以及非常低的起始值。

示例:

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

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

3。 开始: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. 是统计异常值。

解决此问题的最佳方法是什么?我是否必须为起始值定义阈值?

谢谢!

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

  1. 从数据集中查找并排除 Statistical Outliers
  2. 按降序(或任何顺序)对结果值进行排序

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

在数据集中找到 "Outliers" 可以通过计算每个数字的偏差来完成,表示为 "Z-score" 或 "modified Z-score" 并根据特定的预定义阈值对其进行测试。 Z 分数通常是指相对于统计平均值的标准偏差数(换句话说,它以 "Sigmas" 衡量)。修改后的 Z 分数应用中值计算技术来测量偏差,并且在许多情况下提供更强大的异常值统计检测。从数学上讲,修改后的 Z 分数可以写成(如 IglewiczHoaglin 所建议的——参见参考文章):

Mi = 0.6745 * (Xi - Median(Xi)) / MAD,

其中 MAD 代表中值绝对偏差。数据集中任何修改后的 Z 分数的绝对值超过 3.5 的数字都被视为 "Outlier"。修改后的 Z 分数可用于检测与您的案例相关的 Microsoft Excel 工作表中的异常值,如下所述。

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

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

第三步,在C2中输入数组公式:{=MEDIAN(ABS(MEDIAN(A1:A4)-A1:A4))}。提醒一下,要输入数组公式,select 单元格,请在 Excel 公式栏中键入公式,然后单击组合键:CTRL-SHIFT-ENTER(注意围绕着大括号的表达式,表示数组公式)。此单元格 (C2) 中的值对应于 MAD。

第四步,在B列第一行输入公式:=IF((0.6745*ABS(C-A1)>3.5*C), "OUTLIER", "NORMAL"),向下延伸到第四行。 “异常值检测”的最终结果应出现在 B 列中。

A       B           C
900%    OUTLIER     35%
50%     NORMAL      0.35
20%     NORMAL  
10%     NORMAL  

因此值 900% 被发现是一个 "Outlier" 而其他值都可以。对结果集进行排序将只是一个微不足道的任务。

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

我的孤独

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;
}