我有一个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在这类事情上经常被提及,但甚至不确定从哪里开始(遗憾的是,我更像是系统管理员而不是统计学家……)。
提前感谢!
发布于 2011-01-06 04:23:34
你声明的“发现坏处”的目标意味着你要寻找的不是异常值,而是高于或低于某个阈值的观察结果,我假设随着时间的推移,该阈值将保持不变。
例如,如果您的所有服务器都有98±0.1 %的可用性,那么100%可用性的服务器就是异常值,97.6%可用性的服务器也是异常值。但这些可能在您想要的范围内。
另一方面,无论是否有一个或多个服务器低于此阈值,都可能有充分的理由先验地希望收到任何可用性低于95%的服务器的通知。
因此,搜索异常值可能不会提供您感兴趣的信息。阈值可以基于历史数据在统计上确定,例如,通过将错误率建模为泊松或将可用性百分比建模为beta变量。在应用的设置中,这些阈值可能是基于性能要求确定的。
发布于 2011-01-06 06:18:31
直观地识别异常值的一个好方法是绘制箱线图(或盒子和胡须图),它将显示中位数、中位数上下的几个四分位数,以及离这个盒子“很远”的点(请参阅维基百科条目http://en.wikipedia.org/wiki/Box_plot)。在R中,有一个boxplot
函数可以做到这一点。
以编程方式丢弃/识别离群值的一种方法是使用MAD或Median Absolute Deviation。与标准差不同,MAD对异常值不敏感。有时我会使用经验法则来考虑所有偏离中值超过5*MAD的点,都是异常值。
发布于 2011-01-06 00:30:27
我认为最好的办法是研究一下scipy的scoreatpercentile函数,例如,你可以尝试排除所有大于第99个百分位数的值。
如果你没有正态分布,均值和标准差是不好的。
一般来说,对数据的外观有一个大致的视觉概念是很好的。有一个matplotlib;我建议您在决定计划之前用它绘制一些数据图。
https://stackoverflow.com/questions/4606288
复制相似问题