LINUX.ORG.RU

Проверить подходит ли значение диапазону нормальных значений

 , ,


0

2

Добрый вечер.

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

Есть список - последовательность значений. Скажем, изменение некого показателя за последний год. Нормальное значение для показателя до 30 (условно), но в некоторые дни года из-за некой аномалии значение могло неожиданно скакнуть до 5000, например, и выше. При том, что на следующий день значение снова нормальное. Таких проблемных дней в году могло быть штук 50.

Задача: на входе скормить список значений за год, т.е. [значение_день1, значение_день2, ..., значение_день365], а на выходе получить список ненормальных значений. Т.е. те значения, которые сильно отличаются от большинства.

Самое тупое, что пришло в голову, посчитать среднее арифметическое, например, на python

sum(values_list) / float(len(values_list))
и с этим уже сравнивать каждое значение из списка. Ну это неэффективно и глупо, тем более, что может же быть другой случай, когда все большие числа, а аномальные - низкие и т.д.

Можно проверить на нормальность распределения список (afaik, scipy в python это умеет, R тоже умеет, так что можно и rpy2 задействовать, т.к. мне было желательно из python всё делать), но как понять, если распределение ненормальное, из-за какого значения проблема?

Может есть какой-то более-менее простой универсальный (если бы аномалия и список были одни, я бы писать не стал, у меня же их сотни и случаи отличаются) способ в Python или в R получить список анормальных значений для списка значений?

Надеюсь более-менее понятно объяснил задачу.

Сильно не пинайте, если совсем глупость спросил :)


В статистике это называется выбросы или outliers. Универсального способа нет, как ты их определишь, так и будешь искать. Т.е. надо самому понять, что такое «сильно». Можно смотреть, на сколько сигм (стандартных отклонений) величина отличается от среднего значения. Часто берут 3 сигмы - зона внутрь которой значение подчиняющееся номальному распределению попадает в 99.73% случаев. Оценка среднего и стандартного отклонения тоже подвержена влиянию выбросов, но есть устойчивые методы. Например, вместо среднего лучше брать медиану. В зависимости от того, что тебе нужно, можно не заморачиваться, а тупо срезать верхнюю/нижнюю перцентиль. Прикинуть, сколько у тебя таких дней в году, сортировать и удалять такое количество.

Bell
()
Ответ на: комментарий от psv1967

psv1967, Bell, cli, большое спасибо за ответы. Направление понял. Буду разбираться.

wv5pg
() автор топика

Возможно, тебе нужны перцентили (percentile). Скажем, всё что не попадает в 99% считать outliers.

В общем случае я бы начинал анализ данных с анализа распределения. Тут тебе поможет matplotlib с блэджеком и шлюхами с гистограммами (hist) и ящиками с усами (boxplot). Примеры легко гуглятся.

true_admin ★★★★★
()

MAX_VALUE = 30
unnormal_values = []

for i in values_list:
    if i > MAX_VALUE:
        unnormal_values.append(i)

MAX_VALUE уже подбирай как хочешь, никаких matplotlib'ов и прочих не нужно, просто составить алгоритм вроде этого (среднеквадратическое отклонение):

from math import sqrt

am = 0
qm = 0
c = 0

for i in values_list:
    am += i
    c += 1

am /= c

for i in values_list:
    qm += (i - am) ** 2

qm = sqrt(qm/(c-1))

MAX_VALUE = am + qm
destabilizer
()
Ответ на: комментарий от true_admin

Поэкспериментирую с этим, спасибо.

wv5pg
() автор топика
Ответ на: комментарий от destabilizer

Большое спасибо, для нескольких диапазонов это решение отлично подошло.

wv5pg
() автор топика
Ответ на: комментарий от destabilizer

Вообще-то в питоне есть готовый СКО/std И думаю, что не один.

Bell
()
Ответ на: комментарий от destabilizer

values_list[values_list > (mean(values_list)+sd(values_list))]

Не смог удержаться :)

Уж лучше в таком случае перцентили. (Раз одна сигма устраивает)

values_list[values_list > quantile(values_list, 0.8)]

Но всё это перестает работать когда есть тренд и надо брать нормальное решение.

Если уж так хочется выписывать все эти километры кода, то посмотрите готовый модуль «производственной статистики» (оно же «контроль качества»), там примитивных расчетов на скользящем окне десятки вариантов.

psv1967 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.