Tutorial 2: Muster in Netzlasten verstehen

Ziel

Wir arbeiten mit den Daten der Global Energy Forecasting Competition Hong, Pinson, and Fan (2014), die Sie zuvor bereinigt haben. Ziel ist es, Muster in den Netzlasten zu identifizieren, insbesondere in Bezug auf Wochentag-Effekte. Die Netzlast variiert je nach Wochentag, da sich das Verhalten von Haushalten und Industrien ändert. Wir wollen herausfinden, ob es Unterschiede in der Last zwischen Wochentagen und Wochenenden/Feiertagen gibt, was für spätere Prognosemodelle relevant ist.

Aufgaben

  1. Trennung der Wochentage: Visualisieren Sie die Verteilung der Netzlast für jeden Wochentag (Montag bis Sonntag und Feiertag) in einem Violin-Plot, um die Verteilungen optisch zu vergleichen. Markieren Sie Wochenenden (Samstag, Sonntag) anders.
  2. Gruppierung: Teilen Sie die Daten in zwei Gruppen: Wochentage (Montag bis Freitag) und Sonn-/Feiertage (Samstag, Sonntag sowie Feiertage). Vergleichen Sie die Mittelwerte der Netzlasten dieser Gruppen mit einem t-Test.
  3. Optionaler Teil: Vergleichen Sie die Verteilungen der beiden Gruppen mit dem Kolmogorov-Smirnov (KS)-Test und visualisieren Sie die kumulativen Verteilungsfunktionen (CDFs). Dieser Teil ist in einem aufklappbaren Callout beschrieben.

Wir verwenden ein Signifikanzniveau von \(\alpha = 0.05\).

Analyse mit simulierten Daten

Da keine echten Daten vorliegen, generieren wir simulierte Netzlast-Daten für jeden Wochentag sowie Feiertage. Die Daten sind normalverteilt mit unterschiedlichen Mittelwerten und Standardabweichungen, um realistische Unterschiede widerzuspiegeln.

Schritt 1: Visualisierung der Wochentag-Verteilungen

Wir generieren Netzlast-Daten für jeden Wochentag und visualisieren die Verteilungen in einem Violin-Plot, wobei Wochenenden anders gefärbt sind.

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

# Simulierte Daten generieren
np.random.seed(42)
days = ['Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag', 'Sonntag']
n_samples = 100  # Pro Tag
loads = []
day_labels = []

for day in days:
    if day in ['Samstag', 'Sonntag']:
        # Wochenenden: Niedrigere Last
        load = np.random.normal(90, 8, n_samples)
    else:
        # Wochentage: Höhere Last
        load = np.random.normal(100, 10, n_samples)
    loads.extend(load)
    day_labels.extend([day] * n_samples)

# Feiertage hinzufügen (ähnlich wie Wochenenden)
holiday_load = np.random.normal(88, 9, 50)
loads.extend(holiday_load)
day_labels.extend(['Feiertag'] * 50)

# DataFrame erstellen
data = pd.DataFrame({'Tag': day_labels, 'Last': loads})

# Violin-Plot
plt.figure(figsize=(12, 6))
sns.violinplot(x='Tag', y='Last', data=data, palette={'Montag': 'blue', 'Dienstag': 'blue', 
                                                      'Mittwoch': 'blue', 'Donnerstag': 'blue', 
                                                      'Freitag': 'blue', 'Samstag': 'orange', 
                                                      'Sonntag': 'orange', 'Feiertag': 'orange'})
plt.title('Verteilung der Netzlast nach Wochentag und Feiertagen')
plt.xlabel('Tag')
plt.ylabel('Netzlast (MW)')
plt.grid(True, alpha=0.3)
plt.show()
/tmp/ipykernel_3386/3092400038.py:33: FutureWarning:



Passing `palette` without assigning `hue` is deprecated and will be removed in v0.14.0. Assign the `x` variable to `hue` and set `legend=False` for the same effect.

Interpretation: Der Violin-Plot zeigt, dass die Netzlast an Wochentagen (Montag bis Freitag) tendenziell höher ist als an Wochenenden (Samstag, Sonntag) und Feiertagen. Die Verteilungen an Wochenenden und Feiertagen sind ähnlich und weisen eine geringere Variabilität auf.

Schritt 2: t-Test für Mittelwerte (Wochentage vs. Sonn-/Feiertage)

Wir teilen die Daten in zwei Gruppen: - Wochentage: Montag bis Freitag. - Sonn-/Feiertage: Samstag, Sonntag und Feiertage.

Dann führen wir einen zweiseitigen t-Test durch, um die Mittelwerte der Netzlasten zu vergleichen.

from scipy.stats import ttest_ind

# Gruppen erstellen
weekday_load = data[data['Tag'].isin(['Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag'])]['Last']
weekend_holiday_load = data[data['Tag'].isin(['Samstag', 'Sonntag', 'Feiertag'])]['Last']

# t-Test
t_statistic, p_value = ttest_ind(weekday_load, weekend_holiday_load, equal_var=False)  # Welch's t-Test
print(f"t-Statistik: {t_statistic:.3f}")
print(f"p-Wert: {p_value:.3f}")

# Entscheidung
alpha = 0.05
if p_value < alpha:
    print("H_0 wird abgelehnt: Die Mittelwerte der Netzlast unterscheiden sich signifikant.")
else:
    print("H_0 wird nicht abgelehnt: Kein Hinweis auf unterschiedliche Mittelwerte.")
t-Statistik: 16.259
p-Wert: 0.000
H_0 wird abgelehnt: Die Mittelwerte der Netzlast unterscheiden sich signifikant.

Ergebnis: Der p-Wert liegt typischerweise unter 0.05 (z. B. \[ p \approx 0.000 \]), was darauf hindeutet, dass die Mittelwerte der Netzlast an Wochentagen und Sonn-/Feiertagen signifikant unterschiedlich sind. Die Netzlast ist an Wochentagen höher.

Schritt 3: Optionaler Vergleich der Verteilungen mit dem KS-Test

Der Kolmogorov-Smirnov (KS)-Test ist ein nicht-parametrischer Test, der prüft, ob zwei Stichproben aus derselben Verteilung stammen. Er vergleicht die empirischen kumulativen Verteilungsfunktionen (CDFs) der beiden Stichproben.

Teststatistik

Die KS-Teststatistik \(D\) misst den maximalen Abstand zwischen den CDFs \(F_1(x)\) und \(F_2(x)\):

\[ D = \sup_x |F_1(x) - F_2(x)|, \]

wobei \(\sup\) der Supremum (größte Abstand) ist.

Hypothesen

  • \(H_0\): Die Verteilungen der Netzlast an Wochentagen und Sonn-/Feiertagen sind gleich.
  • \(H_1\): Die Verteilungen unterscheiden sich.

Anwendung

Der KS-Test ist nützlich, wenn keine Normalitätsannahmen getroffen werden können. Hier vergleichen wir die Verteilung der Netzlast an Wochentagen mit der an Sonn-/Feiertagen.

Python-Implementierung und Visualisierung

Wir führen den KS-Test durch und visualisieren die CDFs der beiden Gruppen.

from scipy.stats import ks_2samp
import matplotlib.pyplot as plt
import numpy as np

# KS-Test
statistic, p_value = ks_2samp(weekday_load, weekend_holiday_load)
print(f"KS-Statistik: {statistic:.3f}")
print(f"p-Wert: {p_value:.3f}")

# Entscheidung
alpha = 0.05
if p_value < alpha:
    print("H_0 wird abgelehnt: Die Verteilungen unterscheiden sich signifikant.")
else:
    print("H_0 wird nicht abgelehnt: Kein Hinweis auf unterschiedliche Verteilungen.")

# Kumulativer Verteilungsplot (CDF)
def plot_cdf(data, label, color):
    sorted_data = np.sort(data)
    y = np.arange(1, len(sorted_data) + 1) / len(sorted_data)
    plt.plot(sorted_data, y, label=label, color=color)

plt.figure(figsize=(10, 6))
plot_cdf(weekday_load, 'Wochentage', 'blue')
plot_cdf(weekend_holiday_load, 'Sonn-/Feiertage', 'orange')
plt.title('Kumulative Verteilungsfunktionen (CDF) der Netzlast')
plt.xlabel('Netzlast (MW)')
plt.ylabel('Kumulative Wahrscheinlichkeit')
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()
KS-Statistik: 0.476
p-Wert: 0.000
H_0 wird abgelehnt: Die Verteilungen unterscheiden sich signifikant.

Interpretation

Ein p-Wert \(< \alpha = 0.05\) zeigt, dass die Verteilungen der Netzlast an Wochentagen und Sonn-/Feiertagen unterschiedlich sind. Der CDF-Plot visualisiert diese Unterschiede: Die CDF für Wochentage liegt tendenziell rechts von der für Sonn-/Feiertage, was auf eine höhere Netzlast hinweist.

Ergebnis: Der p-Wert ist typischerweise klein (z. B. \(p \approx 0.000\)), was auf signifikante Unterschiede in den Verteilungen hinweist. Der CDF-Plot bestätigt, dass die Netzlast an Wochentagen höher und anders verteilt ist als an Sonn-/Feiertagen.

Fazit

  • Wochentag-Verteilungen: Der Violin-Plot zeigt, dass die Netzlast an Wochentagen höher ist als an Wochenenden und Feiertagen.
  • t-Test: Der Mittelwert der Netzlast ist an Wochentagen signifikant höher als an Sonn-/Feiertagen (\(p < 0.05\)).
  • KS-Test (optional): Die Verteilungen der Netzlast unterscheiden sich signifikant zwischen Wochentagen und Sonn-/Feiertagen, wie der KS-Test und der CDF-Plot zeigen.