Warum Zeitreihendaten einzigartig sind
Eine Zeitreihe ist eine Reihe zeitlich indizierter Datenpunkte. Die Tatsache, dass Zeitreihendaten geordnet sind, macht sie im Datenraum einzigartig, da sie häufig eine serielle Abhängigkeit aufweisen. Serielle Abhängigkeit tritt auf, wenn der Wert eines Datenpunkts zu einem Zeitpunkt statistisch von einem anderen Datenpunkt zu einem anderen Zeitpunkt abhängt. Diese Eigenschaft von Zeitreihendaten verstößt jedoch gegen eine der Grundannahmen vieler statistischer Analysen – dass Daten statistisch unabhängig sind.
Was ist Autokorrelation?
Autokorrelation ist eine Art serielle Abhängigkeit. Von Autokorrelation spricht man insbesondere, wenn eine Zeitreihe in linearer Beziehung zu einer verzögerten Version ihrer selbst steht. Im Gegensatz dazu liegt eine Korrelation einfach dann vor, wenn zwei unabhängige Variablen linear miteinander verknüpft sind.
Warum Autokorrelation wichtig ist
Einer der ersten Schritte bei jeder Datenanalyse ist oft die Durchführung einer Regressionsanalyse. Eine der Annahmen der Regressionsanalyse ist jedoch, dass die Daten keine Autokorrelation aufweisen. Dies kann frustrierend sein, denn wenn Sie versuchen, eine Regressionsanalyse für Daten mit Autokorrelation durchzuführen, wird Ihre Analyse irreführend sein.
Darüber hinaus basieren einige Zeitreihenvorhersagemethoden (insbesondere die Regressionsmodellierung) auf der Annahme, dass keine Autokorrelation vorliegtReste(der Unterschied zwischen dem angepassten Modell und den Daten). Menschen verwenden die Residuen häufig, um zu beurteilen, ob ihr Modell gut passt, und ignorieren dabei die Annahme, dass die Residuen keine Autokorrelation aufweisen (oder dass die Fehler unabhängig und identisch verteilt sind).i.i.d). Dieser Fehler kann Menschen dazu verleiten, zu glauben, dass ihr Modell gut passt, obwohl dies in Wirklichkeit nicht der Fall ist. Ich empfehle dringend, diesen Artikel darüber zu lesenWie man maschinelles Lernen (nicht) für die Zeitreihenvorhersage nutzt: Die Fallstricke vermeidenDarin zeigt der Autor, wie das immer beliebter werdende LSTM-Netzwerk (Long Short Term Memory) als hervorragender Prädiktor für univariate Zeitreihen erscheinen kann, obwohl es in Wirklichkeit nur eine Überanpassung an die Daten darstellt. Er erklärt weiter, dass dieses Missverständnis darauf zurückzuführen ist, dass Genauigkeitsmetriken aufgrund der Autokorrelation versagen.
Schließlich ist der vielleicht überzeugendste Aspekt der Autokorrelationsanalyse, wie sie uns dabei helfen kann, versteckte Muster in unseren Daten aufzudecken und die richtigen Prognosemethoden auszuwählen. Insbesondere können wir damit Saisonalität und Trends in unseren Zeitreihendaten identifizieren. Darüber hinaus ist die gemeinsame Analyse der Autokorrelationsfunktion (ACF) und der partiellen Autokorrelationsfunktion (PACF) erforderlich, um das geeignete ARIMA-Modell für Ihre Zeitreihenvorhersage auszuwählen.
So ermitteln Sie, ob Ihre Zeitreihendaten eine Autokorrelation aufweisen
Für diese Übung verwende ich InfluxDB und dasInfluxDB Python CL. Ich verwende verfügbare Daten aus demCenter for Operational Oceanographic Products and Services der National Oceanic and Atmospheric Administration (NOAA).. Konkret werde ich mir die Wasserstände und Wassertemperaturen eines Flusses in Santa Monica ansehen.
Datensatz:
Curl https://s3.amazonaws.com/noaa.water-database/NOAA_data.txt -o NOAA_data.txtinflux -import -path=NOAA_data.txt -precision=s -database=NOAA_water_database
Diese Analyse und der Code sind in einem Jupyter-Notizbuch enthaltenRepo.
Zuerst importiere ich alle meine Abhängigkeiten.
Importiere Pandas als pdimport numpy als npimport matplotlibimport matplotlib.pyplot als pltfrom influxdb importiere InfluxDBClientfrom statsmodels.graphics.tsaplots importiere plot_pacffrom statsmodels.graphics.tsaplots importiere plot_acffrom scipy.stats importiere linregress
Als nächstes verbinde ich mich mit dem Client, frage meine Wassertemperaturdaten ab und zeichne sie auf.
client = InfluxDBClient(host='localhost', port=8086)h2O = client.query('SELECT mean("degrees") AS "h2O_temp" FROM "NOAA_water_database"."autogen"."h2o_temperature" GROUP BY time(12h) LIMIT 60')h2O_points = [p für p in h2O.get_points()]h2O_df = pd.DataFrame(h2O_points)h2O_df['time_step'] = range(0,len(h2O_df['time']))h2O_df.plot( kind='line',x='time_step',y='h2O_temp')plt.show()
Abb. 1. H2O-Temperatur vs. Zeitschritt
Aus der obigen Darstellung ist nicht ersichtlich, ob unsere Daten eine Autokorrelation aufweisen oder nicht. Ich kann beispielsweise keine Saisonalität erkennen, die zu einer hohen Autokorrelation führen würde.
Ich kann die Autokorrelation mit berechnenPandas.Sereis.autocorr()Funktion, die den Wert des Pearson-Korrelationskoeffizienten zurückgibt. Der Pearson-Korrelationskoeffizient ist ein Maß für die lineare Korrelation zwischen zwei Variablen. Der Pearson-Korrelationskoeffizient hat einen Wert zwischen -1 und 1, wobei 0 keine lineare Korrelation, >0 eine positive Korrelation und <0 eine negative Korrelation darstellt. Eine positive Korrelation liegt vor, wenn sich zwei Variablen gleichzeitig ändern, während ein negativer Korrelationskoeffizient bedeutet, dass sich die Variablen umgekehrt ändern. Ich vergleiche die Daten mit einem Lag=1 (oder Daten(t) vs. Daten(t-1)) und einem Lag=2 (oder Daten(t) vs. Daten(t-2).
shift_1 = h2O_df['h2O_temp'].autocorr(lag=1)print(shift_1)-0.072058477401030730.17849760131784975
Diese Werte liegen sehr nahe bei 0, was darauf hindeutet, dass kaum oder gar keine Korrelation besteht. Die Berechnung einzelner Autokorrelationswerte liefert jedoch möglicherweise nicht das ganze Bild. Möglicherweise gibt es keine Korrelation bei Lag=1, aber möglicherweise gibt es eine Korrelation bei Lag=15. Es ist eine gute Idee, eine zu machenAutokorrelationsdiagrammum die Werte der Autokorrelationsfunktion (AFC) mit verschiedenen Verzögerungsgrößen zu vergleichen. Es ist auch wichtig zu beachten, dass die AFC unzuverlässiger wird, wenn Sie Ihren Verzögerungswert erhöhen. Dies liegt daran, dass Sie mit steigendem Verzögerungswert immer weniger Beobachtungen vergleichen. Als allgemeine Richtlinie gilt, dass die Gesamtzahl der Beobachtungen (T) mindestens 50 betragen sollte und der größte Verzögerungswert (k) kleiner oder gleich T/k sein sollte. Da ich insgesamt 60 Beobachtungen habe, werde ich nur die ersten 20 Werte des AFC berücksichtigen.
plot_acf(h2O_df['h2O_temp'], lags=20)plt.show()
Abb. 2. Autokorrelationsdiagramm für H2O-Temperaturen
Aus diesem Diagramm sehen wir, dass die Werte für den ACF für Verzögerungen > 0 innerhalb des 95-Prozent-Konfidenzintervalls (dargestellt durch die durchgezogene graue Linie) liegen, was bestätigt, dass unsere Daten keine Autokorrelation aufweisen. Dieses Ergebnis überraschte mich zunächst, da die Lufttemperatur an einem Tag normalerweise stark mit der Temperatur am Vortag korreliert. Ich ging davon aus, dass das Gleiche auch für die Wassertemperatur gelten würde. Dieses Ergebnis erinnerte mich daran, dass Bäche und Flüsse nicht das gleiche Systemverhalten haben wie Luft. Ich bin kein Hydrologe, aber ich weiß, dass Quellbäche oder die Schneeschmelze oft das ganze Jahr über die gleiche Temperatur haben. Möglicherweise weisen sie Tag für Tag ein stationäres Temperaturprofil auf, bei dem Mittelwert, Varianz und Autokorrelation alle konstant sind (wobei die Autokorrelation = 0 ist).
Saisonalität mit Autokorrelation in Zeitreihendaten aufdecken
Der ACF kann auch verwendet werden, um Saisonalität in Zeitreihendaten aufzudecken und zu überprüfen. Werfen wir einen Blick auf die Wasserstände aus demselben Datensatz.
client = InfluxDBClient(host='localhost', port=8086)h2O_level = client.query('SELECT "water_level" FROM "NOAA_water_database"."autogen"."h2o_feet" WHERE "location"=\'santa_monica\' AND time > = \'2015-08-22 22:12:00\' UND Zeit <= \'2015-08-28 03:00:00\'')h2O_level_points = [p für p in h2O_level.get_points()]h2O_level_df = pd.DataFrame(h2O_level_points)h2O_level_df['time_step'] = range(0,len(h2O_level_df['time']))h2O_level_df.plot(kind='line',x='time_step',y='water_level')plt .zeigen()
Abb. 3. H2O-Gehalt im Vergleich zum Zeitschritt
Allein durch die grafische Darstellung der Daten ist es ziemlich offensichtlich, dass wahrscheinlich Saisonalität besteht, was durch das vorhersehbare Muster in den Daten deutlich wird. Lassen Sie uns diese Annahme überprüfen, indem wir den ACF grafisch darstellen.
plot_acf(h2O_level_df['water_level'], lags=400)plt.show()
Abb. 4: Autokorrelationsdiagramm für H2O-Gehalte
Aus dem ACF-Diagramm oben können wir ersehen, dass unsere Saisonperiode aus etwa 246 Zeitschritten besteht (wobei der ACF den zweitgrößten positiven Höhepunkt aufweist). Während aus der Darstellung der Zeitreihen in Abbildung 3 leicht ersichtlich war, dass die Wasserstandsdaten saisonabhängig sind, ist dies nicht immer der Fall. InSaisonales ARIMA mit Pythonzeigt der Autor Sean Abu, wie er seiner ARIMA-Methode eine saisonale Komponente hinzufügen muss, um die Saisonalität in seinem Datensatz zu berücksichtigen. Ich habe seine Datensatzauswahl geschätzt, da ich in der folgenden Abbildung keine Autokorrelation erkennen kann. Es ist ein großartiges Beispiel dafür, wie der Einsatz von ACF dabei helfen kann, versteckte Trends in den Daten aufzudecken.
Abb. 5: Monatliche Fahrgastzahlen im Vergleich zum Jahr. Quelle: Saisonales ARIMA mit Python
Untersuchung des Trends mit Autokorrelation in Zeitreihendaten
Um einen Blick auf den Trend der Zeitreihendaten zu werfen, müssen wir zunächst die Saisonalität entfernen. Die verzögerte Differenzierung ist eine einfache Transformationsmethode, mit der die saisonale Komponente der Reihe entfernt werden kann. Eine verzögerte Differenz ist definiert durch:
Differenz(t) = Beobachtung(t) – Beobachtung(t-Intervall)2,
wobei Intervall die Periode ist. Um den verzögerten Unterschied in den Wasserstandsdaten zu berechnen, habe ich die folgende Funktion verwendet:
def Differenz(Datensatz, Intervall): diff = list() für i in Bereich(Intervall, Länge(Datensatz)): Wert = Datensatz[i] - Datensatz[i - Intervall] diff.append(value) return pd.DataFrame( diff, columns = ["water_level_diff"])h2O_level_diff = Differenz(h2O_level_df['water_level'], 246)h2O_level_diff['time_step'] = range(0,len(h2O_level_diff['water_level_diff']))h2O_level_diff.plot(kind= 'line',x='time_step',y='water_level_diff')plt.show()
Abb. 6: Verzögerte Differenz der H2O-Werte
Jetzt können wir den ACF erneut darstellen.
plot_acf(h2O_level_diff['water_level_diff'], lags=300)plt.show()
Abb. 7: ACF der verzögerten Differenz für H2O-Werte
Es könnte den Anschein haben, dass unsere verzögerte Differenz immer noch saisonabhängig ist. Wenn wir jedoch auf die y-Achse in Abbildung 5 achten, können wir sehen, dass der Bereich sehr klein ist und alle Werte nahe bei 0 liegen. Dies informiert uns darüber, dass wir die Saisonalität erfolgreich entfernt haben, es jedoch einen polynomialen Trend gibt. ich benutztesaisonale_decomposeum dies zu überprüfen.
aus statsmodels.tsa.seasonal import saisonal_decomposeaus matplotlib import pyplotresult = saisonal_decompose(h2O['water_level'], model='additive', freq=250)result.plot()pyplot.show()
Abb. 8. Saisonale Zersetzung des H2O-Gehalts
Abschluss
Autokorrelation ist wichtig, weil sie uns helfen kann, Muster in unseren Daten aufzudecken, erfolgreich das beste Vorhersagemodell auszuwählen und die Wirksamkeit unseres Modells richtig zu bewerten. Ich hoffe, dass diese Einführung in die Autokorrelation für Sie nützlich ist.
Verweise
- Zeitreihenanalyse und Prognose anhand von Beispielen, Søren Bisgaard und Murat Kulachi
- So entfernen Sie Trends und Saisonalität mit einer Differenztransformation in Python
Ressourcen
- Staffel ARIMA mit Python: Zeitreihenvorhersage
- Zeitreihen in Python Teil 2: Umgang mit saisonalen Daten
- So zerlegen Sie Zeitreihendaten in Trend und Saisonalität
- Wie man maschinelles Lernen (nicht) für die Zeitreihenvorhersage nutzt: Die Fallstricke vermeiden
- Sanfte Einführung in die AutokorrelationEine sanfte Einführung in die Autokorrelation und die partielle Autokorrelation
- Einführung in Zeitreihen
- Zeitreihenkonzepte
- Stationarität
- Fallstudie zur Zeitreihenprognose mit Python: Monatliche bewaffnete Raubüberfälle in Boston
- So erstellen Sie ein ARIMA-Modell für die Zeitreihenprognose in Python
- Interpretieren Sie die partielle Autokorrelationsfunktion (PACF)
- Annahmen der linearen Regression