Rileva anomalie nelle serie temporali utilizzando il pacchetto Anomalize in R

Contenuti

Questo articolo è stato pubblicato nell'ambito del Blogathon sulla scienza dei dati.

introduzione

Rilevamento anomalie serie temporali

Todo el proceso de detección de anomalías para una Serie storiche se lleva a cabo en 3 Passi:

  1. Scomporre le serie temporali nelle variabili sottostanti; Tendenza, stagionalità, residuo.
  2. Crea soglie superiore e inferiore con un valore di soglia
  3. Identificare come anomalie i punti dati che sono al di fuori delle soglie.

Argomento di studio

Scarichiamo il set di dati dal sito web del governo di Singapore che è facilmente accessibile. Consumo totale di elettricità nelle famiglie per tipo di abitazione. Il sito web dei dati del governo di Singapore si blocca abbastanza facilmente. Questo set di dati mostra il consumo totale di elettricità delle famiglie per tipo di abitazione (e GWh).

Gestito dall'Autorità per il mercato dell'energia

Frequenza annuale

Fonte (S) Autorità per il mercato dell'energia

Licenza Singapore Open Data License

Installa e carica i pacchetti R

In questo esercizio, lavoreremo con 2 Pacchetti chiave per il rilevamento di anomalie delle serie temporali in R: anomalo e temporizzazione. Questi richiedono che l'oggetto sia creato come una manciata di tempo, quindi caricheremo anche i pacchetti tibble. Per prima cosa installiamo e carichiamo queste librerie.

pacchetto <- C('tidyverso','tibbletime','anomalizzare','orario')
install.packages(pacchetto)
biblioteca(ordinatoverso)
biblioteca(tibbletime)
biblioteca(anomalizzare)
biblioteca(temporizzazione)

Caricare dati

Nel passaggio precedente, abbiamo scaricato il file dei consumi elettrici totali per tipologia di abitazione (e GWh) dal sito web del governo di Singapore. Carichiamo il file CSV in un frame di dati R.

df <- leggi.csv("C:Rilevamento anomalie in Rtotale-consumo-elettricità-domestico.csv")
testa(df,5)
19390testa5-2325059

Elaborazione dati

Prima di poter applicare qualsiasi algoritmo di anomalia ai dati, dobbiamo cambiarlo in un formato di data.

La colonna 'mese’ è originariamente in formato fattoriale con molti livelli. Convertiamolo in un tipo di data e selezioniamo solo le colonne pertinenti nel frame di dati.

str(df)
28293str1-1705281
# Change Factor to Date format
df$month <- impasto(df$mese, "01", set="-")
# Select only relevant columns in a new dataframe
df$month <- asso. Dattero(df$mese,formato="%Y-%m-%d")
df <- df %>% Selezionare(mese,grembiule)
# Convert df to a tibble
df <- as_tibble(df)
classe(df)
72981TB-2708356

Utilizzo del pacchetto 'anomalize'’

Il pacchetto R' anomalize’ consente a un flusso di lavoro di rilevare anomalie nei dati. Le funzioni principali sono time_decompose (), anomalia (), e time_recompose ().

df_anomalized <- df %>%
    time_decompose(grembiule, merge = VERO) %>%
    anomalizzare(resto) %>%
    time_recompose()
df_anomalized %>% Intravedere()
60673anomalia2-5250021

Visualizza le anomalie

Possiamo quindi visualizzare le anomalie utilizzando il trama_anomalie () funzione.

df_anomalized %>% trama_anomalie(ncol = 3, punti_alpha = 0.75)
56872visivo1-5145610

Regolazione dell'andamento e della stagionalità

Con anomalize, è facile apportare modifiche perché tutto è fatto con una data o un timestamp, in modo da poter selezionare in modo intuitivo gli incrementi per i periodi di tempo che hanno senso (ad esempio, "5 minuti" o "1 mese").
Primo, nota che una frequenza e una tendenza sono state selezionate automaticamente per noi. Questo è di progettazione. La frequenza degli argomenti = “auto” e tendenza = “auto” sono i valori predefiniti. Possiamo visualizzare questa scomposizione usando plot_anomaly_decomposition ().

p1 <- df_anomalized %>%
    plot_anomaly_decomposition() +
    ggtitle("Freq/Trend = 'auto'")
p1
21584visual2-3468737

Quando è usato “auto”, get_time_scale_template () viene utilizzato per determinare la frequenza logica e gli intervalli di tendenza in base alla scala dei dati. Puoi scoprire la logica:

get_time_scale_template()
91841scala-8982421

Ciò implica che se la scala è 1 giorno (il che significa che la differenza tra ciascun punto dati è 1 giorno), quindi la frequenza sarà 7 giorni (oh 1 settimana) e la tendenza sarà in giro 90 giorni (oh 3 mesi). Questa logica può essere facilmente regolata in due modi: Impostazione dei parametri locali e dei parametri globali.

Regolazione dei parametri locali

El ajuste de los parametri locales se realiza ajustando los parámetros en función. Prossimo, adeguiamo la tendenza = “2 settimane”, il che lo rende una tendenza piuttosto sovradimensionata.

p2 <- df %>%
    time_decompose(grembiule,
                   frequenza = "auto",
                   tendenza = "2 settimane") %>%
    anomalizzare(resto) %>%
    plot_anomaly_decomposition() +
    ggtitle("Tendenza = 2 Settimane (Locale)")
# Show plots
p1
p2
11669P1-8266744
77435P2-2213890

Impostazione del parametro globale

Possiamo anche regolare globalmente usando set_time_scale_template () per aggiornare il modello predefinito a quello che preferiamo. Cambieremo la tendenza da “3 mesi” un “2 settimane” per la scala temporale = “giorno”. Usare time_scale_template () per recuperare il modello di timeline con cui inizia l'anomalia, muto () il campo di tendenza nella posizione desiderata e utilizzare set_time_scale_template () per aggiornare il modello nelle opzioni globali. Possiamo recuperare il modello aggiornato usando get_time_scale_template () per verificare che la modifica sia stata eseguita correttamente.

time_scale_template() %>%
    mutare(trend = ifelse(time_scale == "giorno", "2 settimane", tendenza)) %>%
    set_time_scale_template()
get_time_scale_template()
28118scala1-9995578

Finalmente, possiamo rieseguire il time_decompose () con valori predefiniti, e possiamo vedere che la tendenza è "2 settimane".

p3 <- df %>%
    time_decompose(grembiule) %>%
    anomalizzare(resto) %>%
    plot_anomaly_decomposition() +
    ggtitle("Tendenza = 2 Settimane (Globale)")
p3
64670p3-5409161

Ripristina i valori predefiniti del modello della timeline ai valori predefiniti originali.

time_scale_template() %>%
    set_time_scale_template()
# Verify the change
get_time_scale_template()
60668scala3-1542898

Estrarre i punti dati anomali

Ora, possiamo estrarre i punti dati effettivi che sono anomalie. Per quello, È possibile eseguire il codice riportato di seguito.

df %>% 
  time_decompose(grembiule) %>%
  anomalizzare(resto) %>%
  time_recompose() %>%
  filtro(anomalia == 'Sì')
75590estratto-2851353

Regolazione di alfa e valori massimi

il alfa e max_anoms sono i due parametri che controllano la proprietà anomalia () funzione. h

Alfa

Possiamo regolare l'alfa, impostato su 0.05 predefinito. Per impostazione predefinita, le bande coprono solo l'esterno dell'intervallo.

p4 <- df %>%
    time_decompose(grembiule) %>%
    anomalizzare(resto, alfa = 0.05, max_anoms = 0.2) %>%
    time_recompose() %>%
    trama_anomalie(time_recomposed = VERO) +
    ggtitle("alfa = 0.05")
#> frequenza = 7 days
#> tendenza = 91 days
p4
27149alfa-6207278

Se diminuiamo l'alfa, aumenta le bande, il che rende più difficile essere un outlier. Qui, puoi vedere che le band sono diventate due volte più grandi.

P5 <- df %>%
    time_decompose(grembiule) %>%
    anomalizzare(resto, alfa = 0.025, max_anoms = 0.2) %>%
    time_recompose() %>%
    trama_anomalie(time_recomposed = VERO) +
    ggtitle("alfa = 0.05")
#> frequenza = 7 days
#> tendenza = 91 days
p5
56330alfa1-1407642

Max Anoms

il max_anoms Il parametro viene utilizzato per controllare la percentuale massima di dati che possono essere un'anomalia. Regoliamo alfa = 0.3 in modo che praticamente qualsiasi cosa sia un'anomalia. Ora proviamo un confronto tra max_anoms = 0.2 (20% di anomalie consentite) e max_anoms = 0.05 (5% di anomalie consentite).

P6 <- df %>%
    time_decompose(grembiule) %>%
    anomalizzare(resto, alfa = 0.3, max_anoms = 0.2) %>%
    time_recompose() %>%
    trama_anomalie(time_recomposed = VERO) +
    ggtitle("20% Anomalie")
#> frequenza = 7 days
#> tendenza = 91 days
p7 <- df %>%
    time_decompose(grembiule) %>%
    anomalizzare(resto, alfa = 0.3, max_anoms = 0.05) %>%
    time_recompose() %>%
    trama_anomalie(time_recomposed = VERO) +
    ggtitle("5% Anomalie")
#> frequenza = 7 days
#> tendenza = 91 days
p6
p7
71948P6-8379584
12358P7-2416558

Utilizzo del pacchetto 'timetk’

È un toolkit per lavorare con serie temporali in R, per tracciare, discutere e presentare i dati delle serie temporali degli ingegneri per fare previsioni e previsioni di machine learning.

Visualizzazione interattiva delle anomalie

Qui, timetk La funzione plot_anomaly_diagnostics () consente di modificare alcuni dei parametri al volo.

df %>% temporizzazione::plot_anomaly_diagnostics(mese,grembiule, .facet_ncol = 2)
78486nuovografico-2216213

Rilevamento interattivo delle anomalie

Per trovare i punti dati esatti che sono anomalie, noi usiamo tk_anomaly_diagnostics () funzione.

df %>% temporizzazione::tk_anomaly_diagnostics(mese, grembiule) %>% filtro(anomalia=='Sì')
90009Rileva-8672121

conclusione

In questo articolo, abbiamo visto alcuni dei pacchetti popolari in R che possono essere utilizzati per identificare e visualizzare le anomalie in una serie temporale. Per fornire un po' di chiarezza sulle tecniche di rilevamento delle anomalie in R, abbiamo fatto un caso di studio su un set di dati pubblicamente disponibile. Esistono altri metodi per rilevare valori anomali e possono anche essere esplorati.

Iscriviti alla nostra Newsletter

Non ti invieremo posta SPAM. Lo odiamo quanto te.