Neste artigo, vamos abordar conceitos comuns com os quais trabalhamos na API Timeseries Insights e tentaremos 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 alguns agentes (por exemplo, uma transação de um cliente ou a publicação de um artigo de notícias) 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, que representam propriedades que descrevem o evento, como rótulos ou medições numéricas.
- Um carimbo de data/hora que representa o horário em que o evento ocorreu. Esse carimbo de data/hora será usado ao agregar eventos para formar uma série temporal.
- Um ID de grupo.
Dimensão
Uma dimensão representa um tipo de propriedade para os eventos em um conjunto de dados e o domínio de valores que ela pode ter. Uma dimensão pode ser:
- Categórica. Uma propriedade de evento nessa dimensão pode conter um dos valores limitados/limitados, geralmente strings. Exemplos incluem: o nome do país ou do editor em um conjunto de dados com artigos de notícias, o nome da máquina em um conjunto de dados com dados de monitoramento de produção.
- Numérico. Uma medição ou uma propriedade numérica geral de um evento. Exemplos: número de visualizações de página de artigos de notícias, 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 da Internet.
Normalmente, cada registro de evento recebe um ID de grupo exclusivo. Os casos de uso de ID de 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 propriedades diferentes do mesmo evento vêm de diferentes fontes 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 (geralmente com carimbos de data/hora em um curto período). Um exemplo é a atividade de uma sessão de navegação na Web. Outro exemplo são as entradas de registro de uma corrida de táxi.
- Um identificador da conta de usuário. 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 permitiria que detectássemos que um aumento na CPU está relacionado 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. Omitir groupId
tem um
efeito semelhante, e um groupId
interno é gerado com base no conteúdo e
no carimbo de data/hora.
Fração
Um recorte é o subconjunto de todos os eventos de um conjunto de dados que têm valores específicos 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, imagine 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 em que a venda ocorreu, o nome do produto e a empresa que o fez. Exemplos de fatias nesse 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 de pontos em intervalos de tempo iguais. A duração dos intervalos entre pontos de série temporal consecutivos é chamada de granularidade da série temporal.
Uma série temporal é calculada por:
- Para uma determinada fatia, 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 deles. 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
]. - Agrupe, para cada ponto da série temporal, os eventos com base na dimensão numérica especificada como métrica (
TimeseriesParams.metric
), que representa o valor desses pontos. A agregação pode ser feita por contagem (se nenhummetric
for especificado, normalmente se todas as dimensões do evento forem categóricas), soma ou média (semetric
for especificado).
Ponto da série temporal
Cada ponto da série temporal tem um tempo e um valor associados.
O tempo é um intervalo da duração granularity
com
time
como horário de início.
Se métrica (TimeseriesParams.metric
) for especificada, ela precisa ser uma dimensão numérica. O value
do ponto é agregado a partir dos valores de dimensão na dimensão metric
de todos os eventos no período, 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
É 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, começando pelo tempo de detecção até o horizonte temporal (fornecido pelo campo ForecastParams.horizonTime
).
Intuitivamente, esse campo informa o quanto no futuro devemos prever. Embora nosso interesse seja principalmente no valor do ponto de detecção ao classificar uma fatia como uma anomalia, permitimos que pontos extras sejam previstos, já que podem fornecer informações úteis para o usuário.
Horário e ponto de 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
mais ou menos confiança na nossa previsão. O nível de confiança é refletido no campo EvaluatedSlice.expectedDeviation
, que especifica o que é uma variação absoluta aceitável em relação ao valor previsto para o tempo de detecção.
Anomalia
Um recorte pode ser considerado uma anomalia se o desvio entre os valores previstos e reais durante o tempo de detecção for maior do que o esperado.
Chamamos de pontuação de anormalidade a distância entre o desvio real e o esperado:
anomalyScore = (detectionPointActual - detectionPointForecast) / expectedDeviation
Em geral, pontuações menores que 1,0 refletem variações comuns considerando o histórico do segmento, enquanto pontuações maiores que 1,0 precisam de atenção, com pontuações mais altas representando anomalias mais graves.
Limite de ruído
A pontuação de anormalidade, conforme definido anteriormente, mostra como um desvio é estatisticamente significativo em relação ao normal. No entanto, em muitos casos, esse desvio pode não ser importante, porque a mudança no valor absoluto pode não ser de interesse.
Por exemplo, se uma série temporal tiver todos os valores distribuídos uniformemente no intervalo (9,9, 10,1), o expectedDeviation
será de aproximadamente 0,1. Se o
detectionPointForecast
for 10.0 e o detectionPointActual
for 10.3,
o anomalyScore
será 3.0.
Se as mudanças maiores em valor absoluto forem mais importantes para você, o limite de ruído oferece uma maneira de penalizar fatias com mudanças menores que esse limite, reduzindo a pontuação de anomalia:
anomalyScore = (detectionPointActual - detectionPointForecast) / (expectedDeviation + noiseThreshold)
A seguir
- Siga as instruções de configuração para acesso total e crie seu próprio projeto.
- Um tutorial mais detalhado
- Saiba mais sobre a API REST.