Warum und wie das Bland-Altman-Diagramm für A / B-Tests verwendet wird / Python + Code

Warum das Bland-Altman-Diagramm verwendet wird

Das Bland-Altman-Diagramm stammt aus der medizinischen Industrie, um das Maß für zwei Instrumente zu vergleichen. Das erste Ziel von John Martin Bland & Douglas Altman war es, diese Frage zu beantworten :

Stimmen die beiden Messmethoden hinreichend überein? — D. G. ALTMAN und J. M. FAD

Wenn dies der Fall ist, bedeutet dies, dass wenn Sie zwei Instrumente haben, von denen eines den Stand der Technik zu hohen Kosten darstellt und das zweite 10-mal billiger ist, sind die mit der billigsten Methode erzielten Ergebnisse mit der Referenz vergleichbar und könnten durch eine ausreichende Genauigkeit ersetzt werden? Ist beispielsweise die Herzfrequenz, die von einer angeschlossenen Uhr im Wert von 20 US-Dollar bereitgestellt wird, als Ergebnis eines Elektrokardiogramms ausreichend genau? Das zweite Ziel bestand darin, eine Methode zu entwickeln, bei der die Ergebnisse für Nichtstatistiker leicht verständlich sind.

In der Analytik ist A / B-Testing (auch bekannt als Champion-Challenger) eine gängige Testmethode, um die Ergebnisse einer neuen Aktion / einer neuen Behandlung / eines neuen Designs / … auf population_A mit population_B mit der aktuellen Aktion zu vergleichen. Sobald wir die Ergebnisse des Tests haben, müssen sie analysiert und einem Entscheidungsteam vorgelegt werden, das hauptsächlich aus Nichtstatistikern besteht. Aus diesem Grund ist das Bland-Altman-Diagramm relevant, da es die Ergebnisse des A / B-Tests auf einem Diagramm mit allen angezeigten statistischen Kennzahlen auf verständliche Weise vergleicht.

In ihrer Arbeit zeigten sie auch, warum der Korrelationskoeffizient, der statistische Test des mittleren Vergleichs und die Regression ungeeignet sind, um über die Übereinstimmung von zwei Maßnahmen zu entscheiden, die in unserem A / B-Testfall wären, um über die Leistung des Herausforderers im Vergleich zum Champion zu entscheiden.

Die verwendeten Daten

Für diesen Artikel werde ich einen auf Kaggle verfügbaren Datensatz (aus einem DataCamp-Projekt) mit dem Namen „Mobile Games A / B Testing with Cookie Cats“ verwenden. Der Link befindet sich im Referenzteil.

Cookie Cats ist ein beliebtes mobiles Puzzlespiel, bei dem ein Spieler, wenn er die Level fortschreitet, auf „Tore“ stößt, die ihn zwingen, einige Zeit zu warten, bevor er weiterspielt oder einen Kauf tätigt. In einer solchen Branche ist die Retention eine der wichtigsten Kennzahlen, und das für das Spiel zuständige Team würde die Auswirkungen sehen, wenn das erste Tor von Level 30 auf Level 40 für die Retention nach 7 Tagen verschoben würde. Um das Verhalten einer solchen Bewegung zu sehen, haben sie einen A / B-Test durchgeführt und uns den Datensatz dieser Ergebnisse zur Verfügung gestellt. Wir werden sehen, wie die Bland-Altman-Handlung die folgende Frage beantworten wird : „Wie analysiert man die A / B-Ergebnisse auf der Ebene der Retention an 7-Tagen, wenn die Wartezeit von Level 30 auf Level 40 übergeht?“

Der Datensatz besteht aus 90.189 Zeilen, in denen wir die eindeutige ID des Spielers, die Version des A / B-Tests (Wartezeit bei gate_30 / gate_40), die Summe der Spielrunden, retention_1 ist ein boolescher Spruch, wenn der Spieler am nächsten Tag zurückkam, und retention_7 ist ein boolescher Spruch, wenn der Spieler nach 7 Tagen zurückkam. Um die relevanten Daten zu haben, um unsere Frage zu beantworten, ist es notwendig, einige Reinigung zu tun. Ich werde nur dafür sorgen, dass der Client eine retention_1 = True (denn wenn retention_1= False , ist auch retention_7 False ), eine Anzahl von Spielrunden ≥ 30 (denn wenn sie nicht bis 30 gehen, werden sie nicht vom Gate beeinflusst) und eine Anzahl von Spielrunden < 170 (denn wenn wir die Dauer eines Spiels = 5 Minuten betrachten, wenn ein Spieler 2 Stunden pro Tag während des 7-Tages spielt, spielt er 120 * 7/5 = 168 Spiele. Eine höhere Zahl würde als anormale Verwendung betrachtet). Nach diesem Filter besteht der Datensatz aus 20.471 Zeilen, wie Abbildung 1 unten zeigt. Darüber hinaus ist der Datensatz gleichmäßig zwischen gate_30 & gate_40 ausgeglichen.

Figur1. CookieCats-Datensatz

Wie wird das Bland-Altman-Diagramm erstellt

In diesem Abschnitt erfahren Sie, wie Sie das ursprüngliche Bland-Altman-Diagramm anpassen, um es auf einen A / B-Test anzuwenden. Zuerst werde ich erklären, wie der Plot in seiner ursprünglichen Version erstellt wird, und dann werde ich erklären, wie er mit den Daten unserer A / B-Tests erstellt wird.

Da der ursprüngliche Bland-Altman-Plot die Messung von 2 Instrumenten vergleicht, haben sie die gleiche Länge. Zum Beispiel wird bei der Herzfrequenzmessung zwischen der 20-Dollar-Uhr und dem Elektrokardiogramm die Messung zur gleichen Zeit mit den gleichen Bedingungen durchgeführt, was dazu führt, dass für die 2-Methoden die gleiche Anzahl von Messungen durchgeführt wird. So können wir die Zeile jedes Datensatzes als Erfahrung darstellen, wie im Beispiel in Abbildung 2 unten.

Figur2. Instrument messen pro Erfahrung

Hier begegnen wir dem ersten „Schmerzpunkt“. Ein A / B-Test wird als einzigartiges Erlebnis betrachtet, während wir, wie wir oben sehen, mehrere Erfahrungen benötigen, um die Handlung zu erstellen. Um diese Einschränkung zu umgehen, erstellen wir aus dem A / B-Test mehrere Bootstrap-Samples mit derselben & unterschiedlichen Länge.

Wir generieren 300 nicht eindeutige Zufallszahlen zwischen 200 und 1.000. Um die statistischen Eigenschaften des Bootstraps zu nutzen, wird jede nicht eindeutige zufällige Ganzzahl 50 Mal dupliziert. Diese Zahlen werden verwendet, um eine Stichprobenvielfalt zu erhalten, aber sie sind willkürlich und die Länge hängt von der Größe des ursprünglichen Datensatzes ab. Diese 15.000 (300 * 50) Bootstrap-Stichproben mit einer Länge zwischen 200 und 2.000 werden durch eine Zufallsstichprobe mit einem Ersatz aus dem ursprünglichen Datensatz erhalten und miteinander verkettet. Es kann als die Figure3 dargestellt werden.

Abbildung3. Bootstrapped Dataset building

Der folgende Code erstellt das Bootstrapped Dataset aus den Originaldaten (seien Sie vorsichtig, es kann einige Zeit dauern, da das Bootstrapped Dataset eine Länge von 9.184.350 Zeilen hat {Durch Ändern des random_state hätten wir im Durchschnitt (((200+1.000)/2)*300*50 = 9.000.000 zeilen}).

Dann gruppieren wir nach n_sample (die ID von jeweils 15.000 Bootstrap-Sample), n_sample_2 (die Länge jedes Bootstrap-Samples) und Version, um die Summe der Retention des Spielers bei 7 Tagen pro Gates wie in Abbildung 4 zu erhalten.

Figur4. Bootstrap-Datensatz nach groupby

Wir können diese Ausgabe wie folgt lesen: Das Bootstrap-Beispiel n ° 0/14.999 besteht aus 564 Zeilen, in denen 98 Spieler noch nach 7 Tagen mit einer Wartezeit bei gate_30 spielen, während 105 Spieler noch nach 7 Tagen mit einer Wartezeit bei gate_40 spielen.

Dann verwenden wir eine statistische Eigenschaft des Boostrap, die besagt, dass der Mittelwert einer Bootstrap-Stichprobe ein guter Schätzer des wahren Mittelwerts einer Verteilung ist. Wir machen eine Gruppe nach n_sample_2 und Version, um für jede eindeutige Sample-Länge die durchschnittliche Anzahl der Spieler-Retention bei 7 Tagen pro Gates wie in Abbildung 5 zu haben.

Figur5. Durchschnittliche Anzahl der Spieler, die noch an 7-Tagen für jede eindeutige Sample-Länge und pro Gates spielen

Wir können diese Ausgabe als lesen: wenn die Stichprobe 200 Zeilen hat, gibt es im Durchschnitt 34,60 Spieler, die noch 7 Tage mit einer Wartezeit bei gate_30 spielen, während 34,38 Spieler, die noch 7 Tage mit einer Wartezeit bei gate_40 spielen.

Dann entpacken wir die Datenbank, um den Datensatz in einem klareren Format als die Abbildung zu haben6.

Figur6. Unstacked-Version des Datensatzes

In diesem Stadium haben wir alle notwendigen Informationen, um den Bland-Altman-Plot zu erstellen, und die Darstellung des Datensatzes ist dieselbe wie in der obigen Abbildung2.

Das Bland-Altman-Diagramm besteht aus 2 Achsen. Die x-Achse ist der Durchschnitt der beiden zu vergleichenden Methoden. So ist es für jede Zeile: (gate_30i + gate_40i) / 2 ||| Die y-Achse ist der Unterschied zwischen Methode A und Methode B. Also für jede Zeile: (gate_30i – gate_40i) ||| Und hier ist der zweite „Schmerzpunkt“, den wir haben. Indem die y-Achse beibehalten wird, erhöht die Zunahme der Stichprobengröße die Variabilität der Unterschiede. Infolgedessen wird das statistische Maß, das wir später erhalten werden, von den größten Stichproben überbewertet. Um diese Einschränkung zu umgehen, stellen wir die y-Achse in Prozent dar . Um dies zu tun, ist die Berechnung von y für jede Zeile: ((gate_30i – gate_40i)*100 / (( gate_30i + gate_40i)/2) ||| Der Datensatz sieht aus wie Figure7.

Figur7. x & y-Achse

Wir müssen überprüfen, ob die y-Achse normalverteilt ist, um dem Konfidenzintervall zu vertrauen, das angezeigt wird. Sie können es mit dem Shapiro-Wilk-Test oder zumindest mit einem Histogramm beurteilen. Wenn die Verteilung nicht normal ist, können Sie eine Transformation wie die logarithmische Transformation durchführen. In unserem Fall betrachte ich die Verteilung als normal.

Figur8. Histogramm der y-Achse

Der Bland-Altman besteht aus 3 Linien (siehe Abb.9):

  • die Durchschnittswerte von y
  • die y-Obergrenze des Konfidenzintervalls (hier bei 95% angesichts der 1,96)
  • die y-Untergrenze des Konfidenzintervalls (bei 95%)

Figur9. Werte des Bland-Altman-Plots

Wir haben alles zusammengestellt, das Paket pyCompare ermöglicht es, das Bland-Altman-Plot auf sehr einfache Weise zu zeichnen, ohne db erstellen zu müssen:

Es dauert zuerst die Methode A (der Champion) und dann die Methode B (der Herausforderer). Wenn dann percentage = True , wird automatisch der oben angegebene Kalkül ausgeführt. Es gibt einige andere Parameter, die wir später besprechen werden.

Interpretation des Bland-Altman-Plots für den A/B-Test

Hier sind wir ! Hier ist die Abbildung des Bland-Altman-Diagramms für die A / B-Tests, die mit dem obigen Code generiert wurden:

Figur10. Bland-Altman-Diagramm für A / B-Test angewendet

Zunächst unterscheiden sich der Mittelwert und das Konfidenzintervall des Mittelwerts (hellblauer Streifen) von 0 (in unserem Fall höher). Dies bedeutet, dass sich das Retentionsniveau (im Originalpapier als Bias bezeichnet) von gate_30 und gate_40 erheblich unterscheidet. Aufgrund dieser 2.93 > 0 bedeutet dies, dass A > B < — > Champion > Challenger und als Ergebnis, dass eine Wartezeit auf gate_30 eine größere Retention bietet als eine Wartezeit auf gate_40.

Die beiden Lachsbalken repräsentieren das Konfidenzintervall bei 95% (im Originalpapier als Übereinstimmungsgrenze bezeichnet), was bedeutet, dass wir davon überzeugt sind, dass 95% der Werte dazwischen liegen werden . In unserem Beispiel ist dies sehr mächtig, da wir sagen können, dass die Retention von gate_30 fast immer größer ist als die von gate_40 .

Wie Sie sehen können, gibt es 2 Werte über dem oberen Lachsstreifen und 4 unter dem unteren, was 6/300 = 0,02 < 0 ist.05 so, dass wir sicher sind, dass 95% der Werte innerhalb der 2 Grenzen liegen, 5% darüber oder darunter liegen können und in unserem Fall 2% darstellen, dann ist es völlig normal 😉

Im pyCompare Paket gibt es den Parameter limitOfAgreement, der darauf abzielt, die Vertrauensgrenzen zu ändern. Hier wäre eine relevante Frage: „Zu welchem Prozentsatz kann ich sicher sein, dass die Retention von gate_30 immer größer ist als die von gate_40 ?“ Um diese Frage zu beantworten, muss die unterste Grenze gleich 0 sein, also müssen wir den richtigen Wert finden, um 0 zu haben, wie wir im folgenden Code sehen können, der die Figur bereitstellt11:

Figur11. Ausgabe Beim Ändern des Parameters limitOfAgreement

sehen wir, dass bei limitOfAgreement = 1.55 die Grenze fast gleich 0 ist. Dann müssen wir in der Normalverteilungstabelle den Wert bei 1,55 überprüfen, der 0,9394 ist, also sind wir sicher bei ((1-0.9394)*2)*100 = 87.88%, dass die Retention von gate_30 immer größer sein wird als die von gate_40

Ein letzter Punkt, der hinzugefügt werden muss, ist, dass sie unabhängig vom Durchschnittswert der Stichprobe einheitlich auf dem Diagramm dargestellt werden, was bedeutet, dass die Interpretation, die wir vornehmen, unabhängig von der Größe der Stichprobe verallgemeinert wird. In der Tat, wenn wir eine Art konische Darstellung der Werte gesehen hätten, hätten wir schließen können, dass die Größe der Stichprobe einen Einfluss auf die Ergebnisse hat, so dass wir keine gültige Interpretation haben können.

Fazit

Wir haben gesehen, warum es relevant sein kann, den Bland-Altman-Plot zu verwenden, um eine Ansicht über die Ergebnisse eines A / B-Tests auf einem einfachen Plot zu haben, wie man den Plot aus einem A / B-Test erstellt und wie man ihn interpretiert. Dies funktioniert nur im Falle der Normalität der Differenz, es ist jedoch erforderlich, die Daten zu transformieren.

Außerdem habe ich die App überprüft und die Gates scheinen auf gate_40 zu sein, während wir bewiesen haben, dass die Retention bei 7 Tagen bei 30 besser war. In diesem Fall zeigt sich, dass die Retention im Vergleich zur Rentabilität möglicherweise nicht die beste Metrik ist !

D. G. Altman und J. M. Bland, Messung in der Medizin: die Analyse von Methodenvergleichsstudien, Der Statistiker 32 (1983) 307-317

https://projects.datacamp.com/projects/184 ODER https://www.kaggle.com/yufengsui/mobile-games-ab-testing

D. G. Altman und J. M. Bland, Statistische Methoden zur Beurteilung der Übereinstimmung zwischen zwei Methoden der klinischen Messung, The Lancet 327 (1986) 307-310

D. Giavarina, Verständnis der milden Altman-Analyse, Biochemia Medica 25 (2015) 141-151

You might also like

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.