waarom & hoe de Bland-Altman plot te gebruiken voor A / B testen / Python + code

waarom de Bland-Altman plot

de Bland-Altman plot komt uit de medische industrie om de maat voor twee instrumenten te vergelijken. De eerste doelstelling van John Martin Bland & Douglas Altman was om deze vraag te beantwoorden :

zijn de twee meetmethoden voldoende met elkaar in overeenstemming ? – D. G. ALTMAN en J. M. BLAND

als dit het geval is, betekent dit dat als u twee instrumenten hebt waarvan de ene de stand van de techniek is tegen hoge kosten en de tweede 10 keer goedkoper is, zijn de resultaten die met de goedkoopste methode zijn verkregen vergelijkbaar met de referentie en kunnen deze met voldoende nauwkeurigheid worden vervangen? Bijvoorbeeld, is de hartslag die door een $20 aangesloten horloge is voldoende nauwkeurig als gevolg van een elektrocardiogram ? De tweede doelstelling was een methode te ontwikkelen waarbij de resultaten gemakkelijk te begrijpen zijn voor niet-statistici.

in analytics is a / B testing (ook bekend als Champion-Challenger) een gemeenschappelijke testmethode om de resultaten van een nieuwe actie / een nieuwe behandeling / een nieuw ontwerp / … te vergelijken op population_A met population_B die de huidige actie heeft. Zodra we de resultaten van de test hebben, moeten ze worden geanalyseerd en gepresenteerd aan een besluitvormingsteam dat meestal bestaat uit niet-statistici. Daarom is de Bland-Altman plot relevant omdat het de resultaten van de A/B-test op een plot zal vergelijken met alle statistische metingen die op een begrijpelijke manier worden weergegeven.

in hun paper hebben zij ook aangetoond waarom de correlatiecoëfficiënt, de statistische toets van de gemiddelde vergelijking en de regressie niet geschikt zijn om te beslissen over de goedkeuring van twee maatregelen die in onze A/B-testzaak zouden zijn om te beslissen over de macht van de uitdager in vergelijking met die van de kampioen.

de gebruikte gegevens

voor dit artikel zal ik een dataset gebruiken die beschikbaar is op Kaggle (afkomstig van een DataCamp project) genaamd “Mobile Games A/B Testing with Cookie Cats”. De link zijn in het gedeelte referenties .

Cookie Cats is een populair mobiel puzzelspel waarbij als een speler de levels vordert, hij “gates” tegenkomt die hem dwingen enige tijd te wachten voordat hij verder gaat met spelen of een aankoop doet. In een dergelijke industrie de retentie is een van de belangrijkste statistieken en het team dat verantwoordelijk is voor het spel zou de impact zien als de eerste poort werd verplaatst van niveau 30 naar niveau 40 op de retentie op 7 dagen. Om het gedrag van zo ‘ n beweging te zien deden ze een A/B test en gaven ze ons de dataset van deze resultaten. We zullen zien hoe de Bland-Altman plot de volgende vraag zal beantwoorden : “Hoe analyseer je de A/B resultaten op het niveau van retentie op 7 dagen wanneer de wachttijd van niveau 30 naar niveau 40 gaat ?”

de dataset bestaat uit 90.189 rijen met de unieke id van de speler, de versie van de A/B-test (wachttijd bij gate_30 / gate_40), de som van de spelrondes, retetion_1 is een Booleaans gezegde als de speler de volgende dag terugkwam en retetion_7 is een Booleaans gezegde als de speler na 7 dagen terugkwam. Om de relevante gegevens te hebben om onze vraag te beantwoorden, is het noodzakelijk om wat schoon te maken. Ik zal alleen de client houden met een retention_1 = True (want als retention_1 = False, retention_7 is ook False), een aantal spelrondes ≥ 30 (omdat als ze niet gaan tot 30, zullen ze niet worden beïnvloed door de poort) en een aantal spelrondes < 170 (omdat als we de duur van een spel = 5 minuten, als een speler speelt 2 uur per dag gedurende 7 dagen zal hij spelen 120*7/5 = 168 spellen. Een hoger getal zou worden beschouwd als een anormaal gebruik). Na dit filter bestaat de dataset uit 20.471 rijen als figuur 1 hieronder. Bovendien is de dataset even gebalanceerd tussen gate_30 & gate_40.

figuur 1. CookieCats-dataset

Hoe wordt de Bland-Altman-plot

gebouwd We zullen in deze sectie zien hoe de originele Bland-Altman-plot kan worden aangepast om het toe te passen op een A/B-test. Allereerst ga ik uitleggen hoe het perceel is gebouwd in de originele versie , en dan zal ik uitleggen hoe het te bouwen met de gegevens van onze A/B-tests.

omdat de oorspronkelijke Bland-Altman grafiek de meting van 2 instrumenten vergelijkt, hebben ze dezelfde lengte door ontwerp. Bijvoorbeeld, met de hartslagmeting tussen de $ 20 connect horloge en het elektrocardiogram, de maatregel worden genomen op hetzelfde moment met dezelfde voorwaarden die leiden tot hetzelfde aantal metingen voor de 2 methoden. Dus we kunnen de rij van elke dataset weergeven als een ervaring zoals in het voorbeeld in de figuur 2 hieronder.

Figuur 2. Meetinstrument per ervaring

Dit is waar we het eerste “pijnpunt”tegenkomen. Een A / B-test wordt beschouwd als een unieke ervaring, terwijl we, zoals we hierboven zien, verschillende ervaringen nodig hebben om het perceel te bouwen. Om deze beperking te omzeilen zullen we van de A/B test meerdere Bootstrap samples maken met dezelfde & verschillende lengte.

we genereren 300 niet-unieke willekeurige gehele getallen tussen 200 en 1.000. Deze gehele getallen vertegenwoordigen de lengte van elk Bootstrap-monster en om de statistische eigenschappen van de bootstrap te benutten, wordt elk niet-uniek willekeurig geheel getal 50 keer gedupliceerd. Deze getallen worden gebruikt om een steekproefdiversiteit te hebben, maar deze is willekeurig en de lengte hangt af van de grootte van de oorspronkelijke dataset. Deze 15.000 (300*50) bootstrapped samples met een lengte tussen 200 en 2.000 worden verkregen door een willekeurige sampling met een vervanging van de originele dataset en ze worden samengevoegd. Het kan worden weergegeven als het Figuur3.

Figuur 3. Bootstrapped dataset building

de volgende code creëert de bootstrapped dataset van de oorspronkelijke gegevens (wees voorzichtig, het kan tijd kosten omdat de bootstrapped dataset een lengte heeft van 9.184.350 rijen {door het veranderen van de random_state, zouden we gemiddeld (((200+1.000)/2)*300*50 = 9.000.000 rijen}).

vervolgens groeperen we op n_sample(de id van elke 15.000 bootstrapped sample), n_sample_2 (de lengte van elke bootstrapped sample) en versie om de som van de speler retentie op 7 dagen per gates zoals in Figuur 4.

Figuur 4. Bootstrapped dataset na groupby

we kunnen deze uitvoer lezen als: de bootstrapped sample n°0/14. 999 bestaat uit 564 Rijen waar 98 spelers nog steeds spelen op 7 dagen met een wachttijd bij gate_30 terwijl 105 spelers nog steeds spelen op 7 dagen met een wachttijd bij gate_40.

dan gebruiken we een statistische eigenschap van de boostrap die zegt dat het gemiddelde van een bootstrap-steekproef een goede schatter is van het ware gemiddelde van een distributie. We maken een groep op n_sample_2 en versie om voor elke unieke sample lengte Het gemiddelde aantal spelers retentie op 7 dagen per gates zoals in Figuur 5.

Figuur 5. Gemiddeld aantal spelers dat nog 7 dagen speelt voor elke unieke sample lengte en per gates

we kunnen deze uitvoer lezen als: wanneer de sample 200 rijen heeft zijn er gemiddeld 34,60 spelers die nog steeds 7 dagen spelen met een wachttijd bij gate_30 terwijl 34,38 spelers nog steeds 7 dagen spelen met een wachttijd bij gate_40.

dan unstack we de database om de dataset in een duidelijker formaat als figuur te hebben6.

Figuur 6. Unstacked versie van de dataset

in dit stadium hebben we alle benodigde informatie om de Bland-Altman plot te bouwen en de representatie van de dataset is hetzelfde als in de figuur 2 hierboven.

het plot Bland-Altman bestaat uit 2 assen. De x-as is het gemiddelde van de twee te vergelijken methoden. Zo is het voor elke rij: (gate_30i + gate_40i) / 2 ||| De Y-as is het verschil tussen methode A en methode B. Zo is het voor elke rij: (gate_30i-gate_40i) | | | en hier is het tweede “pijnpunt” dat we hebben. Door de Y-as te houden zoals het is, zal de toename van de grootte van de monsters de variabiliteit van de verschillen vergroten. Als gevolg hiervan zal de statistische meting die we later zullen krijgen, overgewicht krijgen door de grootste steekproeven. Om deze beperking te omzeilen, zullen we de Y-as in percentage vertegenwoordigen . Om dit te doen, is de berekening van y voor elke rij: ((gate_30i – gate_40i)*100 / ((gate_30i + gate_40i)/2) ||| de dataset ziet eruit als Figuur 7.

Figuur 7. x & y-as

we moeten controleren of de Y-as normaal is verdeeld om het betrouwbaarheidsinterval te vertrouwen dat zal worden weergegeven. U kunt het beoordelen met behulp van de shapiro-wilk test of op zijn minst met een histogram. Als de distributie Niet Normaal is dan kun je een transformatie doen zoals logaritmische transformatie. In ons geval beschouw ik de verdeling als normaal.

Figuur 8. Histogram van de Y-as

de Bland-Altman bestaat uit 3 regels (zie Figuur 9):

  • de gemiddelde waarden van y
  • het y de bovengrens van het betrouwbaarheidsinterval (hier in 95% gezien de 1.96)
  • het y de ondergrens van het betrouwbaarheidsinterval (op 95%)

Figure9. Waarden van de Bland-Altman plot

we hebben alles bij elkaar gezet, het pakket pyCompare maakt het mogelijk om de Bland-Altman plot op een zeer eenvoudige manier te tekenen zonder db te hoeven bouwen:

het duurt eerst de methode a (de kampioen) en dan de methode B (de uitdager). Dan, als percentage = waar, zal het automatisch de calculus doen die we hierboven hebben gemaakt. Er zijn een aantal andere parameters die we later zullen bespreken.

hoe interpreteer je de Bland-Altman plot voor de A/B test

hier zijn we ! Hier is de figuur van de Bland-Altman plot voor de A/B testen gegenereerd door de code hierboven:

Figuur 10. Bland-Altman-plot toegepast voor A / B-test

allereerst zijn het gemiddelde en het gemiddelde betrouwbaarheidsinterval (lichtblauwe streep) anders dan 0 (in ons geval hoger). Wat betekent dat het niveau van retentie (genaamd bias in het originele artikel) van gate_30 en gate_40 significant verschillend zijn. Door die 2,93 > 0 betekent dit dat een > B < — > kampioen > Challenger en als gevolg daarvan dat een wachttijd op gate_30 een grotere retentie biedt dan een wachttijd op gate_40.

de twee zalmstaven vertegenwoordigen het betrouwbaarheidsinterval op 95% (in het oorspronkelijke document de limiet van overeenstemming genoemd) en zeggen dat we ervan overtuigd zijn dat 95% van de waarden ertussen zal liggen . In ons voorbeeld is dit zeer krachtig omdat we kunnen zeggen dat de retentie van poort_30 bijna altijd groter zal zijn dan die van poort_40.

zoals u kunt zien, zijn er 2 waarden boven de bovenste zalmstreep en 4 onder de onderste, wat 6/300 = 0,02 < 0 is.05 dus omdat we er zeker van zijn dat 95% van de waarden binnen de 2 grenzen liggen, kan 5% boven of onder liggen en in ons geval vertegenwoordigt het 2% dan is het volkomen normaal 😉

In het pyCompare-pakket is er de parameterlimiet van overeenkomst die de grenzen van vertrouwen wil veranderen. Hier zou een relevante vraag zijn: “bij welk percentage kan ik er zeker van zijn dat het behoud van gate_30 altijd groter zal zijn dan dat van gate_40 ?”Om deze vraag te beantwoorden, moet de laagste grens gelijk zijn aan 0, dus moeten we de juiste waarde vinden om 0 te hebben, zoals we kunnen zien in de code hieronder die het Figuur11:

Figuur 11. Output bij het wijzigen van de parameter limitof agreement

zien we dat wanneer limitof agreement = 1,55, de grens bijna gelijk is aan 0. Dan moeten we in de normale verdeeltabel de waarde controleren op 1,55 wat 0,9394 is, dus we zijn er zeker van dat bij ((1-0.9394)*2)*100 = 87.88% dat de retentie van gate_30 altijd groter zal zijn dan die van gate_40

een laatste punt om toe te voegen is dat, ongeacht de gemiddelde waarde van de steekproef, ze uniform op de plot worden weergegeven, wat betekent dat de interpretatie die we maken gegeneraliseerd is ongeacht de grootte van de steekproef. Als we inderdaad een soort kegelsnede van de waarden hadden gezien, hadden we kunnen concluderen dat de grootte van het monster een invloed heeft op de resultaten, zodat we geen geldige interpretatie kunnen hebben.

conclusie

we zagen waarom het relevant kan zijn om de Bland-Altman plot te gebruiken om één mening te hebben over de resultaten van een A/B-test op een eenvoudige plot, hoe de plot te maken van een A/B-test en hoe het te interpreteren. Dit werkt alleen in geval van normaliteit van het verschil, maar het zal nodig zijn om de gegevens te transformeren.

bovendien, ik controleerde de App en de gates lijkt te zijn op gate_40, terwijl we bewezen dat de retentie op 7 dagen beter was op 30. In dit geval laat het zien dat het behoud is misschien niet de beste maatstaf te volgen in vergelijking met de winstgevendheid !

D. G. Altman en J. M. Bland, Measurement in Medicine: the Analysis of Method Comparison Studies, The Statistician 32 (1983) 307-317

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

D. G. Altman en J. M. Bland, Statistical Methods for Assessing Agreement between Two Methods of Clinical Measurement, The Lancet 327 (1986) 307-310

D. Giavarina, Understanding Bland Altman analysis, Biochemia Medica 25 (2015) 141-151

You might also like

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.