Dieser Artikel wurde im Rahmen der Data Science Blogathon.
Einführung
Erkennung von Zeitreihenanomalien
Der gesamte Prozess der Anomalieerkennung für eine ZeitreiheEine Zeitreihe ist eine Reihe von Daten, die zu aufeinanderfolgenden Zeitpunkten gesammelt oder gemessen werden, in der Regel in regelmäßigen Zeitabständen. Diese Art der Analyse ermöglicht es Ihnen, Muster zu erkennen, Trends und Zyklen in Daten im Zeitverlauf. Seine Anwendung ist breit gefächert, in Bereichen wie Wirtschaft, Meteorologie und öffentliche Gesundheit, Erleichterung von Vorhersagen und Entscheidungsfindung auf der Grundlage historischer Informationen.... findet statt in 3 Schritte:
- Zerlegen Sie die Zeitreihe in die zugrunde liegenden Variablen; Trend, Saisonalität, Rückstand.
- Erstellen Sie obere und untere Schwellenwerte mit einem bestimmten Schwellenwert
- 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)
Datenverarbeitung
Bevor wir einen Anomaliealgorithmus auf die Daten anwenden können, wir müssen es in ein Datumsformat ändern.
La columna ‚mein‘ 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)
# 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)
Usando el paquete ‚anomalisieren‘
El paquete R ‚anomalisieren‘ 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()
Anomalien anzeigen
Wir können die Anomalien dann mit dem plot_anomalien () Funktion.
df_anomalized %>% plot_anomalien(ncol = 3, alpha_dots = 0.75)
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
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()
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 Einstellung der ParameterDas "Parameter" sind Variablen oder Kriterien, die zur Definition von, ein Phänomen oder System zu messen oder zu bewerten. In verschiedenen Bereichen wie z.B. Statistik, Informatik und naturwissenschaftliche Forschung, Parameter sind entscheidend für die Etablierung von Normen und Standards, die die Datenanalyse und -interpretation leiten. Ihre richtige Auswahl und Handhabung sind entscheidend, um genaue und relevante Ergebnisse in jeder Studie oder jedem Projekt zu erhalten.... erfolgt durch Anpassen der Parameter entsprechend. 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
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()
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
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()
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')
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
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
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
Usando el paquete ‚timetk‘
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)
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')
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.