series_decompose_anomalies()

La detección de anomalías se basa en la descomposición de la serie. Para obtener más información, consulte series_decompose().

La función toma una expresión que contiene una serie (matriz numérica dinámica) como entrada y extrae puntos anómalos con puntuaciones.

Syntax

series_decompose_anomalies (Serie, [ Umbral,Estacionalidad,Tendencia,, Test_points, AD_methodSeasonality_threshold ])

Más información sobre las convenciones de sintaxis.

Parámetros

Nombre Tipo Requerido Descripción
Serie dynamic ✔️ Matriz de valores numéricos, normalmente la salida resultante de los operadores make-series o make_list .
Umbral real Umbral de anomalías. El valor predeterminado es 1,5, k, para detectar anomalías leves o más fuertes.
Estacionalidad int Controla el análisis estacional. Los valores posibles son:

- -1: detecta automáticamente la estacionalidad mediante series_periods_detect. Este es el valor predeterminado.
- Período de tiempo entero: entero positivo que especifica el período esperado en el número de contenedores. Por ejemplo, si la serie está en 1h contenedores, un período semanal es de 168 contenedores.
- 0: no hay estacionalidad, así que omita la extracción de este componente.
Tendencia string Controla el análisis de tendencias. Los valores posibles son:

- avg: defina el componente de tendencia como average(x). Este es el valor predeterminado.
- linefit: extraiga el componente de tendencia mediante la regresión lineal.
- none: no hay tendencia, así que omita la extracción de este componente.
Test_points int Entero positivo que especifica el número de puntos al final de la serie que se va a excluir del proceso de aprendizaje, o regresión. Este parámetro debe establecerse con fines de previsión. El valor predeterminado es 0.
AD_method string Controla el método de detección de anomalías en la serie temporal residual, que contiene uno de los siguientes valores:

- ctukey: prueba de barrera de Tukey con intervalo de percentil 10-90 personalizado. Este es el valor predeterminado.
- tukey: prueba de barrera de Tukey con rango de percentil estándar 25-75.

Para obtener más información sobre las series temporales residuales, consulte series_outliers.
Seasonality_threshold real Umbral de puntuación de estacionalidad cuando la estacionalidad se establece en detección automática. El umbral de puntuación predeterminado es 0,6.

Para obtener más información, consulte series_periods_detect.

Devoluciones

La función devuelve las siguientes series respectivas:

  • ad_flag: una serie ternaria que contiene (+1, -1, 0) marcando hacia arriba/abajo/sin anomalías, respectivamente.
  • ad_score: puntuación de anomalías
  • baseline: valor previsto de la serie, según la descomposición.

Algoritmo

Esta función sigue estos pasos:

  1. Llama a series_decompose() con los parámetros respectivos para crear la serie de línea base y residual.
  2. Calcula ad_score serie aplicando series_outliers() con el método de detección de anomalías elegido en la serie residual.
  3. Calcula la serie de ad_flag aplicando el umbral en el ad_score para marcar o reducir o no anomalías, respectivamente.

Ejemplos

Detección de anomalías en estacionalidad semanal

En el ejemplo siguiente, genere una serie con estacionalidad semanal y agregue algunos valores atípicos. series_decompose_anomalies detecta automáticamente la estacionalidad y genera una línea base que captura el patrón repetitivo. Los valores atípicos agregados se pueden detectar claramente en el 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  

Estacionalidad semanal que muestra la línea base y los valores atípicos.

Detección de anomalías en estacionalidad semanal con tendencia

En este ejemplo, agregue una tendencia a la serie del ejemplo anterior. En primer lugar, ejecute series_decompose_anomalies con los parámetros predeterminados en los que el valor predeterminado de tendencia avg solo toma el promedio y no calcula la tendencia. La línea base generada no contiene la tendencia y es menos exacta, en comparación con el ejemplo anterior. Por lo tanto, algunos de los valores atípicos que insertó en los datos no se detectan debido a la varianza más alta.

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 de estacionalidad semanal con tendencia.

A continuación, ejecute el mismo ejemplo, pero dado que espera una tendencia en la serie, especifique linefit en el parámetro trend. Puede ver que la línea base está mucho más cerca de la serie de entrada. Se detectan todos los valores atípicos insertados y también algunos falsos positivos. Consulte el ejemplo siguiente sobre cómo ajustar el umbral.

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  

Anomalías semanales de estacionalidad con tendencia de ajuste de línea.

Ajuste del umbral de detección de anomalías

Se detectaron algunos puntos ruidosos como anomalías en el ejemplo anterior. Ahora aumente el umbral de detección de anomalías de un valor predeterminado de 1,5 a 2,5. Use este intervalo interpercentil, de modo que solo se detecten anomalías más fuertes. Ahora, solo se detectarán los valores atípicos que insertó en los datos.

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  

Anomalías semanales de la serie con un umbral de anomalías mayor.