在数字数据集中查找 'Outliers'
Finding the 'Outliers' in numeric data set
我想比较(排序依据)增长率和不利的高利率以及非常低的起始值。
示例:
1。
开始:1.000.000
结束:1.100.000
增长:+10%
-
开始:100.000
结束:120.000
增长:+20%
3。
开始:1
结束:10
增长:+900%
-
开始:10
结束:15
增长:+50%
仅按增长、降序排序将得出:900% (3.)、50% (4.)、20% (2.)、10% (1.)
但我想要:20% (2.), 10% (1.), 900% (3.), 50% (4.),因为在我的情况下,机会很高,即 3 . 和 4. 是统计异常值。
解决此问题的最佳方法是什么?我是否必须为起始值定义阈值?
谢谢!
根据您提供的描述,问题可以分为 2 个:
- 从数据集中查找并排除
Statistical Outliers
- 按降序(或任何顺序)对结果值进行排序
第一个问题的一般解决方案和使用 Microsoft Excel 的示例描述于:Microsoft Excel 工作表 中的统计离群值检测(http://www.codeproject.com/Tips/214330/Statistical-Outliers-detection).以下是与您的案例相关的一些理论和示例。
在数据集中找到 "Outliers" 可以通过计算每个数字的偏差来完成,表示为 "Z-score" 或 "modified Z-score" 并根据特定的预定义阈值对其进行测试。 Z 分数通常是指相对于统计平均值的标准偏差数(换句话说,它以 "Sigmas" 衡量)。修改后的 Z 分数应用中值计算技术来测量偏差,并且在许多情况下提供更强大的异常值统计检测。从数学上讲,修改后的 Z 分数可以写成(如 Iglewicz 和 Hoaglin 所建议的——参见参考文章):
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;
}
我想比较(排序依据)增长率和不利的高利率以及非常低的起始值。
示例:
1。 开始:1.000.000 结束:1.100.000 增长:+10%
- 开始:100.000 结束:120.000 增长:+20%
3。 开始:1 结束:10 增长:+900%
- 开始:10 结束:15 增长:+50%
仅按增长、降序排序将得出:900% (3.)、50% (4.)、20% (2.)、10% (1.)
但我想要:20% (2.), 10% (1.), 900% (3.), 50% (4.),因为在我的情况下,机会很高,即 3 . 和 4. 是统计异常值。
解决此问题的最佳方法是什么?我是否必须为起始值定义阈值?
谢谢!
根据您提供的描述,问题可以分为 2 个:
- 从数据集中查找并排除
Statistical Outliers
- 按降序(或任何顺序)对结果值进行排序
第一个问题的一般解决方案和使用 Microsoft Excel 的示例描述于:Microsoft Excel 工作表 中的统计离群值检测(http://www.codeproject.com/Tips/214330/Statistical-Outliers-detection).以下是与您的案例相关的一些理论和示例。
在数据集中找到 "Outliers" 可以通过计算每个数字的偏差来完成,表示为 "Z-score" 或 "modified Z-score" 并根据特定的预定义阈值对其进行测试。 Z 分数通常是指相对于统计平均值的标准偏差数(换句话说,它以 "Sigmas" 衡量)。修改后的 Z 分数应用中值计算技术来测量偏差,并且在许多情况下提供更强大的异常值统计检测。从数学上讲,修改后的 Z 分数可以写成(如 Iglewicz 和 Hoaglin 所建议的——参见参考文章):
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;
}