(यह जवाब बकाया घटनाओं का पता लगाने पर एक डुप्लिकेट (अब बंद) सवाल का जवाब दिया , जो ग्राफिकल रूप में कुछ डेटा प्रस्तुत करता है।)
बाह्य पहचान डेटा की प्रकृति और आप उनके बारे में क्या मानने के लिए तैयार हैं पर निर्भर करता है। सामान्य-उद्देश्य विधियां मजबूत आंकड़ों पर निर्भर करती हैं। इस दृष्टिकोण की भावना डेटा के थोक को इस तरह से चिह्नित करना है जो किसी भी आउटलेयर से प्रभावित नहीं है और फिर किसी भी व्यक्तिगत मूल्यों को इंगित करता है जो उस लक्षण वर्णन के भीतर फिट नहीं होते हैं।
क्योंकि यह एक समय श्रृंखला है, यह एक निरंतर आधार पर आउटलेर्स का पता लगाने (पुनः) की आवश्यकता की जटिलता को जोड़ता है। यदि यह श्रृंखला के रूप में किया जाना है, तो हमें केवल पुराने डेटा का उपयोग करने की अनुमति है, भविष्य के डेटा की नहीं! इसके अलावा, कई दोहराया परीक्षणों के खिलाफ सुरक्षा के रूप में, हम एक ऐसी विधि का उपयोग करना चाहते हैं जिसमें बहुत कम झूठी सकारात्मक दर है।
ये विचार सुझाव देते हैं कि डेटा पर एक सरल, मजबूत चलती खिड़की की रूपरेखा का परीक्षण किया जाए । कई संभावनाएं हैं, लेकिन एक सरल, आसानी से समझा और आसानी से लागू किया गया है एक चल रहे एमएडी पर आधारित है: औसत दर्जे का पूर्ण विचलन। यह एक मानक विचलन के समान डेटा के भीतर भिन्नता का एक बहुत मजबूत उपाय है। एक आउटिंग चोटी कई MAD या मध्यिका से अधिक होगी।
अभी भी कुछ ट्यूनिंग की जानी है : डेटा के थोक से कितना विचलन आउटसाइड माना जाना चाहिए और एक समय में कितनी दूर दिखना चाहिए? आइए प्रयोग के लिए इन मापदंडों को छोड़ दें। यहाँ एक है R
कार्यान्वयन डेटा पर लागू (साथ संबंधित मानों के साथ डेटा का अनुकरण करने के) :n = 1150 yx=(1,2,…,n)n=1150y
# Parameters to tune to the circumstances:
window <- 30
threshold <- 5
# An upper threshold ("ut") calculation based on the MAD:
library(zoo) # rollapply()
ut <- function(x) {m = median(x); median(x) + threshold * median(abs(x - m))}
z <- rollapply(zoo(y), window, ut, align="right")
z <- c(rep(z[1], window-1), z) # Use z[1] throughout the initial period
outliers <- y > z
# Graph the data, show the ut() cutoffs, and mark the outliers:
plot(x, y, type="l", lwd=2, col="#E00000", ylim=c(0, 20000))
lines(x, z, col="Gray")
points(x[outliers], y[outliers], pch=19)
प्रश्न में सचित्र लाल वक्र जैसे एक डेटासेट पर लागू होता है, यह इस परिणाम का उत्पादन करता है:
डेटा को लाल रंग में दिखाया गया है, 30-दिवसीय माध्यिका की विंडो + 5 * MAD थ्रेसहोल्ड ग्रे में, और आउटलेरर्स - जो ग्रे वक्र के ऊपर केवल उन डेटा मान हैं - काले रंग में।
(थ्रेशोल्ड की गणना प्रारंभिक विंडो के अंत में की जा सकती है । इस प्रारंभिक विंडो में सभी डेटा के लिए, पहली थ्रेशोल्ड का उपयोग किया जाता है: यही कारण है कि ग्रे वक्र x = 0 और x = 30 के बीच समतल है।)
मापदंडों को बदलने के प्रभाव (ए) के मूल्य में वृद्धि window
ग्रे वक्र को सुचारू करने के लिए होती है और (बी) बढ़ती threshold
ग्रे वक्र को बढ़ाएगी। यह जानने के बाद, कोई डेटा के प्रारंभिक खंड को ले सकता है और उन मापदंडों के मूल्यों की शीघ्रता से पहचान कर सकता है जो बाकी डेटा से सबसे अधिक चोटियों को अलग करते हैं। बाकी डेटा की जाँच करने के लिए ये पैरामीटर मान लागू करें। यदि कोई प्लॉट दिखाता है कि विधि समय के साथ बिगड़ रही है, तो इसका मतलब है कि डेटा की प्रकृति बदल रही है और मापदंडों को फिर से ट्यूनिंग की आवश्यकता हो सकती है।
ध्यान दें कि यह विधि डेटा के बारे में कितना कम मानती है: उन्हें सामान्य रूप से वितरित करने की आवश्यकता नहीं है; उन्हें किसी आवधिकता का प्रदर्शन करने की आवश्यकता नहीं है; उन्हें गैर-नकारात्मक होना भी नहीं चाहिए। यह सभी मानते हैं कि डेटा समय के साथ समान रूप से व्यवहार करता है और यह कि बाकी की चोटियां बाकी डेटा की तुलना में अधिक दिखाई देती हैं।
यदि कोई प्रयोग करना चाहता है (या यहां प्रस्तुत किसी अन्य समाधान की तुलना करता है), तो यहां वह कोड है जिसका उपयोग मैंने प्रश्न में दिखाए गए डेटा की तरह किया था।
n.length <- 1150
cycle.a <- 11
cycle.b <- 365/12
amp.a <- 800
amp.b <- 8000
set.seed(17)
x <- 1:n.length
baseline <- (1/2) * amp.a * (1 + sin(x * 2*pi / cycle.a)) * rgamma(n.length, 40, scale=1/40)
peaks <- rbinom(n.length, 1, exp(2*(-1 + sin(((1 + x/2)^(1/5) / (1 + n.length/2)^(1/5))*x * 2*pi / cycle.b))*cycle.b))
y <- peaks * rgamma(n.length, 20, scale=amp.b/20) + baseline