Mehrere Experimente: Theorie und Praxis

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:

  1. 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.
  2. Ä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.
  3. 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:

H0i nicht abgelehntH0i abgelehntTotal

H0i wahr

UVn0
H0i falschTSn1
Totalk−RRn


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!

Source: https://habr.com/ru/post/de476826/


All Articles