哪些算法或方法可用于从该数据集中检测异常值?

数据挖掘 算法 离群值
2021-10-13 10:30:01

假设我有一个数据集:Amount of money (100, 50, 150, 200, 35, 60 ,50, 20, 500)我在网上搜索了可用于在该数据集中找到可能异常值的技术,但我最终感到困惑。

我的问题是:哪些算法、技术或方法可用于检测该数据集中可能的异常值?

PS:考虑数据不服从正态分布。谢谢。

3个回答

您可以使用 BoxPlot 进行异常值分析。我将向您展示如何在 Python 中做到这一点:

将您的数据视为一个数组:

a = [100, 50, 150, 200, 35, 60 ,50, 20, 500]

现在,使用 seaborn 绘制箱线图:

import seaborn as sn
sn.boxplot(a)

所以,你会得到一个看起来有点像这样的情节:

在此处输入图像描述

似乎500对我来说是唯一的异常值。但是,这完全取决于分析人员或统计学家的分析和容忍度,以及问题陈述。

您可以查看在 CrossValidated SE 上的答案之一以进行更多测试。

还有一些关于异常值以及检测它们的算法和技术的好问题。

我个人最喜欢的是马氏距离技术

异常值检测的一种思考方式是创建一个预测模型,然后检查一个点是否在预测范围内。从信息论的角度来看,您可以看到每个观察结果增加了模型的熵多少。

如果您将这些数据仅视为数字的集合,并且您没有建议的模型来说明它们是如何生成的,那么您不妨只看平均值。如果您确定这些数字不是正态分布的,则您不能就给定数字与平均值的“偏离”程度做出陈述,但您可以从绝对角度来看它。

应用此方法,您可以取所有数字的平均值,然后排除每个数字并取其他数字的平均值。与全球平均值差异最大的平均值是最大的异常值。这是一些蟒蛇:

def avg(a):
    return sum(a)/len(a)

l = [100, 50, 150, 200, 35, 60 ,50, 20, 500]
m = avg(l)
for idx in range(len(l)):
    print("outlier score of {0}: {1}".format(l[idx], abs(m - avg([elem for i, elem in enumerate(l) if i!=idx]))))
>>
outlier score of 100: 4
outlier score of 50: 10
outlier score of 150: 3
outlier score of 200: 9
outlier score of 35: 12
outlier score of 60: 9
outlier score of 50: 10
outlier score of 20: 14
outlier score of 500: 46 

一种简单的方法是使用与箱线图相同的方法:远离 1.5(中位数-q1)或 1.5(q3-中位数)=异常值。

我发现它在很多情况下都很有用,即使它并不完美而且可能太简单了。

它具有不假设常态的优点。