我想要比较(排序)增长率和非常低的起始值的高增长率和劣势。
示例:
仅按增长排序,降序结果为: 900% (3.),50% (4.),20% (2.),10% (1.)
但我想要的是: 20% (2.),10% (1.),900% ( 3. ),50% ( 4. ),因为在我的情况下概率很高,3.和4.是统计上的异常值。
解决这个问题的最好方法是什么?我需要为起始值定义一个阈值吗?
谢谢!
发布于 2015-01-15 06:43:58
根据您提供的描述,问题可以分为两部分:
Statistical Outliers 使用Microsoft Excel的第一个问题和示例的一般解决方案在: Microsoft Excel worksheet (http://www.codeproject.com/Tips/214330/Statistical-Outliers-detection)中的统计异常值检测。以下是与您的案例相关的一些理论和示例。
在数据集中找到“异常值”可以通过计算每个数字的偏差来完成,表示为“Z分数”或“修改的Z分数”,并根据某些预定义的阈值对其进行测试。Z-score通常是指相对于统计平均值的标准差的数量(换句话说,它是以“西格玛”来衡量的)。改进的Z-score应用中值计算技术来测量偏差,并在许多情况下提供了更健壮的异常值统计检测。在数学上,修改后的Z-score可以写成(根据Iglewicz和Hoaglin的建议-参见参考文章):
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栏中。
A B C
900% OUTLIER 35%
50% NORMAL 0.35
20% NORMAL
10% NORMAL 因此,值900%被发现是“异常值”,而其他值是正常的。对结果集进行排序将是一项微不足道的任务。
为了解释清楚起见,本文还提供了Excel工作表示例。算法本身可以用任何编程语言(VBA、C#、Java等)实现。希望这能有所帮助。
发布于 2016-06-13 23:33:15
我的独处
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;
}https://stackoverflow.com/questions/27953724
复制相似问题