查找数据集中的异常值

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对于这类东西有很多提及,但不确定从哪里开始(遗憾的是,我比统计学家更多的是系统管理员......).

提前致谢!

Pra*_*ani 8

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

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


Dav*_*uer 7

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

例如,如果所有服务器的可用性均为98±0.1%,那么100%可用性的服务器将是异常值,服务器的可用性为97.6%.但这些可能在您期望的范围内.

另一方面,无论是否有一个或多个服务器低于此阈值,可能有充分的理由要求以低于95%的可用性通知任何服务器.

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


Nav*_*avi 5

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

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

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