Erkennen von Zeitreihenanomalien mit dem Anomalize-Paket in R

Teilen auf Facebook
Teilen auf twittern
Teilen auf verlinktin
Teilen auf Telegramm
Teilen auf WhatsApp

Inhalt

Dieser Artikel wurde im Rahmen der Data Science Blogathon.

Einführung

Erkennung von Zeitreihenanomalien

Der gesamte Anomalieerkennungsprozess für eine Zeitreihe erfolgt in 3 Schritte:

  1. Zerlegen Sie die Zeitreihe in die zugrunde liegenden Variablen; Trend, Saisonalität, Rückstand.
  2. Erstellen Sie obere und untere Schwellenwerte mit einem bestimmten Schwellenwert
  3. Identifizieren Sie Datenpunkte, die außerhalb der Schwellenwerte liegen, als Anomalien.

Fallstudie

Laden wir den Datensatz von der leicht zugänglichen Website der Regierung von Singapur herunter. Gesamtstromverbrauch der Haushalte nach Wohnungstyp. Daten-Website der Regierung von Singapur stürzt ganz leicht ab. Dieser Datensatz zeigt den Gesamtstromverbrauch der Haushalte nach Wohnungstyp (und GWh).

Verwaltet von der Energiemarktaufsicht

Jährliche Frequenz

Quelle (S) Energiemarktaufsicht

Singapur Open Data License License

R-Pakete installieren und laden

In dieser Übung, wir werden mit arbeiten 2 Schlüsselpakete für die Erkennung von Zeitreihenanomalien in R: anomal Ja timetk. Diese erfordern, dass das Objekt als Tibble der Zeit erstellt wird, also laden wir auch die tibble pakete. Lassen Sie uns zuerst diese Bibliotheken installieren und laden.

pkg <- C('aufgeräumt','Tibbletime','anomalisieren','Uhrzeit')
install.pakete(pkg)
Bücherei(ordentlichversum)
Bücherei(tibbletime)
Bücherei(anomalisieren)
Bücherei(timetk)

Lade Daten

Im vorherigen Schritt, Wir haben die Datei mit dem Gesamtstromverbrauch nach Haustyp heruntergeladen (und GWh) von der Website der Regierung von Singapur. Laden wir die CSV-Datei in einen R-Datenrahmen.

df <- lesen.csv("C:Anomalieerkennung in Rtotal-household-electricity-consumption.csv")
Kopf(df,5)
19390Kopf5-2325059

Datenverarbeitung

Bevor wir einen Anomaliealgorithmus auf die Daten anwenden können, wir müssen es in ein Datumsformat ändern.

Die Spalte „Monat“’ ist ursprünglich im faktoriellen Format mit vielen Ebenen. Lassen Sie es uns in einen Datumstyp konvertieren und nur die relevanten Spalten im Datenrahmen auswählen.

str(df)
28293str1-1705281
# Faktor in Datumsformat ändern
df$Monat <- Einfügen(df$Monat, "01", sep="-")
# Wählen Sie nur relevante Spalten in einem neuen Datenrahmen aus
df$Monat <- as.Datum(df$Monat,format="%Y-%m-%d")
df <- df %>% auswählen(Monat,Gesamt)
# Konvertieren Sie df in ein Tibble
df <- as_tibble(df)
Klasse(df)
72981tb-2708356

Verwenden des „anomalize-Pakets“’

Das R-Paket „anomalize“’ ermöglicht einem Workflow, Datenanomalien zu erkennen. Die Hauptfunktionen sind time_decompose (), Anomalie (), Ja time_recompose ().

df_anomalized <- df %>%
    time_decompose(Gesamt, zusammenführen = WAHR) %>%
    anomalisieren(Rest) %>%
    time_recompose()
df_anomalized %>% Blick()
60673Anomalie2-5250021

Anomalien anzeigen

Wir können die Anomalien dann mit dem plot_anomalien () Funktion.

df_anomalized %>% plot_anomalien(ncol = 3, alpha_dots = 0.75)
56872visual1-5145610

Trend- und Saisonbereinigung

Mit anomalisieren, Es ist einfach, Anpassungen vorzunehmen, da alles mit Datums- oder Zeitstempelinformationen erfolgt, so können Sie für sinnvolle Zeiträume intuitiv Inkremente auswählen (zum Beispiel, "5 Minuten" oder "1 Monat").
Zuerst, Beachten Sie, dass für uns automatisch eine Frequenz und ein Trend ausgewählt wurden. Das ist beabsichtigt. Die Argumente Häufigkeit = “Auto” und Trend = “Auto” sind die Standardwerte. Wir können diese Zerlegung visualisieren mit plot_anomaly_decomposition ().

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

Wenn es verwendet wird “Auto”, get_time_scale_template () verwendet, um die logischen Frequenz- und Trendintervalle basierend auf der Skala der Daten zu bestimmen. Sie können die Logik entdecken:

get_time_scale_template()
91841Skala-8982421

Dies impliziert, dass, wenn die Skala 1 Tag (was bedeutet, dass die Differenz zwischen jedem Datenpunkt 1 Tag), dann ist die frequenz 7 Tage (Ö 1 Woche) und der Trend wird rund sein 90 Tage (Ö 3 Monate). Diese Logik kann auf zwei Arten leicht angepasst werden: lokale Parametereinstellung und globale Parametereinstellung.

Einstellen der lokalen Parameter

Die Anpassung der lokalen Parameter erfolgt durch Anpassung der Parameter nach. Dann, Wir passen den Trend an = “2 Wochen”, was für einen ziemlich Overfitting-Trend sorgt.

p2 <- df %>%
    time_decompose(Gesamt,
                   Frequenz = "Auto",
                   Trend = "2 Wochen") %>%
    anomalisieren(Rest) %>%
    plot_anomaly_decomposition() +
    ggtitle("Trend = 2 Wochen (Lokal)")
# Grundstücke anzeigen
p1
p2
11669p1-8266744
77435p2-2213890

Globale Parametereinstellung

Wir können auch global anpassen mit set_time_scale_template () um die Standardvorlage auf eine von uns bevorzugte zu aktualisieren. Wir werden den Trend ändern von “3 Monate” ein “2 Wochen” für die Zeitskala = “Tag”. Benutzen time_scale_template () um die Timeline-Vorlage abzurufen, mit der die Anomalie beginnt, stumm () das Trendfeld an der gewünschten Stelle und verwenden set_time_scale_template () um die Vorlage in den globalen Optionen zu aktualisieren. Wir können die aktualisierte Vorlage abrufen mit get_time_scale_template () um zu überprüfen, ob die Änderung korrekt ausgeführt wurde.

time_scale_template() %>%
    mutieren(Trend = sonst(time_scale == "Tag", "2 Wochen", Trend)) %>%
    set_time_scale_template()
get_time_scale_template()
28118Maßstab1-9995578

Schließlich, wir können das wiederholen time_decompose () mit Standardwerten, und wir können sehen, dass der Trend "2 Wochen" ist.

p3 <- df %>%
    time_decompose(Gesamt) %>%
    anomalisieren(Rest) %>%
    plot_anomaly_decomposition() +
    ggtitle("Trend = 2 Wochen (Global)")
p3
64670p3-5409161

Lassen Sie uns die Standardeinstellungen der Timeline-Vorlage auf die ursprünglichen Standardeinstellungen zurücksetzen.

time_scale_template() %>%
    set_time_scale_template()
# Überprüfen Sie die Änderung
get_time_scale_template()
60668Skala3-1542898

Extrahieren Sie die anomalen Datenpunkte

Jetzt, wir können die tatsächlichen Datenpunkte extrahieren, die Anomalien sind. Dafür, Sie können den folgenden Code ausführen.

df %>% 
  time_decompose(Gesamt) %>%
  anomalisieren(Rest) %>%
  time_recompose() %>%
  Filter(Anomalie == 'Ja')
75590extrahieren-2851353

Anpassen von Alpha- und Max-Anoms

das alfa Ja max_anoms sind die beiden Parameter, die die Anomalie () Funktion. h

Alfa

Wir können das Alpha anpassen, die in konfiguriert ist 0.05 Ursprünglich. Standardmäßig, die Bänder decken nur das Äußere des Sortiments ab.

p4 <- df %>%
    time_decompose(Gesamt) %>%
    anomalisieren(Rest, alpha = 0.05, max_anoms = 0.2) %>%
    time_recompose() %>%
    plot_anomalien(time_recomposed = WAHR) +
    ggtitle("alpha = 0.05")
#> Frequenz = 7 Tage
#> Trend = 91 Tage
p4
27149alpha-6207278

Wenn wir das Alpha verringern, Erhöhen Sie die Bänder, Was macht es schwieriger, ein Ausreißer zu sein?. Hier, man sieht, dass die Bands doppelt so groß geworden sind.

p5 <- df %>%
    time_decompose(Gesamt) %>%
    anomalisieren(Rest, alpha = 0.025, max_anoms = 0.2) %>%
    time_recompose() %>%
    plot_anomalien(time_recomposed = WAHR) +
    ggtitle("alpha = 0.05")
#> Frequenz = 7 Tage
#> Trend = 91 Tage
p5
56330alpha1-1407642

Max Anoms

das max_anoms Der Parameter wird verwendet, um den maximalen Prozentsatz der Daten zu steuern, die eine Anomalie sein können. Setzen wir Alpha = 0.3 so dass so ziemlich alles ein Ausreißer ist. Versuchen wir nun einen Vergleich zwischen max_anoms = 0.2 (20% erlaubte Anomalien) y max_anoms = 0.05 (5% erlaubte Anomalien).

p6 <- df %>%
    time_decompose(Gesamt) %>%
    anomalisieren(Rest, alpha = 0.3, max_anoms = 0.2) %>%
    time_recompose() %>%
    plot_anomalien(time_recomposed = WAHR) +
    ggtitle("20% Anomalien")
#> Frequenz = 7 Tage
#> Trend = 91 Tage
p7 <- df %>%
    time_decompose(Gesamt) %>%
    anomalisieren(Rest, alpha = 0.3, max_anoms = 0.05) %>%
    time_recompose() %>%
    plot_anomalien(time_recomposed = WAHR) +
    ggtitle("5% Anomalien")
#> Frequenz = 7 Tage
#> Trend = 91 Tage
p6
p7
71948p6-8379584
12358p7-2416558

Verwenden des 'timetk-Pakets’

Es ist ein Toolkit für die Arbeit mit Zeitreihen in R, verfolgen, Diskussion und Präsentation von Zeitreihendaten von Ingenieuren, um Vorhersagen und Vorhersagen für maschinelles Lernen durchzuführen.

Interaktive Anzeige von Anomalien

Hier, timetks Die plot_anomaly_diagnostics-Funktion () ermöglicht es Ihnen, einige der Parameter im laufenden Betrieb zu ändern.

df %>% timetk::plot_anomaly_diagnostics(Monat,Gesamt, .facet_ncol = 2)
78486newplot-2216213

Interaktive Anomalieerkennung

Um die genauen Datenpunkte zu finden, bei denen es sich um Anomalien handelt, wir gebrauchen tk_anomaly_diagnostics () Funktion.

df %>% timetk::tk_anomaly_diagnostics(Monat, Gesamt) %>% Filter(Anomalie=='Ja')
90009erkennen-8672121

Fazit

In diesem Artikel, Wir haben einige der beliebten Pakete in R gesehen, die verwendet werden können, um Anomalien in einer Zeitreihe zu identifizieren und zu visualisieren. Um Klarheit über Anomalieerkennungstechniken in R . zu schaffen, wir haben eine Fallstudie zu einem öffentlich zugänglichen Datensatz durchgeführt. Es gibt andere Methoden, um Ausreißer zu erkennen und können ebenfalls untersucht werden.

Abonniere unseren Newsletter

Wir senden Ihnen keine SPAM-Mail. Wir hassen es genauso wie du.