在数据中查找异常值

2024-05-16 19:55:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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因为这类事情被提到很多,但不知道从哪里开始(遗憾的是,我更像是系统管理员而不是统计学家…)。

提前谢谢!


Tags: 数据方法服务器脚本信息列表格式时间
3条回答

我认为最好的办法是查看scipyscoreatpercentile函数。例如,您可以尝试排除所有高于99%的值。

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

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

视觉上识别异常值的一个好方法是绘制一个方框图(或方框和胡须图),它将显示中值,以及中值上下的几个四分位数,以及离此方框“很远”的点(参见维基百科条目http://en.wikipedia.org/wiki/Box_plot)。在R中,有一个boxplot函数来完成这个任务。

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

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

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

另一方面,apriori可能有充分的理由希望在低于95%可用性的情况下收到任何服务器的通知,无论是否有一个或多个服务器低于此阈值。

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

相关问题 更多 >