(Detta svar svarade på en duplikatfråga (nu stängd) vid Upptäcka utestående händelser, som presenterade en del data i grafisk form.)
Outlier upptäckt beror på vilken typ av data och på vad du är villig att anta om dem. Allmänna metoder är beroende av robust statistik. Andan i detta tillvägagångssätt är att karakterisera huvuddelen av uppgifterna på ett sätt som inte påverkas av några avvikare och sedan peka på individuella värden som inte passar inom den karakteriseringen. serien kompletterar komplikationen med att behöva (åter) upptäcka avvikare kontinuerligt. Om detta ska göras när serien utvecklas får vi bara använda äldre data för detektering, inte framtida data! Dessutom, som skydd mot de många upprepade testerna, skulle vi vilja använda en metod som har en mycket låg falsk positiv frekvens. data . Det finns många möjligheter, men en enkel, lättförståelig och lätt implementerad baseras på en löpande MAD: median absolut avvikelse från medianen. Detta är ett starkt robust mått på variation inom data, liknande en standardavvikelse. En avlägsen topp skulle vara flera MAD eller mer än medianen.
Det finns fortfarande en viss inställning att göra : hur mycket avvikelse från huvuddelen av uppgifterna bör betraktas som yttre och hur långt tillbaka i tiden ska man se? Låt oss lämna dessa som parametrar för experiment. Här är en implementering av R
som tillämpas på data $ x = (1,2, \ ldots, n) $ (med $ n = 1150 $ för att emulera data) med motsvarande värden $ y $:
# Parametrar för att ställa in omständigheterna: fönster <- 30 tröskel <- 5 # En övre tröskel ("ut") beräkning baserad på MAD: bibliotek (zoo) # rollapply ()
ut <- funktion (x) {m = median (x); median (x) + tröskel * median (abs (x - m))} z <- rollapply (zoo (y), window, ut, align = "right") z <- c (rep (z [1], window -1), z) # Använd z [1] under den inledande periodutjämnaren <- y > z # Grafera data, visa ut () cutoffs och markera outliers: plot (x, y, type = "l", lwd = 2, col = "# E00000", ylim = c (0, 20000)) rader (x, z, col = "Grå") punkter (x [outliers], y [outliers], pch = 19) kod>
Tillämpad på en datauppsättning som den röda kurvan som illustreras i frågan, ger det resultatet:
Data visas i rött , 30-dagarsfönstret för median + 5 * MAD-trösklar i grått och avvikelserna - som helt enkelt är datavärdena över den grå kurvan - i svart.
(Tröskeln kan bara beräknas börjar vid slutet i det ursprungliga fönstret. För alla data i detta initiala fönster används den första tröskeln: det är därför den grå kurvan är platt mellan x = 0 och x = 30.)
Effekterna av att ändra parametrar är (a) incr lättare värdet för -fönstret tenderar att jämna ut den grå kurvan och (b) en ökning av -tröskeln höjer den grå kurvan. Att veta detta kan man ta ett första segment av data och snabbt identifiera värden på de parametrar som bäst skiljer de yttre topparna från resten av data. Använd dessa parametervärden för att kontrollera resten av data. Om ett diagram visar att metoden försämras med tiden, betyder det att dataens natur förändras och parametrarna kan behöva justeras om igen.
Lägg märke till hur lite denna metod förutsätter om data: de behöver inte distribueras normalt; de behöver inte uppvisa någon periodicitet; de behöver inte ens vara icke-negativa. Allt det antas är att uppgifterna beter sig på ett relativt likartat sätt över tiden och att de avlägsna topparna är synligt högre än resten av informationen.
Om någon vill experimentera (eller jämföra någon annan lösning med den som erbjuds här), här är koden jag använde för att producera data som de som visas i frågan.
n. längd <- 1150cycle.a <- 11cycle.b <- 365/12 amp.a <- 800amp.b <- 8000set.seed (17) x <- 1: n.längdbaslinje <- (1/2) * amp.a * (1 + sin (x * 2 * pi / cykel.a)) * rgamma (n.längd, 40, skala = 1/40) toppar <- rbinom (n.längd, 1, exp (2 * (- 1) + sin ((((1 + x / 2) ^ (1/5) / (1 + n.längd / 2) ^ (1/5)) * x * 2 * pi / cykel.b)) * cykel.b )) y <- toppar * rgamma (n.längd, 20, skala = amp.b / 20) + baslinje