conceitos

Neste artigo, vamos examinar conceitos comuns com os quais trabalhamos na API Timeseries Insights e tentar fornecer uma explicação intuitiva sobre o que eles representam.

Evento

Um evento é um ponto de dados e a entrada bruta com que a API Timeseries Insights trabalha. Conceitualmente, ele representa uma ação realizada por algum agente (por exemplo, uma transação por um cliente ou a publicação de uma notícia) ou uma observação (por exemplo, as leituras de um sensor de temperatura ou o uso da CPU em uma máquina).

Um evento contém:

  • Um conjunto de valores em diferentes dimensões, representando propriedades que descrevem o evento, como rótulos ou medidas numéricas.
  • Carimbo de data/hora que representa a hora em que o evento ocorreu. Esse carimbo de data/hora será usado ao agregar eventos para formar uma série temporal.
  • Um código de group.

Dimensão

Uma dimensão representa um tipo de propriedade para os eventos em um conjunto de dados e o domínio dos valores que ele pode levar. Uma dimensão pode ser:

  • Categórico. Uma propriedade de evento nessa dimensão pode conter um dos valores limitados/finitos, geralmente strings. Por exemplo: o nome do país ou do editor em um conjunto de dados com matérias jornalísticas e o nome da máquina em um conjunto de dados com dados de monitoramento de produção.
  • Numérico. Uma medida ou uma propriedade numérica geral de um evento. Exemplos: número de visualizações de página para matérias, uso da CPU ou número de erros para dados de monitoramento de produção.

Conjunto de dados

Um conjunto de dados é uma coleção de eventos com um nome exclusivo em um projeto. As consultas são realizadas no mesmo conjunto de dados.

Grupo

Os eventos podem ser agrupados especificando o mesmo ID de grupo (consulte Event.groupId). O grupo é semelhante a uma "sessão" de atividades na Internet.

Geralmente, cada registro de Evento recebe um ID de grupo exclusivo. Os casos de uso de ID do grupo também incluem, entre outros:

  • Um identificador de evento para o mesmo evento (com carimbos de data/hora iguais ou semelhantes) de vários registros de Evento, principalmente quando diferentes propriedades do mesmo evento vêm de fontes diferentes e não são mescladas antes de entrar no sistema. Por exemplo, vários sensores que monitoram o mesmo dispositivo podem produzir um registro de evento separado.
  • Um identificador de sessão para uma coleção de eventos relacionados (normalmente com carimbos de data/hora dentro de um curto período). Um exemplo são as atividades em uma sessão de navegação na Web. Outro exemplo são as entradas de registro de uma corrida de táxi.
  • Um identificador de conta de usuário. Assim, todos os registros de Evento com o mesmo ID de grupo pertencem ao mesmo usuário.

O objetivo do grupo é calcular correlações entre (dimensões de) eventos do mesmo grupo. Por exemplo, se o conjunto de dados tiver dados de monitoramento (como CPU, RAM etc.), um grupo poderá conter todos os dados de monitoramento de um processo. Isso nos permitiria detectar que um aumento na CPU está correlacionado a outro evento, como uma atualização de versão binária em um momento anterior.

Se você não tiver certeza ou não tiver interesse em calcular esses tipos de correlações, cada evento precisará ter um ID de grupo globalmente exclusivo. A omissão de groupId tem um efeito semelhante, e uma groupId interna é gerada com base no conteúdo e no carimbo de data/hora.

Fração

Uma fração é o subconjunto de todos os eventos de um conjunto de dados que têm alguns valores fornecidos em algumas dimensões. Para uma dimensão categórica, o valor fornecido é um único valor fixo. Para uma dimensão numérica, o valor fornecido é um intervalo.

Por exemplo, vamos considerar que temos um conjunto de dados com as vendas de um varejista internacional, e cada evento é uma venda que tem estas dimensões categóricas: o país onde a venda ocorreu, o nome do produto, o nome da empresa que fez o produto. Exemplos de fatias neste caso são: todas as vendas de um determinado produto, todas as vendas de um determinado país para todos os produtos feitos por uma determinada empresa.

Série temporal

As série temporal com que trabalhamos são de tempo discreto, compostas por pontos em intervalos de tempo iguais. O comprimento dos intervalos de tempo entre pontos consecutivos de série temporal é chamado de granularidade da série temporal.

Uma série temporal é calculada da seguinte maneira:

  • Para uma determinada fração, colete todos os eventos no intervalo de tempo [detectionTime - TimeseriesParams.forecastHistory, detectionTime + granularity].
  • Agrupe esses eventos com base no carimbo de data/hora e na granularidade. Um evento E é atribuído a um ponto que começa no tempo T se E.eventTime estiver no intervalo de tempo [T, T + granularity].
  • Agregue, para cada ponto da série temporal, os eventos com base na dimensão numérica especificada como metric (TimeseriesParams.metric), que representa o valor desses pontos. A agregação pode ser feita por contagem (se nenhum metric for especificado, normalmente se todas as dimensões do evento forem categóricas), soma ou média (se metric for especificado).

Ponto da série temporal

Cada ponto da série temporal tem um tempo e um valor associados.

O tempo é, na verdade, um intervalo de duração granularity com time como o horário de início.

Se metric (TimeseriesParams.metric) for especificada, ela precisará ser uma dimensão numérica. O value do ponto é agregado dos valores de dimensão na dimensão metric de todos os eventos no período interno, usando TimeseriesParams.metricAggregationMethod.

Se nenhuma métrica for especificada, o value do ponto será o número de eventos no intervalo de tempo.

Previsão

Processo de previsão de valores futuros para uma determinada série temporal. A previsão usa a parte inicial da série temporal como dados de treinamento para criar um modelo.

Horizonte

Vamos prever os valores de uma série temporal do tempo de detecção até o horizonte (fornecido pelo campo ForecastParams.horizonTime).

Intuitivamente, esse campo nos diz quanto devemos prever no futuro. Embora estejamos mais interessados no valor do ponto de detecção ao classificar uma fração como uma anomalia, permitimos a previsão de pontos extras, já que isso pode fornecer informações úteis para o usuário.

Tempo e ponto da detecção

O tempo de detecção (especificado por QueryDataSetRequest.detectionTime) é o momento em que estamos analisando possíveis anomalias.

O ponto de detecção é o ponto da série temporal no momento da detecção.

Desvio esperado

Dependendo da estabilidade e da previsibilidade de uma série temporal, podemos ter menos ou mais confiança em nossa previsão. O nível de confiança é refletido no campo EvaluatedSlice.expectedDeviation, que especifica o que é um desvio absoluto aceitável do valor previsto para o tempo de detecção.

Anomalia

Uma fatia pode ser considerada uma anomalia se o desvio entre os valores previstos e os reais durante o tempo de detecção for maior do que esperamos que seja.

Chamamos o quão distante o desvio real está do desvio esperado de pontuação de anomalia:

anomalyScore = (detectionPointReal -detectionPointPredict) / expectedDeviation

Em geral, pontuações menores que 1,0 refletem variações que são comuns considerando o histórico da fração, enquanto pontuações maiores que 1,0 precisam exigir atenção, com pontuações mais altas representando anomalias mais graves.

Limite de ruído

A pontuação de anomalia definida anteriormente mostra a significância estatística de um desvio do normal. No entanto, em muitos casos, esse desvio pode não ser importante, porque a alteração no valor absoluto pode não ser relevante.

Por exemplo, se uma série temporal tiver todos os valores distribuídos de maneira uniforme no intervalo (9.9, 10.1), expectedDeviation será aproximadamente 0,1. Se detectionPointForecast for 10.0 e detectionPointActual for 10.3, anomalyScore será 3.0.

Se as alterações de valor absoluto forem mais importantes para você, o limite de ruído oferece uma maneira de penalizar fatias com alterações menores que esse limite, somando a pontuação de anomalia:

anomalyScore = (detectionPointReal -detectionPoint telas) / (expectedDeviation + noiseThreshold)

A seguir