Un test A/B est la façon la plus fiable de savoir si une modification (nouveau bouton, nouveau prix, nouvel e-mail) cause un changement de comportement. On montre la version actuelle (A, le contrôle) à un groupe, la nouvelle version (B, la variante) à un autre, et on compare.
Pourquoi randomiser ?
Comparer « avant » et « après » une mise en production mélange l’effet du changement avec tout le reste : saisonnalité, campagne marketing, actualité. Si les utilisateurs sont répartis au hasard entre A et B au même moment, les deux groupes sont comparables sur tout, y compris ce qu’on ne mesure pas. La seule différence systématique est la modification : la différence observée lui est donc attribuable, au hasard près, que les statistiques mesurent.
Le plan d’expérience, à écrire avant de lancer
- Hypothèse : « Afficher les frais de livraison dès la fiche produit augmentera le taux de commande, car les clients seront moins surpris au paiement. »
- Métrique principale (une seule) : taux de commande par visiteur.
- Métriques garde-fous : panier moyen, taux de remboursement, temps de chargement. Elles ne doivent pas se dégrader.
- Unité de randomisation : l’utilisateur.
- Taille d’échantillon, durée et seuil alpha (prochaine leçon).
Fixer ces choix à l’avance évite de « chercher » une métrique favorable après coup.
Choisir l’unité de randomisation
- Par utilisateur : le plus courant ; chacun voit toujours la même version, ce qui évite les incohérences.
- Par session ou page vue : plus de données, mais un même client peut voir les deux versions.
- Par zone ou magasin quand les individus interagissent (marketplace, prix en magasin).
La métrique doit être calculée au même niveau que l’unité : si on randomise des utilisateurs, on calcule un taux par utilisateur.
Assigner de façon stable : le hachage
Tirer au hasard à chaque visite ferait changer un utilisateur de groupe. On utilise plutôt une fonction de hachage de l’identifiant : le résultat paraît aléatoire, mais il est toujours le même pour le même utilisateur.
import hashlib
def assigner(user_id, experience, part_b=0.5):
# on combine l'expérience et l'utilisateur : deux expériences n'ont pas la même répartition
cle = f"{experience}:{user_id}".encode()
h = int(hashlib.sha256(cle).hexdigest()[:8], 16) # entier entre 0 et 16**8 - 1
position = h / 16**8 # nombre entre 0 et 1
return "B" if position < part_b else "A"
print(assigner("u_123", "frais_livraison")) # toujours la même réponse
On vérifie ensuite que la répartition est équilibrée :
import pandas as pd
groupes = pd.Series([assigner(f"u_{i}", "frais_livraison") for i in range(10_000)])
print(groupes.value_counts(normalize=True)) # proche de 50 % / 50 %
Durée
Même si la taille d’échantillon est atteinte en trois jours, on fait tourner l’expérience sur au moins une semaine complète : le comportement du lundi n’est pas celui du samedi.
À retenir
- La randomisation rend la comparaison causale.
- Une hypothèse, une métrique principale, des garde-fous, définis avant le lancement.
- Assignation stable par hachage, au niveau de l’unité de randomisation.
Exercices
Les solutions et les tests restent sur le serveur. Dans l'espace étudiant, ton code est exécuté et corrigé, et le tuteur donne des indices avant la solution.
Assignation déterministe
Écris
assigner(user_id, experience, part_b=0.5)qui renvoie ‘A’ ou ‘B’ à partir du hachage SHA-256 de la chaînef"{experience}:{user_id}": prends les 8 premiers caractères hexadécimaux, convertis-les en entier, divise par 16**8, et renvoie ‘B’ si le résultat est strictement inférieur àpart_b.import hashlib def assigner(user_id, experience, part_b=0.5): passContrôler l'équilibre des groupes
Le DataFrame
expcontient l’assignation et le pays des utilisateurs. Calculerepartition, la part de chaque groupe (série indexée par ‘A’ et ‘B’), etpart_fr_par_groupe, la part d’utilisateurs français (pays == ‘FR’) dans chaque groupe.import pandas as pd exp = pd.DataFrame({ 'groupe': ['A', 'B', 'A', 'B', 'A', 'B', 'A', 'B'], 'pays': ['FR', 'FR', 'BE', 'FR', 'FR', 'CH', 'FR', 'FR'], }) # repartition = ... # part_fr_par_groupe = ...Choisir l'unité de randomisation
Tu testes un nouveau programme de remise affiché sur tout le site, et ta métrique est le chiffre d’affaires par client sur 30 jours. Quelle unité de randomisation choisir ?
- La page vue
- La session
- L'utilisateur (client)
- Le produit
Quiz de fin de leçon
Pourquoi la randomisation permet-elle une conclusion causale ?
- Parce qu'elle augmente la taille de l'échantillon
- Parce qu'elle rend les groupes comparables en moyenne sur tous les facteurs, mesurés ou non
- Parce qu'elle supprime le hasard
Combien de métriques principales doit avoir une expérience ?
- Une seule
- Au moins cinq
- Autant que possible
Pourquoi faire durer un test au moins une semaine complète ?
- Pour couvrir les variations entre jours de la semaine
- Parce que les serveurs l'exigent
- Pour réduire le seuil alpha
La suite du cours
- Taille d'échantillon, effet minimal détectable et puissance18 min
- Analyser un test de conversion : test de deux proportions18 min
- Métriques continues : test de Welch et bootstrap18 min
- Pièges des tests A/B : SRM, peeking et comparaisons multiples20 min