Manipuler les tests de normalité peut sembler éloigné de l’approche prise par les concepteurs du programme de maths en CPGE ECG. De manière générale, on discute la convergence des variables vers des lois normales, mais on ne vérifie pas si des jeux de données suivent une distribution gaussienne (la fameuse courbe en cloche que tu connais sûrement). Pourtant, une telle approche est au cœur des statistiques et pourrait très bien être plébiscitée par une épreuve type Maths II.
Introduction
Les tests de normalité vérifient si les données sont compatibles avec une distribution normale (gaussienne). Ce sont des tests d’hypothèses basés sur le rejet ou non d’une hypothèse nulle notée \(H_0\), comme nous le verrons par la suite.
Au cœur de cet article, nous étudierons les deux principaux tests de normalité à travers les méthodes de Shapiro-Wilk et de Kolmogorov-Smirnov.
Le test d’hypothèse
L’approche est d’abord d’établir l’hypothèse de base, puis de déterminer si les preuves statistiques permettent de la rejeter. Pour cela, on établit une hypothèse de principe \(H_0\) que l’on cherchera ou non à réfuter (en passant à \(H_1\)).
- Hypothèse nulle \(H_0\) : l’échantillon est tiré d’une population qui suit une distribution normale.
- Hypothèse alternative \(H_1\) : l’échantillon est tiré d’une population dont la distribution n’est pas normale.
Chaque test calcule ce qui s’appelle une statistique de test, qui est convertie en une valeur \(p\).
La valeur \(p\) représente la probabilité d’observer l’échantillon actuel si l’hypothèse de normalité (\(H_0\)) était vraie. La valeur \(p\) est donc comparée à un seuil \(\alpha\) (généralement fixé à 5 %).
- Si \(\mathbf{p > \alpha}\) : on ne rejette pas \(H_0\).
- Si \(\mathbf{p \le \alpha}\) : on rejette \(H_0\). On conclut à la non-normalité.
Attention, ne pas passer à \(H_1\) ne signifie pas pour autant que les données suivent une loi normale, simplement que l’on ne peut pas conclure qu’elles ne suivent pas une loi normale (ce n’est pas exactement pareil).
Fondement des méthodes
Le test de Shapiro-Wilk (S-W)
Le test de Shapiro-Wilk compare la distribution observée à la distribution normale théorique en utilisant les propriétés des quantiles. Il est très puissant, surtout pour les petits et moyens échantillons.
La statistique \(W\)
La statistique de test \(W\) est le carré du coefficient de corrélation entre les quantiles observés (\(x_{(i)}\)), les données triées et les quantiles théoriques (\(a_i\), les coefficients de poids constants).
\[
W = \frac{\left( \sum_{i=1}^{n} a_i x_{(i)} \right)^2}{\sum_{i=1}^{n} (x_i – \bar{x})^2}
\]
Où \(a_i\) sont les coefficients de Shapiro-Wilk dérivés des statistiques d’ordre.
Interprétation de \(W\)
- Plus \(W\) est proche de \(\mathbf{1}\), plus l’ajustement à la normale est bon.
- Plus \(W\) est proche de \(\mathbf{0}\), plus l’écart à la normale est important, menant au rejet de \(H_0\).
Le test de Kolmogorov-Smirnov (K-S)
Le K-S est un test plus général qui compare l’écart maximal entre les fonctions de répartition.
La statistique \(D\)
La statistique \(\mathbf{D}\) mesure la distance maximale absolue entre la fonction de répartition empirique \(F_n(x)\) de l’échantillon et la fonction de répartition théorique \(F(x)\) de la loi normale hypothétisée.
\[
D = \max_{x} |F_n(x) – F(x)|
\]
La correction de Lilliefors
Pour que le test K-S soit valide dans le contexte de la normalité (où les paramètres \(\mu\) et \(\sigma\) sont estimés à partir des données), la correction de Lilliefors est appliquée. Cette correction ajuste les valeurs critiques pour éviter que le test ne soit trop conservateur (c’est-à-dire que l’hypothèse \(H_0\) soit toujours conservée).
Inutile de connaître les aspects techniques de cette correction a priori, connaître son existence n’est, à tout égard, que profitable pour un éventuel sujet de type Maths II.
Implémentation en Python
Test de Shapiro-Wilk
Ce script définit les échantillons (Normal et Exponentiel) et exécute le test de S-W :
Voici une explication ligne par ligne de ce script
np.random.seed(42) est défini afin de fixer ce qu’on appelle « graine aléatoire » en Python et permet de s’assurer que si tu testes le code, tu obtiendras le même résultat que moi, puisque tu généreras les mêmes nombres aléatoires.
Ensuite, on crée un échantillon de 50 points suivant une loi normale. On crée un second échantillon de 50 points, mais suivant une loi exponentielle de paramètre \(lambda = 1/2\). C’est notre « faux ami » dans notre test, puisque l’on sait d’avance qu’il n’est pas normal. Le test devra donc le rejeter et nous allons vérifier cela !
alpha = 0.05 sert, comme vu précédemment, à définir le risque d’erreur de première espèce (rejeter \(H_0\) alors qu’elle est vraie).
Ensuite, la fonction shapiro() calcule deux choses : la statistique $W$ (proche de 1 si c’est normal) ainsi que la p-valeur. On affiche alors les résultats avec 4 décimales.
Test de Kolmogorov-Smirnov (K-S) en Python
Ce script applique le test K-S en utilisant une standardisation préalable, une bonne pratique pour comparer à la loi normale standard.
Voici une explication précise de ce script
Les deux premières lignes servent à transformer les données : on calcule la moyenne avec np.mean et l’écart-type avec np.std. L’objectif est de ramener n’importe quelle série de données à une base comparable : la loi normale centrée réduite \(\mathcal{N}(0,1) \). C’est indispensable, car le test K-S va comparer les données à cette « courbe de référence » standard.
La ligne stats.kstest(data_norm_std, ‘norm’) demande à Python de calculer la distance maximale entre la fonction de répartition de tes données et celle d’une loi normale théorique (le paramètre ‘norm’). Elle renvoie deux valeurs : stat_D (la distance) et la p-valeur. On affiche ensuite ces résultats avec print. Comme ces données ont été générées pour être normales, tu obtiendras une p-value élevée (proche de 1).
On répète exactement la même opération sur l’échantillon issu de la loi exponentielle. Ici, comme la forme d’une loi exponentielle ne ressemble pas du tout à une cloche, la distance D sera beaucoup plus grande. La p-value sera donc très petite (souvent proche de 0), ce qui indique un écart flagrant par rapport à la normale.
S’agissant de la dernière partie du script : on compare la p-valeur au seuil alpha (0,05). Si la p-valeur est plus petite que 0,05, cela signifie que la probabilité que cet écart soit dû au pur hasard est trop faible. Alors, on conclut en rejetant l’idée que les données sont normales. On affiche alors le message de rejet dans la console.
Conclusion
En pratique, le test de Shapiro-Wilk est le plus recommandé pour les échantillons de petite et moyenne taille (\(n < 50\)). Le test de Kolmogorov-Smirnov est plus général et est souvent utilisé pour tester d’autres types de distributions que la loi normale.
Concrètement, ces tests pourraient faire l’objet d’un sujet d’oral type ESCP ou HEC puisqu’il peut perturber l’étudiant, notamment en ce que l’approche de ce thème renverse l’esprit du programme tel qu’enseigné en prépa ECG. Il n’y a désormais plus qu’à espérer qu’un tel sujet tombe l’année prochaine !
Tu peux retrouver ici le méga-répertoire qui contient toutes les annales de concours et les corrigés. Tu peux également accéder ici à toutes nos autres ressources mathématiques !



