首页 > 解决方案 > 使用 Numpy 查找和打印数据异常值

问题描述

我想使用 Pandas 和 Numpy 在 csv 数据表列中查找任何异常值。目前我可以在高端获得异常值,但我不确定如何获得最小异常值或“较低”异常值是否有意义。

这是我正在使用的功能:

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

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

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

数据集太大,无法在此处发布,但如果它可以帮助回答此问题,请点击此处的链接: https ://archive.ics.uci.edu/ml/datasets/Absenteeism+at+work

标签: pythonnumpydataframestatisticsoutliers

解决方案


我改变了你的异常逻辑,它适用于一个人为的例子。

在这种情况下,您应该检查原始z_score 是否小于阈值,而不是检查 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]

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


推荐阅读