Подтвердить что ты не робот

Обнаружение выбросов в наборе данных

У меня есть 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 часто упоминается для такого рода вещей, но не уверен, где даже начать с него (к сожалению, я больше сисадмин, чем статистик...).

Спасибо заранее!

4b9b3361

Ответ 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 есть функции для этого.