Welches Ergebnis ist wichtig?
Hier ist ein häufiges Szenario: Es wurde ein A/B -Check durchgeführt, bei dem eine Zufallsstichprobe von Einheiten (z. Kommunikation oder Angebot und „B“ können keine Kommunikation oder kein Angebot sein. „A“ könnte 10% Rabatt sein und „B“ könnte 20% Rabatt betragen. Zwei Gruppen, zwei verschiedene Behandlungen, bei denen A und B zwei diskrete Behandlungen sind, jedoch ohne Verlust der Allgemeinheit auf mehr als zwei Behandlungen und kontinuierliche Behandlungen.
Die Kampagnenläufe und Ergebnisse werden additionally zur Verfügung gestellt. Mit unserem Backend -System können wir verfolgen, welche dieser Einheiten die Maßnahmen des Interesses ergriffen haben (z. B. einen Kauf getätigt) und welche nicht. Darüber hinaus protokollieren wir für diejenigen, die es taten, die Intensität dieser Aktion. Ein häufiges Szenario ist, dass wir Kaufbeträge für diejenigen verfolgen können, die gekauft wurden. Dies wird oft als durchschnittlicher Bestellbetrag oder Einnahmen professional Käufermetrik bezeichnet. Oder hundert verschiedene Namen, die alle dasselbe bedeuten – für diejenigen, die gekauft haben, wie viel haben sie im Durchschnitt ausgegeben?
Für einige Anwendungsfälle interessiert sich der Vermarkter an der früheren Metrik-der Kaufrate. Haben wir beispielsweise mehr (potenziell erste) Käufer in unserer Akquisitionskampagne mit Behandlung A oder B gefahren? Manchmal sind wir daran interessiert, den Umsatz professional Käufer höher zu steigern, additionally legen wir den Schwerpunkt auf den letzteren.
Häufiger sind wir jedoch daran interessiert, die Einnahmen kostengünstig zu steigern, und was uns wirklich wichtig ist, sind die Einnahmen, die die Kampagne produziert hat gesamt. Hat die Behandlung A oder B mehr Einnahmen gefahren? Wir haben nicht immer ausgewogene Stichprobengrößen (möglicherweise aufgrund von Kosten oder Risikovermeidung) und dividieren die gemessenen Einnahmen durch die Anzahl der Kandidaten, die in jeder Gruppe behandelt wurden (nennen Sie diese Zählungen N_A und N_B). Wir möchten diese Maßnahme zwischen den beiden Gruppen vergleichen, daher lautet der Standardkontrast einfach:
![](https://towardsdatascience.com/wp-content/uploads/2025/02/1_NmHjbi_qPoTaRbMODRe30w.webp)
Dies ist nur die mittleren Einnahmen für die Behandlung A abzüglich der durchschnittlichen Einnahmen für die Behandlung B, wobei dieser Mittelwert die gesamte Reihe von gezielten Einheiten übernommen wird, unabhängig davon, ob sie antworteten oder nicht. Seine Interpretation ist ebenfalls unkompliziert – wie hoch sind die durchschnittlichen Einnahmen professional geförderter Einheit, die von der Behandlung A gegen die Behandlung B steigt?
Natürlich macht diese letzte Maßnahme beide vorhanden: die Rücklaufquote multipliziert mit dem mittleren Umsatz professional Responder.
Unsicherheit?
Wie viel ein Käufer ausgibt, ist sehr variabel und ein paar große Einkäufe in der einen oder anderen Behandlungsgruppe können den Mittelwert erheblich verzerren. Ebenso kann die Variation von Stichproben signifikant sein. Wir möchten additionally verstehen, wie sicher wir in diesem Vergleich der Mittelwerte sind und die „Signifikanz“ des beobachteten Unterschieds quantifizieren.
Sie werfen die Daten additionally in einen T-Check und starren auf den P-Wert. Aber warte! Unglücklicherweise für den Vermarkter, der größte Teil der Zeit, ist die Kaufrate relativ niedrig (manchmal sehr niedrig) und daher gibt es viele null Einnahmewerte – oft die überwiegende Mehrheit. Die T-Check-Annahmen können schwer verletzt werden. Sehr große Stichprobengrößen können zur Rettung kommen, aber es gibt eine bessere grundlegende Möglichkeit, diese Daten zu analysieren, die auf verschiedene Weise nützlich sind, die erklärt werden.
Beispiel Datensatz
Beginnen wir mit dem Beispieldatensatz, um die Dinge praktisch zu machen. Eine meiner Lieblingsdirektmarketingdatensätze stammt aus dem KDD Cup 98.
url="https://kdd.ics.uci.edu/databases/kddcup98/epsilon_mirror/cup98lrn.zip"
filename="cup98LRN.txt"
r = requests.get(url)
z = zipfile.ZipFile(io.BytesIO(r.content material))
z.extractall()
pdf_data = pd.read_csv(filename, sep=',')
pdf_data = pdf_data.question('TARGET_D >=0')
pdf_data('TREATMENT') = np.the place(pdf_data.RFA_2F >1,'A','B')
pdf_data('TREATED') = np.the place(pdf_data.RFA_2F >1,1,0)
pdf_data('GT_0') = np.the place(pdf_data.TARGET_D >0,1,0)
pdf_data = pdf_data(('TREATMENT', 'TREATED', 'GT_0', 'TARGET_D'))
Im obigen Code -Snippet laden wir eine ZIP -Datei (speziell des Lerndatensatzes) herunter, extrahieren sie und lesen Sie sie in einen Pandas -Datenrahmen. Die Artwork dieses Datensatzes ist eine Kampagnengeschichte einer gemeinnützigen Organisation, die über Direktmailings spenden. In diesem Datensatz gibt es keine Behandlungsvarianten. Daher tun wir stattdessen vor, den Datensatz basierend auf der Häufigkeit früherer Spenden zu segmentieren. Wir nennen diesen Indikator BEHANDLUNG (als kategorisch und erstellen BEHANDELT als binärer Indikator für ‚a‘). Betrachten Sie dies als die Ergebnisse einer randomisierten Kontrollstudie, bei der ein Teil der Stichprobenpopulation mit einem Angebot behandelt wurde und der Relaxation nicht. Wir verfolgen jeden Einzelnen und sammeln den Betrag ihrer Spende an.
Wenn wir diesen Datensatz untersuchen, sehen wir, dass es etwa 95.000 beförderte Personen gibt, die allgemein über die beiden Behandlungen gleichermaßen verteilt sind:
![](https://towardsdatascience.com/wp-content/uploads/2025/02/1_XhKq9V5wrHOoNdv-337O6g.webp)
Die Behandlung A hat eine größere Ansprechrate, aber insgesamt beträgt die Ansprechrate im Datensatz nur etwa 5%. Wir haben additionally 95% Nullen.
![](https://towardsdatascience.com/wp-content/uploads/2025/02/1_d4Rey_jyrOFQFdQCRqTLgw.webp)
Für die gespendeten Personen scheint eine Behandlung A mit einer niedrigeren durchschnittlichen Spendenmenge verbunden zu sein.
![](https://towardsdatascience.com/wp-content/uploads/2025/02/1_oV16Oan-_R3-ZBrk5h-R2g.webp)
Die Behandlung A, die alle gezielt mit einem höheren durchschnittlichen Spendenbetrag verbunden sind – Die höhere Rücklaufquote überwiegt den niedrigeren Spendenbetrag für Responner -, aber nicht viel.
![](https://towardsdatascience.com/wp-content/uploads/2025/02/1_uPBb_wAAR2TLlHlraK-WwQ.webp)
Schließlich wird hier das Histogramm der Spendenmenge angezeigt und über beide Behandlungen gepoolt, was die Masse bei Null und eine rechte Schiefe veranschaulicht.
![](https://towardsdatascience.com/wp-content/uploads/2025/02/1_3o4B59kt_EOoY7ESCPGLBQ.webp)
Eine numerische Zusammenfassung der beiden Behandlungsgruppen quantifiziert das oben beobachtete Phänomen – während die Behandlung A eine signifikant höhere Reaktion zugeführt zu haben scheint, die bei ihrer Anantwortung mit einem mit einer gespendeten weniger durchschnittlichen Spenden behandelt wurden. Das Netto dieser beiden Maßnahmen, die wir letztendlich danach sind – die durchschnittliche Spende professional gezielter Einheit insgesamt – scheint immer noch höher für die Behandlung zu sein.
![](https://towardsdatascience.com/wp-content/uploads/2025/02/1_5ubGZIXHhdFAekgvoK4IUA.webp)
Gamma -Hürde
Eine Möglichkeit, diese Daten zu modellieren und unsere Forschungsfrage in Bezug auf den Unterschied zwischen den beiden Behandlungen bei der Erzeugung der durchschnittlichen Spende professional gezielter Einheit zu erzeugen, besteht bei der Gamma -Hürdeverteilung. Ähnlich wie die bekanntere Verteilung von Null aufgeblähtem Poisson (ZIP) oder NB (ZINB) ist dies eine Mischungsverteilung, bei der ein Teil die Masse bei Null und die andere betrifft, in den Fällen, in denen die zufällige Variable positiv ist, die Gammastichte ist Funktion.
![](https://towardsdatascience.com/wp-content/uploads/2025/02/1_h0sDO1A0w0QgnmTzKIp5uQ.webp)
Hier repräsentiert π die Wahrscheinlichkeit, dass die zufällige Variable y> 0 beträgt. Mit anderen Worten, es ist die Wahrscheinlichkeit des Gamma -Prozesses. Ebenso ist (1- π) die Wahrscheinlichkeit, dass die Zufallsvariable Null ist. In Bezug auf unser Downside betrifft dies die Wahrscheinlichkeit, dass eine Spende durchgeführt wird, und wenn ja, ist es Wert.
Beginnen wir mit den Komponententeilen dieser Verteilung in einer Regression – logistische und Gamma -Regression.
Logistische Regression
Die Logit -Funktion ist die Linkfunktion hier, die die logarithmischen Chancen auf die lineare Kombination unserer Prädiktorvariablen bezieht, die mit einer einzelnen Variablen wie unserem Binärbehandlungsindikator aussieht:
![](https://towardsdatascience.com/wp-content/uploads/2025/02/1_qkP9KSclpft2fxW438VfcA.webp)
Wobei π die Wahrscheinlichkeit darstellt, dass das Ergebnis ein „positives“ (als 1) Ereignis wie ein Kauf und (1-π) ist, repräsentiert die Wahrscheinlichkeit, dass das Ergebnis ein „negatives“ Ereignis ist (bezeichnet als 0). Ferner wird π, das oben interessiert ist, durch die inverse Logit -Funktion definiert:
![](https://towardsdatascience.com/wp-content/uploads/2025/02/1_kLFG7jGpUEZOHqbp-DKFJA.webp)
Das Anpassen dieses Modells ist sehr einfach. Wir müssen die Werte der beiden Betas finden, die die Wahrscheinlichkeit der Daten (das Ergebnis y) maximieren – was unter der Annahme von Beobachtungen angenommen wird:
![](https://towardsdatascience.com/wp-content/uploads/2025/02/1_iQBYBYICkhBKmuC0OCcilg.webp)
Wir könnten mehrere Bibliotheken verwenden, um schnell in dieses Modell zu passen, PYMC jedoch als Mittel zum Aufbau einer einfachen bayes’schen logistischen Regression demonstrieren.
Ohne die normalen Schritte des Bayesian -Workflows passen wir dieses einfache Modell mit MCMC an.
import pymc as pm
import arviz as az
from scipy.particular import expit
with pm.Mannequin() as logistic_model:
# noninformative priors
intercept = pm.Regular('intercept', 0, sigma=10)
beta_treat = pm.Regular('beta_treat', 0, sigma=10)
# linear mixture of the handled variable
# by the inverse logit to squish the linear predictor between 0 and 1
p = pm.invlogit(intercept + beta_treat * pdf_data.TREATED)
# Particular person degree binary variable (reply or not)
pm.Bernoulli(title="logit", p=p, noticed=pdf_data.GT_0)
idata = pm.pattern(nuts_sampler="numpyro")
az.abstract(idata, var_names=('intercept', 'beta_treat'))
![](https://towardsdatascience.com/wp-content/uploads/2025/02/1_PCma1nanJ8DhgDOzwG-zjA.webp)
Wenn wir einen Kontrast der beiden mittleren Ansprechraten für die Behandlung erstellen, stellen wir fest, dass der mittlere Ansprechrate für die Behandlung A 0,026 größer als die Behandlung B mit einem glaubwürdigen Intervall von 94% von (0,024, 0,029) beträgt.
# create a brand new column within the posterior which contrasts Remedy A - B
idata.posterior('TREATMENT A - TREATMENT B') = expit(idata.posterior.intercept + idata.posterior.beta_treat) - expit(idata.posterior.intercept)
az.plot_posterior(
idata,
var_names=('TREATMENT A - TREATMENT B')
)
![](https://towardsdatascience.com/wp-content/uploads/2025/02/1_w8gMLIEOtSjShj8Z39vVtg.webp)
Gamma -Regression
Die nächste Komponente ist die Gamma -Verteilung mit einer seiner Parametrisierungen der Wahrscheinlichkeitsdichtefunktion, wie oben gezeigt:
![](https://towardsdatascience.com/wp-content/uploads/2025/02/1_VQCD_xGfUOsWpygyORrDtw.webp)
Diese Verteilung wird für streng optimistic Zufallsvariablen definiert und in Unternehmen für Werte wie Kosten, Ausgaben für Kundendachformen und Versicherungsansprüche verwendet.
Da der Mittelwert und die Varianz von Gamma in Bezug auf α und β gemäß den Formeln definiert sind:
![](https://towardsdatascience.com/wp-content/uploads/2025/02/1_MzdTGteHRdwkAiVJcWDsbg.webp)
Für die Gamma -Regression können wir durch α und β oder durch μ und σ parametrisieren. Wenn wir μ definiert als lineare Kombination von Prädiktorvariablen definieren, können wir Gamma in Bezug auf α und β unter Verwendung von μ definieren:
![](https://towardsdatascience.com/wp-content/uploads/2025/02/1_AN3LxtD93LctbhEdNrXHVA.webp)
Das Gamma -Regressionsmodell nimmt an (in diesem Fall ist die inverse Verbindung eine weitere übliche Possibility).
![](https://towardsdatascience.com/wp-content/uploads/2025/02/1_zHxn8BgnahZoguvgfN7KUA.webp)
Nach quick genau der gleichen Methodik wie für die Rücklaufquote beschränken wir den Datensatz nur auf Responder und passen die Gamma -Regression mit PYMC an.
with pm.Mannequin() as gamma_model:
# noninformative priors
intercept = pm.Regular('intercept', 0, sigma=10)
beta_treat = pm.Regular('beta_treat', 0, sigma=10)
form = pm.HalfNormal('form', 5)
# linear mixture of the handled variable
# by the exp to make sure the linear predictor is optimistic
mu = pm.Deterministic('mu',pm.math.exp(intercept + beta_treat * pdf_responders.TREATED))
# Particular person degree binary variable (reply or not)
pm.Gamma(title="gamma", alpha = form, beta = form/mu, noticed=pdf_responders.TARGET_D)
idata = pm.pattern(nuts_sampler="numpyro")
az.abstract(idata, var_names=('intercept', 'beta_treat'))
![](https://towardsdatascience.com/wp-content/uploads/2025/02/1_vSZpBr3JIRb2nA3902nSxA.webp)
# create a brand new column within the posterior which contrasts Remedy A - B
idata.posterior('TREATMENT A - TREATMENT B') = np.exp(idata.posterior.intercept + idata.posterior.beta_treat) - np.exp(idata.posterior.intercept)
az.plot_posterior(
idata,
var_names=('TREATMENT A - TREATMENT B')
)
![](https://towardsdatascience.com/wp-content/uploads/2025/02/1_UDfCK0GRXrj8cDpo4gubOg.webp)
Wie erwartet sehen wir den mittleren Auftrieb für die Behandlung A, um einen erwarteten Wert zu haben, der dem Stichprobenwert von -7,8 entspricht. Das 94% glaubwürdige Intervall ist (-8,3, -7,3).
Die oben gezeigten Komponenten, die Rücklaufquote und die durchschnittliche Menge professional Responder sind ungefähr so einfach wie möglich. Es ist jedoch eine geradlinige Verlängerung, um zusätzliche Prädiktoren hinzuzufügen, um 1) die bedingten durchschnittlichen Behandlungseffekte (Cate) abzuschätzen, wenn wir erwarten Vorbehandlungsvariablen.
Hürdemodell (Gamma) Regression
Zu diesem Zeitpunkt sollte es ziemlich einfach sein, zu sehen, wo wir Fortschritte machen. Für das Hürdemodell haben wir eine bedingte Wahrscheinlichkeit, je nachdem, ob die spezifische Beobachtung 0 oder größer als Null ist, wie oben für die Gamma -Hürdeverteilung gezeigt. Wir können gleichzeitig die beiden Komponentenmodelle (logistische und Gamma -Regression) anpassen. Wir erhalten kostenlos, ihr Produkt, das in unserem Beispiel eine Schätzung des Spendenbetrags professional Zieleinheit ist.
Es wäre nicht schwierig, dieses Modell mit der Verwendung einer Wahrscheinlichkeitsfunktion mit einer Swap -Anweisung abhängig vom Wert der Ergebnisvariablen einzubauen, aber PYMC hat diese Verteilung bereits für uns codiert.
import pymc as pm
import arviz as az
with pm.Mannequin() as hurdle_model:
## noninformative priors ##
# logistic
intercept_lr = pm.Regular('intercept_lr', 0, sigma=5)
beta_treat_lr = pm.Regular('beta_treat_lr', 0, sigma=1)
# gamma
intercept_gr = pm.Regular('intercept_gr', 0, sigma=5)
beta_treat_gr = pm.Regular('beta_treat_gr', 0, sigma=1)
# alpha
form = pm.HalfNormal('form', 1)
## imply features of predictors ##
p = pm.Deterministic('p', pm.invlogit(intercept_lr + beta_treat_lr * pdf_data.TREATED))
mu = pm.Deterministic('mu',pm.math.exp(intercept_gr + beta_treat_gr * pdf_data.TREATED))
## likliehood ##
# psi is pi
pm.HurdleGamma(title="hurdlegamma", psi=p, alpha = form, beta = form/mu, noticed=pdf_data.TARGET_D)
idata = pm.pattern(cores = 10)
Wenn wir die Zusammenfassung der Spuren untersuchen, sehen wir, dass die Ergebnisse für die beiden Komponentenmodelle genau gleich sind.
![](https://towardsdatascience.com/wp-content/uploads/2025/02/1_jirR0FKbDagR9LAY3l8OTw.webp)
Wie bereits erwähnt, beträgt der Mittelwert der Gamma -Hürdeverteilung π * μ, sodass wir einen Kontrast erzeugen können:
# create a brand new column within the posterior which contrasts Remedy A - B
idata.posterior('TREATMENT A - TREATMENT B') = ((expit(idata.posterior.intercept_lr + idata.posterior.beta_treat_lr))* np.exp(idata.posterior.intercept_gr + idata.posterior.beta_treat_gr)) -
((expit(idata.posterior.intercept_lr))* np.exp(idata.posterior.intercept_gr))
az.plot_posterior(
idata,
var_names=('TREATMENT A - TREATMENT B')
Der mittlere erwartete Wert dieses Modells beträgt 0,043 mit einem glaubwürdigen Intervall von 94% von (-0,0069, 0,092). Wir könnten den hinteren Abfragetieren, um zu erkennen, wie hoch die Spende professional Käufer für die Behandlung A und alle anderen Entscheidungsfunktionen, die für unseren Fall sinnvoll waren, als Hinzufügen eines Fuller P & L zu der Schätzung (dh einschließlich Margen und Kosten) voraussichtlich höher sind, voraussichtlich höher ist. .
![](https://towardsdatascience.com/wp-content/uploads/2025/02/1_ne_kjD6As2ja2eiXh4Pc2g.webp)
Anmerkungen: Einige Implementierungen parametriieren das Gamma-Hürdemodell anders, wenn die Wahrscheinlichkeit von Null π ist und daher der Mittelwert der Gamma-Hürde stattdessen (1-π) umfasst. Beachten Sie auch, dass es zum Zeitpunkt dieses Schreibens ein scheint Ausgabe Mit den Nuts -Sampler in PYMC und wir mussten auf die Commonplace -Python -Implementierung zurückgreifen, um den obigen Code auszuführen.
Zusammenfassung
Mit diesem Ansatz erhalten wir die gleiche Schlussfolgerung für beide Modelle getrennt und den zusätzlichen Nutzen der dritten Metrik. Das Anpassung dieser Modelle mit PYMC ermöglicht uns alle Vorteile der Bayes’schen Analyse – einschließlich der Injektion früherer Domänenwissens und eines vollständigen hinteren Fragen, um Fragen zu beantworten und die Unsicherheit zu quantifizieren!
Credit:
- Alle Bilder sind die Autoren, sofern nicht anders angegeben.
- Der verwendete Datensatz stammt aus dem von Epsilon gesponserten KDD 98 Cup. https://kdd.ics.uci.edu/databases/kddcup98/kddcup98.html (CC um 4.0)