これらの異常値を検出できる異常値検出はどれですか。


7

ベクトルがあり、その中の異常値を検出したい。

次の図は、ベクトルの分布を示しています。赤い点は異常値です。青い点は通常の点です。イエローポイントも正常です。

赤い点を異常値として検出できる異常値検出方法(ノンパラメトリック手法)が必要です。IQR、標準偏差などの方法をテストしましたが、黄色の点も異常値として検出されました。

赤い点だけを検出するのは難しいことはわかっていますが、この問題を解決する方法(方法の組み合わせも含む)があるはずだと思います。

ここに画像の説明を入力してください

ポイントは、1日のセンサーの読み取り値です。ただし、システムの再構成により、センサーの値は変化します(環境は静的ではありません)。再構成の時期は不明です。青い点は再構成前の期間です。黄色の点は、再構成後の値で、読み取り値の分布に偏差を引き起こします(正常です)。赤い点は、黄色い点を違法に変更した結果です。つまり、検出すべき異常です。

カーネル平滑化関数の推定( 'pdf'、 'survivor'、 'cdf'など)が役立つかどうか疑問に思っています。問題を解決するためのコンテキストで使用する主な機能(または他のスムージング方法)と正当化について誰かが助けになりますか?


3
黄色の外れ値ではなく、これらの外れ値の原因は何ですか?外れ値の例はありますか、それともセットを取得しましたか?これに似ていますか?次元数は?
Jan van der Vegt 2017

ありがとう。ポイントは、1日のセンサーの読み取り値です。ただし、システムの再構成により、センサーの値は変化します(環境は静的ではありません)。青い点は再構成前の期間です。黄色の点は再構成後のもので、読み取り値の分布に偏差を引き起こします(ただし正常です)。赤い点は、黄色の点を違法に変更した結果です。一次元です。
Arkan

1
これらの再構成はどのくらいの頻度で行われますか?これらの赤い点は常に起こりますか?いくつかの時系列平滑化方法を見ることができます。
Jan van der Vegt 2017

それは動的であり、明確なものはありません。いいえ。赤い点は違法な変更によって作成された異常であり、常に発生するわけではありません。よく知られている方法(スムージング方法)をいくつか挙げてもらえますか?主な機能は何ですか?
アーカン2017

レベルシフトを検索すると、切片の変化を見つけることができます。データを投稿するBalkeによる時系列のレベルシフトの検出に関する論文を参照してください。11、No。1(1993年1月)、81-92ページ
トム・ライリー

回答:


3

データを時系列として見ることができ、通常の測定では前の値に非常に近い値が生成され、再キャリブレーションでは前のものとの差が大きい値が生成されます。

以下は、例に類似した3つの異なる手段を使用した正規分布に基づくシミュレーションサンプルデータです。 ここに画像の説明を入力してください

前の値との差を計算することにより(一種の派生)、次のデータを取得します。

ここに画像の説明を入力してください

あなたの説明の私の解釈は、あなたは再校正を許容します(すなわち、ゼロからのより大きな距離のポイント、図では赤)が、それらは正と負の値の間で交換しなければなりません(すなわち、青い状態から黄色の値へのシフトに対応します)バック)。

これは、マイナス側またはプラス側のいずれかで2番目の赤い点を確認するアラームを設定できることを意味します。


本当にありがとうございます。はい、それは再校正のようなものであり、これは良いアナロジーです。あなたのアプローチは良いです。私はそれをテストしました。結果は、あなたが描いたものとまったく同じです。最初の赤い点は黄色の点の最初の点です。2番目の点は、赤い点の最初の点です。3番目の赤い点は、赤い点の最後の点です。したがって、このデータから知識を発見することは困難です。これは、最初の赤い点の後の赤い点について議論できなかったためです。結論を出すために主要なデータを視覚化する必要があるかもしれませんが、これは人間の介入です。
Arkan

@Marmite Bomberコードのスニペットを共有して、プログラミングの観点からアイデアをキャッチするとよいでしょう。
マリオ

@マリオ良いアイデア-2年以上経っても見つけられるかどうか見てみましょう。)
Marmite Bomber

@マリオは私の別の答えを参照してください;)
爆撃機

@MarmiteBomberフィードバックに感謝しますが、Pythonコードに興味がありました。
マリオ

0

ロギングを使用する場合は、構成が変更されるとリセットされる移動平均を使用できます。ただし、これには、そのような異常値を検出する前に少なくともいくつかのデータが必要になるという弱点があります。

あなたのデータはかなり「素敵」に見えます(ノイズが多すぎません)。同じ構成で最後の10〜20ポイントの平均を取ることをお勧めします。これらの値が何らかのカウントされた数量である場合、個々のデータポイントのポアソンエラーを取り、平均でエラーを計算できます。

どのくらいの履歴データがありますか?たくさんある場合、それを使用してアラーム率を微調整し、偽の警告を最小限に抑えながら、すべての実際の外れ値の許容可能な比率をキャッチできます。許容できるものは、特定の問題によって異なります。(誤検出のコストまたは検出されなかった外れ値とその存在量)。


ありがとう。残念ながら、再構成は異なり、これによってアラームレートを調整することはできません。最近のポイントの平均化についてもう少し説明できますか?
Arkan

私はこれらのデータポイントが時系列順で正しいと想定していますか?次に、すべてのポイントについて、最後のXXポイントのy軸情報(プロット内のデータ)を使用できます。10としましょう。ただし、これは明らかにデータの見え方に少し依存します。これらの10点について、平均を計算します。個々の測定値に誤差推定値がある場合は、加重誤差を計算します。
El Burro

Xより大きい固定値からの偏差としてアラームを定義するのではなく、移動平均からの偏差としてアラーム率を調整できます。
El Burro

ありがとう。はい。それらは時系列です。カーネル平滑化関数の推定が役立つかどうか疑問に思っています。
Arkan

構成を変更するたびにリセットされる単純な移動平均から始めて、それがうまくいくかどうかを確認することをお勧めします。これが見た目にどのように基づいて構成変更が発生したときに利用できる情報がない場合、黄色と赤を分離する他の信頼できるオプションはありません。少なくとも、与えられた例では、両方の形状が大きく異なっているようには見えません。
El Burro

0

他の回答で提案されたアプローチを簡単な例で説明しましょう

データを取得する

さまざまな手段で正規分布で生成された7つのチャンクを使用してデータをシミュレートします。

これは、グループを明確に区別し、簡単に限界点を検出できるため、重要です。この回答は基本的なしきい値のアプローチを使用しています。実際のデータには、より高度な方法が必要になる場合があります。

dt <- rbind(
data.frame(color=1, x =  round(runif(50, min = 0, max = 50)), y = rnorm (50,mean=3.9, sd=.03)), 
data.frame(color=2, x =  round(runif(15, min = 50, max = 65)), y = rnorm (15,mean=4.5, sd=.03)),
data.frame(color=2, x =  round(runif(15, min = 65, max = 80)), y = rnorm (15,mean=3.3, sd=.03)),
data.frame(color=1, x =  round(runif(70, min = 80, max = 150)), y = rnorm (70,mean=3.9, sd=.03)), 
data.frame(color=2, x =  round(runif(15, min = 150, max = 165)), y = rnorm (15,mean=3.3, sd=.03)), 
data.frame(color=3, x =  round(runif(15, min = 165, max = 180)), y = rnorm (15,mean=2.9, sd=.03)), 
data.frame(color=1, x =  round(runif(120, min = 180, max = 300)), y = rnorm (120,mean=3.9, sd=.03))
)
dt$color <- as.factor(dt$color)
dt <- as_tibble(dt)

ここに画像の説明を入力してください

限界点を導き出す

前のポイントとの単純な違いによりlag(y) 、外れ値を取得します。それらは、しきい値を使用して分類されます。

ここに画像の説明を入力してください

行動分類の変更

あなたが説明したルールに基づいて、限界点はOKおよびに分類されproblemます。

この規則では、同じ方向の2つの変更は許可されていません。前の方向への2番目の動きは問題と見なされます。

logikがより高度な場合は、この単純な解釈を調整する必要がある場合があります。

## extract outliers and get previous value
dt2 <- filter(dt2, diff != 0) %>%
   mutate(cs = cumsum(diff),
          prev = lag(diff),
          cls = case_when(
                      diff * prev >  0 ~ "problem",
                      TRUE ~ "OK"))
## show 
dt2 %>% select(x,y,diff,prev,cls)                       
## # A tibble: 6 x 5
##       x     y  diff  prev cls    
##   <dbl> <dbl> <dbl> <dbl> <chr>  
## 1    50  4.53     1    NA OK     
## 2    66  3.32    -1     1 OK     
## 3    80  3.87     1    -1 OK     
## 4   151  3.32    -1     1 OK     
## 5   167  2.91    -1    -1 problem
## 6   180  3.87     1    -1 OK

プレゼンテーション

最後に、認識された外れ値を元のデータに投影します

## project in the original data
ggplot(data=dt, mapping = aes(x=x, y=y) )  +
  geom_point(mapping = aes(color = color) )  +
  scale_color_manual(values=c("blue", "yellow", "red","green","red")) +
  theme(legend.position="none") +
  geom_vline(data=dt2, aes(xintercept=x, color=cls),
             linetype="dashed", size = 2)

ここに画像の説明を入力してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.