Statistiques
Activités Python
L'objectif de ces activités est de tester quelques cas pratiques avec des outils numériques très utilisés : Python et Matplotlib.
Prérequis

Python
Langage de programmation

Matplotlib
Bibliothèque
Un site pour utiliser Matplotlib en ligne : https://python-fiddle.com/examples/matplotlib
I - Simulation d'une somme de deux lois normales
Le programme ci-dessous simule deux variables aléatoires :
X₁ suit une loi normale de moyenne μ₁ et d'écart-type σ₁
X₂ suit une loi normale de moyenne μ₂ et d'écart-type σ₂
puis calcule leur somme : Y = X₁ + X₂
Objectif : comprendre empiriquement la loi suivie par Y, en visualisant les courbes, et en comparant les moyennes et variances obtenues expérimentalement à ce qu'on attend théoriquement.
👉 Lisez attentivement et comprenez le code ci-dessous.
Observez comment les tirages aléatoires sont générés.
Regardez comment les moyennes et variances sont calculées manuellement.
Repérez les paramètres utilisés : μ₁, σ₁, μ₂, σ₂.
👉 Lancez le programme pour voir les histogrammes des trois variables : X₁, X₂ et Y.
👉 Quelle loi suit Y = X₁ + X₂ ?
👉 Quelle est sa moyenne théorique ? Sa variance théorique ?
👉 Comparez avec les valeurs expérimentales affichées par le programme.👉 Faites de même avec Y = X₁ - X₂.
I - Simulation d'une somme de deux lois normales
Le programme ci-dessous simule deux variables aléatoires :
X₁ suit une loi normale de moyenne μ₁ et d'écart-type σ₁
X₂ suit une loi normale de moyenne μ₂ et d'écart-type σ₂
puis calcule leur somme : Y = X₁ + X₂
Objectif : comprendre empiriquement la loi suivie par Y, en visualisant les courbes, et en comparant les moyennes et variances obtenues expérimentalement à ce qu'on attend théoriquement.
👉 Lisez attentivement et comprenez le code ci-dessous.
Observez comment les tirages aléatoires sont générés.
Regardez comment les moyennes et variances sont calculées manuellement.
Repérez les paramètres utilisés : μ₁, σ₁, μ₂, σ₂.
👉 Lancez le programme pour voir les histogrammes des trois variables : X₁, X₂ et Y.
👉 Quelle loi suit Y = X₁ + X₂ ?
👉 Quelle est sa moyenne théorique ? Sa variance théorique ?
👉 Comparez avec les valeurs expérimentales affichées par le programme.👉 Faites de même avec Y = X₁ - X₂.
import random import matplotlib.pyplot as plt # Déclaration des paramètres mu1 = 3 sigma1 = 2 # donc variance1 = 4 mu2 = 5 sigma2 = 3 # donc variance2 = 9 n = 10000 # nombre de tirages # Listes pour stocker les valeurs X1 = [] X2 = [] Y = [] # Génération manuelle des données for i in range(n): x1 = random.gauss(mu1, sigma1) x2 = random.gauss(mu2, sigma2) y = x1 + x2 X1.append(x1) X2.append(x2) Y.append(y) # Moyenne manuelle moy_X1 = sum(X1) / n moy_X2 = sum(X2) / n moy_Y = sum(Y) / n # Variance manuelle var_X1 = sum((x - moy_X1)**2 for x in X1) / n var_X2 = sum((x - moy_X2)**2 for x in X2) / n var_Y = sum((y - moy_Y)**2 for y in Y) / n # Affichage des résultats print("Moyenne de X1 :", round(moy_X1, 2)) print("Variance de X1 :", round(var_X1, 2)) print("Moyenne de X2 :", round(moy_X2, 2)) print("Variance de X2 :", round(var_X2, 2)) print("Moyenne de Y :", round(moy_Y, 2)) print("Variance de Y :", round(var_Y, 2)) # Tracé des histogrammes plt.figure(figsize=(10, 6)) plt.hist(X1, bins=100, density=True, alpha=0.5, label='X1', color='blue') plt.hist(X2, bins=100, density=True, alpha=0.5, label='X2', color='green') plt.hist(Y, bins=100, density=True, alpha=0.6, label='Y = X1 + X2', color='orange') plt.title("Simulation de X1, X2 et Y = X1 + X2 (Loi normale)") plt.xlabel("Valeurs") plt.ylabel("Densité") plt.legend() plt.grid(True) plt.show()
II - Comparaison de deux capteurs de température
Imaginons qu’on ait deux capteurs de température installés dans une salle de laboratoire.
Le Capteur A (X₁) donne des mesures qui suivent une loi normale N(22 °C, 0.5²)
Le Capteur B (X₂) suit une loi normale N(24 °C, 0.7²) (légèrement biaisé)
On mesure la température toutes les minutes pendant 10 000 minutes, soit 10 000 données par capteur.
On souhaite comparer les deux capteurs en calculant les écarts (X₁ - X₂)² sur les 10 000 mesures. On obtient alors une variable aléatoire Y. Si cette distance est grande, cela signifie que les capteurs ne donnent pas les mêmes valeurs, même s’ils semblent proches.
👉 Modifiez le code précédent pour qu'il puisse simuler l'étude.
👉 Que faut-il faire pour avoir une loi du Khi-2 non centrée ? Modifiez alors Y.
II - Comparaison de deux capteurs de température
Imaginons qu’on ait deux capteurs de température installés dans une salle de laboratoire.
Le Capteur A (X₁) donne des mesures qui suivent une loi normale N(22 °C, 0.5²)
Le Capteur B (X₂) suit une loi normale N(24 °C, 0.7²) (légèrement biaisé)
On mesure la température toutes les minutes pendant 10 000 minutes, soit 10 000 données par capteur.
On souhaite comparer les deux capteurs en calculant les écarts (X₁ - X₂)² sur les 10 000 mesures. On obtient alors une variable aléatoire Y. Si cette distance est grande, cela signifie que les capteurs ne donnent pas les mêmes valeurs, même s’ils semblent proches.
👉 Modifiez le code précédent pour qu'il puisse simuler l'étude.
👉 Que faut-il faire pour avoir une loi du Khi-2 non centrée ? Modifiez alors Y.
III - Vérification du Théorème Central Limite
Le programme ci-dessous simule une variable aléatoire définie comme la somme de k variables normales centrées réduites au carré :
On tire aléatoirement
k
valeurs issues d’une loi N(0,1)On élève chaque valeur au carré et on les additionne
On répète cette opération un grand nombre de fois pour obtenir un histogramme
Cette somme suit une loi du khi-2 à k degrés de liberté : χ²(k). Lorsqu'on augmente k (par exemple k > 100), cette loi devient proche d'une loi normale.
Selon le théorème central limite, on peut alors approximer : χ²(k) ≈ N(μ = k, σ² = 2k).
Objectif : Comprendre empiriquement cette approximation, en visualisant les deux courbes : la loi du khi-2 simulée et la loi normale N(k, 2k) superposée pour comparaison.
👉 Lisez attentivement et comprenez le code ci-dessous.
Observez la manière dont les k tirages sont générés pour chaque simulation.
Repérez les variables importantes :
k
,n
,mu = k
,sigma² = 2k
.
👉 Lancez le programme.
👉 Regardez les deux histogrammes (χ² en orange, approximation normale en bleu).
👉 Augmentez ou diminuezk
et observez l’effet sur la ressemblance entre les courbes.
III - Vérification du Théorème Central Limite
Le programme ci-dessous simule une variable aléatoire définie comme la somme de k variables normales centrées réduites au carré :
On tire aléatoirement
k
valeurs issues d’une loi N(0,1)On élève chaque valeur au carré et on les additionne
On répète cette opération un grand nombre de fois pour obtenir un histogramme
Cette somme suit une loi du khi-2 à k degrés de liberté : χ²(k). Lorsqu'on augmente k (par exemple k > 100), cette loi devient proche d'une loi normale.
Selon le théorème central limite, on peut alors approximer : χ²(k) ≈ N(μ = k, σ² = 2k).
Objectif : Comprendre empiriquement cette approximation, en visualisant les deux courbes : la loi du khi-2 simulée et la loi normale N(k, 2k) superposée pour comparaison.
👉 Lisez attentivement et comprenez le code ci-dessous.
Observez la manière dont les k tirages sont générés pour chaque simulation.
Repérez les variables importantes :
k
,n
,mu = k
,sigma² = 2k
.
👉 Lancez le programme.
👉 Regardez les deux histogrammes (χ² en orange, approximation normale en bleu).
👉 Augmentez ou diminuezk
et observez l’effet sur la ressemblance entre les courbes.
import random import matplotlib.pyplot as plt # Paramètre : degrés de liberté k = 200 # "grand" => approximation normale valable # Nombre de simulations n = 10000 # Liste pour stocker les valeurs de la loi du khi-2 simulée chi2_values = [] # Simulation de la somme de k variables normales réduites au carré for i in range(n): s = 0 for j in range(k): z = random.gauss(0, 1) # variable normale N(0,1) s += z**2 chi2_values.append(s) # Paramètres de la loi normale approximative mu = k sigma = (2 * k)**0.5 # Génération des valeurs normales pour comparaison normal_values = [random.gauss(mu, sigma) for _ in range(n)] # Affichage plt.figure(figsize=(10, 6)) plt.hist(chi2_values, bins=100, density=True, alpha=0.5, label='χ² (simulée)', color='orange') plt.hist(normal_values, bins=100, density=True, alpha=0.5, label='N(k, 2k) (approximation)', color='blue') plt.title("Approximation de la loi χ² par une loi normale (TCL)") plt.xlabel("Valeur") plt.ylabel("Densité") plt.legend() plt.grid(True) plt.show()
IV - Test du χ² — Musique et concentration
Une bibliothèque universitaire veut savoir si la présence de musique dans les salles d’étude influence la concentration des étudiants.
Elle a interrogé 100 étudiants, et les résultats sont les suivants : avec musique, 20 personnes n'ont pas été concentrés, alors 30 l'ont été. Sans musique, 20 personnes ont été concentrées et 30 ne l'ont pas été.
👉 Construisez, sur le papier, le tableau de contingence. Énoncez les hypothèses H0 et H1.
👉 Lisez attentivement et comprenez le code ci-dessous.
👉 Complétez-le pour qu'il puisse répondre à la problématique.
👉 Lancez le programme et faites une conclusion.
IV - Test du χ² — Musique et concentration
Une bibliothèque universitaire veut savoir si la présence de musique dans les salles d’étude influence la concentration des étudiants.
Elle a interrogé 100 étudiants, et les résultats sont les suivants : avec musique, 20 personnes n'ont pas été concentrés, alors 30 l'ont été. Sans musique, 20 personnes ont été concentrées et 30 ne l'ont pas été.
👉 Construisez, sur le papier, le tableau de contingence. Énoncez les hypothèses H0 et H1.
👉 Lisez attentivement et comprenez le code ci-dessous.
👉 Complétez-le pour qu'il puisse répondre à la problématique.
👉 Lancez le programme et faites une conclusion.
from scipy.stats import chi2 # Effectifs observés (tableau de contingence) observes = { 'Musique_Oui': {'Oui': 30, 'Non': 20}, 'Musique_Non': {'Oui': 20, 'Non': 30} } # Totaux total = 100 row_totals = {'Musique_Oui': 50, 'Musique_Non': 50} col_totals = {'Oui': 50, 'Non': 50} # Effectifs théoriques sous hypothèse d’indépendance theoriques = { ligne: { colonne: row_totals[ligne] * col_totals[colonne] / total for colonne in col_totals } for ligne in row_totals } # Affichage pédagogique des effectifs théoriques print("Effectifs théoriques :") for ligne in theoriques: for colonne in theoriques[ligne]: print(f"{ligne} / {colonne} : {theoriques[ligne][colonne]}") # Calcul du χ² chi2_obs = 0 for ligne in observes: for colonne in observes[ligne]: o = observes[ligne][colonne] e = theoriques[ligne][colonne] # chi2_obs += à compléter print(f"\nStatistique du test χ² : {chi2_obs:.4f}") # Seuil à 5% (ddl = (2-1)*(2-1) = 1) ddl = 1 seuil = chi2.ppf(0.95, ddl) print(f"Seuil critique (α = 5%) : {seuil:.4f}") # Conclusion if chi2_obs > seuil: print("Conclusion : Il existe une dépendance entre musique et concentration.") else: print("Conclusion : On ne peut pas rejeter l’hypothèse d’indépendance.")
© Jules Fàdel Hamdan 2024