Ab dem 7. März 2024 hat Google eine neue offizielle Bayes'sche MMM-Version namens Meridian veröffentlicht. Meridian ist derzeit für ausgewählte Werbetreibende nur begrenzt verfügbar. Bitte besuchen Sie diese Website oder wenden Sie sich für weitere Informationen an Ihren Google-Vertreter. Die LMMM-Version wird eingestellt, sobald Meridian allgemein verfügbar ist.
Dokumente • Einführung • Theorie • Erste Schritte • Referenzen • Community Spotlight
Marketing Mix Modeling (MMM) wird von Werbetreibenden verwendet, um die Werbewirksamkeit zu messen und Entscheidungen über die Budgetzuweisung über alle Medienkanäle hinweg zu treffen. Die auf aggregierten Daten basierende Messung ermöglicht einen Vergleich zwischen Online- und Offline-Kanälen und bleibt außerdem von den jüngsten Änderungen des Ökosystems (einige im Zusammenhang mit dem Datenschutz) unberührt, die sich auf die Attributionsmodellierung auswirken können. Mit MMM können Sie:
Der Bayes'sche Ansatz für MMM ermöglicht es einem Werbetreibenden, Vorinformationen in die Modellierung zu integrieren, was Ihnen Folgendes ermöglicht:
Das LightweightMMM-Paket (erstellt mit Numpyro und JAX) hilft Werbetreibenden bei der einfachen Erstellung von Bayes'schen MMM-Modellen, indem es die Funktionalität bietet, Daten entsprechend zu skalieren, Modelle auszuwerten, Budgetzuweisungen zu optimieren und gängige Diagramme zu zeichnen, die in der Praxis verwendet werden.
Ein MMM quantifiziert die Beziehung zwischen Medienkanalaktivität und Verkäufen und berücksichtigt gleichzeitig andere Faktoren. Nachfolgend finden Sie eine vereinfachte Modellübersicht. Das vollständige Modell ist in der Modelldokumentation aufgeführt. Ein MMM wird typischerweise auf wöchentlicher Ebene durchgeführt (der KPI könnte z. B. der Umsatz pro Woche sein), es kann jedoch auch auf täglicher Ebene durchgeführt werden.
Dabei ist KPI typischerweise das Volumen oder der Wert der Verkäufe pro Zeitraum.
Das LightweightMMM kann entweder mit auf nationaler Ebene aggregierten Daten (Standardansatz) oder mit auf geografischer Ebene aggregierten Daten (subnationaler hierarchischer Ansatz) durchgeführt werden.
Nationale Ebene (Standardansatz). Dieser Ansatz ist angemessen, wenn die verfügbaren Daten nur auf nationaler Ebene aggregiert werden (der KPI könnte z. B. nationale Verkäufe pro Zeitraum sein). Dies ist das am häufigsten in MMMs verwendete Format.
Geo-Ebene (subnationaler hierarchischer Ansatz). Dieser Ansatz ist geeignet, wenn die Daten auf subnationaler Ebene aggregiert werden können (z. B. könnte der KPI der Umsatz pro Zeitraum für jeden Staat innerhalb eines Landes sein). Dieser Ansatz kann im Vergleich zum Standardansatz genauere Ergebnisse liefern, da mehr Datenpunkte zur Anpassung an das Modell verwendet werden. Wir empfehlen, wenn möglich, für größere Länder wie die USA ein Modell auf subnationaler Ebene zu verwenden.
Es ist wahrscheinlich, dass die Wirkung eines Medienkanals auf den Umsatz eine verzögerte Wirkung hat, die mit der Zeit langsam nachlässt. Unsere leistungsstarke Bayes'sche MMM-Modellarchitektur ist darauf ausgelegt, diesen Effekt zu erfassen und bietet drei verschiedene Ansätze. Wir empfehlen Benutzern, alle drei Ansätze zu vergleichen und den Ansatz zu verwenden, der am besten funktioniert. Der Ansatz, der am besten funktioniert, ist in der Regel derjenige, der die beste Out-of-Sample-Anpassung aufweist (was eine der generierten Ausgaben ist). Die Funktionsformen dieser drei Ansätze werden im Folgenden kurz beschrieben und in unserer Modelldokumentation vollständig zum Ausdruck gebracht.
Die empfohlene Methode zur Installation von Lightweight_mmm ist über PyPi:
pip install --upgrade pip
pip install lightweight_mmm
Wenn Sie die neueste und etwas instabilere Version verwenden möchten, können Sie sie von Github installieren:
pip install --upgrade git+https://github.com/google/lightweight_mmm.git
Wenn Sie Google Colab verwenden, stellen Sie sicher, dass Sie die Laufzeit nach der Installation neu starten.
Hier verwenden wir simulierte Daten, es wird jedoch davon ausgegangen, dass Ihre Daten zu diesem Zeitpunkt bereinigt wurden. Die notwendigen Daten sind:
# Let's assume we have the following datasets with the following shapes (we use
the `simulate_dummy_data` function in utils for this example ):
media_data , extra_features , target , costs = utils . simulate_dummy_data (
data_size = 160 ,
n_media_channels = 3 ,
n_extra_features = 2 ,
geos = 5 ) # Or geos=1 for national model
Die Skalierung ist eine Kunst. Bayesianische Techniken funktionieren gut, wenn die Eingabedaten einen kleinen Maßstab haben. Wir sollten Variablen nicht auf 0 zentrieren. Verkäufe und Medien sollten eine Untergrenze von 0 haben.
y
kann als y / jnp.mean(y)
skaliert werden.media
können als X_m / jnp.mean(X_m, axis=0)
skaliert werden, was bedeutet, dass der neue Spaltenmittelwert 1 sein wird. Wir stellen einen CustomScaler
zur Verfügung, der Multiplikationen und Divisionsskalierungen anwenden kann, falls die weiter verbreiteten Skalierer nicht zu Ihrem Anwendungsfall passen. Skalieren Sie Ihre Daten entsprechend, bevor Sie das Modell anpassen. Unten finden Sie ein Beispiel für die Verwendung dieses CustomScaler
:
# Simple split of the data based on time.
split_point = data_size - data_size // 10
media_data_train = media_data [: split_point , :]
target_train = target [: split_point ]
extra_features_train = extra_features [: split_point , :]
extra_features_test = extra_features [ split_point :, :]
# Scale data
media_scaler = preprocessing . CustomScaler ( divide_operation = jnp . mean )
extra_features_scaler = preprocessing . CustomScaler ( divide_operation = jnp . mean )
target_scaler = preprocessing . CustomScaler (
divide_operation = jnp . mean )
# scale cost up by N since fit() will divide it by number of time periods
cost_scaler = preprocessing . CustomScaler ( divide_operation = jnp . mean )
media_data_train = media_scaler . fit_transform ( media_data_train )
extra_features_train = extra_features_scaler . fit_transform (
extra_features_train )
target_train = target_scaler . fit_transform ( target_train )
costs = cost_scaler . fit_transform ( unscaled_costs )
Falls Sie eine Variable haben, die viele Nullen enthält, können Sie auch anhand des Mittelwerts von Werten ungleich Null skalieren. Sie können dazu beispielsweise eine Lambda-Funktion verwenden: lambda x: jnp.mean(x[x > 0])
. Gleiches gilt für die Kostenskalierung.
Das Modell erfordert die Mediendaten, die zusätzlichen Funktionen, die Kosten jeder Medieneinheit pro Kanal und das Ziel. Sie können auch angeben, wie viele Samples Sie verwenden möchten und wie viele Ketten vorhanden sind.
Um mehrere Ketten parallel auszuführen, müsste der Benutzer numpyro.set_host_device_count
entweder auf die Anzahl der Ketten oder die Anzahl der verfügbaren CPUs setzen.
Sehen Sie sich unten ein Beispiel an:
# Fit model.
mmm = lightweight_mmm . LightweightMMM ()
mmm . fit ( media = media_data ,
extra_features = extra_features ,
media_prior = costs ,
target = target ,
number_warmup = 1000 ,
number_samples = 1000 ,
number_chains = 2 )
Wenn Sie einen Prior im Modell ändern möchten (außer dem Medien-Prior, den Sie bereits immer angeben), können Sie dies mit custom_priors
tun:
# See detailed explanation on custom priors in our documentation.
custom_priors = { "intercept" : numpyro . distributions . Uniform ( 1 , 5 )}
# Fit model.
mmm = lightweight_mmm . LightweightMMM ()
mmm . fit ( media = media_data ,
extra_features = extra_features ,
media_prior = costs ,
target = target ,
number_warmup = 1000 ,
number_samples = 1000 ,
number_chains = 2 ,
custom_priors = custom_priors )
Weitere Informationen finden Sie in unserer Dokumentation zu custom_priors.
Sie können zwischen täglichen und wöchentlichen Daten wechseln, indem Sie weekday_seasonality=True
und seasonality_frequency=365
oder weekday_seasonality=False
und seasonality_frequency=52
(Standard) aktivieren. Bei täglichen Daten gibt es zwei Arten von Saisonalität: diskrete Wochentagsdaten und glatte Jahresdaten.
Benutzer können die Konvergenzmetriken der Parameter wie folgt überprüfen:
mmm . print_summary ()
Als Faustregel gilt, dass r_hat
-Werte für alle Parameter kleiner als 1,1 sind.
Benutzer können die Übereinstimmung zwischen dem tatsächlichen KPI und dem vorhergesagten KPI überprüfen, indem sie:
plot . plot_model_fit ( media_mix_model = mmm , target_scaler = target_scaler )
Wenn target_scaler
used for preprocessing.CustomScaler()
angegeben wird, wäre das Ziel unskaliert. Bayesianisches R-Quadrat und MAPE werden im Diagramm angezeigt.
Benutzer können die Vorhersage für die Testdaten erhalten, indem sie:
prediction = mmm . predict (
media = media_data_test ,
extra_features = extra_data_test ,
target_scaler = target_scaler
)
Die zurückgegebenen Vorhersagen sind Verteilungen; Wenn Punktschätzungen gewünscht sind, können Benutzer diese auf der Grundlage der angegebenen Verteilung berechnen. Wenn beispielsweise data_size
der Testdaten 20, number_samples
1000 und number_of_chains
2 beträgt, gibt mmm.predict
2000 Vorhersagesätze mit 20 Datenpunkten zurück. Benutzer können die Verteilungen mit dem wahren Wert der Testdaten vergleichen und die Metriken wie Mittelwert und Median berechnen.
Benutzer können Details zur Parameterschätzung erhalten, indem sie:
mmm . print_summary ()
Das Obige gibt den Mittelwert, die Standardabweichung, den Median und das glaubwürdige Intervall für jeden Parameter zurück. Die Verteilungstabellen werden bereitgestellt von:
plot . plot_media_channel_posteriors ( media_mix_model = mmm , channel_names = media_names )
channel_names
gibt Mediennamen in jedem Diagramm an.
Reaktionskurven werden wie folgt bereitgestellt:
plot . plot_response_curves ( media_mix_model = mmm , media_scaler = media_scaler , target_scaler = target_scaler )
Wenn media_scaler
und target_scaler
die für preprocessing.CustomScaler()
verwendet werden, angegeben werden, würden sowohl die Medien- als auch die Zielwerte unskaliert.
Um die Medieneffektivität und ROI-Schätzung zu extrahieren, können Benutzer Folgendes tun:
media_effect_hat , roi_hat = mmm . get_posterior_metrics ()
media_effect_hat
ist die Schätzung der Medienwirksamkeit und roi_hat
ist die ROI-Schätzung. Anschließend können Benutzer die Verteilung der Schätzung wie folgt visualisieren:
plot . plot_bars_media_metrics ( metric = media_effect_hat , channel_names = media_names )
plot . plot_bars_media_metrics ( metric = roi_hat , channel_names = media_names )
Zur Optimierung maximieren wir den Umsatz, indem wir die Medieneingaben so ändern, dass die Gesamtkosten der Medien konstant bleiben. Wir können auch angemessene Grenzen für jede Medieneingabe zulassen (z. B. +- x %). Wir optimieren nur kanalübergreifend und nicht über die Zeit. Um die Optimierung durchzuführen, benötigt man folgende Hauptparameter:
n_time_periods
: Die Anzahl der Zeiträume, die Sie simulieren möchten (z. B. für die nächsten 10 Wochen optimieren, wenn Sie ein Modell auf wöchentlichen Daten trainiert haben).budget
das Sie für die nächsten n_time_periods
zuweisen möchten.n_time_periods
verwendet werden.media_gap
bezieht sich auf die Mediendatenlücke zwischen dem Ende der Trainingsdaten und dem Beginn der bereitgestellten Out-of-Sample-Medien. Z.B. Wenn 100 Wochen Daten für das Training verwendet wurden und die Vorhersage 2 Monate nach Abschluss der Trainingsdaten beginnt, müssen wir die 8 Wochen angeben, die zwischen den Trainingsdaten und den Vorhersagedaten fehlen, damit Datentransformationen (Adstock, Übertrag usw.) korrekt durchgeführt werden können .Siehe unten und Beispiel für eine Optimierung:
# Run media optimization.
budget = 40 # your budget here
prices = np . array ([ 0.1 , 0.11 , 0.12 ])
extra_features_test = extra_features_scaler . transform ( extra_features_test )
solution = optimize_media . find_optimal_budgets (
n_time_periods = extra_features_test . shape [ 0 ],
media_mix_model = mmm ,
budget = budget ,
extra_features = extra_features_test ,
prices = prices )
Benutzer können das Modell wie folgt speichern und laden:
utils . save_model ( mmm , file_path = 'file_path' )
Benutzer können file_path
angeben, um das Modell zu speichern. So laden Sie ein gespeichertes MMM-Modell:
utils . load_model ( file_path : 'file_path' )
Um dieses Repository zu zitieren:
@software{lightweight_mmmgithub,
author = {Pablo Duque and Dirk Nachbar and Yuka Abe and Christiane Ahlheim and Mike Anderson and Yan Sun and Omri Goldstein and Tim Eck},
title = {LightweightMMM: Lightweight (Bayesian) Marketing Mix Modeling},
url = {https://github.com/google/lightweight_mmm},
version = {0.1.6},
year = {2022},
}
Jin, Y., Wang, Y., Sun, Y., Chan, D. & Koehler, J. (2017). Bayesianische Methoden zur Media-Mix-Modellierung mit Verschleppungs- und Formeffekten. Google Inc.
Chan, D. & Perry, M. (2017). Herausforderungen und Chancen bei der Media-Mix-Modellierung.
Sun, Y., Wang, Y., Jin, Y., Chan, D. & Koehler, J. (2017). Bayesianische hierarchische Medienmixmodellierung auf Geoebene.
Da LMMM kein offizielles Google-Produkt ist, kann das LMMM-Team nur eingeschränkten Support anbieten.
Bei Fragen zur Methodik schauen Sie bitte im Abschnitt „Referenzen“ oder auf der FAQ-Seite nach.
Wenn Sie Probleme bei der Installation oder Verwendung von LMMM haben , können Sie diese gerne auf den Registerkarten „Diskussionen“ oder „Probleme“ des Github-Repositorys posten. Das LMMM-Team beantwortet diese Fragen in unserer Freizeit, daher können wir eine zeitnahe Antwort leider nicht garantieren. Wir ermutigen die Community auch, hier Tipps und Ratschläge miteinander zu teilen!
Funktionsanfragen posten Sie bitte auf der Registerkarte „Diskussionen“ des Github-Repositorys. Wir haben eine interne Roadmap für die LMMM-Entwicklung, achten aber auf Funktionswünsche und freuen uns über diese!
Für Fehlerberichte posten Sie diese bitte auf der Registerkarte „Probleme“ des Github-Repositorys. Ob/wann wir sie beheben können, werden wir Sie in den Kommentaren zu Ihrem Problem darüber informieren.
Pull-Requests werden gerne angenommen, sind für uns aber nur sehr schwer zusammenzuführen, da der Code in diesem Repository mit den internen Systemen von Google verknüpft ist und eine interne Prüfung bestehen muss. Wenn Sie eine Pull-Anfrage einreichen und wir über Ressourcen verfügen, um diese zusammenzuführen, werden wir Sie diesbezüglich kontaktieren!
So erstellen Sie ein Marketing-Mix-Modell mit LightweightMMM von Mario Filho.
Wie Google LightweightMMM funktioniert und eine exemplarische Vorgehensweise für Googles LightweightMMM von Mike Taylor.