series_decompose_anomalies()

A Deteção de Anomalias baseia-se na decomposição de séries. Para obter mais informações, veja series_decompose().

A função utiliza uma expressão que contém uma série (matriz numérica dinâmica) como entrada e extrai pontos anómalos com pontuações.

Syntax

series_decompose_anomalies (, Série [ Limiar,Sazonalidade,Tendência,, Test_points, AD_methodSeasonality_threshold ])

Saiba mais sobre as convenções de sintaxe.

Parâmetros

Nome Tipo Necessário Descrição
Série dynamic ✔️ Uma matriz de valores numéricos, normalmente a saída resultante de operadores de make-series ou make_list .
Limite real O limiar de anomalias. A predefinição é 1,5, k valor, para detetar anomalias leves ou mais fortes.
Sazonalidade int Controla a análise sazonal. Os valores possíveis são:

- -1: detete automaticamente a sazonalidade com series_periods_detect. Este é o valor predefinido.
- Período de tempo de número inteiro: um número inteiro positivo que especifica o período esperado em número de classes. Por exemplo, se a série estiver em 1h classes, um período semanal é de 168 classes.
- 0: sem sazonalidade, por isso, ignore a extração deste componente.
Tendência string Controla a análise de tendências. Os valores possíveis são:

- avg: defina o componente de tendência como average(x). Esta é a predefinição.
- linefit: extraia o componente de tendência com a regressão linear.
- none: Sem tendência, por isso, ignore a extração deste componente.
Test_points int Um número inteiro positivo que especifica o número de pontos no final da série a excluir do processo de aprendizagem ou regressão. Este parâmetro deve ser definido para fins de previsão. O valor predefinido é 0.
AD_method string Controla o método de deteção de anomalias na série temporal residual, que contém um dos seguintes valores:

- ctukey: Teste de vedação de Tukey com intervalo de percentil 10 a 90 personalizado. Esta é a predefinição.
- tukey: Teste de vedação de Tukey com o intervalo de percentil padrão 25-75.

Para obter mais informações sobre séries temporizadores residuais, veja series_outliers.
Seasonality_threshold real O limiar da classificação de sazonalidade quando a Sazonalidade está definida para deteção automática. O limiar de classificação predefinido é 0,6.

Para obter mais informações, veja series_periods_detect.

Devoluções

A função devolve as seguintes séries:

  • ad_flag: uma série ternary contendo (+1, -1, 0) marcando para cima/para baixo/sem anomalias, respetivamente
  • ad_score: Pontuação de anomalias
  • baseline: o valor previsto da série, de acordo com a decomposição

O algoritmo

Esta função segue estes passos:

  1. Chama series_decompose() com os respetivos parâmetros, para criar a série de linha de base e residuais.
  2. Calcula ad_score série ao aplicar series_outliers() com o método de deteção de anomalias escolhido na série residual.
  3. Calcula a série ad_flag ao aplicar o limiar no ad_score para marcar para cima/para baixo/sem anomalias, respetivamente.

Exemplos

Detetar anomalias na sazonalidade semanal

No exemplo seguinte, gere uma série com sazonalidade semanal e, em seguida, adicione alguns valores atípicos à mesma. series_decompose_anomalies detetar automaticamente a sazonalidade e gera uma linha de base que captura o padrão repetitivo. Os valores atípicos que adicionou podem ser claramente vistos no componente 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  

Sazonalidade semanal a mostrar a linha de base e valores atípicos.

Detetar anomalias na sazonalidade semanal com tendência

Neste exemplo, adicione uma tendência à série do exemplo anterior. Em primeiro lugar, execute series_decompose_anomalies com os parâmetros predefinidos em que o valor predefinido da tendência avg só assume a média e não calcula a tendência. A linha de base gerada não contém a tendência e é menos exata, em comparação com o exemplo anterior. Consequentemente, alguns dos valores atípicos que inseriu nos dados não são detetados devido à maior variância.

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

Valores atípicos semanais de sazonalidade com tendência.

Em seguida, execute o mesmo exemplo, mas uma vez que espera uma tendência na série, especifique linefit no parâmetro de tendência. Pode ver que a linha de base está muito mais próxima da série de entrada. Todos os valores atípicos inseridos são detetados e também alguns falsos positivos. Veja o exemplo seguinte sobre como ajustar o limiar.

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  

Anomalias semanais de sazonalidade com tendência de ajuste de linhas.

Ajustar o limiar de deteção de anomalias

Foram detetados alguns pontos ruidosos como anomalias no exemplo anterior. Agora, aumente o limiar de deteção de anomalias de uma predefinição de 1,5 para 2,5. Utilize este intervalo de interpessois, para que apenas sejam detetadas anomalias mais fortes. Agora, apenas os valores atípicos que inseriu nos dados serão detetados.

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  

Anomalias de séries semanais com limiar de anomalias mais elevado.