Buona forma per rimuovere gli outlier?


12

Sto lavorando su statistiche per build di software. Ho i dati per ogni build su pass / fail e tempo trascorso e ne generiamo ~ 200 di questi / settimana.

Il tasso di successo è facile da aggregare, posso dire che il 45% ha superato una determinata settimana. Ma vorrei aggregare anche il tempo trascorso e voglio assicurarmi di non travisare troppo i dati. Ho pensato che sarebbe meglio chiedere ai professionisti :-)

Supponiamo di avere 10 durate. Rappresentano sia i casi pass che fail. Alcuni build falliscono immediatamente, il che rende la durata insolitamente breve. Alcuni si bloccano durante i test e alla fine scadono, causando durate molto lunghe. Costruiamo prodotti diversi, quindi anche le build di successo variano tra 90 secondi e 4 ore.

Potrei ottenere un set come questo:

[50, 7812, 3014, 13400, 21011, 155, 60, 8993, 8378, 9100]

Il mio primo approccio è stato quello di ottenere il tempo mediano ordinando il set e selezionando il valore medio, in questo caso 7812 (non mi sono preoccupato della media aritmetica per i set con numero pari).

Sfortunatamente, questo sembra generare molte variazioni, dal momento che scelgo solo un dato valore. Quindi, se dovessi evidenziare questo valore, rimbalzerebbe tra i 5000-10000 secondi a seconda di quale build si trovasse nella mediana.

Quindi, per ovviare a questo, ho provato un altro approccio: rimuovere gli outlier e quindi calcolare una media sui valori rimanenti. Ho deciso di dividerlo in terzili e lavorare solo su quello centrale:

[50, 60, 155, 3014, 7812, 8378, 8993, 9100, 13400, 21011] ->
[50, 60, 155], [3014, 7812, 8378, 8993], [9100, 13400, 21011] ->
[3014, 7812, 8378, 8993]

Il motivo per cui questo mi sembra migliore è duplice:

  • Non vogliamo alcuna azione sulle build più veloci, stanno già bene
  • Le build più lunghe sono probabilmente indotte dal timeout e saranno sempre lì. Abbiamo altri meccanismi per rilevarli

Quindi mi sembra che questi siano i dati che sto cercando, ma sono preoccupato di aver raggiunto la fluidità rimuovendo, beh, la verità.

È controverso? Il metodo è sano?

Grazie!


Non hai ancora detto perché vuoi avere la tua misura del tempo trascorso. Devi stimare il tempo totale della macchina che stai pagando? Devi stimare quanti viaggi alla macchina da caffè potresti fare? Qual è l'azione che probabilmente intraprenderai se conoscessi i tempi?
StasK,

Inoltre, se hai prodotti eterogenei che costruisci, rimbalzare è naturale e non dovresti cercare di liberartene. Se hai una misura della complessità di un dato progetto (numero di file, numero di righe di codice, numero di routine, ecc.), Potresti essere interessato al tempo trascorso normalizzato dalla complessità, che potrebbe essere più stabile. Se vuoi renderlo davvero stabile e piatto nel tempo, non sarai in grado di imparare quando devi intraprendere le tue azioni.
StasK,

@StasK: grazie per i tuoi commenti, questo è un input prezioso. L'azione è già nota: molte di queste build richiedono un tempo di attesa troppo lungo e dovremmo lavorare per renderle più veloci. Voglio usare la misura aggregata per vedere se le cose stanno migliorando o peggiorando.
Kim Gräsman,

E sì, idealmente probabilmente lo farei per prodotto, ma i dati di origine non mantengono tali informazioni, quindi barare in base a ciò che so sulla distribuzione. Questo potrebbe cambiare nel tempo, ovviamente, e potrei dover ripensarci.
Kim Gräsman,

Bene, mi sembra che tu abbia tre gruppi nei tuoi dati: (i) costruisce quella build; (ii) build che falliscono (e dici che tendono a fallire piuttosto rapidamente), e (iii) build che riattaccano (o quasi) - e questo è probabilmente il principale se non l'unico gruppo su cui vuoi agire. La misura aggregata del tempo potrebbe non essere di grande utilità; ma qualcosa come la decima build più lunga, o il decimo più alto percentile della distribuzione dei tempi di costruzione, potrebbe essere una misura migliore di ciò che è all'estremo della distribuzione a cui tieni. Questo è all'incirca ciò che l'EPA utilizza nel monitoraggio dell'inquinamento.
StasK

Risposte:


8

Il tuo approccio ha senso per me, tenendo conto del tuo obiettivo. È semplice, è semplice, fa il lavoro e probabilmente non vorrai scrivere un articolo scientifico a riguardo.

Una cosa che si dovrebbe fare sempre nel trattare con gli outlier è capirli , e tu già fai un ottimo lavoro al riguardo. Quindi possibili modi per migliorare il tuo approccio sarebbero: puoi usare le informazioni su quali build sono sospese? Dici che hai "altri meccanismi per rilevare quelli" - puoi rilevarli e quindi rimuovere solo quelli dal campione?

Altrimenti, se hai più dati, potresti pensare di rimuovere non i terziari, ma i quintili ... ma a un certo punto, questo probabilmente non farà molta differenza.


Quando dico "altri" meccanismi, intendo completamente diverso da questo set di dati, quindi non posso prendere decisioni basate su di esso qui. Stiamo aggregando i dati quotidianamente e riceviamo solo ~ 50 build al giorno, quindi penso che i quintili potrebbero produrre dati troppo pochi, ma grazie per il suggerimento, posso sperimentare!
Kim Gräsman,

13

Quello che stai facendo è noto come un mezzo tagliato .

Come hai fatto, è comune tagliare la stessa proporzione da ciascun lato (la proporzione di rifilatura).

Puoi tagliare qualsiasi cosa tra 0% (una media normale) fino a (quasi) 50% (che dà la mediana). Il tuo esempio è stato tagliato del 30% da ciascuna estremità.

Vedi questa risposta e l' articolo Wikipedia pertinente .

[Modifica: vedi l' eccellente discussione di Nick Cox su questo argomento.]

È uno stimatore di posizione abbastanza ragionevole, piuttosto robusto. È generalmente considerato più adatto per le distribuzioni quasi simmetriche rispetto a quelle molto inclinate, ma se si adatta al tuo scopo * non c'è motivo di non usarlo. Quanto è meglio tagliare dipende dal tipo di distribuzione che hai e dalle proprietà che cerchi.

* Non è del tutto chiaro cosa desideri stimare qui.

Esistono numerosi altri solidi approcci per sintetizzare il "centro" delle distribuzioni, alcuni dei quali potrebbero essere utili. (ad esempio gli stimatori M potrebbero essere utili per te, forse)

[Se hai bisogno di una misura corrispondente della variabilità per andare con la tua media tagliata, una deviazione standard Winsorized potrebbe esserti di qualche utilità (essenzialmente, quando calcoli il sd, sostituisci i valori che taglieresti quando taglierai con i valori più estremi che non tagliato).]


In realtà non ho verificato la forma tipica della mia distribuzione, penso che varia di settimana in settimana a seconda di dove le persone apportano modifiche. Potrebbe in effetti essere molto distorto.
Kim Gräsman,

Grazie per aver dato un nome al mio lavoro hack, a proposito. Ispira un po 'di fiducia :-)
Kim Gräsman il

2

Ancora un altro metodo è calcolare la mediana di tutte le medie a coppie o eseguire il bootstrap.

Aggiornare:

La mediana di tutte le medie a coppie è chiamata stimatore di Hodges – Lehmann . Questo stimatore ha di solito un'alta efficienza. Questa voce dell'enciclopedia di Scott L. Hershberger dice:

Mentre sia lo stimatore mediano che quello di Hodges-Lehmann sono entrambi preferibili alla media campionaria per le distribuzioni non simmetriche, lo stimatore di Hodges-Lehmann ha un'efficienza relativa asintotica maggiore rispetto alla media rispetto alla mediana

Il bootstrap può essere meno rilevante e più intensivo dal punto di vista computazionale, ma è possibile prelevare un piccolo campione casuale di dati con la sostituzione e calcolare la media di quel sottocampione, farlo più volte e calcolare la mediana di tutti i mezzi.

In entrambi i casi non è più necessario selezionare un valore tra i valori dei dati (quando si calcola la mediana ordinaria), ma invece si sceglie tra molte medie da sottoinsiemi di dati.


2
Puoi descrivere vantaggi e svantaggi di questi metodi? Una risposta di una riga è insufficiente.
StasK,

1
Ho provato a fare un aggiornamento con maggiori spiegazioni
Finn Årup Nielsen,

Sia le medie a coppie che il bootstrap sembrano comportare una serie di ricalcoli sull'intero set di dati. Il campione è generalmente piuttosto piccolo (<500 valori), quindi probabilmente non è un problema, ma sembra più complicato. Buono a sapersi, ci sono più approcci con cui sperimentare se la media ritagliata risulta essere troppo brusca. Grazie!
Kim Gräsman,

1

Sembra ragionevole quello che stai facendo: solo per informazione utilizzo il seguente processo abbastanza spesso per uno scopo simile: ma sono sempre e solo realmente interessato agli Upper Outlier.

Calcola il riepilogo di cinque numeri: Min, Q1, Mediana, Q3, Max. Calcola intervallo interquartile: Q3-Q1. Imposta le "recinzioni" anomale su Q1-IQR * X e Q3 + IQR * X: dove un valore ragionevole di "X" è 1,5.

Usando Excel e le figure sopra (usando 1,5 per 'X' **) si ottiene un valore anomalo superiore: 21011

MIN 50
Q1  3014
MEDIAN  8095
Q3  9073.25
MAX 21011
IQR 6059.25
UPPER FENCE 18162.125
LOWER FENCE -6074.875

Quindi la recinzione inferiore qui non è utile o realistica per il tuo esempio in realtà: che supporta il punto sollevato dall'altro post sull'importanza di comprendere il significato dei tuoi dati specifici.

(** Ho trovato una citazione per la regola '1.5': non sto dicendo che sia autorevole, ma mi sembra un ragionevole punto di partenza per me: http://statistics.about.com/od/Descriptive-Statistics/a/ What-Is-The-Interquartile-Range-Rule.htm )

Potresti anche decidere (forse) solo di usare i punti dati che rientrano nel QI stesso: questo sembra produrre risultati sensati (in quanto l'appartenenza al tuo metodo è molto simile).

utilizzando gli stessi dati, ciò collocherebbe i seguenti punti di dati nella "zona di interesse":

7812
3014
13400
21011
8993
8378
9100

Su un diagramma a scatole: questi punti rientrerebbero tutti nella parte scatola (anziché nella parte baffi) del diagramma.

A può essere visto che questo elenco include alcuni elementi non presenti nel tuo elenco originale (le build più lunghe); Non posso dire se un elenco sia più preciso in alcun modo. (di nuovo, si tratta di comprendere il set di dati).


Grazie, questo sembra molto vicino in linea di principio a quello che sto già facendo. In che modo questo metodo potrebbe essere migliore del semplice partizionamento del set di dati?
Kim Gräsman,

1
Non posso davvero dire se entrambi i metodi siano migliori o meno: l'ho suggerito in base a ciò che ho letto nei libri / siti di statistiche. Una cosa (penso) che il metodo aggiunge è che ti permette di adattare le 'recinzioni' a qualunque cosa tu ritenga adatta (regolando il fattore 1.5); dove solo prendere il terzo medio potrebbe essere più suscettibile di includere un valore anomalo potenzialmente alto (che probabilmente potrebbe essere meglio classificato al di fuori della barriera) ..... ma non posso dirlo con certezza. Un'altra cosa sull'uso di Quartiles è che il riepilogo a 5 numeri è abbastanza ben compreso e comunemente usato.
monojohnny,

Grazie per il dettaglio aggiunto! Faccio questo in Python, quindi ho già una funzione in cui partizionare il set di dati in N parti e quindi estrarre la parte centrale. È invece una modifica di un carattere per renderlo invece 5 o 7 partizioni. Ma il tuo punto è ben preso ed è bello vedere un altro modo comune di affrontare questo problema. Grazie ancora.
Kim Gräsman,

suona bene per me: aggiungerò un'altra cosa per enfatizzare l'uso di quartili e recinzioni (piuttosto che avere partizioni variabili) - è che si mappano direttamente su grafici a scatole: en.wikipedia.org/wiki/Box_plot che consentono (tra le altre cose) un modo standard di confrontare graficamente diverse distribuzioni.
monojohnny,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.