Обнаружение выбросов в наборе данных
У меня есть python script, который создает список списков времени безотказной работы сервера и производительности, где каждый под-список (или "строка" ) содержит определенную статистику кластера. Например, красиво отформатированный выглядит примерно так:
------- ------------- ------------ ---------- -------------------
Cluster %Availability Requests/Sec Errors/Sec %Memory_Utilization
------- ------------- ------------ ---------- -------------------
ams-a 98.099 1012 678 91
bos-a 98.099 1111 12 91
bos-b 55.123 1513 576 22
lax-a 99.110 988 10 89
pdx-a 98.123 1121 11 90
ord-b 75.005 1301 123 100
sjc-a 99.020 1000 10 88
...(so on)...
Итак, в виде списка это может выглядеть так:
[[ams-a,98.099,1012,678,91],[bos-a,98.099,1111,12,91],...]
Мой вопрос: какой лучший способ определить выбросы в каждом столбце? Или же выбросы не обязательно являются лучшим способом для атаки на проблему "плохого"? В приведенных выше данных я определенно хотел бы узнать о bos-b и ord-b, а также ams-a, так как частота ошибок настолько высока, но другие могут быть отброшены. В зависимости от столбца, поскольку высшее значение не обязательно хуже и не ниже, я пытаюсь найти наиболее эффективный способ сделать это. Кажется, что numpy часто упоминается для такого рода вещей, но не уверен, где даже начать с него (к сожалению, я больше сисадмин, чем статистик...).
Спасибо заранее!
Ответы
Ответ 1
Ваша заявленная цель "найти плохость" подразумевает, что это не те выбросы, которые вы ищете, а наблюдения, которые выпадают выше или ниже некоторого порога, и я бы предположил, что порог будет оставаться неизменным с течением времени.
В качестве примера, если все ваши серверы имели доступность 98 ± 0,1%, сервер с 100% -й доступностью был бы выбросом, как и сервер с доступностью 97,6%. Но они могут быть в пределах ваших желаемых пределов.
С другой стороны, могут быть веские причины, по которым apriori хочет получать уведомление о любом сервере с доступностью менее 95%, независимо от того, существует ли один или несколько серверов ниже этого порога.
По этой причине поиск выбросов может не предоставлять интересующую вас информацию. Пороги могут быть определены статистически на основе исторических данных, например. путем моделирования частоты ошибок в виде пуассонов или процентной доступности в виде бета-переменных. В прикладной настройке эти пороговые значения, вероятно, могут быть определены на основе требований к производительности.
Ответ 2
Один из хороших способов визуализации визуализаций состоит в том, чтобы сделать квадратный квадрат (или график "коробка-и-усы" ), в котором будет отображаться медиана, и пара квартилей выше и ниже медианы, а точки, которые лежат "далеко", из этого окна (см. запись в Википедии http://en.wikipedia.org/wiki/Box_plot). В R есть функция boxplot
, чтобы сделать именно это.
Один из способов программно отбрасывать/идентифицировать выбросы - использовать MAD или Median Absolute Deviation. MAD не чувствителен к выбросам, в отличие от стандартного отклонения. Я иногда использую эмпирическое правило, чтобы рассмотреть все точки, которые больше, чем 5 * MAD, от медианного, чтобы быть выбросами.
Ответ 3
Я думаю, что ваш лучший выбор - посмотреть scipy scoreatpercentile. Так, например, вы можете попробовать исключить все значения, которые выше 99-го процентиля.
Среднее и стандартное отклонение не являются хорошими, если у вас нет нормального распределения.
В целом хорошо иметь грубую визуальную идею о том, как выглядят ваши данные. Существует matplotlib; Я рекомендую вам сделать некоторые графики ваших данных, прежде чем принимать решение о плане.
Ответ 4
Вам нужно рассчитать среднее (среднее) и стандартное отклонение для столбца. Отклонение от уклона является немного запутанным, но важным фактом является то, что 2/3 данных находятся в пределах
Среднее +/- Стандартное отклонение
Как правило, ничего снаружи Среднее +/- 2 * Стандартное отклонение - это выброс, но вы можете настроить множитель.
http://en.wikipedia.org/wiki/Standard_deviation
Итак, чтобы быть понятным, вы хотите преобразовать данные в стандартные отклонения от среднего.
т
def getdeviations(x, mean, stddev):
return math.abs(x - mean) / stddev
У Numpy есть функции для этого.