Traduction d'un besoin métier
Capacité à partir d'un problème concret rencontré en contexte professionnel et à le formaliser en une solution technique utile et ciblée.
Outil d'aide à la décision pour tests A/B. Il calcule la significativité statistique d'une expérimentation et tranche clairement : résultat fiable, à poursuivre, ou non concluant. Conçu pour répondre à un besoin observé en contexte professionnel / éviter les décisions prises sur des données insuffisantes.
En contexte professionnel, lors de missions d'expérimentation web, une difficulté revient systématiquement : distinguer un résultat réellement significatif d'une simple variation due au hasard. Une hausse de conversion de quelques pourcents sur un échantillon trop faible est souvent interprétée à tort comme une victoire, ce qui conduit à déployer des changements dont l'effet n'est pas prouvé.
Ce projet répond à ce problème concret : transformer des chiffres bruts (visiteurs et conversions) en un verdict statistique clair et défendable. Il met en évidence une démarche complète, de la compréhension du besoin métier à son implémentation technique, en passant par le choix d'une méthode statistique rigoureuse.
Une architecture en trois temps : calcul statistique côté client, persistance des analyses partagées, et restitution via un lien. Chaque brique illustre une compétence technique distincte.
L'interface recueille les visiteurs et conversions du contrôle et de la variation. Une validation est effectuée avant tout calcul : valeurs entières positives, conversions inférieures ou égales aux visiteurs, minimum d'un visiteur par groupe. Cette étape illustre la rigueur attendue sur la fiabilité des données d'entrée.
Le cœur du projet repose sur un test Z de comparaison de deux proportions : erreur standard combinée, score z, puis probabilité via la fonction de répartition normale (approximation d'Abramowitz & Stegun). L'implémentation est entièrement maîtrisée, sans bibliothèque externe ce qui démontre la compréhension réelle de la méthode statistique, et pas seulement son usage.
Le résultat est restitué sous forme d'un verdict lisible : déployable, contrôle meilleur, ou non concluant. La logique tient compte à la fois de la confiance statistique et de la taille de l'échantillon, afin de ne jamais conclure prématurément. L'objectif est de rendre une décision complexe immédiatement compréhensible, y compris pour un profil non statisticien.
Une analyse peut être partagée via un lien unique. Les données sont persistées dans une base Supabase, puis rechargées à l'ouverture du lien pour reconstituer le résultat. Cette fonctionnalité illustre la maîtrise d'une architecture client-serveur complète : génération d'identifiant, écriture et lecture via une API, gestion des paramètres d'URL.
Entrez les données de votre test A/B et obtenez un verdict statistique immédiat.
Capacité à partir d'un problème concret rencontré en contexte professionnel et à le formaliser en une solution technique utile et ciblée.
Mise en œuvre d'un test de significativité de A à Z, sans dépendance externe, témoignant d'une compréhension réelle des concepts et pas d'un simple assemblage de briques.
Conception d'une couche de données isolée (Supabase) pour le partage par lien : écriture, lecture, gestion des identifiants et des paramètres d'URL.
Le calcul reste fonctionnel même si la base est indisponible ; seule la fonction de partage est affectée. Une séparation nette entre logique métier et persistance.
// Test Z — comparaison de deux proportions (ab-decision-stats.js) function confidenceLevel(visA, convA, visB, convB) { const pPool = (convA + convB) / (visA + visB); const se = Math.sqrt(pPool * (1 - pPool) * (1/visA + 1/visB)); const z = (conversionRate(visB, convB) - conversionRate(visA, convA)) / se; return normalCDF(z); // Φ(z) via approximation Abramowitz & Stegun } function getVerdict(confidence, uplift, sampleSufficient) { if (!sampleSufficient) return { type: 'yellow' }; if (confidence >= 0.95 && uplift > 0) return { type: 'green' }; if ((1 - confidence) >= 0.95 && uplift < 0) return { type: 'red' }; return { type: 'yellow' }; }