series_decompose_anomalies()

Avvikelseidentifiering baseras på seriedekomposition. Mer information finns i series_decompose().

Funktionen tar ett uttryck som innehåller en serie (dynamisk numerisk matris) som indata och extraherar avvikande punkter med poäng.

Syntax

series_decompose_anomalies (Serien, [ Tröskelvärde,Säsongsvariationer,Trend,, Test_points, AD_methodSeasonality_threshold ])

Läs mer om syntaxkonventioner.

Parametrar

Namn Typ Obligatorisk Beskrivning
Serie dynamic ✔️ En matris med numeriska värden, vanligtvis resulterande utdata från operatorerna make-series eller make_list .
Tröskelvärde real Avvikelsetröskelvärdet. Standardvärdet är 1,5 k för att identifiera milda eller starkare avvikelser.
Säsongsberoende int Styr säsongsanalysen. Möjliga värden är:

- -1: Identifiera säsongsvariationer automatiskt med series_periods_detect. Detta är standardvärdet.
– Heltalstid: Ett positivt heltal som anger den förväntade perioden i antalet intervall. Om serien till exempel finns i 1h lagerplatser är en veckoperiod 168 intervall.
- 0: Ingen säsongsvariation, så hoppa över att extrahera den här komponenten.
Trend string Styr trendanalysen. Möjliga värden är:

- avg: Definiera trendkomponenten som average(x). Det här är standardinställningen.
- linefit: Extrahera trendkomponenten med linjär regression.
- none: Ingen trend, så hoppa över att extrahera den här komponenten.
Test_points int Ett positivt heltal som anger antalet punkter i slutet av serien som ska undantas från inlärnings- eller regressionsprocessen. Den här parametern ska anges för prognostisering. Standardvärdet är 0.
AD_method string Styr avvikelseidentifieringsmetoden i residualtidsserien, som innehåller något av följande värden:

- ctukey: Tukeys stängseltest med anpassat 10:e-90:e percentilintervall. Det här är standardinställningen.
- tukey: Tukeys stakettest med standardvärdet 25:e-75:e percentilen.

Mer information om residualtidsserier finns i series_outliers.
Seasonality_threshold real Tröskelvärdet för säsongspoäng när Säsongsvariation är inställt på identifiera automatiskt. Standardvärdet för poängtröskelvärdet är 0,6.

Mer information finns i series_periods_detect.

Returer

Funktionen returnerar följande respektive serie:

  • ad_flag: En ternary-serie som innehåller (+1, -1, 0) som markerar upp/ned/ingen avvikelse respektive
  • ad_score: Avvikelsepoäng
  • baseline: Det förutsagda värdet för serien enligt nedbrytningen

Algoritmen

Den här funktionen följer dessa steg:

  1. Anropar series_decompose() med respektive parametrar för att skapa baslinje- och residualserierna.
  2. Beräknar ad_score-serien genom att använda series_outliers() med den valda metoden för avvikelseidentifiering i residualserien.
  3. Beräknar ad_flag-serien genom att tillämpa tröskelvärdet på ad_score för att markera upp/ned/ingen avvikelse.

Exempel

Identifiera avvikelser i veckovisa säsongsvariationer

I följande exempel genererar du en serie med säsongsvariation varje vecka och lägger sedan till några extremvärden i den. series_decompose_anomalies identifierar säsongsvariationen automatiskt och genererar en baslinje som fångar upp det repetitiva mönstret. Avvikande värden som du har lagt till kan tydligt identifieras i komponenten 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  

Veckovis säsongsvariation som visar baslinje och extremvärden.

Identifiera avvikelser i veckovisa säsongsvariationer med trend

I det här exemplet lägger du till en trend i serien från föregående exempel. Börja med att köra series_decompose_anomalies med standardparametrarna där trendstandardvärdet avg bara tar medelvärdet och inte beräknar trenden. Den genererade baslinjen innehåller inte trenden och är mindre exakt, jämfört med föregående exempel. Därför identifieras inte vissa av de avvikande värden som du infogade i data på grund av den högre variansen.

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

Veckovisa säsongsvariationer med trend.

Kör sedan samma exempel, men eftersom du förväntar dig en trend i serien anger du linefit i trendparametern. Du kan se att baslinjen ligger mycket närmare indataserien. Alla infogade extremvärden identifieras och även vissa falska positiva identifieringar. Se nästa exempel på hur du justerar tröskelvärdet.

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  

Veckovisa säsongsavvikelser med linjeanpassningstrend.

Justera tröskelvärdet för avvikelseidentifiering

Några bullriga punkter identifierades som avvikelser i föregående exempel. Öka nu tröskelvärdet för avvikelseidentifiering från standardvärdet 1,5 till 2,5. Använd det här interpercentilintervallet så att endast starkare avvikelser identifieras. Nu identifieras bara avvikande värden som du har infogat i data.

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  

Veckovisa serieavvikelser med högre avvikelsetröskel.