(이 답변 은 일부 이벤트 를 그래픽 형식으로 표시하는 미해결 이벤트 감지 의 중복 (현재 비공개) 질문에 응답했습니다 .)
이상치 탐지는 데이터의 특성과 데이터에 대해 기꺼이 추측하는 것에 달려 있습니다. 범용 방법은 강력한 통계에 의존합니다. 이 접근 방식의 정신은 대부분의 데이터를 특이 치의 영향을받지 않는 방식으로 특성화 한 다음 해당 특성에 맞지 않는 개별 값을 가리 키는 것입니다.
이것은 시계열이므로 특이 치를 지속적으로 (재) 검출해야하는 복잡한 문제를 추가합니다. 시리즈가 전개됨에 따라이 작업을 수행하면 추후 데이터가 아닌 오래된 데이터 만 탐지에 사용할 수 있습니다! 또한 여러 번 반복되는 테스트를 방지하기 위해 오 탐지율이 매우 낮은 방법을 사용하려고합니다.
이러한 고려 사항은 데이터에 대해 간단하고 강력한 이동 창 이상치 테스트를 실행하는 것을 제안합니다 . 많은 가능성이 있지만 간단하고 쉽게 이해되고 쉽게 구현되는 것은 실행중인 MAD를 기준으로합니다. 이는 표준 편차와 유사하게 데이터 내에서 강력한 변동 측정입니다. 외부 피크 는 여러 MAD이거나 중앙값보다 큽니다.
R
x = ( 1 , 2 , … , n )n = 1150와이
# 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 사이에서 평평한 이유입니다.
매개 변수 변경의 효과 는 (a) 값이 증가 window
하면 회색 곡선이 평활 해지는 경향이 있고 (b) 증가 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