(この回答は、未解決のイベントの検出に関する重複した(現在は閉じられている)質問に回答しました。
外れ値の検出は、データの性質と、データについて何を想定するかによって異なります。 汎用メソッドは、堅牢な統計に依存しています。このアプローチの精神は、外れ値の影響を受けない方法でデータの大部分を特徴付けて、その特性に収まらない個々の値を指すことです。
これは時系列であるため、異常値を継続的に(再)検出する必要があるという複雑さが加わります。これがシリーズの展開時に行われる場合、検出には古いデータのみを使用でき、将来のデータは使用できません!さらに、多くの繰り返しテストに対する保護として、偽陽性率が非常に低い方法を使用する必要があります。
これらの考慮事項は、データに対して単純で堅牢な移動ウィンドウの外れ値テストを実行することをお勧めします。多くの可能性がありますが、単純で、簡単に理解され、簡単に実装できるものは、実行中のMADに基づいています:中央値からの絶対偏差の中央値。これは、標準偏差に類似した、データ内の変動の非常に堅牢な尺度です。外れたピークは、いくつかのMADまたは中央値より大きくなります。
R
x=(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)
質問に示されている赤い曲線のようなデータセットに適用すると、次の結果が生成されます。
データは赤で、中央値+ 5 * MADしきい値の30日間のウィンドウは灰色で、外れ値は単に灰色の曲線より上のデータ値で、黒で表示されます。
(しきい値は、最初のウィンドウの最後からしか計算できません。この最初のウィンドウ内のすべてのデータには、最初のしきい値が使用されます。そのため、灰色の曲線はx = 0とx = 30の間で平坦です。)
パラメータを変更すると、(a)の値がwindow
大きくthreshold
なるとグレーカーブが滑らかになり、(b)大きくするとグレーカーブが大きくなります。これを知って、データの最初のセグメントを取得し、外側のピークを残りのデータから最適に分離するパラメーターの値をすばやく特定できます。これらのパラメータ値を適用して、残りのデータを確認します。時間が経つにつれてメソッドが悪化していることがプロットに示されている場合、それはデータの性質が変化しており、パラメーターの再調整が必要な可能性があることを意味します。
このメソッドがデータに関してほとんど想定していないことに注意してください。それらは正規分布である必要はありません。周期性を示す必要はありません。彼らは非負である必要さえありません。すべてのそれは想定していたデータは、時間をかけて、合理的に同様の方法で動作することをして、範囲外のピークは、データの残りの部分よりも目に見えて高くなっているということです。
誰かが実験する(または他のソリューションをここで提供されているソリューションと比較する)場合は、質問に示されているようなデータを生成するために使用したコードを以下に示します。
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