使用 Numpy 查找和打印数据异常值

Find and print outliers of data using Numpy

我想使用 Pandas 和 Numpy 在 csv 数据 table 列中找到任何异常值。目前我可以获得高端的离群值,但我不确定如何获得最小离群值或 "lower" 离群值(如果这有意义的话)。

这是我正在使用的函数:

def detect_outlier(data_1):
    outliers = []
    threshold = 3
    mean_1 = np.mean(data_1)
    std_1 = np.std(data_1)

    for y in data_1:
        z_score = (y - mean_1) / std_1
        if np.abs(z_score) > threshold:
            outliers.append(y)
    return outliers

这 return 是 z 得分大于 3(阈值)的离群值,并且有效。我尝试将阈值更改为 -3 以获得较低频谱上的异常值,但它只是 return 特定列的所有值。这是否仅表示没有较低的异常值或我做错了什么?我发现的所有问题都与删除异常值有关,但我只想显示任何异常值。

还有一些异常值使用为列提供的函数 return 一个空数组,这是否表示该特定列没有异常值?

数据集太大,无法在此处post,但如果它可以帮助回答这个问题,这里是link: https://archive.ics.uci.edu/ml/datasets/Absenteeism+at+work

我更改了您的离群值逻辑,它适用于一个人工示例。

与其检查 z_score 的 绝对值 是否 大于 阈值,不如检查在这种情况下,raw z_score 小于

见下文。

import random
import numpy as np 

    def detect_outlier(data_1):
        outliers = []
        threshold = -3
        mean_1 = np.mean(data_1)
        std_1 = np.std(data_1)
        for y in data_1:
            z_score = (y - mean_1) / std_1
            if z_score < threshold:
                outliers.append(y)
        return outliers

data = [random.randrange(200,300,1) for i in range(1000)]
data.append(0.01)

result = detect_outlier(data)
print(f'Outlier: {result}')

输出:

Outlier: [0.01]

也有可能您的数据集在分布的负侧没有极端异常值,但无论如何逻辑都会错过它们。