查找数据集中的异常值

时间:2011-01-05 16:09:44

标签: python statistics

我有一个python脚本,它创建服务器正常运行时间和性能数据列表的列表,其中每个子列表(或“行”)包含特定集群的统计信息。例如,格式很好看起来像这样:

-------  -------------  ------------  ----------  -------------------
Cluster  %Availability  Requests/Sec  Errors/Sec  %Memory_Utilization
-------  -------------  ------------  ----------  -------------------
ams-a    98.099          1012         678          91
bos-a    98.099          1111         12           91
bos-b    55.123          1513         576          22
lax-a    99.110          988          10           89
pdx-a    98.123          1121         11           90
ord-b    75.005          1301         123          100
sjc-a    99.020          1000         10           88
...(so on)...

所以在列表形式中,它可能看起来像:

[[ams-a,98.099,1012,678,91],[bos-a,98.099,1111,12,91],...]

我的问题:确定每列中异常值的最佳方法是什么?或者异常值不一定是解决发现“坏”问题的最佳方式?在上面的数据中,我肯定想知道bos-b和ord-b,以及ams-a,因为它的错误率很高,但其他的可以丢弃。根据列,由于更高不一定更糟,也不是更低,我试图找出最有效的方法来做到这一点。看起来numpy对于这类东西有很多提及,但不确定从哪里开始(遗憾的是,我比统计学家更多的是系统管理员......)。

提前致谢!

4 个答案:

答案 0 :(得分:8)

在视觉上识别异常值的一个好方法是制作一个箱线图(或盒子和胡须图),它将显示中位数,以及中位数上下的几个四分位数,以及“远”的点从这个方框中看(见维基百科条目http://en.wikipedia.org/wiki/Box_plot)。在R中,有boxplot函数可以做到这一点。

以编程方式丢弃/识别异常值的一种方法是使用MAD或Median Absolute Deviation。与标准偏差不同,MAD对异常值不敏感。我有时会使用经验法则来考虑距离中位数超过5 * MAD的所有点,作为异常值。

答案 1 :(得分:7)

你所说的“发现不良”的目标意味着它不是你正在寻找的异常值,而是高于或低于某个阈值的观察值,我会假设阈值随着时间的推移会保持不变。

例如,如果所有服务器的可用性均为98±0.1%,则100%可用性的服务器将是异常值,服务器的可用性为97.6%。但这些可能在你想要的范围内。

另一方面,无论是否有一台或多台服务器低于此门槛,可能有很好的理由要求通知任何服务器的可用性低于95%。

出于这个原因,搜索异常值可能无法提供您感兴趣的信息。阈值可以根据历史数据进行统计确定,例如:通过将误差率建模为泊松或百分比可用性作为β变量。在应用设置中,这些阈值可能是根据性能要求确定的。

答案 2 :(得分:5)

我认为最好的办法是查看scipyscoreatpercentile函数。因此,例如,您可以尝试排除超过第99百分位数的所有值。

如果没有正态分布,则平均值和标准差都不好。

通常,对您的数据的外观有一个粗略的视觉概念是很好的。有matplotlib;我建议您在决定计划之前用它制作一些数据图。

答案 3 :(得分:1)

您需要计算列的平均值(平均值)和标准偏差。 Stadard偏差有点混乱,但重要的事实是2/3的数据在

之内

平均值+/- StandardDeviation

通常情况下,平均值+/- 2 * StandardDeviation之外的任何值都是异常值,但您可以调整乘数。

http://en.wikipedia.org/wiki/Standard_deviation

所以要明确,您希望将数据转换为与平均值的标准偏差。

def getdeviations(x, mean, stddev):
   return math.abs(x - mean) / stddev

Numpy有这方面的功能。