使用 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]
也有可能您的数据集在分布的负侧没有极端异常值,但无论如何逻辑都会错过它们。
我想使用 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]
也有可能您的数据集在分布的负侧没有极端异常值,但无论如何逻辑都会错过它们。