Detecção de anomalia de séries temporais com Python

9

Preciso implementar a detecção de anomalias em vários conjuntos de dados de séries temporais. Eu nunca fiz isso antes e estava esperando por alguns conselhos. Estou muito confortável com o python, então prefiro que a solução seja implementada (a maior parte do meu código é python para outras partes do meu trabalho).

Descrição dos dados: são dados de séries temporais mensais que apenas começaram a ser coletados nos últimos 2 anos (ou seja, apenas 24 a 36 períodos). Essencialmente, existem várias métricas sendo monitoradas mensalmente para vários clientes.

time_period    client    metric    score
01-2013        client1   metric1   100
02-2013        client1   metric1   119
01-2013        client2   metric1   50
02-2013        client2   metric2   500
...

Aqui está o que estou pensando: coloque dados em um dataframe (pandas) e calcule uma média móvel de 6 meses para cada par cliente / métrica. Se o valor do período atual exceder algum limite com base na média de 6 meses, aumente o sinalizador. O problema parece bastante simples. Eu só quero ter certeza de que estou adotando uma abordagem sólida.

Qualquer conselho para aprofundar um pouco essa idéia seria muito apreciado. Eu sei que a pergunta é um pouco abstrata, e peço desculpas por isso.

Eric Miller
fonte
Eu não sei o caminho python, mas esta questão está cheio de ideias sobre as abordagens gerais: stats.stackexchange.com/questions/26688/...
rapaio
pypi.org/project/anomaly-detection Isso é construído na biblioteca para detecção de anomalias em python, que é semelhante à detecção de anomalias do twitter. Como o código de detecção de anomalias do twitter está na linguagem R. Seu problema é anomalia contextual. Auto.arima model too
saravanan saminathan

Respostas:

1

Penso que uma abordagem semelhante ao controle estatístico de processos , com gráficos de controle etc. pode ser útil aqui.

babelproofreader
fonte
Eu vou ler isso. Esse método é bom para séries temporais com pequenas quantidades de dados (ou seja, 24 meses)?
Eric Miller
terminou de ler a maior parte. De acordo com esse método, devo calcular o terceiro desvio padrão para as séries temporais e traçar uma linha com esses limites. Se um valor exceder esses limites, sinalize-o. Este é um método que eu havia considerado.
Eric Miller
1

Existem muitas opções para a detecção de anomalias, desde um desvio padrão usando a função de desvio padrão do Pandas até um método bayesiano e muitos métodos de aprendizado de máquina, como: clustering, SVM, processo Gaussian, redes neurais.

Dê uma olhada neste tutorial: https://www.datascience.com/blog/python-anomaly-detection

De uma perspectiva bayesiana, recomendo o Profeta do Facebook. Dá resultados muito avançados sem a necessidade de ser um especialista em séries temporais. Possui opções para trabalhar meses, dias, etc., e "intervalos de incerteza" ajudam com anomalias.

Por fim, eu recomendo este blog do Uber sobre o uso de redes neurais (LSTM) para detecção de anomalias; ele tem informações muito úteis: https://eng.uber.com/neural-networks/

Germán Alfaro
fonte
0

Se você deseja assumir que seu conjunto de dados é normalmente distribuído, é possível estimar quantis dessa distribuição e ver se ele fica fora, por exemplo, 95%, 80%, etc. Não estou muito familiarizado com as bibliotecas Python, mas tenho certeza de que já existem funções criadas para isso.

Kevin Pei
fonte
Há uma tendência de alta para a maioria dos clientes. Não sei se você poderia chamar os dados aleatoriamente.
Eric Miller
2
Então não neste caso. Acredito que o método abaixo de mim e o seu funcionariam bem nessa situação. Eu fiz algo parecido com isso antes: faça uma média móvel do período X contínuo, subtraia o valor da métrica atual da média móvel. Encontre os limites do desvio padrão (ou use uma entrada subjetiva, se você souber neste cenário) desses resíduos e qualquer coisa acima ou abaixo desses limites pode ser considerada anomalia. Esse método funcionaria bem se um cliente subitamente visse um aumento na pontuação.
Kevin Pei