Concevoir une expérience A/B

Première leçon du cours Tests A/B et expérimentation, en accès libre : environ 15 minutes, 3 exercices et 3 questions de quiz. C'est la leçon de base du catalogue ; dans l'espace étudiant, elle est réécrite pour ton profil.

Objectifs

  • Formuler une hypothèse testable et choisir une métrique principale et des métriques garde-fous
  • Mettre en place une assignation aléatoire, stable et équilibrée des utilisateurs

Hypothèse d'expérienceMétrique principale et garde-fousRandomisation

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

  1. 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. »
  2. Métrique principale (une seule) : taux de commande par visiteur.
  3. Métriques garde-fous : panier moyen, taux de remboursement, temps de chargement. Elles ne doivent pas se dégrader.
  4. Unité de randomisation : l’utilisateur.
  5. 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.

  1. CodeDifficulté 2Python dans le navigateur2 indices

    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îne f"{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):
        pass
  2. CodeDifficulté 1Python dans le navigateur2 indices

    Contrôler l'équilibre des groupes

    Le DataFrame exp contient l’assignation et le pays des utilisateurs. Calcule repartition, la part de chaque groupe (série indexée par ‘A’ et ‘B’), et part_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 = ...
  3. QCMDifficulté 21 indice

    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

  1. 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
  2. Combien de métriques principales doit avoir une expérience ?

    • Une seule
    • Au moins cinq
    • Autant que possible
  3. 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

  1. Taille d'échantillon, effet minimal détectable et puissance18 min
  2. Analyser un test de conversion : test de deux proportions18 min
  3. Métriques continues : test de Welch et bootstrap18 min
  4. Pièges des tests A/B : SRM, peeking et comparaisons multiples20 min

Tests A/B et expérimentation · Intermédiaire · 2 h 44