BRAGA

01 Arbeit01-03

MMM und Budget­optimierung für Österreich

Ein Bayes’sches Marketing-Mix-Modell, das schätzt, was jeder Kanal beiträgt, die von Werbeplattformen ausgewiesene Attribution an einer bekannten Wahrheit prüft und Budget nur dort verschiebt, wo die Evidenz eine Breakeven-Regel (Regel zur Gewinnschwelle) erfüllt.

Entwurf · Freigabe ausstehendMarketingAbgeschlossenVeröffentlicht 4. Aug. 20267 Min. LesezeitRepository
91 %
Kurvenabdeckung
26 von 28
Parameter wiederhergestellt
+45 %
Überzurechnung durch die Plattform, Paid Search
Inhalt
  1. 01Fragestellung
  2. 02Daten
  3. 03Methode
  4. 04Ergebnis
  5. 05Grenzen
  6. 06Entscheidung
  7. 07Entstehung
Zusammenfassung

Das Modell wird an einer bekannten Wahrheit validiert, bevor es etwas entscheidet, und auf Metas öffentlichem Robyn-Demodatensatz bringt dasselbe Wochenbudget, nach einer Breakeven-Regel umverteilt, im Median 15,1 % des derzeitigen Deckungsbeitrags der Medien; keine der 500 verwendeten Ziehungen aus der A-posteriori-Verteilung zeigt einen Verlust. Die Regel verschiebt Budget zu TV und Facebook, zieht es von der Außenwerbung (Out-of-Home) ab und lässt Print und Search (Suchmaschinenwerbung), deren Intervall-Untergrenzen unter dem Breakeven liegen, unverändert.

Fragestellung

Die Frage ist jene, die jedes werbetreibende Unternehmen an seinen Mediaplan stellt: Welche Kanäle haben inkrementell beigetragen, wie weit lagen die von den Plattformen ausgewiesenen Zahlen daneben, und was bringt es tatsächlich, dasselbe Budget umzuschichten? Die Vergleichseinheit ist der Deckungsbeitrag, nicht der Umsatz. Ein Kanal, dessen Return on Ad Spend (ROAS, Umsatz je eingesetztem Werbe-Euro) unter dem Breakeven-ROAS (der Gewinnschwelle) liegt, vernichtet Marge, wie hoch sein ausgewiesener Umsatz auch erscheint.

Daten

„Für Österreich“ im Titel bezeichnet das Umfeld, für das das Modell gebaut ist, nicht die Daten dahinter: Wochenraster, der österreichische Feiertagskalender als Kontrollvariable, Euro und eine Logik auf Basis des Deckungsbeitrags. Es wurden keine Daten österreichischer Kunden verwendet. Das Modell läuft in drei Layern (Ebenen), und der erste muss bestehen, bevor der zweite zählt:

  • Layer P, ein generiertes werbetreibendes Unternehmen mit offengelegten wahren Parametern: 156 Wochen, fünf Kanäle (TV, Radio, Print, Paid Search und Paid Social, also bezahlte Such- und Social-Media-Werbung).
  • Layer R, Metas öffentliche Robyn-Demodatei (MIT-Lizenz): simulierte Wochendaten für fünf benannte Kanäle, Umsatz in den eigenen Geldeinheiten der Datei, Umsätze der Mitbewerber als Kontrollvariable.
  • Layer D, die A-posteriori-Verteilung (Posterior) aus Layer R, übergeben an einen Budgetoptimierer unter einer schriftlich festgelegten Entscheidungsregel.
Modelleingaben
Raster
wöchentlich
Übertragung
geometrischer Adstock (Übertragungseffekt der Werbung) je Kanal, Abklingrate geschätzt
Sättigung
Hill-Kurve auf die Adstock-transformierten Ausgaben
Basislinie
linearer Trend · zwei jährliche Fourier-Paare · eine Kontrollvariable
Deckungs­beitrags­quote
40 %, angenommen
Breakeven-ROAS
2,50

Die Priors (A-priori-Verteilungen) sind schwach informativ und für alle Kanäle gleich, damit die Schätzungen aus den Daten kommen und nicht aus einer Annahme, die die Antwort schon kennt.

Methode

Die Validierung kommt vor jeder Entscheidung; die Schritte laufen daher in dieser Reihenfolge:

  1. Das Modell wird in PyMC angepasst und mit NUTS (No-U-Turn Sampler; nutpie) gesampelt: zwei Ketten mit je 1.000 Tuning-Schritten und 1.000 Ziehungen, Ziel-Akzeptanzrate 0,9, nach Divergenzen über eine protokollierte Stufenfolge angehoben (die berichteten Anpassungen liefen mit 0,95 und 2.000 Ziehungen je Kette).
  2. Ein Fit zählt nur bei einem R-hat unter 1,01, einer effektiven Stichprobengröße über 400 und null Divergenzen. Jeder Fit legt diese Diagnosewerte neben sich ab.
  3. Auf Layer P muss der Sampler die Wahrheit wiederherstellen, die ihm vorgegeben wurde, und die plattformartige Attribution wird an derselben Wahrheit gemessen.
  4. Das Modell wird auf beiden Layern an einem Holdout (zurückgehaltener Testzeitraum) von 26 Wochen gegen zwei Vergleichsmodelle geprüft: eine Ridge-Regression und eine saisonal naive Prognose.
  5. Die Posterior aus Layer R geht an den Optimierer, unter einer Entscheidungsregel, die vor seinem Lauf festgelegt wird; der Umverteilungsgewinn wird über 500 Posterior-Ziehungen gelesen.
Entscheidungsregel

Budget wird nur so lange zu einem Kanal verschoben, wie die Untergrenze seines Intervalls zu 90 % für den marginalen ROAS über dem Breakeven bleibt, und nur, wenn das 10. Perzentil des Umverteilungsgewinns positiv ist. Die Regel wird festgelegt, bevor der Optimierer läuft.

Ergebnis

Erneut geprüft am 26. Okt. 2026

Nach Code-Korrekturen am 30. Sep. 2026 wurden die Entscheidungsebene und die Validierung auf synthetischen Daten mit dem aktuellen Code neu gerechnet. Jede Zahl auf dieser Seite wurde reproduziert; das Build-Log des Repositorys dokumentiert die Prüfung.

Validierung auf Layer P

Der Sampler muss die Wahrheit wiederherstellen, die ihm vorgegeben wurde. Die Kurvenabdeckung beträgt 91 % (die wahren Reaktionskurven innerhalb des Posterior-Bands, über den beobachteten Ausgabenbereich), und 26 von 28 wahren Parameterwerten liegen innerhalb ihrer Intervalle zu 90 %. Die Abweichungen folgen einem bekannten Zielkonflikt, nicht einem Fehler: Alle fünf Effektgrößen und alle fünf Halbsättigungspunkte haben Mediane über der Wahrheit, weil eine Kurve, die höher steigt, aber später sättigt, dieselben Wochen erklärt. Die Wiederherstellung wird daher an Kurven und Anteilen beurteilt, also an dem, was eine Budgetentscheidung verwendet.

An derselben Wahrheit gemessen, rechnet der plattformartige Bericht Paid Search 45 % zu viel zu (von der Plattform ausgewiesener gegenüber wahrem inkrementellem Umsatz) und den Offline-Kanälen gar nichts.

Umverteilung auf Layer R

Auf dem öffentlichen Datensatz bringt dasselbe gesamte Wochenbudget, nach der Entscheidungsregel umverteilt, im Median 15,1 % des derzeitigen Deckungsbeitrags der Medien. Das 10. Perzentil liegt bei 8,8 %, und keine der 500 verwendeten Posterior-Ziehungen zeigt einen Verlust.

Abb. 01-03-1 · Empfohlene Änderung der Wochenausgaben

Budget wandert von der Außenwerbung zu TV und Facebook.

TV+50 %
Außenwerbung−20 %
Print0 %
Facebook+50 %
Search0 %
Veränderung von den derzeitigen zu den empfohlenen Wochenausgaben bei gleichem Gesamtbudget; n = 5 Kanäle. Print und Search bleiben unverändert (0 %): Die Untergrenzen ihrer Intervalle liegen unter dem Breakeven. Mittellinie = null; Bereich −50 % bis +50 %.
Quelle: Layer R, Metas öffentliche Robyn-Demodatei, nach der Entscheidungsregel umverteilt. Veröffentlichte Zahlen, zuletzt validiert am 16. Sep. 2026.

Wochenausgaben je Kanal, derzeit und laut Empfehlung, in den Geldeinheiten des Datensatzes:

Kanal Derzeit Empfohlen
TV 14.844 22.266
Außenwerbung 43.218 34.723
Print 3.729 unverändert
Facebook 2.146 3.218
Search 5.916 unverändert

Der marginale ROAS, den die Regel prüft, bei den derzeitigen Ausgaben: der Median und das Intervall zu 90 %, dessen Untergrenze das Breakeven-Kriterium liest.

Kanal Median Intervall zu 90 %
TV 7,26 4,38–10,72
Außenwerbung 0,75 0,10–1,68
Print 7,81 1,22–16,01
Facebook 20,53 4,76–45,52
Search 7,68 0,89–25,55

Das Breakeven-Kriterium ist es, das Print und Search auf dem derzeitigen Niveau hält. Ihre Mediane sind hoch, aber die Untergrenzen ihrer Intervalle liegen unter 2,50, daher wird kein Budget zu ihnen verschoben. Bei der Außenwerbung liegt das gesamte Intervall unter 2,50. Die Beträge sind in den eigenen Geldeinheiten des Datensatzes angegeben, nicht in Euro; Anteile, ROAS-Verhältnisse und die Breakeven-Prüfung sind die Größen, die sich übertragen lassen.

Holdout

Auf einem Holdout von 26 Wochen gegen zwei Vergleichsmodelle hatte das Modell auf Layer P den geringsten mittleren absoluten prozentualen Fehler (MAPE): 3,0 %, gegenüber 4,7 % für die Ridge-Regression und 9,6 % für eine saisonal naive Prognose. Auf Layer R unterlag es mit 7,9 % gegenüber 5,1 % für die Ridge-Regression. Das wird so berichtet, wie es ausgefallen ist. Das Argument für das MMM ist, dass es mit Intervallen angibt, welcher Kanal den Umsatz erwirtschaftet hat; das können die Vergleichsmodelle nicht. Auf Layer P lagen 85 % der Holdout-Wochen innerhalb seiner Intervalle zu 90 %: etwas zu eng, das Modell ist also etwas zu selbstsicher.

Ergebnis · Layer R, 500 Posterior-Ziehungen

Nach der Breakeven-Regel umverteilt, bringt dasselbe Wochenbudget im Median 15,1 % des derzeitigen Deckungsbeitrags der Medien, und keine der 500 Ziehungen zeigt einen Verlust.

Grenzen

Was diese Arbeit nicht belegt:

  • Echte Daten eines Werbetreibenden. Layer R ist ein simulierter öffentlicher Datensatz in nicht benannten Geldeinheiten. Der Austausch gegen echte Daten eines werbetreibenden Unternehmens ist geplant, nicht erfolgt.
  • Die Modellform. Eine einzige Modellform wird angenommen (geometrischer Adstock, Hill-Sättigung, additive Basislinie). Die Wiederherstellung auf Layer P zeigt, dass der Sampler diese Form wiederfindet, nicht, dass die Wirklichkeit sie hat.
  • Kanäle, die sich gemeinsam bewegen. Wöchentliche nationale Daten können Kanäle, deren Ausgaben sich gemeinsam bewegen, nicht trennen; die Intervalle werden entsprechend breiter.
  • Verhalten bei neuen Ausgabenniveaus. Der Optimierer nimmt an, dass die Reaktionskurven bei neuen Ausgabenniveaus gelten und dass Mitbewerber nicht reagieren.

Entscheidung

Nach der schriftlich festgelegten Regel wird Budget zu TV und Facebook verschoben und von der Außenwerbung abgezogen; Print und Search bleiben unverändert, denn zu einem Kanal, dessen Intervall-Untergrenze unter dem Breakeven-ROAS von 2,50 liegt, wird kein Budget verschoben. Die Entscheidung beruht auf einem simulierten öffentlichen Datensatz in nicht benannten Geldeinheiten; der Austausch gegen echte Daten eines werbetreibenden Unternehmens ist geplant, nicht erfolgt.

Was würde die Entscheidung umkehren?

Die Regel nennt die Bedingungen selbst. Fällt bei einer Neuschätzung die Untergrenze des Intervalls zu 90 % für den marginalen ROAS von TV oder Facebook auf 2,50 oder darunter, endet die Verschiebung zu diesem Kanal; ist das 10. Perzentil des Umverteilungsgewinns nicht mehr positiv, endet die Umverteilung. Der Optimierer nimmt außerdem an, dass die Reaktionskurven bei den neuen Ausgabenniveaus gelten und dass Mitbewerber nicht reagieren; die Empfehlung beruht auf beiden Annahmen, und keine davon ist belegt.

Code, Berichte und das Entscheidungsmemo liegen im Repository. Die Zahlen in seiner README werden aus den Berichtsdateien erzeugt, und ein Test prüft, dass beide übereinstimmen.

Entstehung

47 Commits und 10 gemergte Pull-Requests an 8 Tagen zwischen 4. Aug. 2026 und 27. Okt. 2026. Merge-Commits und Bots sind nicht gezählt; Zeiten in Wiener Zeit.

Abb. 01-03-B1 · KalenderDer dichteste Tag war der 4. Aug. 2026 mit 12 Commits.
Aug.Sep.Okt.MoMiFrSo4. Aug. 2026 · 125. Aug. 2026 · 06. Aug. 2026 · 07. Aug. 2026 · 08. Aug. 2026 · 09. Aug. 2026 · 010. Aug. 2026 · 011. Aug. 2026 · 012. Aug. 2026 · 013. Aug. 2026 · 014. Aug. 2026 · 015. Aug. 2026 · 016. Aug. 2026 · 017. Aug. 2026 · 018. Aug. 2026 · 019. Aug. 2026 · 020. Aug. 2026 · 021. Aug. 2026 · 022. Aug. 2026 · 023. Aug. 2026 · 024. Aug. 2026 · 025. Aug. 2026 · 026. Aug. 2026 · 027. Aug. 2026 · 028. Aug. 2026 · 029. Aug. 2026 · 030. Aug. 2026 · 031. Aug. 2026 · 01. Sep. 2026 · 02. Sep. 2026 · 03. Sep. 2026 · 04. Sep. 2026 · 05. Sep. 2026 · 06. Sep. 2026 · 07. Sep. 2026 · 08. Sep. 2026 · 09. Sep. 2026 · 010. Sep. 2026 · 011. Sep. 2026 · 012. Sep. 2026 · 013. Sep. 2026 · 014. Sep. 2026 · 015. Sep. 2026 · 916. Sep. 2026 · 517. Sep. 2026 · 518. Sep. 2026 · 019. Sep. 2026 · 020. Sep. 2026 · 021. Sep. 2026 · 122. Sep. 2026 · 023. Sep. 2026 · 024. Sep. 2026 · 025. Sep. 2026 · 026. Sep. 2026 · 027. Sep. 2026 · 028. Sep. 2026 · 029. Sep. 2026 · 030. Sep. 2026 · 31. Okt. 2026 · 02. Okt. 2026 · 03. Okt. 2026 · 04. Okt. 2026 · 05. Okt. 2026 · 06. Okt. 2026 · 07. Okt. 2026 · 08. Okt. 2026 · 09. Okt. 2026 · 010. Okt. 2026 · 011. Okt. 2026 · 012. Okt. 2026 · 013. Okt. 2026 · 014. Okt. 2026 · 015. Okt. 2026 · 016. Okt. 2026 · 017. Okt. 2026 · 018. Okt. 2026 · 019. Okt. 2026 · 020. Okt. 2026 · 021. Okt. 2026 · 022. Okt. 2026 · 023. Okt. 2026 · 024. Okt. 2026 · 025. Okt. 2026 · 026. Okt. 2026 · 527. Okt. 2026 · 7012345–67–89–12

n = 47 Commits. Farbe: Commits pro Tag, sieben Stufen von 1 bis 12; ein leeres Feld hatte keinen. Der Zeiger auf einem Feld zeigt die Zahl.
Quelle: Git-Historie von RafaelBraga-Kribitz/austrian-mmm-budget-optimizer, Standardzweig, Stand 27. Okt. 2026.

Abb. 01-03-B2 · WocheDie dichteste Stunde der Woche: Dienstag, 20:00–21:00 Uhr, 12 Commits.
0003060912151821MoDiMiDoFrSaSoMo 00:00 · 0Mo 01:00 · 0Mo 02:00 · 0Mo 03:00 · 0Mo 04:00 · 0Mo 05:00 · 0Mo 06:00 · 0Mo 07:00 · 0Mo 08:00 · 0Mo 09:00 · 0Mo 10:00 · 0Mo 11:00 · 0Mo 12:00 · 0Mo 13:00 · 0Mo 14:00 · 0Mo 15:00 · 1Mo 16:00 · 0Mo 17:00 · 0Mo 18:00 · 0Mo 19:00 · 3Mo 20:00 · 0Mo 21:00 · 2Mo 22:00 · 0Mo 23:00 · 0Di 00:00 · 4Di 01:00 · 3Di 02:00 · 0Di 03:00 · 0Di 04:00 · 0Di 05:00 · 0Di 06:00 · 0Di 07:00 · 0Di 08:00 · 0Di 09:00 · 0Di 10:00 · 0Di 11:00 · 0Di 12:00 · 0Di 13:00 · 0Di 14:00 · 0Di 15:00 · 3Di 16:00 · 1Di 17:00 · 0Di 18:00 · 4Di 19:00 · 1Di 20:00 · 12Di 21:00 · 0Di 22:00 · 0Di 23:00 · 0Mi 00:00 · 1Mi 01:00 · 0Mi 02:00 · 0Mi 03:00 · 0Mi 04:00 · 0Mi 05:00 · 0Mi 06:00 · 0Mi 07:00 · 0Mi 08:00 · 0Mi 09:00 · 0Mi 10:00 · 0Mi 11:00 · 0Mi 12:00 · 1Mi 13:00 · 1Mi 14:00 · 2Mi 15:00 · 1Mi 16:00 · 0Mi 17:00 · 0Mi 18:00 · 1Mi 19:00 · 1Mi 20:00 · 0Mi 21:00 · 0Mi 22:00 · 0Mi 23:00 · 0Do 00:00 · 0Do 01:00 · 0Do 02:00 · 0Do 03:00 · 0Do 04:00 · 0Do 05:00 · 0Do 06:00 · 0Do 07:00 · 0Do 08:00 · 0Do 09:00 · 0Do 10:00 · 0Do 11:00 · 0Do 12:00 · 0Do 13:00 · 0Do 14:00 · 0Do 15:00 · 0Do 16:00 · 2Do 17:00 · 1Do 18:00 · 0Do 19:00 · 2Do 20:00 · 0Do 21:00 · 0Do 22:00 · 0Do 23:00 · 0Fr 00:00 · 0Fr 01:00 · 0Fr 02:00 · 0Fr 03:00 · 0Fr 04:00 · 0Fr 05:00 · 0Fr 06:00 · 0Fr 07:00 · 0Fr 08:00 · 0Fr 09:00 · 0Fr 10:00 · 0Fr 11:00 · 0Fr 12:00 · 0Fr 13:00 · 0Fr 14:00 · 0Fr 15:00 · 0Fr 16:00 · 0Fr 17:00 · 0Fr 18:00 · 0Fr 19:00 · 0Fr 20:00 · 0Fr 21:00 · 0Fr 22:00 · 0Fr 23:00 · 0Sa 00:00 · 0Sa 01:00 · 0Sa 02:00 · 0Sa 03:00 · 0Sa 04:00 · 0Sa 05:00 · 0Sa 06:00 · 0Sa 07:00 · 0Sa 08:00 · 0Sa 09:00 · 0Sa 10:00 · 0Sa 11:00 · 0Sa 12:00 · 0Sa 13:00 · 0Sa 14:00 · 0Sa 15:00 · 0Sa 16:00 · 0Sa 17:00 · 0Sa 18:00 · 0Sa 19:00 · 0Sa 20:00 · 0Sa 21:00 · 0Sa 22:00 · 0Sa 23:00 · 0So 00:00 · 0So 01:00 · 0So 02:00 · 0So 03:00 · 0So 04:00 · 0So 05:00 · 0So 06:00 · 0So 07:00 · 0So 08:00 · 0So 09:00 · 0So 10:00 · 0So 11:00 · 0So 12:00 · 0So 13:00 · 0So 14:00 · 0So 15:00 · 0So 16:00 · 0So 17:00 · 0So 18:00 · 0So 19:00 · 0So 20:00 · 0So 21:00 · 0So 22:00 · 0So 23:00 · 0012345–67–89–12

n = 47 Commits. Farbe: Commits pro Stunde, sieben Stufen von 1 bis 12; ein leeres Feld hatte keinen. Der Zeiger auf einem Feld zeigt die Zahl.
Quelle: Git-Historie von RafaelBraga-Kribitz/austrian-mmm-budget-optimizer, Standardzweig, Stand 27. Okt. 2026.

Abb. 01-03-B3 · Geschriebene Zeilen

22 Zeilen Tests auf 100 Zeilen Code.

Code5.664
Tests1.228
Doku14.727
CI & Setup161
Hinzugefügte Zeilen, n = 21.780. Daten, generierte Dateien, Abbildungen, Notebooks und Lockfiles sind nicht gezählt.
Quelle: Git-Historie von RafaelBraga-Kribitz/austrian-mmm-budget-optimizer, Standardzweig, Stand 27. Okt. 2026.

#marketing#media-mix-modelling#budgetoptimierung

Fragen zu diesem Projekt oder eine Rolle, in die diese Art von Arbeit passt?

Tastaturkürzel

Einzelne Tasten; ohne Wirkung beim Tippen in ein Feld oder mit gehaltener Cmd-, Strg- oder Alt-Taste.

0
Startseite
1 2 3 4
Arbeit, Schreiben, Werkzeuge, Über
j / k
Nächster / vorheriger Abschnitt dieser Seite
n / p
Nächstes / vorheriges Projekt oder Essay
u
Eine Ebene höher
l
English
t
Hell- oder Dunkelmodus
?
Diese Liste
Esc
Schließen