series_decompose()

Aplica una transformación de descomposición en una serie.

Toma una expresión que contiene una serie (matriz numérica dinámica) como entrada y la descompone en componentes estacionales, de tendencia y residuales.

Syntax

series_decompose(Serie, [ Estacionalidad,Tendencia,, Test_pointsSeasonality_threshold ])

Obtenga 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 .
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: entero positivo que especifica el período esperado en el número de contenedores. Por ejemplo, si la serie está en 1 - h 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.
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:

  • baseline: el valor previsto de la serie (suma de los componentes estacionales y de tendencia, vea a continuación).
  • seasonal: la serie del componente estacional:
    • si el período no se detecta o se establece explícitamente en 0: constante 0.
    • si se detecta o se establece en un entero positivo: mediana de los puntos de la serie en la misma fase
  • trend: la serie del componente de tendencia.
  • residual: la serie del componente residual (es decir, x - línea base).

Nota

  • Orden de ejecución de componentes:
  1. Extracción de la serie estacional
  2. Resta de x, generando la serie deseasonal
  3. Extracción del componente de tendencia de la serie deseasonal
  4. Creación de la línea base = estacional + tendencia
  5. Creación del valor residual = x : línea base
  • Se debe habilitar la estacionalidad o la tendencia. De lo contrario, la función es redundante y simplemente devuelve la línea base = 0 y residual = x.

Más información sobre la descomposición de series

Este método se suele aplicar a la serie temporal de métricas esperadas para manifestar el comportamiento periódico o de tendencia. Puede usar el método para predecir valores futuros de métricas o detectar valores anómalos. La suposición implícita de este proceso de regresión es que, aparte del comportamiento estacional y de tendencia, la serie temporal se distribuye estocástica y aleatoriamente. Previsión de los valores futuros de métricas de los componentes estacionales y de tendencia al omitir la parte residual. Detecte valores anómalos basados en la detección de valores atípicos solo en la parte residual. Encontrará más detalles en el capítulo Descomposición de serie temporal.

Ejemplos

Estacionalidad semanal

En el ejemplo siguiente, se genera una serie con estacionalidad semanal y sin tendencia, a continuación, se agregan algunos valores atípicos. series_decompose busca y detecta automáticamente la estacionalidad y genera una línea base casi idéntica al componente estacional. Los valores atípicos que agregamos se pueden ver claramente en el componente residual.

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(y)
| render timechart  

Serie descompone 1.

Estacionalidad semanal con tendencia

En este ejemplo, se agrega una tendencia a la serie del ejemplo anterior. En primer lugar, se ejecuta series_decompose con los parámetros predeterminados. El valor predeterminado de tendencia avg solo toma el promedio y no calcula la tendencia. La línea base generada no contiene la tendencia. Al observar la tendencia en los valores residuales, se vuelve evidente que este ejemplo es menos preciso que el ejemplo anterior.

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(y)
| render timechart  

Serie descompone 2.

A continuación, se vuelve a ejecutar el mismo ejemplo. Dado que esperamos una tendencia en la serie, se especifica linefit en el parámetro de tendencia. Podemos ver que se detecta la tendencia positiva y la línea base está mucho más cerca de la serie de entrada. Los valores residuales están cerca de cero y solo los valores atípicos destacan. Podemos ver todos los componentes de la serie en el gráfico.

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(y, -1, 'linefit')
| render timechart  

Serie descompone 3.