sep*_*ram 17 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)...
Run Code Online (Sandbox Code Playgroud)
所以在列表形式中,它可能看起来像:
[[ams-a,98.099,1012,678,91],[bos-a,98.099,1111,12,91],...]
Run Code Online (Sandbox Code Playgroud)
我的问题:确定每列中异常值的最佳方法是什么?或者异常值不一定是解决发现"坏"问题的最佳方式?在上面的数据,我肯定会想了解BOS-b和ORD-B,以及AMS-A,因为它的误差率如此之高,但其他人可以被丢弃.根据列,由于更高不一定更糟,也不是更低,我试图找出最有效的方法来做到这一点.看起来numpy对于这类东西有很多提及,但不确定从哪里开始(遗憾的是,我比统计学家更多的是系统管理员......).
提前致谢!
在视觉上识别异常值的一个好方法是制作一个箱线图(或盒子和胡须图),它将显示中位数,以及中位数上下两个四分位数,以及距离此框"远"的点(参见维基百科条目http://en.wikipedia.org/wiki/Box_plot).在R中,有一个boxplot功能可以做到这一点.
以编程方式丢弃/识别异常值的一种方法是使用MAD或中位数绝对偏差.与标准偏差不同,MAD对异常值不敏感.我有时会使用经验法则来考虑距离中位数超过5*MAD的所有点,作为异常值.
你所说的"发现不良"的目标意味着它不是你正在寻找的异常值,而是高于或低于某个阈值的观察值,我会假设阈值随着时间的推移会保持不变.
例如,如果所有服务器的可用性均为98±0.1%,那么100%可用性的服务器将是异常值,服务器的可用性为97.6%.但这些可能在您期望的范围内.
另一方面,无论是否有一个或多个服务器低于此阈值,可能有充分的理由要求以低于95%的可用性通知任何服务器.
出于这个原因,搜索异常值可能无法提供您感兴趣的信息.阈值可以根据历史数据进行统计确定,例如将误差率建模为泊松或百分比可用性作为β变量.在应用的设置中,可以基于性能要求来确定这些阈值.
我认为你最好的办法是看看scipy的scoreatpercentile功能.因此,例如,您可以尝试排除超过第99百分位数的所有值.
如果没有正态分布,则均值和标准差都不好.
通常,对您的数据的外观有一个粗略的视觉概念是很好的.有matplotlib ; 我建议您在决定计划之前用它制作一些数据图.