Нахождение выбросов в наборе данных - PullRequest
17 голосов
/ 05 января 2011

У меня есть скрипт на python, который создает список списков времени работы сервера и данных о производительности, где каждый подсписок (или «строка») содержит статистику конкретного кластера.Например, в хорошо отформатированном виде это выглядит примерно так:

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

Заранее спасибо!

Ответы [ 4 ]

8 голосов
/ 06 января 2011

Один хороший способ визуально идентифицировать выбросы - это составить коробчатый график (или график типа «коробка и усы»), который покажет медиану, пару квартилей выше и ниже медианы и точки, расположенные «далеко» из этого окна (см. запись в Википедии http://en.wikipedia.org/wiki/Box_plot). В R есть функция boxplot, которая делает именно это.

Одним из способов программного сброса / идентификации выбросов является использование MAD или Среднее абсолютное отклонение . MAD не чувствителен к выбросам, в отличие от стандартного отклонения. Я иногда использую эмпирическое правило, чтобы рассматривать все точки, которые находятся на расстоянии более 5 * MAD от медианы, как отклонения.

7 голосов
/ 05 января 2011

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

Например, если бы все ваши серверы имели доступность 98 ± 0,1%, сервер с доступностью 100% был бы выбросом, как и сервер с доступностью 97,6%.Но они могут находиться в пределах ваших желаемых пределов.

С другой стороны, могут быть веские причины, почему ariori хочет получать уведомления о любом сервере с доступностью менее 95%, независимо от того, существует один или несколько серверов.ниже этого порога.

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

5 голосов
/ 05 января 2011

Я думаю, что вам лучше всего взглянуть на функцию scipy scoreatpercentile .Так, например, вы можете попробовать исключить все значения выше 99-го процентиля.

Среднее и стандартное отклонение не годятся, если у вас нет нормального распределения.

Как правило, хорошо иметь грубое визуальное представление о том, как выглядят ваши данные.Есть matplotlib ;Я рекомендую вам составить несколько графиков ваших данных, прежде чем принимать решение о плане.

1 голос
/ 05 января 2011

Вам необходимо рассчитать среднее (среднее) и стандартное отклонение для столбца. Стандартное отклонение немного сбивает с толку, но важный факт заключается в том, что 2/3 данных находится в пределах

Среднее +/- Стандартное отклонение

Обычно все, что находится за пределами среднего значения +/- 2 * Стандартное отклонение является выбросом, но вы можете настроить множитель.

http://en.wikipedia.org/wiki/Standard_deviation

Итак, чтобы быть ясным, вы хотите преобразовать данные в стандартные отклонения от среднего.

е

def getdeviations(x, mean, stddev):
   return math.abs(x - mean) / stddev

У Numpy есть для этого функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...