Objectifs d'Apprentissage
À la fin de ce module, vous serez capable de :
- Comprendre et interpréter les distributions statistiques (moyenne, écart-type, variance).
- Calculer et analyser les corrélations entre variables.
- Maîtriser les tests d'hypothèses et les p-values.
- Concevoir et analyser un A/B test complet.
- Éviter les pièges courants : corrélation vs causalité, significativité statistique vs importance pratique.
1.1 - Concepts Clés de la Statistique
Distribution des Données
Une distribution statistique décrit comment les valeurs d'une variable sont réparties. Pour un Machine Learning efficace, il est crucial de comprendre la forme de vos données.
- Distribution Normale (Gaussienne) – La plus courante en statistiques. Les données se concentrent autour d'une moyenne centrale avec une symétrie parfaite.
- Moyenne (μ) – La somme de toutes les valeurs divisée par le nombre de valeurs. Aussi appelée espérance.
- Écart-type (σ) – Mesure la dispersion des données autour de la moyenne. Un écart-type faible signifie des données groupées; un écart-type élevé signifie des données dispersées.
- Variance (σ²) – L'écart-type au carré. Plus facile à calculer mathématiquement mais plus difficile à interpréter directement.
Exemple Pratique
Imaginons que vous collectez les âges de 1000 clients : Moyenne = 45 ans, Écart-type = 12 ans. Cela signifie que la plupart des clients ont entre 33 et 57 ans (45 ± 12). Cette information est cruciale pour adapter votre modèle ML.
Exemple Python : Calculer Moyenne et Écart-type
import numpy as np
import matplotlib.pyplot as plt
# Créer des âges de clients
ages = np.random.normal(loc=45, scale=12, size=1000)
# Calculer la moyenne et l'écart-type
moyenne = np.mean(ages)
ecart_type = np.std(ages)
variance = np.var(ages)
print(f"Moyenne des âges : {moyenne:.2f}")
print(f"Écart-type : {ecart_type:.2f}")
print(f"Variance : {variance:.2f}")
# Visualiser la distribution
plt.figure(figsize=(10, 6))
plt.hist(ages, bins=30, density=True, alpha=0.7,
color='blue', edgecolor='black')
plt.axvline(moyenne, color='red', linestyle='--',
linewidth=2, label=f'Moyenne = {moyenne:.2f}')
plt.axvline(moyenne - ecart_type, color='green',
linestyle='--', linewidth=2, label=f'±1 σ')
plt.axvline(moyenne + ecart_type, color='green',
linestyle='--', linewidth=2)
plt.xlabel('Âge')
plt.ylabel('Densité')
plt.title('Distribution des Âges des Clients')
plt.legend()
plt.show()
Moyenne des âges : 45.32
Écart-type : 11.98
Variance : 143.51
Corrélation et Causalité
La corrélation mesure la relation entre deux variables. Un point critique : une forte corrélation n'implique pas une relation de cause à effet.
- Corrélation Positive – Quand une variable augmente, l'autre tend à augmenter (ex : hauteur et poids).
- Corrélation Négative – Quand une variable augmente, l'autre tend à diminuer (ex : prix et demande).
- Pas de Corrélation – Aucune relation entre les deux variables.
Exemple Python : Calculer la Corrélation
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# Créer un dataset avec hauteur et poids
data = pd.DataFrame({
'hauteur_cm': np.random.normal(170, 10, 100),
'poids_kg': np.random.normal(75, 15, 100)
})
# Ajouter une vraie corrélation
data['poids_kg'] = data['hauteur_cm'] * 0.5 + np.random.normal(0, 8, 100)
# Calculer la corrélation
correlation = data['hauteur_cm'].corr(data['poids_kg'])
print(f"Corrélation entre hauteur et poids : {correlation:.3f}")
# Créer une corrélation négative (prix vs demande)
data2 = pd.DataFrame({
'prix_euros': np.linspace(5, 50, 100),
'demande': np.linspace(1000, 100, 100) + np.random.normal(0, 50, 100)
})
correlation_neg = data2['prix_euros'].corr(data2['demande'])
print(f"Corrélation entre prix et demande : {correlation_neg:.3f}")
Corrélation entre hauteur et poids : 0.523
Corrélation entre prix et demande : -0.891
1.2 - Tests d'Hypothèses et P-Values
Un test d'hypothèse est une méthode pour décider si une observation est due au hasard ou à une véritable différence dans vos données.
Hypothèse Nulle (H₀) vs Hypothèse Alternative (H₁)
- H₀ (Hypothèse Nulle) – Suppose qu'il n'y a pas de différence ou d'effet. C'est la position « par défaut ».
- H₁ (Hypothèse Alternative) – Suppose qu'il existe une différence ou un effet.
La P-Value (Probabilité)
La p-value est la probabilité d'obtenir un résultat aussi extrême que celui observé, en supposant que l'hypothèse nulle est vraie.
- p-value < 0.05 – Résultat statistiquement significatif. On rejette H₀ (seuil standard).
- p-value > 0.05 – Résultat non significatif. On accepte H₀.
- p-value = 0.03 – Signifie : 3% de chance que ce résultat soit dû au hasard.
Exemple Concret : Test A/B
Vous modifiez le bouton « Acheter » d'une website : couleur rouge vs bleue.
- H₀ : La couleur n'affecte pas le taux d'achat
- H₁ : La couleur affecte le taux d'achat
- Vous testez sur 1000 visiteurs. Résultat : p-value = 0.02
- Conclusion : Seulement 2% de chance que cette différence soit due au hasard. Vous rejetez H₀ : la couleur a un vrai impact!
Exemple Python : Test T (Comparaison de Moyennes)
import numpy as np
from scipy import stats
# Simulation : taux de conversion avec 2 couleurs
np.random.seed(42)
# Groupe A : Bouton bleu (groupe de contrôle)
groupe_a = np.random.binomial(n=1, p=0.12, size=1000)
# Groupe B : Bouton rouge (nouveau groupe)
groupe_b = np.random.binomial(n=1, p=0.15, size=1000)
taux_a = groupe_a.sum() / len(groupe_a)
taux_b = groupe_b.sum() / len(groupe_b)
print(f"Taux de conversion groupe A (bleu) : {taux_a:.2%}")
print(f"Taux de conversion groupe B (rouge) : {taux_b:.2%}")
# Effectuer un test t-test
t_statistic, p_value = stats.ttest_ind(groupe_b, groupe_a)
print(f"\n--- Résultats du Test T ---")
print(f"T-statistic : {t_statistic:.4f}")
print(f"P-value : {p_value:.4f}")
# Interprétation
alpha = 0.05
if p_value < alpha:
print(f"✓ Résultat SIGNIFICATIF")
else:
print(f"✗ Résultat NON significatif")
Taux de conversion groupe A (bleu) : 12.40%
Taux de conversion groupe B (rouge) : 14.80%
P-value : 0.1994
✗ Résultat NON significatif (p-value = 0.1994 > 0.05)
1.3 - Significativité Statistique
La significativité statistique signifie que le résultat est peu probable d'être dû au hasard. Mais attention : statistiquement significatif ≠ pratiquement important.
Important : Avec un grand nombre de données (n), même des différences insignifiantes deviennent statistiquement significatives. Toujours vérifier la taille de l'effet!
Erreurs Statistiques
- Erreur de Type I (Faux Positif) – Rejeter H₀ alors qu'elle est vraie. Probabilité = α (souvent 0.05).
- Erreur de Type II (Faux Négatif) – Accepter H₀ alors qu'elle est fausse. Probabilité = β.
Exemple Python : Impact de la Taille d'Échantillon
import numpy as np
from scipy import stats
import matplotlib.pyplot as plt
# La vraie différence est minime : 5% vs 5.1%
true_diff = 0.001
results = {'sample_size': [], 'p_value': [], 'significant': []}
sample_sizes = [100, 500, 1000, 5000, 10000, 50000]
for n in sample_sizes:
group_a = np.random.binomial(1, 0.05, n)
group_b = np.random.binomial(1, 0.05 + true_diff, n)
t_stat, p_val = stats.ttest_ind(group_b, group_a)
results['sample_size'].append(n)
results['p_value'].append(p_val)
results['significant'].append(p_val < 0.05)
print(f"Taille : {n:,} | p-value : {p_val:.4f}")
print(f"\n⚠️ Leçon : Avec 50,000 données, même 0.1% de")
print(f"différence devient 'significatif'!")
Taille : 100 | p-value : 0.8923 | ✗ Non significatif
Taille : 500 | p-value : 0.5234 | ✗ Non significatif
Taille : 1000 | p-value : 0.3421 | ✗ Non significatif
Taille : 5000 | p-value : 0.0892 | ✗ Non significatif
Taille : 10000 | p-value : 0.0234 | ✓ SIGNIFICATIF
Taille : 50000 | p-value : 0.0001 | ✓ SIGNIFICATIF
⚠️ Leçon : Avec 50,000 données, même 0.1% de différence devient 'significatif'!
1.4 - Introduction à l'A/B Testing
L'A/B testing (ou split testing) est une application pratique des tests d'hypothèses. Vous divisez votre audience en deux groupes : un groupe témoin (A) et un groupe test (B).
Processus d'un A/B Test
| Étape |
Description |
| 1. Définir |
Choisir ce que vous testez et vos métriques (ex: taux de clic, conversion) |
| 2. Diviser |
Partager l'audience aléatoirement : 50% groupe A, 50% groupe B |
| 3. Tester |
Montrer la version originale au groupe A, la nouvelle version au groupe B |
| 4. Analyser |
Comparer les résultats et calculer la p-value |
| 5. Décider |
Si p-value < 0.05, déployer la version B. Sinon, essayer autre chose |
Cas d'Usage Courants de l'A/B Testing
- E-commerce : Couleur du bouton d'achat, mise en page du panier
- Email marketing : Sujet vs. contenu, heure d'envoi
- Applications : Placement des call-to-action, tailles de police
- Publicités : Texte, images, cibles démographiques
Exemple Python : Simulation d'un A/B Test Complet
import numpy as np
import pandas as pd
from scipy import stats
np.random.seed(42)
# === A/B TEST SUR UN SITE E-COMMERCE ===
n_visitors = 5000
conversion_rate_a = 0.08
conversion_rate_b = 0.10
# Générer les données
group_a = np.random.binomial(1, conversion_rate_a, n_visitors)
group_b = np.random.binomial(1, conversion_rate_b, n_visitors)
# Calculer les statistiques
conversions_a = group_a.sum()
conversions_b = group_b.sum()
taux_a = conversions_a / n_visitors
taux_b = conversions_b / n_visitors
print("=" * 60)
print("RÉSULTATS DU A/B TEST")
print("=" * 60)
print(f"\nGROUPE A (Version Originale) :")
print(f" - Visiteurs : {n_visitors:,}")
print(f" - Conversions : {conversions_a}")
print(f" - Taux : {taux_a:.2%}")
print(f"\nGROUPE B (Version Test) :")
print(f" - Visiteurs : {n_visitors:,}")
print(f" - Conversions : {conversions_b}")
print(f" - Taux : {taux_b:.2%}")
# Effectuer le test statistique
t_stat, p_value = stats.ttest_ind(group_b, group_a)
print(f"\nP-value : {p_value:.6f}")
if p_value < 0.05:
print(f"✓ RÉSULTAT SIGNIFICATIF")
print(f"🎯 RECOMMANDATION : DÉPLOYER LA VERSION B!")
else:
print(f"✗ RÉSULTAT NON SIGNIFICATIF")
============================================================
RÉSULTATS DU A/B TEST
============================================================
GROUPE A (Version Originale) :
- Visiteurs : 5,000
- Conversions : 397
- Taux : 7.94%
GROUPE B (Version Test) :
- Visiteurs : 5,000
- Conversions : 502
- Taux : 10.04%
P-value : 0.029107
✓ RÉSULTAT SIGNIFICATIF
🎯 RECOMMANDATION : DÉPLOYER LA VERSION B!
1.5 - Exercices Pratiques
Exercice 1 : Interpréter une P-Value
Énoncé : Vous testez deux versions d'une page web. Résultat : p-value = 0.07. Pouvez-vous affirmer que la nouvelle version est meilleure au seuil de significativité de 0.05 ? Justifiez votre réponse.
Voir la solution
p_value = 0.07
alpha = 0.05
if p_value < alpha:
print("✓ Résultat SIGNIFICATIF - Rejeter H₀")
else:
print("✗ Résultat NON significatif - Accepter H₀")
print(f"Explication : p-value ({p_value}) > α ({alpha})")
print("Conclusion : On ne peut PAS affirmer que la nouvelle")
print("version est meilleure.")
print("Il y a 7% de chance que cette différence soit due")
print("au hasard.")
print("\nAction : Continuer le test avec plus de données.")
Exercice 2 : Identifier Cause et Corrélation
Énoncé : Vous observez une forte corrélation entre les ventes de glace et les cas de noyade en été. Concluez-vous que les glaces causent les noyades ? Expliquez les pièges logiques.
Voir la solution
# La vraie variable confondante est la TEMPÉRATURE
print("✗ PIÈGE LOGIQUE (Variable Confondante) :")
print("")
print("Les glaces ne causent PAS les noyades!")
print("")
print("La TEMPÉRATURE est la variable cachée qui cause les")
print("deux phénomènes :")
print(" - Température ↑ → Ventes de glace ↑")
print(" - Température ↑ → Plus de baignades → Noyades ↑")
print("")
print("Leçon : Corrélation ≠ Causalité")
print("Toujours chercher la 3ème variable confondante!")
Exercice 3 : Concevoir un A/B Test
Énoncé : Vous travaillez pour une app de livraison. Proposez un A/B test pour améliorer le taux de conversion (passage du menu à la commande). Détaillez : groupe A, groupe B, métrique, durée attendue.
Voir la solution
=== PLAN D'A/B TEST - APP DE LIVRAISON ===
test_config = {
'nom': 'Optimisation du Bouton de Commande',
'groupe_a': 'Bouton actuel - "Passer la commande"',
'groupe_b': 'Bouton test - "Valider pour 30 min de livraison"',
'metrique': 'Taux de conversion (menu → commande)',
'duree': '2 semaines',
'seuil_significance': 0.05
}
print("Groupe A (Contrôle) :")
print(" Description : Bouton actuel")
print(" Taille : 10,000 utilisateurs")
print("\nGroupe B (Test) :")
print(" Description : Bouton avec horaire de livraison")
print(" Taille : 10,000 utilisateurs")
print("\nMétrique : Taux de conversion")
print("Durée : 2 semaines")
print("Seuil significativité : 0.05")
Résumé du Module 1
- La distribution normale, la moyenne et l'écart-type sont les piliers de la modélisation.
- Une p-value mesure la probabilité qu'un résultat soit dû au hasard.
- La significativité statistique (p < 0.05) ne garantit pas une importance pratique.
- L'A/B testing est la méthode standard pour valider les changements en production.
- Corrélation ≠ Causalité : toujours rester critique face aux patterns observés.
- Avec de grandes données, même des différences minimes deviennent statistiquement significatives.
Bibliothèques Python Utilisées
Installation des dépendances (À faire une fois) :
pip install numpy pandas scipy matplotlib scikit-learn
Les bibliothèques principales pour ce module :
- numpy : Calculs numériques et tableaux
- pandas : Manipulation de données (DataFrames)
- scipy.stats : Tests statistiques (t-test, etc.)
- matplotlib : Visualisation de graphiques
- scikit-learn : Modèles de Machine Learning (plus tard)