Der komplette Leitfaden zu Forecasting: Wie du vorhersagst, was dein Unternehmen wirklich braucht
Forecasting ist eines dieser Dinge, die einfach klingen, bis du versuchst, es richtig zu machen. Jeder will wissen, was kommt. Wie viele Einheiten werden wir nächstes Quartal verkaufen? Wie viel Lagerbestand brauchen wir? Wie wird die Nachfrage während der Weihnachtszeit aussehen? Die gute Nachricht: Forecasting muss kein Rätselraten sein. Es gibt bewährte Methoden, die dir wirklich brauchbare Vorhersagen liefern. Die schlechte Nachricht? Es gibt keine Zauberformel, die für alles funktioniert. Verschiedene Situationen brauchen verschiedene Ansätze.
Die zwei großen Kategorien: Quantitativ vs. Qualitativ
Bevor wir ins Detail gehen, musst du die grundlegende Unterscheidung bei Prognoseansätzen verstehen.
Quantitative Prognosen nutzen historische numerische Daten und mathematische Modelle, um zukünftige Werte vorherzusagen. Sie sind datengetrieben, objektiv und funktionieren brillant, wenn du verlässliche historische Daten hast und die Zukunft sich wahrscheinlich ähnlich wie die Vergangenheit verhält.
Qualitative Prognosen stützen sich auf Expertenmeinungen, Intuition, Marktforschung und menschliches Urteilsvermögen. Sie sind von Natur aus subjektiv, aber absolut unverzichtbar, wenn du mit neuen Produkten, unsicheren Märkten oder Situationen zu tun hast, in denen die Vergangenheit einfach nicht die Zukunft vorhersagen kann.
Keine ist grundsätzlich besser als die andere. Der Trick ist zu wissen, wann du welche verwendest – und manchmal beide zu kombinieren.
Quantitative Prognosemethoden
Lass uns mit den zahlenbasierten Ansätzen beginnen.
Zeitreihenanalyse
Zeitreihenprognosen sind wahrscheinlich die am häufigsten verwendete quantitative Methode. Sie analysiert Muster in historischen Daten über die Zeit, um zukünftige Werte vorherzusagen.
Die Kernannahme hier ist, dass die Zukunft ähnlichen Mustern wie die Vergangenheit folgen wird. Wenn Regenschirmverkäufe jeden November in die Höhe schnellen, werden sie das wahrscheinlich auch nächsten November tun.
Zeitreihendaten enthalten typischerweise mehrere Komponenten:
Trend: Die langfristige Richtung der Daten. Steigen die Verkäufe generell, sinken sie, oder bleiben sie über Jahre flach?
Saisonalität: Regelmäßige, vorhersagbare Muster, die sich in festen Perioden wiederholen. Weihnachtseinkaufsspitzen, Sommerferiendellen, solche Sachen.
Zyklische Muster: Längerfristige Schwankungen, die an Wirtschafts- oder Geschäftszyklen gebunden sind. Diese sind nicht so vorhersagbar wie saisonale Muster.
Unregelmäßige/Zufällige Variation: Das unvorhersagbare Rauschen in deinen Daten, das kein Modell erfassen kann.
Gängige Zeitreihenmethoden umfassen:
Gleitende Durchschnitte: Glättet kurzfristige Schwankungen durch Mittelung von Datenpunkten über ein rollendes Fenster. Einfach aber effektiv für stabile Daten.
Exponentielle Glättung: Gewichtet neuere Beobachtungen stärker. Die Idee ist, dass das, was letzten Monat passiert ist, wahrscheinlich relevanter ist als das, was vor drei Jahren passiert ist.
ARIMA (AutoRegressive Integrated Moving Average): Ein ausgereifterer Ansatz, der mit Trends und Saisonalität umgehen kann. Das Arbeitspferd der Zeitreihenprognose.
Prophet: Facebooks Prognosetool, das Saisonalität, Feiertage und fehlende Daten wirklich gut handhabt. Brillant für Geschäftsprognosen.
SARIMA: ARIMAs saisonaler Cousin. Wenn du starke saisonale Muster hast, ist das oft deine beste Wahl.
Regressionsanalyse
Während Zeitreihen betrachten, wie sich eine Variable über die Zeit verändert, untersucht die Regressionsanalyse Beziehungen zwischen Variablen.
Die Frage verschiebt sich von „Was werden die Verkäufe nächsten Monat sein, basierend auf den vorherigen Monaten?" zu „Was treibt die Verkäufe an, und wie können wir sie basierend auf diesen Treibern vorhersagen?"
Einfache lineare Regression: Eine Prädiktorvariable. „Die Verkäufe steigen um 50.000 € für jeden Grad, den die Temperatur über 20°C steigt."
Multiple lineare Regression: Mehrere Prädiktorvariablen. „Die Verkäufe hängen von der Temperatur, dem Wochentag, ob es einen U-Bahn-Streik gibt, und der Nähe zum Zahltag ab."
Polynomiale Regression: Für Beziehungen, die keine geraden Linien sind.
Regression ist besonders mächtig, wenn du kausale Faktoren identifizieren kannst, die deine Ergebnisse antreiben. Wenn du weißt, dass die Kundenfrequenz an der Oxford Street stark mit den Verkäufen korreliert, und du Prognosen für die Kundenfrequenz hast, kannst du diese Beziehung nutzen.
Machine Learning Ansätze
Für komplexe Muster mit vielen Variablen übertreffen Machine Learning Modelle oft traditionelle statistische Methoden.
Random Forests: Ensemble-Methoden, die mehrere Entscheidungsbäume kombinieren. Großartig für den Umgang mit nicht-linearen Beziehungen und Interaktionen zwischen Variablen.
Gradient Boosting (XGBoost, LightGBM): Gewinnt oft Prognose-Wettbewerbe. Handhabt komplexe Muster und große Datensätze effizient.
Neuronale Netze (LSTM, GRU): Besonders gut für sequenzielle Daten mit langfristigen Abhängigkeiten. Wenn das, was vor sechs Monaten passiert ist, heute noch Auswirkungen hat, können diese es erfassen.
Der Kompromiss bei ML-Methoden ist die Interpretierbarkeit. Eine lineare Regression sagt dir genau, wie jeder Faktor zur Prognose beiträgt. Ein neuronales Netz könnte genauer sein, aber zu erklären, warum es eine bestimmte Vorhersage gemacht hat, kann fast unmöglich sein.
Qualitative Prognosemethoden
Jetzt lass uns darüber reden, wann die Zahlen nicht ausreichen.
Die Delphi-Methode
Das ist strukturierter Expertenkonsens. Du versammelst ein Panel von Experten, bittest sie, unabhängig zu prognostizieren, teilst die aggregierten Ergebnisse anonym, und wiederholst das, bis die Gruppe zu einem Konsens kommt.
Die Anonymität ist entscheidend. Sie verhindert, dass dominante Persönlichkeiten die Diskussion überrollen und reduziert Ankereffekte.
Die Delphi-Methode funktioniert brillant für: Neue Produkteinführungen, wo es keine historischen Daten gibt; langfristige strategische Prognosen; Technologie-Adoptionsprognosen; Marktdisruptionsszenarien.
Marktforschung und Umfragen
Manchmal ist der beste Weg vorherzusagen, was Kunden kaufen werden, sie zu fragen.
Kundenbefragungen: „Würdest du dieses Produkt zu diesem Preis kaufen?"
Fokusgruppen: Tiefere qualitative Einblicke in Präferenzen und Verhaltensweisen
Kaufabsichtsstudien: Strukturierte Fragebögen, die die Kaufwahrscheinlichkeit messen
Die Herausforderung bei Umfragen ist, dass das, was Leute sagen, dass sie tun werden, und das, was sie tatsächlich tun, oft unterschiedlich ist. Jemand könnte sagen, er würde definitiv nachhaltige Mode kaufen, dann aber die billigere nicht-nachhaltige Option an der Kasse wählen.
Vertriebsmitarbeiter-Komposit
Dein Vertriebsteam spricht jeden Tag mit Kunden. Sie wissen, welche Produkte für Begeisterung sorgen, nach welchen Kunden fragen, und welche Staub ansetzen.
Die Aggregation ihrer Schätzungen zu einer kollektiven Prognose nutzt ihr Wissen von der Front. Die Nachteile sind, dass Vertriebsleute optimistisch (oder pessimistisch, je nach Anreizstrukturen) sein könnten, und ihre Ansichten durch aktuelle Erfahrungen verzerrt sein können.
Management-Meinung (Jury der Führungskräfte)
Führungskräfte bündeln ihr Urteilsvermögen, um Prognosen zu erstellen. Schnell, günstig und nutzt strategische Einsichten.
Das Risiko ist Gruppendenken und das HiPPO-Problem (Highest Paid Person's Opinion gewinnt – die Meinung des Bestbezahlten gewinnt). Strukturiere den Prozess sorgfältig, um echten unabhängigen Input zu bekommen.
Szenarioplanung
Anstatt eine einzelne Zukunft vorherzusagen, entwickelst du mehrere plausible Szenarien und prognostizierst für jedes.
„Wenn die Wirtschaft um 3% wächst, erwarten wir X. Wenn wir in eine Rezession geraten, erwarten wir Y. Wenn ein neuer Wettbewerber in den Markt eintritt, erwarten wir Z."
Das ist besonders wertvoll für strategische Planung und Risikomanagement.
Saisonale vs. Nicht-saisonale Prognosen
Diese Unterscheidung geht quer durch die quantitative/qualitative Trennung.
Saisonale Prognosen
Saisonale Muster sind regelmäßige, vorhersagbare Schwankungen, die sich in festen Intervallen wiederholen.
Jährliche Saisonalität: Weihnachtseinkaufsspitzen, Sommerferien-Muster, Back-to-School-Ansturm
Monatliche Saisonalität: Zahltag-Effekte, Monatsende-Muster
Wöchentliche Saisonalität: Unterschiede zwischen Wochenende und Werktagen
Tägliche Saisonalität: Mittagsansturm, Abend-Shopping-Muster
Wenn du klare saisonale Muster hast, muss deine Prognosemethode diese berücksichtigen. Einen einfachen gleitenden Durchschnitt auf stark saisonale Daten anzuwenden, gibt dir Prognosen, die immer falsch, immer zu spät sind.
Saisonale Zerlegung trennt deine Daten in Trend-, Saison- und Restkomponenten. Du prognostizierst jede separat und kombinierst sie wieder.
Methoden, die für Saisonalität entwickelt wurden, umfassen: Seasonal ARIMA (SARIMA), Holt-Winters exponentielle Glättung, Prophet (handhabt multiple Saisonalitäten wunderbar), Fourier-Terme in Regressionsmodellen.
Nicht-saisonale Prognosen
Manche Daten haben wirklich keine saisonalen Muster. B2B-Industrieausrüstungsverkäufe könnten mehr von Wirtschaftszyklen und Investitionsbudgets getrieben sein als von der Jahreszeit.
Für nicht-saisonale Daten funktionieren oft einfachere Methoden gut: Einfache exponentielle Glättung, ARIMA ohne saisonale Komponenten, Regressionsmodelle ohne saisonale Terme, Trend-Extrapolation.
Die Gefahr ist anzunehmen, dass Daten nicht-saisonal sind, wenn sie tatsächlich Muster haben, die du nicht erkannt hast. Prüfe immer auf Saisonalität, bevor du annimmst, dass sie nicht vorhanden ist.
Wann welche Methode: Ein Entscheidungsrahmen
So kannst du über die Wahl deines Ansatzes nachdenken:
Nutze quantitative Methoden, wenn: Du ausreichend historische Daten hast (mindestens zwei bis drei Jahre für jährliche Saisonalität); die zugrunde liegenden Muster relativ stabil sind; die Zukunft wahrscheinlich der Vergangenheit ähnelt; du häufige, automatisierte Prognosen im großen Maßstab brauchst.
Nutze qualitative Methoden, wenn: Du für neue Produkte ohne Historie prognostizierst; große Marktdisruptionen auftreten oder erwartet werden; du lange Zeithorizonte mit hoher Unsicherheit betrachtest; Expertenwissen Faktoren erfasst, die die Daten nicht zeigen.
Kombiniere beide, wenn: Du quantitative Prognosen mit Expertenurteil anpassen willst; du Modellausgaben gegen Intuition validierst; verschiedene Produktkategorien unterschiedliche Ansätze brauchen; du Ensemble-Prognosen erstellst, die mehrere Methoden verbinden.
Praktisches Beispiel: Prognosen für ein Londoner Luxuskaufhaus
Lass mich dir zeigen, wie das in der Praxis funktioniert. Ich habe mit Prognosen für ein berühmtes Kaufhaus an der Oxford Street gearbeitet, die Art von Ort, die seit über hundert Jahren ein Londoner Wahrzeichen ist. Sie verkaufen alles von Designer-Mode bis Feinkost, von Luxusuhren bis Schönheitsprodukten.
Jede Produktkategorie braucht einen anderen Prognoseansatz. So denken wir darüber:
Beispiel 1: Designer-Sonnenbrillen (Hochsaisonal, Quantitativ)
Sonnenbrillen haben eines der klarsten saisonalen Muster im Einzelhandel. Die Verkäufe explodieren im späten Frühling, erreichen im Sommer ihren Höhepunkt und stürzen im Winter ab.
Für diese Kategorie nutzen wir Seasonal ARIMA (SARIMA), weil: Wir Jahre an historischen Verkaufsdaten haben; das saisonale Muster stark und konsistent ist; die Beziehung zwischen Saison und Verkäufen mechanisch ist (Leute kaufen Sonnenbrillen, wenn es sonnig ist).
Wir integrieren auch Regressionselemente mit Wettervorhersagen. Ein ungewöhnlich warmer April kann die Sommernachfrage vorziehen; ein regnerischer Juni unterdrückt sie.
Das Modell handhabt: Jährliche Saisonalität (Sommerspitzen), Trend (graduelles Wachstum bei Premium-Sonnenbrillen), externe Regressoren (Temperaturvorhersagen, UV-Index).
Beispiel 2: Luxusuhren (Geringe Saisonalität, Gemischte Methoden)
High-End-Uhren von Marken im Wonder Room folgen nicht typischen saisonalen Mustern wie Mode. Ein Rolex-Kauf für 10.000 € wird nicht davon getrieben, ob es draußen sonnig ist.
Stattdessen korrelieren diese Käufe mit: Bonussaison (Januar, Juli für Finanzdienstleistungen); Aktienmarkt-Performance; Touristenankunften (besonders aus bestimmten Märkten); Neue Modellveröffentlichungen; Wechselkurse, die internationale Käufer beeinflussen.
Wir nutzen multiple Regression mit Wirtschaftsindikatoren, kombiniert mit qualitativem Input von den Uhren-Einkäufern, die wissen, wann neue Modelle erscheinen und welche Stücke Wartelisten generieren.
Die Mischung sieht so aus: 60% quantitatives Modell (Regression auf Wirtschaftsfaktoren), 40% qualitative Anpassung (Einkäufer-Expertise, Markenbeziehungs-Intelligenz).
Beispiel 3: Neue Designer-Kollektion-Launch (Rein Qualitativ)
Wenn ein heißer neuer Designer eine exklusive Kollektion launcht, gibt es keine historischen Daten. Die Verkäufe verschiedener Produkte von verschiedenen Designern im letzten Jahr sagen dir fast nichts.
Hier verlassen wir uns vollständig auf qualitative Methoden:
Delphi-artige Expertenpanels: Einkäufer, Merchandiser und Marketing arbeiten gemeinsam an Schätzungen
Analoge Prognosen: „Dieser Launch ist ähnlich wie die X-Kollektion vor zwei Jahren, die Y gemacht hat"
Marktforschung: Social-Media-Sentiment, Modepresse-Berichterstattung, Influencer-Interesse
Vorbestelldaten: Frühe Signale von VIP-Kunden und Moderedakteuren
Wir erstellen typischerweise drei Szenarien (konservativ, erwartet, optimistisch) und planen Bestand und Personal entsprechend.
Beispiel 4: Food Hall Süßwaren (Saisonal mit Events)
Die Food Hall verkauft Premium-Schokolade, Kekse und Süßwaren. Das hat starke Saisonalität, aber auch event-getriebene Spitzen.
Saisonale Muster: Weihnachten (massiv), Ostern (signifikant), Valentinstag (moderat), Muttertag (moderat).
Event-getriebene Variation: Königliche Anlässe, Store-Events und Kooperationen, Neue Produktlaunches.
Wir nutzen Prophet dafür, weil es handhabt: Multiple Saisonalitäten (wöchentlich, jährlich); Feiertagseffekte (mit benutzerdefinierten Feiertagskalendern für UK-spezifische Events); Trendänderungen; Fehlende Daten (hilfreich, wenn COVID Muster gestört hat).
Wir fügen qualitative Überlagerungen für große Events hinzu. Wenn das Kaufhaus eine Disney-Weihnachtskooperation macht, erfassen historische Muster nicht den Uplift durch diese spezifische Partnerschaft.
Beispiel 5: Beauty-Produkte (Gemischte Saisonalität, Promotions-Komplexität)
Beauty ist kompliziert. Manche Produkte sind saisonal (LSF im Sommer, reichhaltige Feuchtigkeitscremes im Winter), andere nicht. Werbeaktionen treiben riesige Schwankungen.
Wir nutzen einen hybriden Ansatz:
Basisprognose: Prophet oder SARIMA für zugrunde liegende Nachfragemuster
Promotions-Uplift-Modelle: Regressionsmodelle, die den Verkaufsanstieg durch verschiedene Promotionstypen schätzen
Neuprodukt-Prognosen: Qualitative Methoden für Launches
Der Promotions-Teil ist entscheidend. Eine „Geschenk beim Kauf"-Aktion könnte die Verkäufe für eine Woche verdreifachen. Das Modell muss wissen, dass Promotionen geplant sind, um nicht zu denken, dass die Nachfrage sich dauerhaft verdreifacht hat.
Beispiel 6: Luxushandtaschen (Angebotsbeschränkt, Qualitativ-Heavy)
Bei bestimmten Heritage-Luxusmarken übersteigt die Nachfrage das Angebot. Es gibt Wartelisten. Die Prognose-Herausforderung ist nicht „Wie viel werden Kunden kaufen wollen?" sondern „Wie viel wird uns die Marke zuteilen?"
Das dreht das Prognoseproblem um. Wir brauchen:
Angebotsprognosen: Qualitative Intelligenz aus Markenbeziehungen über Zuteilungserwartungen
Nachfrageerfassung: Die wahre Nachfrage verstehen, auch wenn Verkäufe durch Angebot begrenzt sind
Wartelisten-Management: Konversionsraten von Warteliste zu Kauf vorhersagen
Überwiegend qualitativ, stark beziehungsgetrieben.
Python-Bibliotheken für Prognosen
So, jetzt wird's praktisch. Hier sind die Python-Bibliotheken, die du brauchst, und Beispielcode für gängige Prognoseaufgaben.
Essenzielle Bibliotheken
# Kern-Datenverarbeitung
import pandas as pd
import numpy as np
# Visualisierung
import matplotlib.pyplot as plt
import seaborn as sns
# Statistische Prognosen
from statsmodels.tsa.holtwinters import ExponentialSmoothing
from statsmodels.tsa.arima.model import ARIMA
from statsmodels.tsa.statespace.sarimax import SARIMAX
from statsmodels.tsa.seasonal import seasonal_decompose
# Facebook Prophet
from prophet import Prophet
# Machine Learning
from sklearn.linear_model import LinearRegression, Ridge, Lasso
from sklearn.ensemble import RandomForestRegressor, GradientBoostingRegressor
from sklearn.model_selection import train_test_split, TimeSeriesSplit
from sklearn.metrics import mean_absolute_error, mean_squared_error
# Fortgeschrittenes ML
import xgboost as xgb
import lightgbm as lgb
# Deep Learning für Zeitreihen
from tensorflow import keras
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense, Dropout
Beispiel 1: Saisonale Zerlegung (Deine Daten verstehen)
Bevor du prognostizierst, verstehe was in deinen Daten steckt.
import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.tsa.seasonal import seasonal_decompose
# Sonnenbrillen-Verkaufsdaten laden
df = pd.read_csv('sunglasses_sales.csv', parse_dates=['date'], index_col='date')
# Zeitreihe zerlegen
decomposition = seasonal_decompose(df['sales'], model='multiplicative', period=12)
# Komponenten plotten
fig, axes = plt.subplots(4, 1, figsize=(12, 10))
decomposition.observed.plot(ax=axes[0], title='Beobachtet')
decomposition.trend.plot(ax=axes[1], title='Trend')
decomposition.seasonal.plot(ax=axes[2], title='Saisonal')
decomposition.resid.plot(ax=axes[3], title='Residual')
plt.tight_layout()
plt.show()
# Jetzt siehst du:
# Gibt es einen Trend? (wachsend, sinkend, flach)
# Wie stark ist die Saisonalität? (große oder kleine Schwankungen)
# Wie viel ungeklärte Variation bleibt? (Residual-Rauschen)
Beispiel 2: SARIMA für saisonale Produkte (Sonnenbrillen)
import pandas as pd
import numpy as np
from statsmodels.tsa.statespace.sarimax import SARIMAX
from sklearn.metrics import mean_absolute_error, mean_absolute_percentage_error
import matplotlib.pyplot as plt
# Daten laden und vorbereiten
df = pd.read_csv('sunglasses_sales.csv', parse_dates=['date'], index_col='date')
df = df.asfreq('MS') # Monatsstart-Frequenz
# In Train und Test aufteilen
train = df[:'2024']
test = df['2025':]
# SARIMA-Modell fitten
# Order: (p, d, q) für nicht-saisonalen Teil
# Seasonal order: (P, D, Q, s) wobei s die saisonale Periode ist (12 für monatlich)
model = SARIMAX(
train['sales'],
order=(1, 1, 1),
seasonal_order=(1, 1, 1, 12),
enforce_stationarity=False,
enforce_invertibility=False
)
results = model.fit(disp=False)
# Modellzusammenfassung ausgeben
print(results.summary())
# Prognose
forecast = results.get_forecast(steps=len(test))
forecast_mean = forecast.predicted_mean
forecast_ci = forecast.conf_int()
# Evaluieren
mae = mean_absolute_error(test['sales'], forecast_mean)
mape = mean_absolute_percentage_error(test['sales'], forecast_mean)
print(f'Mean Absolute Error: {mae:.2f}')
print(f'Mean Absolute Percentage Error: {mape:.2%}')
# Ergebnisse plotten
plt.figure(figsize=(12, 6))
plt.plot(train.index, train['sales'], label='Trainingsdaten')
plt.plot(test.index, test['sales'], label='Tatsächlich', color='green')
plt.plot(test.index, forecast_mean, label='Prognose', color='red')
plt.fill_between(
test.index,
forecast_ci.iloc[:, 0],
forecast_ci.iloc[:, 1],
color='red',
alpha=0.2,
label='95% Konfidenzintervall'
)
plt.legend()
plt.title('Sonnenbrillen-Verkaufsprognose (SARIMA)')
plt.xlabel('Datum')
plt.ylabel('Verkäufe (€)')
plt.show()
Beispiel 3: Prophet für Food Hall Süßwaren
Prophet ist brillant für Geschäftsprognosen mit Feiertagen und Events.
import pandas as pd
from prophet import Prophet
import matplotlib.pyplot as plt
# Daten laden (Prophet braucht Spalten namens 'ds' und 'y')
df = pd.read_csv('confectionery_sales.csv')
df.columns = ['ds', 'y'] # Datum und Verkäufe
df['ds'] = pd.to_datetime(df['ds'])
# Deutsche Feiertage und store-spezifische Events definieren
weihnachten = pd.DataFrame({
'holiday': 'weihnachten',
'ds': pd.to_datetime(['2022-12-25', '2023-12-25', '2024-12-25', '2025-12-25']),
'lower_window': -30, # Effekt beginnt 30 Tage vorher
'upper_window': 5 # Effekt endet 5 Tage danach
})
ostern = pd.DataFrame({
'holiday': 'ostern',
'ds': pd.to_datetime(['2022-04-17', '2023-04-09', '2024-03-31', '2025-04-20']),
'lower_window': -14,
'upper_window': 1
})
valentinstag = pd.DataFrame({
'holiday': 'valentinstag',
'ds': pd.to_datetime(['2022-02-14', '2023-02-14', '2024-02-14', '2025-02-14']),
'lower_window': -7,
'upper_window': 0
})
muttertag = pd.DataFrame({
'holiday': 'muttertag',
'ds': pd.to_datetime(['2022-05-08', '2023-05-14', '2024-05-12', '2025-05-11']),
'lower_window': -7,
'upper_window': 0
})
holidays = pd.concat([weihnachten, ostern, valentinstag, muttertag])
# Prophet initialisieren und fitten
model = Prophet(
holidays=holidays,
yearly_seasonality=True,
weekly_seasonality=True,
daily_seasonality=False,
changepoint_prior_scale=0.05 # Flexibilität bei Trendänderungen
)
model.fit(df)
# Zukunfts-DataFrame für Prognose erstellen
future = model.make_future_dataframe(periods=365) # Ein Jahr voraus prognostizieren
# Prognose generieren
forecast = model.predict(future)
# Prognose plotten
fig1 = model.plot(forecast)
plt.title('Süßwaren-Verkaufsprognose')
plt.xlabel('Datum')
plt.ylabel('Verkäufe (€)')
plt.show()
# Komponenten plotten (Trend, wöchentlich, jährlich, Feiertage)
fig2 = model.plot_components(forecast)
plt.show()
Beispiel 4: Multiple Regression für Luxusuhren
Wenn externe Faktoren die Nachfrage treiben, erfasst Regression diese Beziehungen.
import pandas as pd
import numpy as np
from sklearn.linear_model import Ridge
from sklearn.model_selection import TimeSeriesSplit
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_absolute_error, r2_score
import matplotlib.pyplot as plt
# Daten mit mehreren Features laden
df = pd.read_csv('watch_sales_with_features.csv', parse_dates=['date'])
# Features, die Luxusuhren-Verkäufe treiben könnten
# dax: Aktienmarkt-Performance
# tourist_arrivals: Internationale Besucher
# eur_usd: Wechselkurs
# bonus_season: Binärer Indikator für Bonus-Monate (Jan, Jul)
# new_model_release: Binärer Indikator für neue Uhren-Releases
feature_columns = [
'dax_change',
'tourist_arrivals',
'eur_usd',
'bonus_season',
'new_model_release',
'month_sin', # Zyklische Kodierung des Monats
'month_cos'
]
# Zyklische Monats-Features erstellen
df['month'] = df['date'].dt.month
df['month_sin'] = np.sin(2 * np.pi * df['month'] / 12)
df['month_cos'] = np.cos(2 * np.pi * df['month'] / 12)
# Features und Ziel vorbereiten
X = df[feature_columns]
y = df['sales']
# Features skalieren
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# Zeitreihen-Kreuzvalidierung
tscv = TimeSeriesSplit(n_splits=5)
mae_scores = []
r2_scores = []
for train_idx, test_idx in tscv.split(X_scaled):
X_train, X_test = X_scaled[train_idx], X_scaled[test_idx]
y_train, y_test = y.iloc[train_idx], y.iloc[test_idx]
model = Ridge(alpha=1.0)
model.fit(X_train, y_train)
predictions = model.predict(X_test)
mae_scores.append(mean_absolute_error(y_test, predictions))
r2_scores.append(r2_score(y_test, predictions))
print(f'Durchschnittlicher MAE: {np.mean(mae_scores):.2f}')
print(f'Durchschnittlicher R2: {np.mean(r2_scores):.3f}')
# Finales Modell auf allen Daten fitten
final_model = Ridge(alpha=1.0)
final_model.fit(X_scaled, y)
# Feature-Wichtigkeit
feature_importance = pd.DataFrame({
'feature': feature_columns,
'coefficient': final_model.coef_
}).sort_values('coefficient', key=abs, ascending=False)
print("\nFeature-Wichtigkeit:")
print(feature_importance)
Beispiel 5: XGBoost für komplexe Muster (Beauty-Produkte)
Wenn du viele Features und komplexe Interaktionen hast, glänzt Gradient Boosting.
import pandas as pd
import numpy as np
import xgboost as xgb
from sklearn.model_selection import TimeSeriesSplit
from sklearn.metrics import mean_absolute_error
import matplotlib.pyplot as plt
# Beauty-Produkt-Verkaufsdaten laden
df = pd.read_csv('beauty_sales.csv', parse_dates=['date'])
# Feature Engineering
df['day_of_week'] = df['date'].dt.dayofweek
df['month'] = df['date'].dt.month
df['week_of_year'] = df['date'].dt.isocalendar().week
df['is_weekend'] = df['day_of_week'].isin([5, 6]).astype(int)
df['is_payday_week'] = df['date'].dt.day.isin(range(25, 32)).astype(int)
# Lag-Features (vorherige Verkäufe)
df['sales_lag_7'] = df['sales'].shift(7)
df['sales_lag_14'] = df['sales'].shift(14)
df['sales_lag_28'] = df['sales'].shift(28)
# Rollende Statistiken
df['sales_rolling_mean_7'] = df['sales'].rolling(window=7).mean()
df['sales_rolling_std_7'] = df['sales'].rolling(window=7).std()
df['sales_rolling_mean_28'] = df['sales'].rolling(window=28).mean()
# Zeilen mit NaN von Lag-Features entfernen
df = df.dropna()
# Features definieren
feature_columns = [
'day_of_week', 'month', 'week_of_year', 'is_weekend', 'is_payday_week',
'sales_lag_7', 'sales_lag_14', 'sales_lag_28',
'sales_rolling_mean_7', 'sales_rolling_std_7', 'sales_rolling_mean_28'
]
X = df[feature_columns]
y = df['sales']
# Zeitreihen-Split
tscv = TimeSeriesSplit(n_splits=5)
mae_scores = []
for train_idx, test_idx in tscv.split(X):
X_train, X_test = X.iloc[train_idx], X.iloc[test_idx]
y_train, y_test = y.iloc[train_idx], y.iloc[test_idx]
model = xgb.XGBRegressor(
n_estimators=100,
max_depth=6,
learning_rate=0.1,
subsample=0.8,
colsample_bytree=0.8,
random_state=42
)
model.fit(
X_train, y_train,
eval_set=[(X_test, y_test)],
verbose=False
)
predictions = model.predict(X_test)
mae_scores.append(mean_absolute_error(y_test, predictions))
print(f'Durchschnittlicher MAE: {np.mean(mae_scores):.2f}')
# Finales Modell fitten und Feature-Wichtigkeit holen
final_model = xgb.XGBRegressor(n_estimators=100, max_depth=6, learning_rate=0.1)
final_model.fit(X, y)
# Feature-Wichtigkeit plotten
xgb.plot_importance(final_model, max_num_features=15)
plt.title('Feature-Wichtigkeit für Beauty-Produkt-Verkäufe')
plt.tight_layout()
plt.show()
Beispiel 6: Quantitativ und Qualitativ kombinieren (Ensemble-Ansatz)
Für neue Kollektion-Launches, verbinde Modellausgaben mit Expertenurteil.
import pandas as pd
import numpy as np
def create_ensemble_forecast(
quantitative_forecast,
expert_estimates,
quantitative_weight=0.6,
expert_weight=0.4
):
"""
Verbinde quantitative Modellprognose mit Expertenurteil.
Parameter:
quantitative_forecast: Vom Modell vorhergesagte Werte
expert_estimates: Dictionary mit 'conservative', 'expected', 'optimistic' Schätzungen
quantitative_weight: Gewicht für Modellprognose (Standard 0.6)
expert_weight: Gewicht für Expertenschätzung (Standard 0.4)
Gibt zurück:
Dictionary mit gemischten Prognosen für jedes Szenario
"""
results = {}
for scenario, expert_value in expert_estimates.items():
blended = (
quantitative_forecast * quantitative_weight +
expert_value * expert_weight
)
results[scenario] = blended
return results
def calculate_forecast_with_uncertainty(
base_forecast,
historical_mape,
confidence_level=0.95
):
"""
Füge Unsicherheitsgrenzen zu Prognosen basierend auf historischer Genauigkeit hinzu.
Parameter:
base_forecast: Punkt-Prognosewert
historical_mape: Historischer Mean Absolute Percentage Error
confidence_level: Konfidenzniveau für Grenzen (Standard 0.95)
Gibt zurück:
Dictionary mit Prognose und Grenzen
"""
z_score = 1.96 if confidence_level == 0.95 else 1.645
margin = base_forecast * historical_mape * z_score
return {
'forecast': base_forecast,
'lower_bound': base_forecast - margin,
'upper_bound': base_forecast + margin,
'confidence_level': confidence_level
}
# Beispiel: Neue Designer-Kollektion-Launch
# Modellprognose basierend auf analogen Produkten
model_forecast = 125000 # 125.000 € vorhergesagt aus ähnlichen vergangenen Launches
# Expertenschätzungen vom Einkäufer-Panel (Delphi-Stil)
expert_estimates = {
'conservative': 95000, # Vorsichtige Schätzung
'expected': 140000, # Wahrscheinlichste Schätzung
'optimistic': 200000 # Best-Case-Szenario
}
# Ensemble-Prognosen erstellen
ensemble = create_ensemble_forecast(
model_forecast,
expert_estimates,
quantitative_weight=0.5, # Gleiche Gewichtung für neues Produkt
expert_weight=0.5
)
print("Ensemble-Prognosen für Neue Kollektion:")
for scenario, value in ensemble.items():
print(f" {scenario.capitalize()}: {value:,.0f} EUR")
# Unsicherheit zum erwarteten Szenario hinzufügen
historical_mape = 0.25 # 25% historischer Fehler bei Neuprodukt-Prognosen
forecast_with_bounds = calculate_forecast_with_uncertainty(
ensemble['expected'],
historical_mape
)
print(f"\nErwartete Prognose mit 95% Konfidenz:")
print(f" Punktschätzung: {forecast_with_bounds['forecast']:,.0f} EUR")
print(f" Untere Grenze: {forecast_with_bounds['lower_bound']:,.0f} EUR")
print(f" Obere Grenze: {forecast_with_bounds['upper_bound']:,.0f} EUR")
Beispiel 7: Prognosegenauigkeit überwachen
Prognosen erstellen ist keine einmalige Sache. Du musst verfolgen, wie gut du bist, und anpassen.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
def calculate_forecast_metrics(actual, forecast):
"""
Berechne gängige Prognosegenauigkeits-Metriken.
Gibt Dictionary mit MAE, MAPE, RMSE und Bias zurück.
"""
errors = actual - forecast
abs_errors = np.abs(errors)
pct_errors = abs_errors / actual
metrics = {
'mae': np.mean(abs_errors),
'mape': np.mean(pct_errors) * 100,
'rmse': np.sqrt(np.mean(errors ** 2)),
'bias': np.mean(errors), # Positiv = Unterprognose
'bias_pct': (np.mean(errors) / np.mean(actual)) * 100
}
return metrics
def forecast_accuracy_report(df, actual_col, forecast_col, group_col=None):
"""
Erstelle Prognosegenauigkeitsbericht, optional nach Kategorie gruppiert.
Parameter:
df: DataFrame mit Ist- und Prognosespalten
actual_col: Name der Ist-Werte-Spalte
forecast_col: Name der Prognose-Spalte
group_col: Optionale Spalte zum Gruppieren (z.B. Produktkategorie)
Gibt zurück:
DataFrame mit Genauigkeitsmetriken
"""
if group_col:
results = []
for group in df[group_col].unique():
group_df = df[df[group_col] == group]
metrics = calculate_forecast_metrics(
group_df[actual_col],
group_df[forecast_col]
)
metrics['category'] = group
results.append(metrics)
return pd.DataFrame(results).set_index('category')
else:
return pd.DataFrame([calculate_forecast_metrics(
df[actual_col],
df[forecast_col]
)])
# Beispiel-Nutzung
results_df = pd.DataFrame({
'category': ['Sonnenbrillen', 'Sonnenbrillen', 'Uhren', 'Uhren',
'Süßwaren', 'Süßwaren', 'Beauty', 'Beauty'],
'month': ['Jan', 'Feb', 'Jan', 'Feb', 'Jan', 'Feb', 'Jan', 'Feb'],
'actual': [45000, 52000, 180000, 195000, 120000, 85000, 95000, 98000],
'forecast': [48000, 49000, 175000, 190000, 115000, 88000, 92000, 95000]
})
# Genauigkeitsbericht nach Kategorie erstellen
accuracy_report = forecast_accuracy_report(
results_df,
actual_col='actual',
forecast_col='forecast',
group_col='category'
)
print("Prognosegenauigkeit nach Kategorie:")
print(accuracy_report.round(2))
Wichtige Erkenntnisse
Bei Prognosen geht es nicht darum, die perfekte Methode zu finden. Es geht darum, den richtigen Ansatz mit deiner spezifischen Situation zu matchen.
Beginne mit den Daten, die du hast. Wenn du Jahre sauberer historischer Daten mit klaren Mustern hast, werden dir quantitative Methoden gut dienen. Wenn du bei einem neuen Produkt im Blindflug bist, nutze qualitative Ansätze.
Verstehe deine Muster. Saisonale Zerlegung sollte dein erster Schritt sein. Wisse, was deine Daten antreibt, bevor du versuchst, sie vorherzusagen.
Übertreib es nicht mit der Komplexität. Eine einfache Methode, die du verstehst und erklären kannst, schlägt oft eine komplexe Black Box. Fang einfach an, füge Komplexität nur hinzu, wenn sie die Genauigkeit nachweislich verbessert.
Kombiniere Ansätze. Die besten Prognostiker verbinden quantitative Strenge mit Expertenurteil. Modelle erfassen Muster; Menschen erfassen Kontext.
Verfolge deine Genauigkeit. Prognosen ohne Genauigkeitsmessung ist nur Raten mit extra Schritten. Baue Feedback-Schleifen und verbessere kontinuierlich.
Plane für Unsicherheit. Punkt-Prognosen sind immer falsch. Die Frage ist, wie falsch. Liefere Spannen und Szenarien, nicht nur einzelne Zahlen.
Gute Prognosen zu erstellen ist echt schwer. Aber mit den richtigen Tools und Frameworks kannst du viel besser darin werden, vorherzusagen, was dein Unternehmen braucht – ob das Designer-Sonnenbrillen oder handwerkliche Pralinen sind.