2011-01-05 11 views
17

Ho uno script python che crea un elenco di elenchi di tempo di attività e dati del server, in cui ogni sotto-elenco (o 'riga') contiene le statistiche di un particolare cluster. Ad esempio, ben formattato sembra qualcosa di simile:Ricerca di valori anomali in un set di dati

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

Quindi, sotto forma di lista, che potrebbe essere simile:

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

La mia domanda: Qual è il modo migliore per determinare i valori anomali in ogni colonna? Oppure i valori anomali non sono necessariamente il modo migliore per attaccare il problema di trovare "cattiveria"? Nei dati sopra, vorrei assolutamente sapere di bos-b e ord-b, così come di ams-a poiché il tasso di errore è così alto, ma gli altri possono essere scartati. A seconda della colonna, poiché più in alto non è necessariamente peggio, né inferiore, sto cercando di capire il modo più efficiente per farlo. Sembra che Numpy sia menzionato molto per questo genere di cose, ma non so da che parte cominciare (purtroppo, sono più sysadmin che statistico ...).

Grazie in anticipo!

+2

Perché non porre la domanda nel sito [stats.SE] (http://stats.stackexchange.com/)? – csgillespie

+0

@csgillespie Buona idea, lo farò! – septagram

+1

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

risposta

7

L'obiettivo dichiarato di "individuazione di cattiva qualità" implica che non sono i valori anomali che si stanno cercando, ma le osservazioni che cadono al di sopra o al di sotto di una soglia e presumo che la soglia rimarrebbe la stessa nel tempo.

Per fare un esempio, se tutti i server erano a disponibilità 98 ± 0,1%, un server al 100% di disponibilità sarebbe un valore erratico, come farebbe un server presso disponibilità 97,6%. Ma questi potrebbero essere entro i tuoi limiti desiderati.

D'altra parte, ci possono essere buone ragioni per voler essere avvisati di qualsiasi server con meno del 95% di disponibilità, indipendentemente dal fatto che ci sia uno o più server al di sotto di questa soglia.

Per questo motivo, una ricerca di valori anomali potrebbe non fornire le informazioni a cui si è interessati. Le soglie potrebbero essere determinate statisticamente in base a dati storici, ad es. modellando il tasso di errore come disponibilità di poisson o percentuale come variabili beta. In un'impostazione applicata, queste soglie potrebbero probabilmente essere determinate in base ai requisiti di prestazione.

+0

Mentre ci sono molte buone risposte qui (specificatamente rivolte alla mia domanda sui valori anomali), @ David sembra essere il migliore dal punto di vista delle statistiche. Contrassegnare come risposta, anche se non ho ancora avuto la possibilità di implementarlo. – septagram

1

È necessario calcolare la media (media) e la deviazione standard per la colonna. Deviazione Stadard è un po 'di confusione, ma il fatto importante è che i 2/3 dei dati è dentro

media +/- standarddeviation

Generalmente nulla al di fuori media +/- 2 * standarddeviation è un outlier, ma si può modificare il moltiplicatore.

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

Quindi, per essere chiari, si desidera convertire i dati in deviazioni standard dalla media.

cioè

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

Numpy ha funzioni per questo.

+4

Questo è solo un approccio valido se si assume che i valori provengano da una distribuzione normale. – tkerwin

+2

alternative al normale includerebbe il tasso di errore come poisson e la percentuale di disponibilità come distribuzioni beta –

5

Penso che la cosa migliore da fare sia dare un'occhiata alla funzione scoreatpercentile di . Ad esempio, potresti provare a escludere tutti i valori superiori al 99 ° percentile.

media e deviazione standard non sono buone se non si dispone di una distribuzione normale.

In genere è consigliabile avere un'idea visiva approssimativa di come appaiono i dati. C'è matplotlib; Ti consiglio di creare alcuni grafici dei tuoi dati prima di decidere un piano.

+1

Se si esegue questa analisi solo di rado, ho trovato R (http://www.r-project.org/) molto più facile da usare per l'esplorazione interattiva dei dati. Anche se finisci con Scipy/Numpy per la tua soluzione finale, potrebbe valere la pena di giocare prima con i dati in R. – Wilduck

+0

Buon consiglio, darò un'occhiata a scoreatpercentile. – septagram

8

Un buon modo per identificare visivamente i valori anomali è quello di creare un grafico a scatole (o trama a scatola e baffi), che mostra la mediana, e un paio di quartili sopra e sotto la mediana, ei punti che si trovano "lontano" "da questa finestra (vedi la voce di Wikipedia http://en.wikipedia.org/wiki/Box_plot). In R, c'è una funzione boxplot per fare proprio questo.

Un modo per scartare/identificare i valori anomali a livello di codice consiste nell'utilizzare il MAD o Median Absolute Deviation. Il MAD non è sensibile ai valori anomali, a differenza della deviazione standard. A volte uso una regola empirica per considerare tutti i punti che sono più di 5 * MAD lontano dalla mediana, per essere anomali.

Problemi correlati