Introduction

A detecção precoce de anomalias desempenha um papel fundamental na prevenção de acidentes, organização comercial, assim como em detecção em segurança da informação.

Estamos avaliando um dataset fornecido pelo Twitter, o pacote R também foi desenvolvido por eles. Este pacote nos ajuda a monitorar os picos no envolvimento do usuário na plataforma em torno de feriados, grandes eventos esportivos ou durante as últimas notícias.

Além dos aumentos no envolvimento social, fatores exógenos - como bots ou spammers - podem causar uma anomalia no número de favoritos ou seguidores. O pacote pode ser usado para encontrar esses bots ou spam, bem como detectar anomalias nas métricas do sistema após uma nova versão de software. Estamos usando o AnomalyDetection porque queremos que a comunidade pública desenvolva o pacote e aprenda com ele como temos.

Como funciona esse pacote

O algoritmo principal, Seasonal Hybrid ESD (S-H-ESD), baseia-se no teste ESD generalizado para a detecção de anomalias. A S-H-ESD pode ser utilizada para detectar anomalias globais e locais. Isto é conseguido empregando-se a decomposição de séries de tempo e usando métricas estatísticas robustas, como por exemplo, Mediana junto com ESD. Além disso, para longas séries temporais, tais como 6 meses de dados minuciosos, o algoritmo emprega a aproximação por partes. Isso está enraizado no fato de que a extração de tendência na presença de anomalias não é trivial para a detecção de anomalias.

ESD - Em 9 de janeiro de 2015, a equipe de engenharia do Twitter lançou outro pacote Open Source R muito interessante para trabalhar com dados de séries temporais:

“AnomalyDetection” - Este pacote utiliza o algoritmo ESD (S-H-ESD) para identificar anomalias locais (= variações dentro de padrões sazonais) e anomalias globais (= variações que não podem ser explicadas com padrões sazonais).

Iniciando o código

Uma função para verificar se os pacotes necessários estão instalados. Ao final, as bibliotecas são carregadas.

is.installed <- function(mypkg) is.element(mypkg, installed.packages()[,1]) 

if(!is.installed("devtools"))
        install.packages("devtools", dep = TRUE)

if(!is.installed("AnomalyDetection"))
        devtools::install_github("twitter/AnomalyDetection")

if(!is.installed("stringi"))
        install.packages("stringi")

if(!is.installed("magrittr"))
        install.packages("magrittr")

library("devtools")
library("AnomalyDetection")

Recomenda-se ao usuário usar o conjunto de dados de exemplo que acompanha os pacotes. Execute os seguintes comandos:

data(raw_data)
res = AnomalyDetectionTs(raw_data, max_anoms=0.02, direction='both', plot=TRUE)
res$plot

A partir da trama, podemos dizer que a série de tempo de entrada com as experiências, tanto anomalias positivas e negativas. Além disso, muitas das anomalias das séries temporais são anomalias locais dentro dos limites da sazonalidade da série temporal.

Portanto, essas anomalias não podem ser detectadas usando os métodos tradicionais. As anomalias detectadas utilizando a técnica proposta são anotadas na plotagem. Caso os timestamps para o gráfico acima não estivessem disponíveis, a detecção de anomalias poderia ser realizada usando a função AnomalyDetectionVec. Especificamente, você pode usar o seguinte comando:

AnomalyDetectionVec(raw_data[,2], max_anoms=0.02, period=1440, 
                    direction='both', only_last=FALSE, plot=TRUE)
## $anoms
##     index    anoms
## 1     125  21.3510
## 2    5320 193.1036
## 3    6224 148.1740
## 4    7426  52.7478
## 5    7428  49.6582
## 6    7430  35.6067
## 7    7431  32.5045
## 8    7432  30.0555
## 9    7433  31.2614
## 10   7434  30.2551
## 11   7435  27.3860
## 12   7436  28.9807
## 13   7437  29.0844
## 14   7438  26.9185
## 15   7439  26.4621
## 16   7440  27.2180
## 17   7441  40.4268
## 18   7442  28.8811
## 19   7443  27.1294
## 20   7444  26.9913
## 21   7445  26.7741
## 22   7446  30.6972
## 23   7447  27.6085
## 24   7448  25.2841
## 25   7449  25.2264
## 26   7450  25.1927
## 27   7451  27.6501
## 28   7452  24.8858
## 29   7453  24.8099
## 30   7454  24.2950
## 31   7455  24.5221
## 32   7456  26.7354
## 33   7457  24.7589
## 34   7458  25.6300
## 35   7459  24.6949
## 36   7460  23.6518
## 37   7461  27.6977
## 38   7462  25.8687
## 39   7463  24.6654
## 40   7464  24.6694
## 41   7465  24.4351
## 42   7466  25.7723
## 43   7467  24.2502
## 44   7468  25.0965
## 45   7469  23.9362
## 46   7470  24.4127
## 47   7471  32.8182
## 48   7472  27.4586
## 49   7473  26.3163
## 50   7474  30.3965
## 51   7475  26.9516
## 52   7476  26.8908
## 53   7477  28.9461
## 54   7478  28.9742
## 55   7479  30.0406
## 56   7480  28.8507
## 57   7481  32.7811
## 58   7482  27.7468
## 59   7483  30.8174
## 60   7484  28.5658
## 61   7485  27.6677
## 62   7486  31.0409
## 63   7576 154.7750
## 64   7577 148.8620
## 65   7583 165.7870
## 66   7584 167.5850
## 67   7585 170.3490
## 68   7586 180.8990
## 69   7587 170.5130
## 70   7588 174.6780
## 71   7589 164.7350
## 72   7590 178.8220
## 73   7591 198.3260
## 74   7592 203.9010
## 75   7593 200.3090
## 76   7594 178.4910
## 77   7595 167.7480
## 78   7596 183.0180
## 79   7597 176.7690
## 80   7598 186.8230
## 81   7599 183.6600
## 82   7600 179.2760
## 83   7601 197.2830
## 84   7602 191.0970
## 85   7603 194.6700
## 86   7604 177.3250
## 87   7605 173.7580
## 88   7606 200.8160
## 89   7607 186.2350
## 90   7608 185.4210
## 91   7609 178.9580
## 92   7610 171.7500
## 93   7611 203.2310
## 94   7612 181.3540
## 95   7613 186.7780
## 96   7614 175.5820
## 97   7615 176.1250
## 98   7616 181.5140
## 99   7617 175.2610
## 100  7618 164.7190
## 101  7621 170.7360
## 102  7622 151.5490
## 103  7623 149.4120
## 104  7624 150.5540
## 105  7626 149.5410
## 106 10640 188.2908
## 107 13632  56.4691
## 108 13633  54.9415
## 109 13634  52.0359
## 110 13635  47.7313
## 111 13636  50.5876
## 112 13637  48.2846
## 113 13638  44.6438
## 114 13639  42.3077
## 115 13640  38.8363
## 116 13641  41.0145
## 117 13642  39.5523
## 118 13643  38.9117
## 119 13644  37.3052
## 120 13645  36.1725
## 121 13646  37.5150
## 122 13647  38.1387
## 123 13648  39.5351
## 124 13649  38.1834
## 125 13650  37.5988
## 126 13651  43.6522
## 127 13652  47.9571
## 128 14348 210.0000
## 129 14358  40.0000
## 130 14368 250.0000
## 131 14378  40.0000
## 
## $plot

Frequentemente, a detecção de anomalias é efectuada em uma base periódica. Por exemplo, você pode estar interessado em determinar se houve alguma anomalia ontem. Para este fim, apoiamos uma flag only_last onde se pode subconjugar as anomalias que ocorreram durante o último dia ou última hora. O seguite comando:

res = AnomalyDetectionTs(raw_data, max_anoms=0.02, direction='both', 
                         only_last="day", plot=TRUE)
res$plot

A partir do gráfico acima, observamos que apenas as anomalias ocorridas durante o último dia foram anotadas. Além disso, os seis dias anteriores são incluídos para expor a natureza sazonal da série de tempo, mas são colocados no fundo como a janela de interesse principal é o último dia.

A detecção de anomalias para séries temporais de longa duração pode ser realizada configurando o argumento de longo prazo para T. Um gráfico de exemplo correspondente a este (para um conjunto de dados diferente) é mostrado abaixo:

res = AnomalyDetectionTs(raw_data, max_anoms=0.02, direction='both', longterm = T,
                         plot=TRUE)
res$plot

.

The Scientist