In der heutigen Welt ist eine Produktentwicklung ohne A / B-Tests kaum vorstellbar. Um ein Produkt oder eine neue FunktionalitĂ€t erfolgreich zu starten, mĂŒssen Sie A / B korrekt entwerfen, die Ergebnisse berechnen und interpretieren. Manchmal mĂŒssen wir mehr als zwei Gruppen testen. In diesem Artikel betrachten wir einen solchen Fall - mehrere Tests:
- Wir werden darĂŒber sprechen, wann und warum mehrere Tests durchzufĂŒhren sind.
- Betrachten Sie die wichtigsten Methoden zur Berechnung der Testergebnisse und die mathematischen Prinzipien, auf denen die Methoden basieren.
- Wir geben Beispiele fĂŒr die Software-Implementierung der Methoden. Sie können diese Beispiele in Ihren Projekten verwenden.
Also fangen wir an.

Mehrere Experimente: wann und warum
Offensichtlich sollte jede technische Komplikation des Experiments durch die praktische Notwendigkeit gerechtfertigt sein. Dies gilt auch fĂŒr mehrere Tests. Wenn das Publikum in mehr als zwei Untergruppen aufgeteilt wird, steigt die Wahrscheinlichkeit, dass wĂ€hrend des Experiments ein Fehler der ersten Art auftritt, exponentiell an:
1â(1â alpha)n,
wo
n - die Anzahl der Untergruppen,
alpha - ein bestimmtes MaĂ an statistischer Signifikanz.
Wenn also nur eine zusĂ€tzliche Untergruppe zum ĂŒblichen Paartest hinzugefĂŒgt wird (
n=3 ) auf einem bestimmten Standardniveau
alpha=0.05 wir bekommen die Wahrscheinlichkeit eines Fehlers der ersten Art
p=0,14 das ĂŒbertrifft unser ziel deutlich
alpha=0.05 .
Warum mehrere Experimente durchfĂŒhren, wenn sie die Genauigkeit der Forschungsergebnisse verringern? Es kann verschiedene GrĂŒnde geben:
- Es ist erforderlich, mehrere Ănderungen und ihre kumulative Auswirkung auf Produktmetriken zu testen. Ein Beispiel zeigt dem Benutzer auf der Serviceseite zwei neue Elemente, die sich relativ zueinander unterscheiden.
- Ănderungen können nur in einem Zeitraum getestet werden, da sie voneinander abhĂ€ngig sind und auf die wöchentliche SaisonabhĂ€ngigkeit reagieren. Ein Beispiel ist das Deaktivieren von WerbekanĂ€len, um den Effekt der Kannibalisierung zwischen KanĂ€len zu berechnen.
- Der Kunde möchte so schnell wie möglich und kostengĂŒnstig eine Antwort erhalten, welche der Optionen ausgewĂ€hlt werden sollte, wobei gleichzeitig die Entwicklung und DurchfĂŒhrung des Experiments gespart wird.
Wenn wir mit einem dieser Probleme konfrontiert sind und die statistische Signifikanz fĂŒr den Test berechnen mĂŒssen, mĂŒssen wir die Notwendigkeit von Korrekturen fĂŒr mehrere Tests berĂŒcksichtigen. Worum es geht und wie es richtig gemacht wird, wird weiter unten erlĂ€utert.
Mehrere Experimente: Berechnungsfunktionen
Grundlegende Konzepte
Betrachten Sie den allgemeinen Fall, wenn wir es zu tun haben
n Hypothesen
H0i ,
i=1,...,n etwa paarweise Gleichheit von Median oder Durchschnitt
m Untergruppen. In diesem Fall sind sowohl das wahre als auch das falsche Ergebnis möglich.
H0iVSH1i fĂŒr jeden von
i=1,...,n Hypothesen. PrÀsentieren Sie die Ergebnisse als Verwirrungsmatrix-Experiment:
Also fÀlschlicherweise abgelehnt
V von
R Grundlegende Hypothesen abgelehnt.
Basierend auf diesen Parametern fĂŒhren wir zwei wichtige Fehlerkonzepte ein, die wĂ€hrend mehrerer Tests kontrolliert werden:
FWER und
Fdr .
Gruppenfehlerwahrscheinlichkeit
FWER (Family-Wise Error Rate) ist die Wahrscheinlichkeit, mindestens einen Fehler der ersten Art zu erhalten, und wird durch die Formel bestimmt:
FWER=p(V>0).
Fdr (False Discovery Rate) ist die mathematische Erwartung des VerhÀltnisses von Fehlern erster Art zur Gesamtzahl der Abweichungen der Haupthypothese:
FDR=E(V/R|R>0).
Betrachten Sie die Methoden zur Steuerung dieser Fehler am Beispiel eines Standardproduktfalls.
Fallbeschreibung
Betrachten Sie als einfaches Beispiel ein Experiment, in dem drei isolierten, nicht zusammenhĂ€ngenden Benutzergruppen drei Seitenoptionen mit einem Angebot zum Klicken auf die Anruftaste fĂŒr eine Anzeige angezeigt wurden. Als grundlegende Metrik zur Vereinfachung der Berechnung nehmen wir die Gesamtzahl der Anrufe in jeder Gruppe.
Schauen wir uns an, wie sich die untersuchte Metrik geÀndert hat:
Abb. 1. Die Grafik der Dynamik beim DrĂŒcken der Anruftaste
Wir werden die Standardmethode verwenden
bootstrap Um die Verteilung der Zielmetrik in den Stichproben zu normalisieren und die Histogramme und Bereichsdiagramme der Durchschnittswerte in den Stichproben zu betrachten:
Abb. 2. Das Histogramm der Verteilung der Durchschnittswerte in Gruppen
Abb. 3. Der Bereich der Durchschnittswerte in Gruppen
Gemessen an den Grafiken gewinnt Gruppe C durch die Anzahl der Klicks auf die Anruftaste. Es ist jedoch erforderlich, die statistische Signifikanz der Ergebnisse zu ĂŒberprĂŒfen. Dazu bringen wir die geschĂ€tzte Metrik in die Form der Normalverteilung und verwenden das ĂŒbliche Student-t-Kriterium fĂŒr den paarweisen Vergleich von Gruppen im Experiment und dann - Kontrollmethoden
FWER und
Fdr Korrekturen fĂŒr mehrere Vergleiche zu berĂŒcksichtigen.
Weniger Kontrolle
Es gibt viele Methoden, um diesen Fehler zu kontrollieren. Am hÀufigsten sind jedoch zwei:
1) Einschrittverfahren mit gleichzeitiger Einstellung
pâWert fĂŒr alle getesteten Hypothesen nach der Bonferroni-Methode;
2) sequentielle, iterative Anpassung
pâWert c Entscheidungsfindung bei jedem Schritt gemÀà dem Ergebnis der Hill-Methode.
1. Bonferroni Ănderung
Dieses einstufige Verfahren verringert die Wahrscheinlichkeit eines falsch positiven Versuchsergebnisses. Der Kern der Methode besteht darin, eine alternative Hypothese zu akzeptieren, wenn:
pâ„ alpha/n,
wo
n - die Anzahl getesteter Hypothesen.
Die Methode kann ganz einfach mit der Standardbibliothek implementiert werden
bootstrapped :
from bootstrapped import bootstrap as bs from bootstrapped import compare_functions as bs_cmp from bootstrapped import stats_functions as bs_st bs_ab_estims = bs.bootstrap_ab(np.array(group_A), np.array(group_B), bs_st.mean bs_cmp.difference, num_iterations=5000, alpha=0.05/3, iteration_batch_size=100, scale_test_by=1, num_threads=4) bs_bc_estims = bs.bootstrap_ab(np.array(group_B), np.array(group_C), bs_st.mean bs_cmp.difference, num_iterations=5000, alpha=0.05/3, iteration_batch_size=100, scale_test_by=1, num_threads=4) bs_ac_estims = bs.bootstrap_ab(np.array(group_A), np.array(group_C), bs_st.mean bs_cmp.difference, num_iterations=5000, alpha=0.05/3, iteration_batch_size=100, scale_test_by=1, num_threads=4)
Nachdem wir die Ergebnisse einer statistischen Auswertung erhalten haben, können wir schlieĂen, ob sich die Gruppen unterscheiden oder nicht.
Das Hauptminus des Ansatzes: Je mehr Untergruppen vorhanden sind, desto geringer ist die Potenz des Kriteriums, wodurch die Wahrscheinlichkeit steigt, dass die falsche Hypothese akzeptiert wird. Zum Beispiel fĂŒr zehn Tests und
αi=0,05 mĂŒssen bekommen
piâ€510â3 zu sagen, dass der Unterschied signifikant ist. Um diese MĂ€ngel auszugleichen, können Sie die Hill-Methode wĂ€hlen.
2. Hill-Methode
Dies ist eine abwĂ€rts gerichtete sequentielle Ănderungsprozedur.
pâWert . Im ersten Schritt des Methodenalgorithmus wird real
pâWert aufsteigend sortiert:
p1â€Â·Â·Â·â€pn,
dann das original
alpha -level:
alphaâČi= alpha/(nâi+1),
Danach wird der Zustand ĂŒberprĂŒft
piâ„ alphaâČi und schlieĂt daraus, ob die Haupthypothese wahr ist
H0i .
Algorithmus-Haltepunkt - Zeitpunkt i, an dem die erste Haupthypothese akzeptiert wird
H0i und alle folgenden
H0j,j>i .
Sie können diese Methode mithilfe der Prozedur implementieren
multipletests() aus der Bibliothek
statsmodels mit Parameter
method=âholmâ :
from bootstrapped import bootstrap as bs from bootstrapped import stats_functions as bs_st from scipy.stats import ttest_ind from statsmodels.sandbox.stats.multicomp import multipletests bs_a = bs.bootstrap(np.array(group_A), stat_func=bs_st.mean, num_iterations=10000, iteration_batch_size=300, return_distribution=True) bs_b = bs.bootstrap(np.array(group_B), stat_func=bs_st.mean, num_iterations=10000, iteration_batch_size=300, return_distribution=True) bs_c = bs.bootstrap(np.array(group_C), stat_func=bs_st.mean, num_iterations=10000, iteration_batch_size=300, return_distribution=True) stat_ab, p_ab = stats.ttest_ind(pd.DataFrame(bs_a), pd.DataFrame(bs_b)) stat_bc, p_bc = stats.ttest_ind(pd.DataFrame(bs_b), pd.DataFrame(bs_c)) stat_ac, p_ac = stats.ttest_ind(pd.DataFrame(bs_a), pd.DataFrame(bs_c)) print(sorted([p_ab, p_bc, p_ac])) print("FWER: " + str(multipletests(sorted([p_ab, p_bc, p_ac]), alpha=0.05, method='holm', is_sorted = True)))
FDR-Kontrolle
Kontrolle
Fdr bedeutet, dass die Bedingung erfĂŒllt ist
FDR=E(V/R)< alpha . Dabei
FDRâ€FWER d.h. die Wahrscheinlichkeit, einen Fehler erster Ordnung bei der Steuerung zu bekommen
Fdr rĂŒcklĂ€ufig.
Benjamini-Hochberg-Methode
Diese Bottom-Up-Prozedur beinhaltet eine sequentielle Ănderung.
pâWert aufsteigend vorsortiert:
p1â€Â·Â·Â·â€pn.
Dann Quelle
α -level wird durch die Formel angepasst:
alphaâČi=i· alpha/n,
Dann wird wie bei der Holm-Methode die Bedingung geprĂŒft
piâ„ alphaâČi und schlieĂt daraus, ob die Haupthypothese wahr ist
H0i und alle folgenden
H0j,j>i .
Sowohl die Benjamini-Hochberg-Methode als auch die Holm-Methode können mit dem Verfahren implementiert werden
multipletests() :
print("FDR: " + str(multipletests([p_ab, p_bc, p_ac], alpha=0.05, method='fdr_bh', is_sorted = False)))
Fazit
In dem Artikel haben wir ĂŒber die wichtigsten Methoden zur Auswertung der Ergebnisse mehrerer Tests gesprochen und Beispiele fĂŒr Programmcode angegeben, der diese Methoden implementiert. Wir hoffen, dass Sie Zeit mit Nutzen und Interesse verbracht haben und die beschriebenen Verfahren in die Praxis umsetzen können. Und wenn Sie Fragen haben, beantworten wir diese gerne.
Vielen Dank fĂŒr Ihre Aufmerksamkeit!