series_decompose_anomalies()

異常検出は、系列分解に基づいて行われます。 詳細については、series_decompose() を参照してください。

この関数は、系列 (動的な数値配列) を含む式を入力として受け取り、スコアを使用して異常なポイントを抽出します。

構文

series_decompose_anomalies (シリーズ,[ しきい値,季節,傾向,, Test_points, AD_methodSeasonality_threshold ])

構文規則について詳しく知る。

パラメーター

名前 必須 説明
系列 dynamic ✔️ 数値の配列。通常は、 make-series 演算子または make_list 演算子の結果の出力です。
しきい値 real 異常しきい値。 マイルドまたはより強い異常を検出するための既定値は 1.5、k の値です。
季節性 int 季節分析を制御します。 次の値を指定できます。

- -1: series_periods_detectを使用して季節性を自動検出します。 これが既定値です。
- 整数の期間: ビン数で予想される期間を指定する正の整数。たとえば、系列がビン内にある 1h 場合、週単位の期間は 168 ビンです。
- 0: 季節性はないため、このコンポーネントの抽出はスキップしてください。
傾向 string 傾向分析を制御します。 次の値を指定できます。

- avg: 傾向コンポーネントを として average(x)定義します。 既定値です。
- linefit: 線形回帰を使用して傾向コンポーネントを抽出します。
- none: 傾向がないため、このコンポーネントの抽出をスキップします。
Test_points int 学習 (回帰) プロセスから除外する系列の末尾にあるポイントの数を指定する正の整数。 このパラメーターは、予測のために設定する必要があります。 既定値は 0 です。
AD_method string 次のいずれかの値を含む、残差時系列の異常検出方法を制御します。

- ctukey: カスタム 10 ~ 90 パーセンタイル範囲を使用した Tukey のフェンス テスト 。 既定値です。
- tukey:標準の25-75パーセンタイル範囲を持つ Tukeyのフェンステスト

残差時系列の詳細については、「 series_outliers」を参照してください。
Seasonality_threshold real 季節性が自動検出に設定されている場合の 季節性 スコアのしきい値。 既定のスコアしきい値は 0.6 です。

詳細については、「series_periods_detect」を参照してください。

戻り値

この関数からは、次のそれぞれの系列が返されます。

  • ad_flag: それぞれアップ/ダウン/異常なしをマークする (+1、-1、0) を含む三項系列
  • ad_score: 異常スコア
  • baseline: 分解に従った、系列の予測値

アルゴリズム

この関数は、次のステップに従います。

  1. それぞれのパラメーターを使用して、series_decompose() を呼び出し、ベースラインと残差の系列を作成します。
  2. 残差系列に対して選択した異常検出方法と一緒に、series_outliers() を適用することにより、ad_score 系列を計算します。
  3. ad_score にしきい値を適用して、それぞれアップ/ダウン/異常なしをマークすることにより、ad_flag 系列を計算します。

週単位で季節性の異常を検出する

次の例では、週単位の季節性を持つ系列を生成し、それにいくつかの外れ値を追加します。 series_decompose_anomalies では、季節性を自動検出し、反復パターンをキャプチャするベースラインを生成します。 追加した外れ値は、ad_score コンポーネントで明確に見つけることができます。

let ts=range t from 1 to 24*7*5 step 1 
| extend Timestamp = datetime(2018-03-01 05:00) + 1h * t 
| extend y = 2*rand() + iff((t/24)%7>=5, 10.0, 15.0) - (((t%24)/10)*((t%24)/10)) // generate a series with weekly seasonality
| extend y=iff(t==150 or t==200 or t==780, y-8.0, y) // add some dip outliers
| extend y=iff(t==300 or t==400 or t==600, y+8.0, y) // add some spike outliers
| summarize Timestamp=make_list(Timestamp, 10000),y=make_list(y, 10000);
ts 
| extend series_decompose_anomalies(y)
| render timechart  

ベースラインと外れ値を示す週単位の季節性。

傾向を使用して週単位の季節性の異常を検出する

この例では、前の例からの系列に傾向を追加します。 まず、既定のパラメーターを使用して series_decompose_anomalies を実行します。この場合は、傾向 avg の既定値として平均のみが使用され、傾向が計算されません。 生成されたベースラインには傾向が含まれておらず、前の例と比較して精度が低くなっています。 その結果、変性が大きいため、データに挿入した外れ値の一部が検出されません。

let ts=range t from 1 to 24*7*5 step 1 
| extend Timestamp = datetime(2018-03-01 05:00) + 1h * t 
| extend y = 2*rand() + iff((t/24)%7>=5, 5.0, 15.0) - (((t%24)/10)*((t%24)/10)) + t/72.0 // generate a series with weekly seasonality and ongoing trend
| extend y=iff(t==150 or t==200 or t==780, y-8.0, y) // add some dip outliers
| extend y=iff(t==300 or t==400 or t==600, y+8.0, y) // add some spike outliers
| summarize Timestamp=make_list(Timestamp, 10000),y=make_list(y, 10000);
ts 
| extend series_decompose_anomalies(y)
| extend series_decompose_anomalies_y_ad_flag = 
series_multiply(10, series_decompose_anomalies_y_ad_flag) // multiply by 10 for visualization purposes
| render timechart

傾向のある週ごとの季節性の外れ値。

次に、同じ例を実行します。ただし、系列での傾向を期待しているため、傾向パラメーターには linefit を指定します。 ベースラインが入力系列にはるかに近いことを確認できます。 挿入された外れ値はすべて検出され、一部の擬陽性も検出されます。 しきい値の調整に関する次の例を参照してください。

let ts=range t from 1 to 24*7*5 step 1 
| extend Timestamp = datetime(2018-03-01 05:00) + 1h * t 
| extend y = 2*rand() + iff((t/24)%7>=5, 5.0, 15.0) - (((t%24)/10)*((t%24)/10)) + t/72.0 // generate a series with weekly seasonality and ongoing trend
| extend y=iff(t==150 or t==200 or t==780, y-8.0, y) // add some dip outliers
| extend y=iff(t==300 or t==400 or t==600, y+8.0, y) // add some spike outliers
| summarize Timestamp=make_list(Timestamp, 10000),y=make_list(y, 10000);
ts 
| extend series_decompose_anomalies(y, 1.5, -1, 'linefit')
| extend series_decompose_anomalies_y_ad_flag = 
series_multiply(10, series_decompose_anomalies_y_ad_flag) // multiply by 10 for visualization purposes
| render timechart  

ラインフィット傾向を伴う週単位の季節性の異常。

異常検出のしきい値を調整する

前の例では、いくつかのノイズ ポイントが異常として検出されました。 次に、異常検出のしきい値を、既定値の 1.5 から 2.5 に増やします。 このパーセンタイル範囲を使用して、より重度の異常のみが検出されるようにします。 これで、データに挿入した外れ値だけが検出されます。

let ts=range t from 1 to 24*7*5 step 1 
| extend Timestamp = datetime(2018-03-01 05:00) + 1h * t 
| extend y = 2*rand() + iff((t/24)%7>=5, 5.0, 15.0) - (((t%24)/10)*((t%24)/10)) + t/72.0 // generate a series with weekly seasonality and onlgoing trend
| extend y=iff(t==150 or t==200 or t==780, y-8.0, y) // add some dip outliers
| extend y=iff(t==300 or t==400 or t==600, y+8.0, y) // add some spike outliers
| summarize Timestamp=make_list(Timestamp, 10000),y=make_list(y, 10000);
ts 
| extend series_decompose_anomalies(y, 2.5, -1, 'linefit')
| extend series_decompose_anomalies_y_ad_flag = 
series_multiply(10, series_decompose_anomalies_y_ad_flag) // multiply by 10 for visualization purposes
| render timechart  

異常しきい値が高い毎週の系列の異常。