Найдите и распечатайте выбросы данных, используя Numpy - PullRequest
2 голосов
/ 19 февраля 2020

Я хочу найти любые выбросы в столбце таблицы данных csv, используя Pandas и Numpy. В настоящее время я могу получить выбросы на стороне более высокого конца, но я не уверен, как получить минимальные выбросы или "более низкие" выбросы, если это имеет смысл.

Вот функция, которую я использую:

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, чтобы получить выбросы в более низком спектре, но он просто возвращает все значения столбца speci c. Означает ли это, что нет более низких выбросов или я делаю что-то не так? Все вопросы, которые я нахожу, касаются удаления выбросов, но я просто хочу показать любые выбросы.

Кроме того, некоторые из выбросов, использующих функцию, предусмотренную для столбцов, возвращают пустой массив, означает ли это, что для этого указанного столбца c нет выбросов?

Набор данных слишком большой написать здесь, но вот ссылка, если она может помочь ответить на этот вопрос: https://archive.ics.uci.edu/ml/datasets/Absenteeism+at+work

1 Ответ

1 голос
/ 20 февраля 2020

Я изменил ваш логический файл c, и он работает на искусственном примере.

Вместо того, чтобы проверять, является ли абсолютное значение вашего 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]

Также возможно, что ваш набор данных не имеют экстремальные выбросы на отрицательной стороне распределения, но логика c пропустила бы их независимо.

...