我有一个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对于这类东西有很多提及,但不确定从哪里开始(遗憾的是,我比统计学家更多的是系统管理员......)。
提前致谢!
答案 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)
我认为最好的办法是查看scipy的scoreatpercentile函数。因此,例如,您可以尝试排除超过第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有这方面的功能。