Data science : Test d’Anderson-Darling
Pour cet avant dernier article de notre série, nous allons parler du test d’Anderson-Darling.
À l’instar des tests de Kolmogorov-Smirnov et Lilliefors, ce test est un test d’ajustement dont la normalité est un cas particulier. Il permet de comparer l’ajustement d’une fonction de répartition observée cumulée à une fonction de répartition théorique cumulée.Le test d’Anderson-Darling est souvent considéré comme une alternative au test de Kolmogorov-Smirnov, car contrairement à ce dernier qui a parfois du mal avec les valeurs extrêmes, lui permet de comparer les fonctions de répartition sur toutes leurs étendues.
Nous utiliserons scipy et openturns pour les illustrations comme évoqué dans le premier article Data science : Droite de Henry.
Un peu de théorie
La statistique de test a été définie par Anderson et Darling en 1954 par :
où est une fonction de poids non négative qui peut être calculée par .
Ainsi la statistique est aussi égale à :
où
- est la fonction de distribution cumulative de la distribution spécifiée (normale dans notre cas)
- les sont les données (ordonnées)
- et la taille de l’échantillon.
En pratique
Exemple 1
Considérons un échantillon provenant d’une loi normale et utilisons scipy.stats.anderson :
import numpy as np from scipy import stats n = 1000 mu = 2 sigma = 1.2 data = stats.norm.rvs(loc = mu, scale=sigma, size=n) print(stats.anderson(data, "norm"))
AndersonResult(statistic=0.631695544735976, critical_values=array([0.574, 0.653, 0.784, 0.914, 1.088]), significance_level=array([15. , 10. , 5. , 2.5, 1. ]))
Comme on peut le voir, par défaut scipy renvoie les p-value correspondant à 5 niveaux de risque différents, à savoir , , , et . Notre échantillon provenant d’une loi normale, les p-values sont tous supérieurs aux différents risques.
Exemple 2
Considérons le même échantillon que celui utilisé dans l’exemple précédent mais cette fois nous utiliserons l’option NormalityTest.AndersonDarlingNormal() :
import openturns as ot ot.RandomGenerator.SetSeed(567) n = 1000 mu = 2 sigma = 1.2 distribution = ot.Normal(mu, sigma) sample = distribution.getSample(n) test_result = ot.NormalityTest.AndersonDarlingNormal(sample) print("p-value :", test_result.getPValue(), "\n", "threshold :", test_result.getThreshold(), "\n", "normality :", test_result.getBinaryQualityMeasure())
p-value : 0.6283127893141487 threshold : 0.05 normality : True
On peut voir directement, grâce à getBinaryQualityMeasure(), que la normalité de notre échantillon est vérifiée avec un risque de .
On est arrivé à la fin de cet article sur le test d’Anderson-Darling. On se retrouve très bientôt pour le dernier article de cette série sur les tests de normalité.
Laisser un commentaire