6  6 Lags & Autokorrelation

7 6 Lags & Autokorrelation

Zeitreihen unterscheiden sich von klassischen Datensätzen, weil Beobachtungen nicht unabhängig sind.

Der Wert zum Zeitpunkt t hängt häufig von vorherigen Werten ab.

Diese zeitliche Abhängigkeit untersuchen wir mit:

  • Lags
  • Autokorrelation

Merke

Zeitliche Abhängigkeit ist eine zentrale Eigenschaft von Zeitreihen. Ohne sie gäbe es keine sinnvolle Prognose.


7.1 6.1 Beispielsignal

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

rng = np.random.default_rng(21)

t = pd.date_range("2025-01-01", periods=24*14, freq="H")
trend = np.linspace(0, 2, len(t))
season = 0.8 * np.sin(2*np.pi*(t.hour)/24)
noise = 0.4 * rng.normal(size=len(t))

s = pd.Series(15 + trend + season + noise, index=t, name="signal")

s.plot(title="Beispielsignal")
plt.show()
/var/folders/p_/ks3trxjx0jd839_g4g0vm4nc0000gn/T/ipykernel_19379/1570465617.py:7: FutureWarning: 'H' is deprecated and will be removed in a future version, please use 'h' instead.
  t = pd.date_range("2025-01-01", periods=24*14, freq="H")


7.2 6.2 Lag-Features

Ein Lag verschiebt die Zeitreihe nach hinten.

lag_1h = s.shift(1)
lag_24h = s.shift(24)

df_lags = pd.DataFrame({
    "y": s,
    "lag_1h": lag_1h,
    "lag_24h": lag_24h
})

df_lags.head()
y lag_1h lag_24h
2025-01-01 00:00:00 15.143509 NaN NaN
2025-01-01 01:00:00 15.817296 15.143509 NaN
2025-01-01 02:00:00 14.697408 15.817296 NaN
2025-01-01 03:00:00 16.258241 14.697408 NaN
2025-01-01 04:00:00 15.697774 16.258241 NaN
y = s.to_numpy()

lag1 = np.roll(y, 1)
lag24 = np.roll(y, 24)

lag1[0] = np.nan
lag24[:24] = np.nan

Interpretation

Ein hoher Zusammenhang zwischen y(t) und y(t-24) deutet auf eine Tagesperiodik hin.


7.3 6.3 Autokorrelation berechnen

Autokorrelation misst die Korrelation zwischen y(t) und y(t-k).

lags = range(1, 49)
ac = [s.corr(s.shift(k)) for k in lags]

plt.stem(list(lags), ac)
plt.title("Autokorrelation (1–48 Stunden)")
plt.xlabel("Lag (h)")
plt.ylabel("Korrelation")
plt.show()

import numpy as np

y = s.to_numpy()
y = y - np.nanmean(y)

def autocorr(y, k):
    return np.corrcoef(y[:-k], y[k:])[0,1]

lags = range(1, 49)
ac_np = [autocorr(y, k) for k in lags]

plt.stem(list(lags), ac_np)
plt.title("Autokorrelation (NumPy)")
plt.xlabel("Lag")
plt.ylabel("Korrelation")
plt.show()


7.4 6.4 Interpretation der Autokorrelation

Typische Muster:

  • Langsam abfallende Kurve → starker Trend
  • Periodische Peaks (z. B. bei 24, 48, 72) → Saison
  • Schneller Abfall gegen 0 → schwache Abhängigkeit

Achtung

Trend kann Autokorrelation künstlich erhöhen. Gegebenenfalls zuerst detrenden oder differenzieren.


7.5 6.5 Mini-Aufgaben

  1. Entfernen Sie den Trend (z. B. durch Rolling Mean).
    • Wie verändert sich die Autokorrelation?
  2. Erzeugen Sie eine Zeitreihe ohne Saison.
    • Wie sieht die Autokorrelationsfunktion aus?
  3. Erzeugen Sie reine Zufallsdaten.
    • Was erwarten Sie?