Hvorfor og hvordan du bruker Bland-Altman-plottet for A/B-testing | Python + kode

hvorfor bruke Bland-Altman-plottet

Bland-Altman-plottet kommer fra medisinsk industri for å sammenligne tiltaket for to instrumenter. Det første målet Med John Martin Bland & Douglas Altman var å svare på dette spørsmålet :

er de to målemetodene tilstrekkelig enige ? D. G. ALTMAN Og J. M. TØRT

HVIS det er tilfelle, betyr det at hvis du har to instrumenter hvor en er toppmoderne til en høy pris og den andre er 10 ganger billigere, er resultatene oppnådd med den billigste metoden sammenlignbare med referansen og kan den erstattes med tilstrekkelig nøyaktighet? For eksempel er hjertefrekvensen gitt av en $ 20 tilkoblet klokke tilstrekkelig nøyaktig som følge av et elektrokardiogram ? Det andre målet var å lage en metode der resultatene er lett forståelig for ikke-statistikere.

i analytics er A/B-testing (så vel kjent Som Champion-Challenger) en vanlig testmetode for å sammenligne resultatene av en ny handling / en ny behandling / et nytt design / … på population_A til population_B som har den nåværende handlingen. Når vi har testresultatene, må de analyseres og presenteres for et beslutningsteam som hovedsakelig består av ikke-statistikere. Derfor Er Bland-Altman-plottet relevant fordi det vil sammenligne resultatene Av A / B-testen på en tomt med alle de statistiske tiltakene som vises på en forståelig måte.

i deres papir viste de også hvorfor korrelasjonskoeffisienten, den statistiske testen av gjennomsnittlig sammenligning og regresjonen er upassende å bestemme seg for enighet om to tiltak som ville være i Vårt a/B-testfall for å avgjøre utfordrerens kraft sammenlignet med den ene av mesteren.

dataene som brukes

for denne artikkelen vil jeg bruke et datasett tilgjengelig På Kaggle (kommer Fra Et DataCamp-prosjekt) kalt «Mobile Games A/B Testing with Cookie Cats». Lenken er i referansedelen .

Cookie Cats Er et populært mobil puslespill hvor som spiller fremgang nivåene, vil han møte «porter» som vil tvinge ham til å vente en stund før du fortsetter å spille eller å foreta et kjøp. I en slik bransje er oppbevaring en av nøkkeltallene, og teamet som har ansvaret for spillet vil se effekten hvis den første porten ble flyttet fra nivå 30 til nivå 40 på oppbevaring på 7 dager. For å se oppførselen til et slikt trekk gjorde de En a / B-test, og de ga oss datasettet av disse resultatene. Vi vil se hvordan Bland-Altman-plottet vil svare på følgende spørsmål : «Hvordan analysere a / B-resultatene på nivået av oppbevaring på 7 dager når ventetiden går fra nivå 30 til nivå 40 ?»

datasettet består av 90.189 rader hvor vi har spillerens unike id, a/b-testens versjon (ventetid på gate_30 / gate_40), spillrundene » sum, retention_1 er et boolsk ordtak om spilleren kom tilbake neste dag og retention_7 er et boolsk ordtak om spilleren kom tilbake etter 7 dager. For å få de relevante dataene til å svare på spørsmålet vårt, er det nødvendig å gjøre litt rengjøring. Jeg vil bare beholde klienten som har en retention_1 = True (fordi hvis retention_1=False, retention_7 Er Falsk også), et antall spillrunder ≥ 30 (fordi hvis de ikke går til 30, vil de ikke bli påvirket av porten) og et antall spillrunder < 170 (fordi hvis vi vurderer varigheten av et spill = 5 minutter, hvis en spiller spiller 2 timer per dag i løpet av 7-dagen, vil han spille 120*7/5 = 168 spill. Et høyere tall vil bli vurdert som en anormal bruk). Etter dette filteret består datasettet av 20.471 rader Som Figure1 nedenfor. Videre er datasettet like balansert mellom gate_30 & gate_40.

Figur 1. CookieCats datasett

hvordan er Bygget Bland-Altman plot

Vi vil se på denne delen hvordan du tilpasser den opprinnelige Bland-Altman plot for å bruke den til En a / B-test. Først av alt skal jeg forklare hvordan tomten er bygget i sin opprinnelige versjon, og så vil jeg forklare hvordan man bygger den med våre a/B-testdata.

På grunn av at Den opprinnelige Bland-Altman-plottet sammenligner måling av 2 instrumenter, har de samme lengde ved design. For eksempel, med hjertefrekvensmåling mellom $ 20 connect-klokken og elektrokardiogrammet, blir tiltaket tatt samtidig med de samme forholdene som fører til å ha samme antall målinger for 2-metodene. Så vi kan representere hvert datasetts rad som en opplevelse som på eksemplet I Figure2 nedenfor.

Figur 2. Instrumentmål per erfaring

det er her vi møter det første «smertepunktet». En a / B-test regnes som en unik opplevelse, mens som vi ser ovenfor, trenger vi flere erfaringer for å bygge tomten. For å omgå denne begrensningen vil vi lage fra A/B-testen flere bootstrapped-prøver som har begge samme & forskjellig lengde.

vi genererer 300 ikke-unike tilfeldige heltall mellom 200 og 1.000. Disse heltallene vil representere lengden på hver bootstrapped prøve og for å dra nytte av bootstrap statistiske egenskaper, er hver ikke-unike tilfeldig heltall duplisert 50 ganger. Disse tallene brukes for å ha et utvalgsdiversitet, men det er vilkårlig og lengden avhenger av størrelsen på det opprinnelige datasettet. Disse 15.000 (300*50) bootstrapped prøver med en lengde mellom 200 og 2.000 oppnås ved et tilfeldig utvalg med en erstatning fra det opprinnelige datasettet, og de er sammenkoblet sammen. Det kan representeres Som Figuren3.

Figur 3. Bootstrapped dataset building

følgende kode oppretter bootstrapped datasettet fra de opprinnelige dataene (vær forsiktig, det kan ta tid fordi bootstrapped datasettet har en lengde på 9.184.350 rader {ved å endre random_state, ville vi ha i gjennomsnitt (((200+1.000)/2)*300*50 = 9.000.000 rader}).

Deretter grupperer vi etter n_sample (iden til hver 15.000 bootstrapped sample), n_sample_2 (lengden på hver bootstrapped sample) og versjon for å få summen av spillerens oppbevaring på 7 dager per porte som I Figur 4.

Figur4. Bootstrapped datasett etter groupby

vi kan lese denne utgangen som: bootstrapped-prøven n°0/14.999 består av 564 rader hvor 98 spillere fortsatt spiller på 7 dager med ventetid på gate_30 mens 105 spillere fortsatt spiller på 7 dager med ventetid på gate_40.

da bruker vi en statistisk egenskap av boostrap som sier at gjennomsnittet av en bootstrap-prøve er en god estimator av det sanne gjennomsnittet av en fordeling. Vi lager en gruppe etter n_sample_2 og versjon for å ha for hver unike utvalgs lengde gjennomsnittlig antall spillers oppbevaring på 7 dager per gate som I Figur 5.

Figur 5. Gjennomsnittlig antall spillere som fortsatt spiller på 7 dager for hver unike prøvelengde og per port

Vi kan lese denne utgangen som: når prøven har 200 rader er det i gjennomsnitt 34.60 spillere som fortsatt spiller på 7 dager med ventetid på gate_30 mens 34.38 spillere som fortsatt spiller på 7 dager med ventetid på gate_40.

da unstack vi databasen for å få datasettet i et klarere format Som Figuren6.

Figur 6. Unstacked versjon av datasettet

På dette stadiet har vi all nødvendig informasjon for å bygge Bland-Altman-plottet og representasjonen av datasettet er det samme Som I Figuren2 ovenfor.

Bland-Altman-plottet består av 2 akse. X-aksen er gjennomsnittet av de to metodene for å sammenligne. Så det er for hver rad: (gate_30i + gate_40i) / 2 ||| y-aksen er forskjellen Mellom metode A Og Metode B. Så det er for hver rad: (gate_30i-gate_40i) ||| og Her er det andre «smertepunktet» vi har. Ved å holde y-aksen som den er, vil økningen av prøvens størrelse øke variabiliteten til forskjellene. Som et resultat vil det statistiske tiltaket vi får senere bli overvektet av de største prøvene. For å omgå denne begrensningen representerer vi y-aksen i prosent . For å gjøre det, er beregningen av y for hver rad: ((gate_30i-gate_40i)*100 / (( gate_30i + gate_40i) / 2) / / / datasettet ser Ut Som Figur7.

Figur 7. x & y-aksen

vi må kontrollere at y-aksen er normalfordelt for å kunne stole på konfidensintervallet som skal vises. Du kan vurdere det ved å bruke shapiro-wilk-testen eller i det minste med et histogram. Hvis fordelingen ikke Er Normal, kan du gjøre en transformasjon som logaritmisk transformasjon. I vårt tilfelle anser jeg distribusjonen Som Vanlig.

Figur 8. Histogram av y-aksen

Bland-Altman består av 3 linjer (Se Figur9):

  • gjennomsnittsverdiene for y
  • y ‘s øvre grense for konfidensintervallet (her ved 95% gitt 1,96)
  • y’ s nedre grense for konfidensintervallet (ved 95%)

Figur 9. Verdier Av Bland-Altman-plottet

vi legger alt sammen, pakken pyCompare gjør det mulig å tegne Bland-Altman-plottet på en veldig enkel måte uten å måtte bygge db:

Det tar først metoden A (mesteren) og deretter metoden B (utfordreren). Så, hvis prosent = Sant, vil den automatisk gjøre kalkulatoren vi laget ovenfor. Det er noen andre parametere vi vil diskutere senere.

hvordan tolke Bland-Altman-plottet for a / b-testen

Her er vi ! Her er figuren Av Bland-Altman-plottet for A / B-testingen generert av koden ovenfor:

Figur 10. Bland-Altman plot søkt Om A / b test

først av alt, gjennomsnittet og gjennomsnittet konfidensintervall (lys blå stripe) er annerledes enn 0 (høyere i vårt tilfelle). Hvilket betyr at nivået av oppbevaring (navngitt bias i originalpapiret) av gate_30 og gate_40 er vesentlig forskjellig. På grunn av at 2.93 > 0 betyr Det At A > B

de to laksestengene representerer konfidensintervallet på 95% (navngitt avtalegrense i opprinnelig papir) som sier at vi er overbevist om at 95% av verdiene vil være mellom . I vårt eksempel er dette veldig kraftig fordi vi kan si at oppbevaring av gate_30 vil være nesten alltid større enn den av gate_40.

som du kan se, er det 2 verdier over den øvre laksestripen og 4 under den nedre, som er 6/300 = 0,02 < 0.05 så på grunn av at vi er sikre på at 95% av verdiene er innenfor 2-grensene, 5% kan være over eller under, og i vårt tilfelle representerer det 2% da er det helt normalt;)

i pycompare-pakken er det parameteren limitOfAgreement som har som mål å endre grensene for tillit. Her vil et relevant spørsmål være: «Ved hvilken prosentandel kan jeg være sikker på at oppbevaring av gate_30 alltid vil være større enn den av gate_40 ?»For å svare på dette spørsmålet må den laveste grensen være lik 0, så vi må finne riktig verdi for å få 0 som vi kan se i koden nedenfor som gir Figuren11:

Figur 11. Utgang når du endrer limitofagreementets parameter

ser vi at når limitOfAgreement = 1,55, er grensen nesten lik 0. Da må vi sjekke I Normalfordelingstabellen verdien på 1,55 som er 0,9394, så vi er sikre på ((1-0.9394)*2)*100 = 87.88% at retensjonen av gate_30 alltid vil være større enn den av gate_40

Et siste punkt å legge til er at uansett gjennomsnittsverdien av prøven, er de jevnt representert på plottet som betyr at tolkningen vi lager er generalisert uansett størrelsen på prøven er. Faktisk hvis vi hadde sett en slags konisk representasjon av verdiene, kunne vi ha konkludert med at utvalgets størrelse har innvirkning på resultatene, slik at vi ikke kan ha en gyldig tolkning.

Konklusjon

vi så hvorfor Det kan være relevant å bruke Bland-Altman-plottet for å få en oversikt over resultatene av En a / B-test på en enkel tomt, hvordan man lager plottet fra En A/B-test og hvordan man tolker det. Dette fungerer bare i tilfelle normalitet av forskjellen, men det vil være nødvendig å transformere dataene.

Videre sjekket Jeg Appen og portene ser ut til å være på gate_40 mens vi viste at oppbevaring på 7 dager var bedre på 30. I dette tilfellet viser det at oppbevaring kanskje ikke er den beste metriske å følge i forhold til lønnsomheten !

D. G. Altman og Jm Bland, Måling I Medisin: Analysen Av Metodesammenligningsstudier, Statistikeren 32 (1983) 307-317

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

D. G. Altman Og J. M. Bland, Statistiske Metoder For Å Vurdere Avtale mellom To Metoder For Klinisk Måling, The Lancet 327 (1986) 307-310

D. Giavarina, Forståelse Bland altman analyse, Biochemia Medica 25 (2015) 141-151

You might also like

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert.