Perché e come usare la trama Bland-Altman per test A/B | Python + code

Perché usare la trama Bland-Altman

La trama Bland-Altman proviene dall’industria medica per confrontare la misura per due strumenti. Il primo obiettivo di John Martin Bland & Douglas Altman era quello di rispondere a questa domanda :

I due metodi di misurazione concordano sufficientemente ? – D. G. ALTMAN e J. M. BLANDO

Se è il caso, significa che se si dispone di due strumenti in cui uno è lo stato dell’arte ad un costo elevato e il secondo è 10 volte più economico, i risultati ottenuti con il metodo più economico sono paragonabili al riferimento e potrebbero essere sostituiti con una precisione sufficiente? Ad esempio, la frequenza cardiaca fornita da un orologio collegato a connected 20 è sufficientemente precisa come risultato di un elettrocardiogramma ? Il secondo obiettivo era quello di produrre un metodo in cui i risultati fossero facilmente comprensibili ai non statistici.

In analytics, il test A / B (noto come Champion-Challenger) è una metodologia comune di test per confrontare i risultati di una nuova azione / un nuovo trattamento / un nuovo design / popul su population_A a population_B con l’azione corrente. Una volta che abbiamo i risultati del test, devono essere analizzati e presentati a un team decisionale composto per lo più da non statistici. Ecco perché la trama Bland-Altman è rilevante perché confronterà i risultati del test A/B su un grafico con tutte le misure statistiche visualizzate in modo comprensibile.

Nel loro articolo, hanno anche mostrato perché il coefficiente di correlazione, il test statistico del confronto medio e la regressione non sono appropriati per decidere l’accordo di due misure che sarebbero nel nostro caso di test A/B per decidere il potere dello sfidante rispetto a quello del campione.

I dati utilizzati

Per questo articolo userò un set di dati disponibile su Kaggle (proveniente da un progetto DataCamp) chiamato “Mobile Games A/B Testing with Cookie Cats”. Il collegamento si trova nella parte riferimenti .

Cookie Cats è un popolare gioco di puzzle mobile in cui, come un giocatore progredire i livelli, incontrerà “cancelli” che lo costringerà ad aspettare per qualche tempo prima di continuare a giocare o per effettuare un acquisto. In un tale settore la ritenzione è una delle metriche chiave e il team responsabile del gioco vedrebbe l’impatto se il primo cancello fosse spostato dal livello 30 al livello 40 sulla ritenzione a 7 giorni. Per vedere il comportamento di una tale mossa hanno fatto un test A/B e ci hanno fornito il set di dati di questi risultati. Vedremo come la trama Blanda-Altman risponderà alla seguente domanda : “Come analizzare i risultati A / B sul livello di ritenzione a 7 giorni quando il tempo di attesa passa dal livello 30 al livello 40 ?”

Il set di dati è composto da 90.189 righe in cui abbiamo l’id univoco del giocatore, la versione del test A/B (tempo di attesa a gate_30 / gate_40), la somma dei round di gioco, retention_1 è un detto booleano se il giocatore è tornato il giorno successivo e retention_7 è un detto booleano se il giocatore è tornato dopo 7 giorni. Per avere i dati rilevanti per rispondere alla nostra domanda, è necessario fare un po ‘ di pulizia. Voglio solo mantenere il cliente retention_1 = True (perché se retention_1=False, retention_7 è Falso come bene), un numero di turni di gioco ≥ 30 (perché se non andare fino a 30, non sarà influenzato dal cancello) e un numero di turni di gioco < 170 (perché se consideriamo la durata di un gioco = 5 minuti, se un giocatore gioca 2 ore al giorno per 7 giorni la giocherà 120*7/5 = 168 giochi. Un numero più alto sarebbe considerato come un uso anormale). Dopo questo filtro, il set di dati è composto da 20.471 righe come Figura1 di seguito. Inoltre, il set di dati è ugualmente bilanciato tra gate_30 & gate_40.

Figura1. Cookiecats dataset

Come viene costruito il plot Bland-Altman

Vedremo in questa sezione come adattare il plot Bland-Altman originale per applicarlo a un test A/B. Prima di tutto spiegherò come è costruita la trama nella sua versione originale , e poi spiegherò come costruirla con i dati dei nostri test A/B.

A causa del fatto che la trama originale Bland-Altman confronta la misurazione di 2 strumenti, hanno la stessa lunghezza in base alla progettazione. Ad esempio, con la misurazione della frequenza cardiaca tra l’orologio connect 20 connect e l’elettrocardiogramma, la misura viene presa allo stesso tempo con le stesse condizioni che portano ad avere lo stesso numero di misurazioni per i metodi 2. Quindi possiamo rappresentare la riga di ogni set di dati come un’esperienza come nell’esempio nella figura 2 qui sotto.

Figura2. Strumento di misura per esperienza

Questo è dove incontriamo il primo “punto di dolore”. Un test A / B è considerato un’esperienza unica mentre, come vediamo sopra, abbiamo bisogno di diverse esperienze per costruire la trama. Per aggirare questa limitazione creeremo dal test A/B diversi campioni bootstrap aventi entrambi la stessa lunghezza & diversa.

Generiamo 300 numeri interi casuali non univoci tra 200 e 1.000. Questi numeri interi rappresenteranno la lunghezza di ciascun campione bootstrap e per beneficiare delle proprietà statistiche del bootstrap, ogni intero casuale non univoco viene duplicato 50 volte. Questi numeri sono usati per avere una diversità di esempio ma è arbitraria e la lunghezza dipende dalla dimensione del set di dati originale. Questi 15.000 (300*50) campioni bootstrap con una lunghezza compresa tra 200 e 2.000 sono ottenuti da un campionamento casuale con una sostituzione dal set di dati originale e sono concatenati insieme. Può essere rappresentato come la Figura3.

Figura3. Creazione del set di dati bootstrap

Il seguente codice crea il set di dati bootstrap dai dati originali (fai attenzione, può richiedere tempo perché il set di dati bootstrap ha una lunghezza di 9.184.350 righe {cambiando random_state, avremmo in media (((200+1.000)/2)*300*50 = 9.000.000 righe}).

Quindi, raggruppiamo per n_sample (l’id di ogni 15.000 bootstrap campione), n_sample_2 (la lunghezza di ogni campione bootstrap) e la versione in modo da avere la somma di ritenzione del giocatore a 7 giorni per porte come in Figura 4.

Figura4. Bootstrap dataset dopo groupby

Possiamo leggere questo output come: il campione bootstrap n°0/14.999 è composto da 564 righe in cui 98 giocatori stanno ancora giocando a 7 giorni con un tempo di attesa a gate_30 mentre 105 giocatori stanno ancora giocando a 7 giorni con un tempo di attesa a gate_40.

Quindi, usiamo una proprietà statistica del boostrap dicendo che la media di un campione di bootstrap è un buon stimatore della vera media di una distribuzione. Facciamo un gruppo per n_sample_2 e versione in modo da avere per la lunghezza di ogni campione unico il numero medio di ritenzione del giocatore a 7 giorni per porte come in Figura 5.

Figura5. Numero medio di giocatori che ancora giocano a 7 giorni per ogni lunghezza campione unico e per porte

Possiamo leggere questo output come: quando il campione ha 200 righe ci sono in media 34.60 giocatori che stanno ancora giocando a 7 giorni con un tempo di attesa a gate_30 mentre 34.38 giocatori che stanno ancora giocando a 7 giorni con un tempo di attesa a gate_40.

Quindi scolleghiamo il database in modo da avere il set di dati in un formato più chiaro come Figura6.

Figura6. Versione unstacked del set di dati

In questa fase abbiamo tutte le informazioni necessarie per costruire la trama Bland-Altman e la rappresentazione del set di dati è la stessa della Figura2 sopra.

La trama Bland-Altman è composta da 2 assi. L’asse x è la media dei due metodi da confrontare. Quindi è per ogni riga: (gate_30i + gate_40i ) / 2 ||| L’asse y è la differenza tra il metodo A e il metodo B. Quindi è per ogni riga: (gate_30i-gate_40i) ||| E qui è il secondo “punto di dolore” che abbiamo. Mantenendo l’asse y così com’è, l’aumento della dimensione dei campioni aumenterà la variabilità delle differenze. Di conseguenza, la misura statistica che otterremo in seguito sarà sovrastimata dai campioni più grandi. Per aggirare questa limitazione, rappresenteremo l’asse y in percentuale . Per farlo, il calcolo di y è per ogni riga: ((gate_30i-gate_40i)*100/((gate_30i + gate_40i) | 2) | | / Il set di dati sembra Figure7.

Figura7. x & asse y

Dobbiamo verificare che l’asse y sia normalmente distribuito per poter considerare attendibile l’intervallo di confidenza che verrà visualizzato. Puoi valutarlo usando il test shapiro-wilk o almeno con un istogramma. Se la distribuzione non è normale, è possibile eseguire una trasformazione come la trasformazione logaritmica. Nel nostro caso, considero la distribuzione normale.

Figura8. Istogramma dell’asse y

Il Bland-Altman è composto da 3 linee (vedi Figura9):

  • la media dei valori di y
  • y il limite superiore dell’intervallo di confidenza (qui al 95% del dato il 1.96)
  • y del limite inferiore dell’intervallo di confidenza (al 95%)

Figure9. Valori della trama Bland-Altman

Abbiamo messo tutti insieme, il pacchetto pyCompare permette di disegnare la trama Bland-Altman in un modo molto semplice senza dover costruire db:

Prende prima il metodo A (il campione) e poi il metodo B (lo sfidante). Quindi, se percentage = True, eseguirà automaticamente il calcolo che abbiamo fatto sopra. Ci sono alcuni altri parametri che discuteremo più avanti.

Come interpretare la trama Bland-Altman per il test A/B

Eccoci qui ! Ecco la figura della trama Bland-Altman per il test A / B generato dal codice sopra:

Figura10. Bland-Altman plot applicato per il test A / B

Prima di tutto, la media e l’intervallo di confidenza della media (striscia blu chiaro) sono diversi da 0 (più alto nel nostro caso). Il che significa che il livello di conservazione (denominato bias nella carta originale) di gate_30 e gate_40 sono significativamente diversi. A causa di ciò 2.93 > 0 significa che A > B < — > Champion > Challenger e di conseguenza che un periodo di attesa su gate_30 fornisce una ritenzione maggiore di un periodo di attesa su gate_40.

Le due barre di salmone rappresentano l’intervallo di confidenza al 95% (chiamato limite di accordo nel documento originale) dicendo che siamo convinti che il 95% dei valori sarà tra . Nel nostro esempio, questo è molto potente perché possiamo dire che la conservazione di gate_30 sarà quasi sempre maggiore di quella di gate_40.

Come puoi vedere, ci sono 2 valori sopra la striscia di salmone superiore e 4 sotto quella inferiore, che è 6/300 = 0.02 < 0.05 così dovuto che siamo certi che il 95% dei valori sia entro i 2 confini, il 5% può essere sopra o sotto e nel nostro caso rappresenta il 2% quindi è perfettamente normale 😉

Nel pacchetto pyCompare c’è il parametro limitOfAgreement che mira a modificare i confini di confidenza. Qui, una domanda rilevante sarebbe : “A quale percentuale posso essere sicuro che la conservazione di gate_30 sarà sempre maggiore di quella di gate_40 ?”Per rispondere a questa domanda, il più basso limite deve essere uguale a 0, quindi dobbiamo trovare il valore giusto per avere 0 come si può vedere nel codice riportato di seguito, che forniscono la Figure11:

Figure11. Output quando si modifica il parametro limitOfAgreement

Vediamo che quando limitOfAgreement = 1.55, il limite è quasi uguale a 0. Quindi dobbiamo controllare nella normale tabella di distribuzione il valore a 1.55 che è 0.9394, quindi siamo sicuri di ((1-0.9394)*2)*100 = 87.88% che la riserva di gate_30 sarà sempre più grande di quella di gate_40

Un ultimo punto da aggiungere è che, qualunque sia il valore medio del campione, sono uniformemente rappresentato sulla trama, il che significa che l’interpretazione che stiamo facendo sono generalizzata qualunque sia la dimensione del campione. In effetti, se avessimo visto una sorta di rappresentazione conica dei valori, avremmo potuto concludere che la dimensione del campione ha un impatto sui risultati, quindi non possiamo avere un’interpretazione valida.

Conclusione

Abbiamo visto perché può essere rilevante utilizzare la trama Bland-Altman per avere una visione sui risultati di un test A/B su una trama semplice, come creare la trama da un test A/B e come interpretarla. Questo funziona solo in caso di normalità della differenza tuttavia sarà necessario trasformare i dati.

Inoltre, ho controllato l’app e le porte sembrano essere su gate_40 mentre abbiamo dimostrato che la ritenzione ai giorni 7 era migliore a 30. In questo caso, dimostra che la conservazione non è forse la migliore metrica da seguire rispetto alla redditività !

D. G. Altman e J. M. Dolce, di Misura in Medicina: l’Analisi del Metodo di Confronto di Studi, La Statistica 32 (1983) 307-317

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

D. G. Altman e J. M. Blando, Metodi Statistici per la Valutazione di un Accordo tra i Due Metodi di Misurazione Clinica, The Lancet 327 (1986) 307-310

D. Giavarina, di Comprensione, di Bland Altman analisi, Biochemia Medica 25 (2015) 141-151

You might also like

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.