Tag: ab-testing, cro, analytics, split-testing, frontend, feature-flag
Livello: intermedio
TL;DR: Metodologia per confrontare due o più versioni di una pagina o funzionalità per determinare quale performi meglio in base a metriche predefinite.
Definire chiaramente l'ipotesi e la metrica di successo (KPI) prima di iniziare.
Il traffico viene diviso casualmente tra la versione di controllo (A) e la variante (B).
È necessario raggiungere la significatività statistica per validare i risultati ed evitare falsi positivi.
Evitare di testare troppe variabili contemporaneamente per isolare l'impatto della singola modifica.
Considerare la durata del test per includere cicli settimanali completi e mitigare anomalie temporali.
Segmentare i risultati per dispositivo o tipo di utente per estrarre insight più precisi.
L'AA testing serve a verificare l'affidabilità del setup tecnico misurando il rumore di fondo.
Q: Come capisci se un test ha raggiunto la significatività statistica?R: Utilizzo calcolatori statistici basati sul p-value e mi assicuro che la dimensione del campione prestabilita sia stata raggiunta prima di dichiarare un vincitore.
Q: Cosa fai se un test risulta neutrale?R: Analizzo i dati per segmenti (es. solo mobile, solo nuovi utenti) per cercare pattern nascosti. Se non trovo nulla, considero l'ipotesi invalidata e passo alla successiva.
Q: Che differenza c'è tra AB test e test multivariato (MVT)?R: L'AB test confronta versioni intere di una pagina. L'MVT testa combinazioni di più elementi modificati simultaneamente e richiede molto più traffico.
Fermare il test troppo presto (peeking) appena si nota un risultato positivo.
Modificare le metriche di successo o gli obiettivi in corso d'opera.
Testare variazioni irrilevanti (es. sfumature di colore) sperando in impatti enormi sui tassi di conversione.
Ignorare l'effetto novità, dove gli utenti interagiscono maggiormente solo perché la feature è nuova.
Sovrapporre più test sulla stessa audience causando interferenza nei dati.
// Assegnazione deterministica di un utente a un bucket (A/B)
function getVariant(userId: string): 'A' | 'B' {
// L'hashing garantisce che lo stesso utente veda sempre la stessa variante
const hash = generateHash(userId);
return hash % 2 === 0 ? 'A' : 'B';
}
// Implementazione base di un feature flag
if (getVariant(currentUser.id) === 'B') {
renderNewCheckout();
} else {
renderLegacyCheckout();
}