In diesem Abschnitt wird beschrieben, wie Sie Meridian für die Szenarioplanung verwenden, einschließlich der Einbindung von Daten und Annahmen über zukünftige Entwicklungen in Szenarien zur Budgetoptimierung.
Im Rahmen der zukunftsbezogenen Budgetoptimierung prognostiziert Meridian das inkrementelle Ergebnis auf Grundlage bestimmter Annahmen über die Zukunft. Meridian sagt dabei nicht den absoluten zukünftigen Ergebniswert voraus, sondern ausschließlich den inkrementellen Anteil. Weitere Informationen sind unter Warum prognostiziert Meridian keine Ergebnisse? verfügbar.
Was ist Szenarioplanung?
Szenarioplanung ist eine MMM-Analyse (Marketing Mix Modeling), die Annahmen über die Zukunft einbeziehen kann. Für die Analyse nach der Modellierung, z. B. für Return on Investment (ROI), Reaktionskurven und Budgetoptimierung, verwendet Meridian Verlaufsdaten, um Standardannahmen zu treffen. Diese Annahmen können für die zukunftsbezogene Planung angemessen sein, das ist aber nicht immer der Fall. Neue Daten können in die Analyse einbezogen werden, um die Annahmen nach Bedarf zu ändern.
Im Folgenden finden Sie einige Möglichkeiten, wie sich zukünftige Strategien von bisherigen unterscheiden können.
- Kosten pro Media-Einheit: Die Kosten pro Media-Einheit für einen Channel haben sich möglicherweise geändert oder werden sich voraussichtlich ändern (siehe Code-Beispiel 1 und Code-Beispiel 2).
- Umsatz pro KPI-Einheit: Der Umsatz pro KPI (z. B. Stückpreis oder Lifetime-Wert) hat sich möglicherweise geändert oder wird sich voraussichtlich ändern (siehe Code-Beispiel 3).
- Flighting-Muster: Eventuell stimmen Ihre bisherigen und zukünftigen Flighting-Muster nicht überein. Vielleicht haben Sie während des Modelltrainingszeitraums einen neuen Media-Channel eingeführt. Das bisherige Flighting-Muster des neuen Channels enthält möglicherweise Nullen oder zeigt einen Aufwärtstrend, der voraussichtlich nicht fortgesetzt wird (siehe Code-Beispiel 4).
Messwerte für die Analyse nach der Modellierung
Die Szenarioplanung wirkt sich auf Messwertdefinitionen, aber nicht auf die Parameterschätzung aus. Zur Veranschaulichung dieser Konzepte betrachten wir einen hypothetischen Fall, in dem die Methode der gewöhnlichen kleinsten Quadrate verwendet wird, um die Behandlungseffekte eines Medikaments zu schätzen. Wir gehen davon aus, dass die Dosierung in mg (X) das Ergebnis (Y) linear beeinflusst, wie im Modell dargestellt:
\[ Y = \alpha + X \beta + \epsilon \ . \]
Der Behandlungseffekt hängt vom Dosierungskoeffizienten $\beta$ ab, der aus einem beobachteten Dataset geschätzt wird. Der Behandlungseffekt kann viele mögliche Messwertdefinitionen haben. Sie könnten beispielsweise die Wirkung eines Medikaments als die erwartete Änderung des Ergebnisses definieren, die durch eine Dosis von 10 mg ($10 \beta$) oder 15 mg ($15 \beta$) verursacht wird. Beide Definitionen des Behandlungseffekts können mit demselben Modell und derselben Koeffizientenschätzung $\hat{\beta}$ berechnet werden.
In Meridian hängt die Definition der Messwerte für die Analyse nach der Modellierung von bestimmten Datenmerkmalen ab. Der ROI hängt beispielsweise von einem bestimmten Zeitraum, einer Reihe von geografischen Einheiten, dem Flighting-Muster (relative Verteilung von Media-Einheiten auf geografische Einheiten und Zeiträume), der Gesamtzahl der Media-Einheiten pro Channel, den Kosten pro Media-Einheit und dem Umsatz pro KPI ab. Weitere Messwerte für die Analyse nach der Modellierung umfassen das erwartete Ergebnis, das inkrementelle Ergebnis, den Grenz-ROI, die Kosten pro inkrementellem KPI, Reaktionskurven und die optimale Budgetzuweisung. Standardmäßig werden diese Messwerte anhand der input_data definiert, die an Meridian übergeben werden. Mit new_data können jedoch alternative Messwertdefinitionen festgelegt werden. In Tabelle 1 wird angegeben, welche Dateneigenschaften die Definition der einzelnen Messwerte beeinflussen.
| Zeitraum | Reihe von geografischen Einheiten | Flighting-Muster | Gesamtzahl der Media-Einheiten pro Channel | Kosten pro Media-Einheit | Umsatz pro KPI (falls zutreffend) | Kontrollwerte | |
|---|---|---|---|---|---|---|---|
expected_outcome |
X | X | X | X | X | X | |
incremental_outcome |
X | X | X | X | X | ||
roi, marginal_roi, cpik |
X | X | X | X | X | X | |
response_curves |
X | X | X | X | X | ||
BudgetOptimizer.optimize |
X | X | X | ‡ | X | X |
‡ Bei der Budgetoptimierung wird die Gesamtzahl der Media-Einheiten pro Channel (in Kombination mit den Annahmen zum festen Flighting-Muster und zu den Kosten pro Media-Einheit) verwendet, um ein Standardgesamtbudget (nur bei der Optimierung mit festem Budget) und Budgetbeschränkungen auf Channelebene festzulegen. Wenn diese Einstellungen über die Argumente
budgetundpct_of_spendvonBudgetOptimizer.optimizeüberschrieben werden, hat die Gesamtzahl der Media-Einheiten pro Channel keine Auswirkungen auf die Optimierung.
Die Schätzung der einzelnen Messwerte für die Analyse nach der Modellierung hängt von der Posterior-Verteilung der Modellparameter ab. Die Posterior-Verteilung ist abhängig von den input_data, die an den Meridian-Objektkonstruktor übergeben werden (mit Ausnahme des KPI für geografische Einheiten und Zeiträume, die in ModelSpec.holdout_id angegeben sind). Die Posterior-Verteilung wird geschätzt, wenn sample_posterior aufgerufen wird. Diese Schätzung wird für alle Analysen nach der Modellierung verwendet.
Das Argument new_data
Der Standardwert für jede Dateneigenschaft in Tabelle 1 wird aus den input_data abgeleitet, die an Meridian übergeben werden. Bei der Analyse nach der Modellierung kann der Nutzer die Eingabedaten mit dem Argument new_data überschreiben, das in den meisten Methoden verfügbar ist. Für jede Methode wird nur eine Teilmenge der new_data-Attribute verwendet. In Tabelle 2 sehen Sie, welche new_data-Attribute von den einzelnen Methoden verwendet werden.
new_data-Attribute, die von den einzelnen Methoden verwendet werden.
media, reach, frequency |
revenue_per_kpi |
media_spend, rf_spend |
organic_media, organic_reach, organic_frequency, non_media_treatments |
controls |
time |
Zeitdimension muss mit input_data übereinstimmen. |
|
|---|---|---|---|---|---|---|---|
expected_outcome |
X | X | X | X | Ja | ||
incremental_outcome |
X | X | X | Nein | |||
roi, cpik, marginal_roi |
X | X | X | Nein | |||
response_curves |
X | X | X | X | Nein | ||
BudgetOptimizer.optimize |
X | X | X | X | Nein |
Die Datenattribute werden aus den new_data auf dieselbe Weise wie aus den Eingabedaten abgeleitet. Die Kosten pro Media-Einheit werden beispielsweise für jede geografische Einheit und jeden Zeitraum berechnet, indem die Ausgaben durch die Media-Einheiten geteilt werden.
Wenn der Zeitraum von new_data mit dem Zeitraum der Eingabedaten übereinstimmt, müssen Sie nicht alle new_data-Attribute angeben, die von der Methode verwendet werden, die Sie aufrufen. Sie können eine beliebige Teilmenge der Attribute angeben. Die verbleibenden Attribute werden aus den Eingabedaten übernommen.
Wenn sich der Zeitraum von new_data jedoch von dem der Eingabedaten unterscheidet, müssen Sie alle new_data-Attribute übergeben, die von der Methode verwendet werden, die Sie aufrufen. Alle new_data-Attribute müssen dieselbe Zeitdimension haben.
Nur für die Methode expected_outcome muss die Zeitdimension mit den Eingabedaten übereinstimmen.
Für die Methoden response_curves und optimize müssen außerdem Datumslabels an new_data.time übergeben werden, wenn die Zeitdimension nicht mit den Eingabedaten übereinstimmt. Die Datumslabels haben keine Auswirkungen auf die Berechnungen, werden in bestimmten Visualisierungen aber für Achsenlabels verwendet.
Helper-Methode zum Erstellen von new_data für die Budgetoptimierung
Es kann auf den ersten Blick wenig logisch erscheinen, dass die Ausgaben auf Channelebene sowohl eine Ausgabe als auch eine new_data-Eingabe von BudgetOptimizer.optimize sind. Die Ausgabe ist die optimale Ausgabenverteilung, während die eingegebenen Ausgaben zusammen mit den Media-Einheiten verwendet werden, um die angenommenen Kosten pro Media-Einheit für jede geografische Einheit und jeden Zeitraum festzulegen. Die eingegebenen Ausgaben werden außerdem genutzt, um das Gesamtbudget für ein Optimierungsszenario mit festem Budget sowie die Budgetbeschränkungen auf Channelebene festzulegen. Diese können jedoch mit den Argumenten budget und pct_of_spend überschrieben werden.
Die Methode optimizer.create_optimization_tensors ist für Nutzer verfügbar, die die Daten zu den Kosten pro Media-Einheit lieber direkt eingeben möchten. Mit dieser Methode wird ein new_data-Objekt erstellt, das speziell für die Übergabe an die BudgetOptimizer.optimize-Methode vorgesehen ist und die folgenden Optionen für Eingabedaten unterstützt.
Channels ohne Reichweite und Häufigkeit:
- Media-Einheiten und Kosten pro Media-Einheit
- Ausgaben und Kosten pro Media-Einheit
Channels für Reichweite und Häufigkeit, wenn use_optimal_frequency=True:
- Impressionen und Cost-per-Impression
- Ausgaben und Cost-per-Impression
Channels für Reichweite und Häufigkeit, wenn use_optimal_frequency=False:
- Impressionen, Häufigkeit und Cost-per-Impression
- Ausgaben, Häufigkeit und Cost-per-Impression
Beispiele zur Veranschaulichung
In diesem Abschnitt wird erläutert, wie die Berechnungen für die wichtigsten Funktionen zur Analyse nach der Modellierung durchgeführt werden: Analyzer.incremental_outcome, Analyzer.roi, Analyzer.response_curves und BudgetOptimizer.optimize.
Insbesondere wird in diesen Beispielen gezeigt, wie die Berechnung der einzelnen Methoden mit input_data und new_data erfolgt. In diesen Beispielen enthält input_data ein Zeitfenster vor der Modellierung für die Daten der Media-Einheiten, new_data aber nicht. Das Zeitfenster vor der Modellierung enthält Media-Einheiten-Daten aus der Zeit vor dem ersten Modellierungszeitfenster. So kann das Modell die verzögerte Wirkung dieser Einheiten korrekt berücksichtigen. Wenn new_data einen anderen Zeitraum als input_data abdeckt (was in diesen Beispielen der Fall ist), müssen die Daten der Media-Einheiten dieselbe Anzahl von Zeiträumen aufweisen wie alle anderen neuen Daten.
Zusätzlich zu new_data haben alle diese Methoden ein selected_times-Argument. Diese Argumente beeinflussen die Definition des Ausgabemesswerts, nicht die Parameterschätzung. Weitere Informationen sind unter Was ist Szenarioplanung? verfügbar.
Die Methode Analyzer.incremental_outcome hat auch ein media_selected_times-Argument, mit dem sich die Definition des inkrementellen Ergebnisses weiter verfeinern lässt. Dieses Argument bietet Analyzer.incremental_outcome mehr Flexibilität als die anderen Methoden. Die übrigen Methoden haben dieses Argument nicht, da ihre Berechnungen einen Abgleich zwischen inkrementellem Ergebnis und den zugehörigen Kosten erfordern. Das kann zu Mehrdeutigkeiten führen, wenn sowohl selected_times als auch media_selected_times anpassbar sind. Sie können die incremental_outcome-Ausgabe jedoch manuell mit Kostendaten kombinieren, um beispielsweise benutzerdefinierte ROI-Definitionen zu erstellen.
In einem Modell auf geografischer Ebene hat jede geografische Einheit ein eigenes inkrementelles Ergebnis, einen eigenen ROI und eine eigene Reaktionskurve. Jedes Beispiel steht für eine einzelne geografische Einheit.
Für Ergebnisse auf Länderebene werden die Ergebnisse der einzelnen geografischen Einheiten aggregiert. Jede dieser Methoden hat ein selected_geos-Argument, mit dem der Nutzer eine Teilmenge von geografischen Einheiten angeben kann, die in die Messwertdefinition aufgenommen werden sollen.
Inkrementelles Ergebnis
Bei der incremental_outcome-Methode wird für jeden Media-Channel das erwartete Ergebnis in zwei kontrafaktischen Szenarien verglichen. In einem Szenario werden die Media-Einheiten auf die bisherigen Werte festgelegt. Im anderen Szenario werden sie für einige oder alle Zeiträume auf null gesetzt.
Mit dem media_selected_times-Argument werden die Zeiträume festgelegt, in denen die Media-Einheiten auf null gesetzt werden.
Das selected_times-Argument bestimmt den Zeitraum, in dem das inkrementelle Ergebnis gemessen wird.
input_data verwenden
Bei der Standarddefinition für das inkrementelle Ergebnis sind für media_selected_times alle Zeiträume festgelegt, einschließlich des Modellierungszeitfensters und des Zeitfensters vor der Modellierung.
Die Media-Einheiten vom Typ input_data können optional ein Zeitfenster vor der Modellierung enthalten, damit das Modell den verzögerten Effekt dieser Einheiten richtig berücksichtigen kann.
Der Standardwert für selected_times sind alle Zeiträume im Modellierungszeitfenster. Das bedeutet, dass das inkrementelle Ergebnis über alle Zeiträume im Modellierungszeitfenster hinweg aggregiert wird.
Die input_data können Media-Einheiten in einem Zeitfenster vor der Modellierung enthalten, um verzögerte Effekte zu berücksichtigen. Das Zeitfenster vor der Modellierung enthält nur Media-Einheiten und keine anderen Daten. Daher sind die Zellen in der Abbildung leer.

input_data mit geänderten selected_times und media_selected_times verwenden
Um zu verstehen, wie new_data in incremental_outcome und anderen Methoden verwendet wird, sollten Sie die Argumente selected_times und media_selected_times kennen.
In diesem Beispiel ist media_selected_times auf einen einzelnen Zeitraum (Woche 0) festgelegt.
selected_times ist auf die Wochen 0 bis 3 festgelegt. max_lag ist in der ModelSpec auf 3 festgelegt. Das inkrementelle Ergebnis muss also ab Woche 4 null sein. Durch diese Kombination aus media_selected_times und selected_times wird die gesamte langfristige Wirkung der Media-Einheiten aus Woche 0 erfasst.

new_data mit einem neuen Zeitfenster verwenden
Wenn new_data mit einer anderen Anzahl von Zeiträumen als input_data übergeben wird, gibt es kein Zeitfenster vor der Modellierung. Es wird davon ausgegangen, dass die Media-Einheiten für alle Zeiträume vor dem Zeitfenster für new_data gleich null sind.
Bei der Standarddefinition des inkrementellen Ergebnisses sind sowohl media_selected_times als auch selected_times alle Zeiträume im new_data-Zeitfenster.

ROI
Bei der roi-Methode wird für jeden Media-Channel das inkrementelle Ergebnis, das während selected_times erzielt wurde, durch die Ausgaben während selected_times geteilt. Die roi-Methode hat kein media_selected_times-Argument. Beim inkrementellen Ergebnis wird das kontrafaktische Szenario, in dem Media-Einheiten auf historische Werte festgelegt sind, mit dem kontrafaktischen Szenario verglichen, in dem Media-Einheiten für alle Zeiträume auf null gesetzt sind.
input_data verwenden
Standardmäßig ist für selected_times das gesamte Modellierungszeitfenster festgelegt. Im kontrafaktischen Szenario werden die Media-Einheiten für alle Zeiträume sowohl im Modellierungszeitfenster als auch im Zeitfenster vor der Modellierung auf null gesetzt.

new_data mit einem neuen Zeitfenster verwenden
Wenn new_data mit einer anderen Anzahl von Zeiträumen als input_data übergeben wird, gibt es kein Zeitfenster vor der Modellierung. Es wird davon ausgegangen, dass die Media-Einheiten für alle Zeiträume vor dem Zeitfenster für new_data gleich null sind.

Reaktionskurven und Budgetoptimierung
Die response_curves-Methode ähnelt roi insofern, als das inkrementelle Ergebnis und die Ausgaben beide über selected_times aggregiert werden, das standardmäßig auf das gesamte Modellierungszeitfenster festgelegt ist. Jeder Punkt auf der x-Achse der Reaktionskurve entspricht einem bestimmten Prozentsatz der bisherigen Ausgaben im Zeitraum selected_times. Bei dieser Methode wird das entsprechende inkrementelle Ergebnis (y-Achse) berechnet, indem die bisherigen Media-Einheiten mit demselben Faktor skaliert werden. Der Skalierungsfaktor wird auf die Media-Einheiten des Modellierungszeitfensters und des Zeitfensters vor der Modellierung angewendet.
Die Budgetoptimierung basiert auf Reaktionskurven. Daher gilt dieselbe Abbildung sowohl für Reaktionskurven als auch für die Budgetoptimierung. Das Argument selected_times in BudgetOptimizer.optimize wurde eingestellt. Stattdessen werden jetzt die Argumente start_date und end_date verwendet.
input_data verwenden
Standardmäßig ist für selected_times das gesamte Modellierungszeitfenster festgelegt. Die Media-Einheiten der kontrafaktischen Menge werden für alle Zeiträume im Modellierungszeitfenster und im Zeitfenster vor der Modellierung skaliert.
In dieser Abbildung wird die Reaktionskurve auf der Grundlage von 50 % des input_data-Budgets berechnet.

new_data mit einem neuen Zeitfenster verwenden
Wenn new_data mit einer anderen Anzahl von Zeiträumen als input_data übergeben wird, gibt es kein Zeitfenster vor der Modellierung. Es wird davon ausgegangen, dass die Media-Einheiten für alle Zeiträume vor dem Zeitfenster für new_data gleich null sind.
In dieser Abbildung wird die Reaktionskurve auf der Grundlage von 50 % des new_data-Budgets berechnet.

Codebeispiele für die Budgetoptimierung
Die folgenden Beispiele veranschaulichen die Leistungsfähigkeit von new_data für die Budgetoptimierung und die Planung zukünftiger Szenarien. Dazu konzentriert sich jedes Beispiel auf ein wichtiges Attribut der Eingabedaten, das mit new_data geändert werden kann. Alle diese Annahmen (und weitere) lassen sich jedoch in einem Optimierungsszenario kombinieren.
Angenommen, Sie möchten Ihr Budget für ein zukünftiges Quartal optimieren, das voraussichtlich ein ähnliches Flighting-Muster, ähnliche Kosten pro Media-Einheit und einen ähnlichen Umsatz pro KPI wie die Eingabedaten des letzten Quartals aufweist. Sie können die Eingabedaten des letzten Quartals verwenden, um das zukünftige Szenario darzustellen und die Aspekte anzupassen, die sich voraussichtlich ändern werden. Das wird in den einzelnen Beispielen veranschaulicht.
In komplizierteren zukünftigen Szenarien ist es möglicherweise besser, die Eingabedaten vollständig durch neue Daten zu ersetzen. Dazu können die Arrays entweder in Python erstellt oder die Daten aus einer CSV-Datei geladen werden.
In diesen Beispielen gibt es drei Media-Channels. Der KPI ist die verkaufte Stückzahl und revenue_per_kpi ist angegeben. Zur Veranschaulichung wird in jedem Beispiel ein Optimierungsszenario ausgeführt, das auf dem vierten Quartal 2024 basiert. In jedem Beispiel wird ein Schlüsselelement des Szenarios geändert. Das new_data-Argument wird verwendet, um die Änderung zu berücksichtigen.
Im Code der einzelnen Beispiele wird davon ausgegangen, dass ein Meridian-Modell als mmm initialisiert, die Methode sample_posterior aufgerufen und ein BudgetOptimizer als opt initialisiert wurde.
mmm = model.Meridian(...)
mmm.sample_posterior(...)
opt = optimizer.BudgetOptimizer(mmm)
Beispiel 1: Neue Kosten pro Media-Einheit für einen einzelnen Channel
Angenommen, die Kosten pro Media-Einheit für den ersten Channel werden sich in naher Zukunft voraussichtlich verdoppeln. Sie sollten daher die angenommenen Kosten pro Media-Einheit dieses Channels in der Optimierung verdoppeln. Dazu erstellen Sie ein Ausgaben-Array, das den Eingabedaten entspricht, mit der Ausnahme, dass die Ausgaben für den ersten Channel verdoppelt werden. Das Array wird an den DataTensors-Konstruktor übergeben, der wiederum an das new_data-Argument der Optimierung übergeben wird.
Wenn Sie media_spend ändern, wirkt sich das auch auf das Standardgesamtbudget für die Optimierung mit festem Budget sowie auf die Standardausgabenbeschränkungen aus. Diese Standardwerte können mit den Optimierungsargumenten budget und pct_of_spend überschrieben werden.
Es ist wichtig, diese Argumente zu kennen und sie bei Bedarf anzupassen.
# Create `new_data` from `input_data`, but double the spend for channel 0.
new_spend = mmm.input_data.media_spend
new_spend[:, :, 0] *= 2
new_data = analyzer.DataTensors(media_spend=new_spend)
# Run fixed budget optimization on the last quarter of 2024, using customized
# total budget and constraints.
opt_results = opt.optimize(
new_data=new_data,
budget=100,
pct_of_spend=[0.3, 0.3, 0.4],
start_date="2024-10-07",
end_date="2024-12-30",
)
Beispiel 2: Neue Kosten pro Media für alle Channels
Angenommen, die Kosten pro Media-Einheit werden sich in naher Zukunft voraussichtlich für alle Channels ändern. Sie sollten daher die angenommenen Kosten pro Media-Einheit aller Channels in der Optimierung ändern. Für jeden Channel sind die erwarteten Kosten eine bekannte Konstante, die über alle geografischen Einheiten und Zeiträume hinweg gleich bleibt. Die Helper-Methode create_optimization_tensors, mit der ein DataTensors-Objekt erstellt wird, bietet sich für diese Aufgabe an, da die Kosten pro Media-Einheit (cpmu) eine direkte Eingabe sind.
Für die Methode create_optimization_tensors müssen alle Optimierungsargumente übergeben werden. Entweder media oder media_spend kann (mit geografischer und Zeitdimension) übergeben werden, um das Flighting-Muster anzugeben. Die Zeitdimension aller Argumente für create_optimization_tensors muss übereinstimmen. media darf keine zusätzlichen Zeiträume für verzögerte Effekte enthalten.
# Create `new_data` using the helper method. The cost per media unit (cpmu) is
# set to a constant value for each channel.
new_cpmu = np.array([0.1, 0.2, 0.5])
media_excl_lag = mmm.input_data.media[:, -mmm.n_times:, :]
new_data = opt.create_optimization_tensors(
time=mmm.input_data.time,
cpmu=new_cpmu,
media=media_excl_lag,
revenue_per_kpi=mmm.input_data.revenue_per_kpi,
)
# Run fixed budget optimization on the last quarter of 2024, using customized
# total budget and constraints.
opt_results = opt.optimize(
new_data=new_data,
budget=100,
pct_of_spend=[0.3, 0.3, 0.4],
start_date="2024-10-07",
end_date="2024-12-30",
)
Dasselbe lässt sich auch erreichen, indem das DataTensors-Objekt direkt erstellt wird. Dazu werden die Media-Einheiten der einzelnen Channels mit den Kosten pro Media-Einheit für den jeweiligen Channel skaliert.
# Create `new_data` without the helper method.
# In this example, `mmm.n_media_times > mmm.n_times` because the `media` data
# contains additional lag history. These time periods are discarded to create
# the new spend data.
media_excl_lag = mmm.input_data.media[:, -mmm.n_times:, :]
new_spend = media_excl_lag * np.array([0.1, 0.2, 0.5])
new_data = analyzer.DataTensors(media_spend=new_spend)
# Run fixed budget optimization on the last quarter of 2024, using customized
# total budget and constraints.
opt_results = opt.optimize(
new_data=new_data,
budget=100,
pct_of_spend=[0.3, 0.3, 0.4],
start_date="2024-10-07",
end_date="2024-12-30",
)
Beispiel 3: Neuer Umsatz pro KPI
Angenommen, der Umsatz pro KPI (z. B. Stückpreis oder Lifetime-Wert) wird sich in naher Zukunft voraussichtlich ändern. Die neue Annahme zum Umsatz pro KPI kann in die Optimierung einbezogen werden. Dadurch ändert sich der geschätzte Umsatz pro inkrementeller KPI-Einheit, aber nicht die Anpassung des Modells an den KPI selbst.
# Create `new_data` from `input_data`, but double the revenue per kpi.
new_data = analyzer.DataTensors(
revenue_per_kpi=mmm.input_data.revenue_per_kpi * 2
)
# Run fixed budget optimization on the last quarter of 2024, using customized
# total budget and constraints.
opt_results = opt.optimize(
new_data=new_data,
budget=100,
pct_of_spend=[0.3, 0.3, 0.4],
start_date="2024-10-07",
end_date="2024-12-30",
)
Beispiel 4: Neues Flighting-Muster
Möglicherweise planen Sie ein anderes zukünftiges Flighting-Muster (relative Verteilung von Media-Einheiten auf geografische Einheiten oder Zeiträume). Ein häufiger Grund dafür ist, dass Sie das Budget von einer geografischen Einheit in eine andere verschieben möchten. Ein weiterer häufiger Grund ist die Berücksichtigung eines neuen Media-Channels, der während des Zeitraums der Eingabedaten eingeführt wurde. Wenn ein neuer Channel dazukommt, gibt es in dem Flighting-Muster vor seiner Einführung keine (also null) Media-Einheiten. Wenn Sie den neuen Channel in Zukunft kontinuierlich einsetzen möchten, sollten die Nullen im Flighting-Muster durch andere Werte ersetzt werden, um das geplante Flighting-Muster besser widerzuspiegeln.
Angenommen, der erste Media-Channel wurde im vierten Quartal 2024 eingeführt. Vielleicht hatte er anfangs keine Ausgaben, die aber im Laufe des Quartals anstiegen. In Zukunft möchten Sie jedoch eine konstante Anzahl von Media-Einheiten pro Kopf über geografische Einheiten und Zeiträume hinweg festlegen. Mit dem Argument media von DataTensors wird das Flighting-Muster angegeben. Wenn Sie dieses Argument für ein Geo-Modell angeben, ist es oft am besten, das beabsichtigte Flighting-Muster in Bezug auf Media-Einheiten pro Kopf zu berücksichtigen.
Die genaue Anzahl der Media-Einheiten pro Kopf (in diesem Beispiel 100) hat keinen Einfluss auf das Flighting-Muster. Das Flighting-Muster ist die relative Zuweisung von Media-Einheiten auf geografische Einheiten und Zeiträume. Dasselbe Flighting-Muster könnte also beispielsweise durch die Zuweisung von 10 Einheiten pro Kopf erreicht werden. Die Media-Einheiten wirken sich jedoch auch auf die Annahme zu den Kosten pro Media-Einheit aus, die aus dem Verhältnis der Ausgaben pro Media-Einheit in jeder geografischen Einheit und jedem Zeitraum abgeleitet werden. In diesem Beispiel werden die neuen Ausgabendaten übergeben, um für alle geografischen Einheiten und Zeiträume Kosten pro Media-Einheit von 0,1 zu erzielen.
Wenn Sie media_spend ändern, wirkt sich das auch auf das Standardgesamtbudget für die Optimierung mit festem Budget sowie auf die Standardausgabenbeschränkungen aus. Diese Standardwerte können mit den Optimierungsargumenten budget und pct_of_spend überschrieben werden.
Es ist wichtig, diese Argumente zu kennen und sie bei Bedarf anzupassen.
# Create new media units data from the input data, but set the media units per
# capita to 100 for channel 0 for all geos and time periods.
new_media = mmm.input_data.media.values
new_media[:, :, 0] = 100 * mmm.input_data.population.values[:, None]
# Set a cost per media unit of 0.1 for channel 0 for all geos and time periods.
new_media_spend = mmm.input_data.media_spend.values
new_media_spend[:, :, 0] = 0.1 * new_media[:, -mmm.n_times:, 0]
new_data = analyzer.DataTensors(
media=new_media,
media_spend=new_spend,
)
# Run fixed budget optimization on the last quarter of 2024, using customized
# total budget and constraints.
opt_results = opt.optimize(
new_data=new_data,
budget=100,
pct_of_spend=[0.3, 0.3, 0.4],
start_date="2024-10-07",
end_date="2024-12-30",
)
Warum prognostiziert Meridian keine Ergebnisse?
Meridian muss das erwartete Ergebnis nicht in die Zukunft prognostizieren, damit seine kausale Inferenz für die zukünftige Planung nützlich ist. Meridian bietet Methoden, die die Planung zukünftiger Szenarien unterstützen, darunter die Klasse Optimizer und viele Methoden wie roi, marginal_roi und incremental_outcome. Mit dem Argument new_data in diesen Methoden lassen sich die kausalen Inferenzfunktionen von Meridian verwenden, um Mengen für jede hypothetische Media-Ausführung oder jedes Flighting-Muster zu schätzen, einschließlich zukünftiger Ausführungen.
Ziel von Meridian ist die kausale Inferenz. Genauer gesagt, soll das inkrementelle Ergebnis abgeleitet werden, das Testvariablen auf das Ergebnis haben. Mithilfe von Begriffen aus dem Glossar vereinfachen wir die Definition des inkrementellen Ergebnisses so:
\[ \text{Incremental Outcome} = \text{Expected Outcome} - \text{Counterfactual} \]
Dabei hängt die Bedeutung von kontrafaktisch vom Testtyp ab. Weitere Informationen finden Sie im Glossar und eine genauere Definition unter Inkrementelles Ergebnis – Definition.
Kontrollvariablen haben einen Einfluss auf das erwartete Ergebnis, aber nicht auf das inkrementelle Ergebnis (abgesehen von dem Einfluss, den Kontrollvariablen auf die Bereinigung von Media-Effekten haben). Das liegt daran, dass im Meridian-Modell festgelegt ist, dass Kontrollvariablen einen additiven Effekt auf „Erwartetes Ergebnis“ und „Kontrafaktisch“ haben, der sich in der Differenz aufhebt. Um das erwartete Ergebnis vorherzusagen, müssten wir die Kontrolldaten prognostizieren. Das kann sehr schwierig sein, da viele Kontrollvariablen stark schwanken, schwer vorhersehbar sind und völlig außerhalb der Kontrolle eines Werbetreibenden liegen. Die Prognose der Kontrolldaten wäre orthogonal zu den kausalen Inferenzzielen von Meridian, da wir das inkrementelle Ergebnis ableiten und sogar optimieren können, ohne das erwartete Ergebnis vorhersagen zu müssen.
Auch die durch Knoten parametrisierten zeitlichen Effekte sind additiv. Daher hängen das erwartete Ergebnis und das kontrafaktische Ergebnis von den Knotenwerten ab, das inkrementelle Ergebnis jedoch nicht. Der knotenbasierte Ansatz von Meridian zur Modellierung zeitlicher Muster ist nicht für die Prognose konzipiert. Stattdessen wurde er entwickelt, um ein wesentlich flexibleres Modell für zeitliche Muster zu bieten, wodurch er sich besonders gut für kausale Inferenz eignet.