Portail Étudiant

Plateforme de cours en ligne

Module 1 : Les Fondamentaux Statistiques

ML-M1
Renforcer vos bases statistiques pour comprendre et construire des modèles de Machine Learning efficaces. Ces fondamentaux sont essentiels pour passer de l'analyse descriptive (« quoi ») à l'analyse prédictive (« pourquoi et qu'est-ce que ça sera ? »).
Durée : 6 heures Niveau : Débutant Langage : Python (NumPy, Scipy)

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.

  1. H₀ : La couleur n'affecte pas le taux d'achat
  2. H₁ : La couleur affecte le taux d'achat
  3. Vous testez sur 1000 visiteurs. Résultat : p-value = 0.02
  4. 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

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 :

Passez au Module 2 : Préparation des Données →