2011-01-05 13 views
17

Mam skrypt Pythona, który tworzy listę list uptime serwera i dane wydajności, gdzie każda podlista (lub "wiersz") zawiera statystyki poszczególnych klastra. Na przykład, ładnie sformatowane wygląda mniej więcej tak:Znajdowanie wartości odstających w zestawie danych

------- ------------- ------------ ---------- ------------------- 
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)... 

Więc w formie listy, to może wyglądać następująco:

[[ams-a,98.099,1012,678,91],[bos-a,98.099,1111,12,91],...] 

Moje pytanie: Jaki jest najlepszy sposób, aby określić wartości odstających w każdej kolumnie? Czy też odstające niekoniecznie są najlepszym sposobem na zaatakowanie problemu znalezienia "zła"? W powyższych danych zdecydowanie chciałbym wiedzieć o bos-b i ord-b, a także ams-a, ponieważ wskaźnik błędów jest tak wysoki, ale pozostałe można odrzucić. W zależności od kolumny, ponieważ wyższa nie jest niekoniecznie gorsza, ani mniejsza, staram się wymyślić najbardziej skuteczny sposób, aby to zrobić. Wygląda na to, że numpy jest często wspominany o takich rzeczach, ale nie wiem, od czego zacząć (niestety, jestem bardziej sysadmin niż statystyk ...).

Z góry dziękuję!

+2

Dlaczego nie zadać pytania na stronie [stats.SE] (http://stats.stackexchange.com/)? – csgillespie

+0

@csgillespie Dobry pomysł, zrobi! – septagram

+1

duplikat http://stats.stackexchange.com/questions/6013/finding-outliers-in-a-data-set –

Odpowiedz

7

Podany przez ciebie cel "znalezienia zła" oznacza, że ​​nie są to wartości odbiegające, których szukasz, ale obserwacje, które spadają powyżej lub poniżej pewnego progu, i przypuszczam, że próg pozostanie taki sam w czasie.

Na przykład, jeśli wszystkie serwery miały 98 ± 0,1% dostępności, serwer o 100% dostępności byłby odstający, tak jak serwer z 97,6% dostępnością. Ale te mogą znajdować się w pożądanych granicach.

Z drugiej strony mogą istnieć uzasadnione powody, aby chcieć otrzymywać powiadomienia o każdym serwerze z mniej niż 95% dostępnością, niezależnie od tego, czy jeden lub wiele serwerów jest poniżej tego progu.

Z tego powodu wyszukiwanie wartości odstających może nie dostarczyć informacji, które Cię interesują. Progi można określić statystycznie na podstawie danych historycznych, np. modelując współczynnik błędów jako współczynnik poissona lub procent jako zmienne beta. W zastosowanym ustawieniu progi te mogłyby prawdopodobnie zostać określone na podstawie wymagań dotyczących wydajności.

+0

Podczas gdy istnieje wiele dobrych odpowiedzi tutaj (szczególnie koncentrujących się na moim pytaniu o odstających), @ David wydaje się być najlepszym z punktu widzenia statystyki. Oznaczenie jako odpowiedź, mimo że nie miałem jeszcze okazji go wdrożyć. – septagram

1

Należy obliczyć średnie (średnie) i standardowe odchylenie dla kolumny. odchylenie Stadard jest nieco mylące, ale ważny jest fakt, że 2/3 tych danych jest w

średnia +/- StandardDeviation

Generalnie nic poza średnia +/- 2 * StandardDeviation jest poboczna, ale może poprawić mnożnik.

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

więc być jasne, chcesz przekonwertować dane do odchyleń standardowych od średniej.

tj

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

Numpy posiada funkcje do tego.

+4

To jest tylko prawidłowe podejście, jeśli przyjmuje się, że wartości pochodzą z normalnej dystrybucji. – tkerwin

+2

alternatywy dla normalnej zawierałoby wskaźnik błędu jako poissona i procentową dostępność jako dystrybucje beta –

5

Wydaje mi się, że najlepiej jest rzucić okiem na funkcję 'scoreatpercentile. Więc na przykład możesz spróbować wyłączyć wszystkie wartości, które są powyżej 99. percentyla.

Średnie i standardowe odchylenie nie jest dobre, jeśli nie ma normalnego rozkładu.

Generalnie dobrze jest mieć przybliżony obraz tego, jak wyglądają Twoje dane. Istnieje matplotlib; Zalecam, aby przed podjęciem decyzji w sprawie planu wykonać pewne spisy swoich danych.

+1

Jeśli tylko wykonujesz tę analizę rzadko, zauważyłem, że R (http://www.r-project.org/) jest dużo łatwiejszy w użyciu do interaktywnej eksploracji danych. Nawet jeśli skończysz z scipy/numpy dla ostatecznego rozwiązania, może warto zagrać z danymi w R najpierw. – Wilduck

+0

Dobra sugestia, popatrzę na scoreatpercentile. – septagram

8

Jednym ze sposobów identyfikacji wizualnych wartości odstających jest stworzenie wykresu boksu (lub boksu i wąsów), który pokaże medianę, oraz kilku kwartyli powyżej i poniżej mediany, oraz punktów, które są "daleko". "z tego pola (patrz wpis w Wikipedii http://en.wikipedia.org/wiki/Box_plot). W R istnieje właśnie funkcja boxplot.

Jednym ze sposobów programowego odrzucenia/identyfikacji wartości odstających jest użycie MAD lub Median Absolute Deviation. MAD nie jest wrażliwy na wartości oddalone, w przeciwieństwie do odchylenia standardowego. Czasami używam pewnej reguły, aby uważać wszystkie punkty, które są ponad 5 * MAD z dala od mediany, aby były odstające.

Powiązane problemy