📜  异常值检测的 Z 分数 - Python(1)

📅  最后修改于: 2023-12-03 15:39:30.143000             🧑  作者: Mango

异常值检测的 Z 分数 - Python

异常值是指在数据集中与其他观测值明显不同的数据点。异常值可以对数据分析造成很大的干扰,因此需要对其进行检测和处理。其中一种常用的方法是使用 Z 分数进行异常值检测。

Z 分数概述

Z 分数是指一个数据点与数据集均值的偏差值除以数据集标准差的值。其计算公式如下:

$$Z = \frac{x - \mu}{\sigma}$$

其中,$x$ 表示数据点的值,$\mu$ 表示数据集的均值,$\sigma$ 表示数据集的标准差。Z 分数衡量的是一个数据点与均值的距离,以标准差为单位。

一般地,如果一个数据点的 Z 分数超过了 $3$ 或 $-,3$,那么我们就认为这个数据点是一个异常值。

实现方法

在 Python 中,我们可以使用 Scipy 库的 zscore() 函数计算 Z 分数。我们可以将待处理的数据作为参数传入该函数,函数会返回一个 Z 分数矩阵。然后我们可以遍历这个矩阵,找到其中超过阈值的数据点,把它们标记成异常值。

from scipy import stats
import numpy as np

def detect_outliers_zscore(data, threshold=3):
    z_scores = stats.zscore(data)
    abs_z_scores = np.abs(z_scores)
    filtered_entries = (abs_z_scores > threshold)
    return filtered_entries

上述代码中,detect_outliers_zscore() 函数接受待处理的数据和阈值作为参数,并返回一个布尔值数组。该数组标明了哪些数据点被认为是异常值。

使用范例

我们可以用以下代码生成一个 $10 \times 2$ 的随机数据集,然后用上述函数检测其中的异常值。

data = np.random.randn(10, 2)
outliers = detect_outliers_zscore(data, threshold=3)
print(outliers)

该代码会输出以下结果:

array([[False, False],
       [False, False],
       [False, False],
       [False, False],
       [False, False],
       [False, False],
       [False, False],
       [False, False],
       [False, False],
       [False, False]])

由于我们生成的数据集是随机的,因此不太可能出现异常值。但是如果我们手动添加一些异常值,那么就会得到不同的结果。

系统复杂度分析

该实现方法的时间复杂度为 $O(n^2)$,空间复杂度为 $O(n^2)$。其中,$n$ 表示数据集中数据点的数量。算法的复杂度随着数据集的大小而增加,因此在处理大型数据集时需要谨慎。