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 :

    \[W_n^2 = n\int_{-\infty}^{\infty}\left[F_n(x) - F(x)\right]^2 \phi(F(X)){dF(x)}\]

\phi est une fonction de poids non négative qui peut être calculée par \phi = \left[F(x)(1 - F(x))\right]^{-1}.

Ainsi la statistique est aussi égale à :

    \[W_n^2 = -n - \frac{1}{n}\sum(2i - 1)\left\{logF(X_i) + log(1 - F(X_{n+1-i}))\right\}\]

  • F(x_i) est la fonction de distribution cumulative de la distribution spécifiée (normale dans notre cas)
  • les x_i sont les données (ordonnées)
  • et n 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 15\%, 10\%, 5\%, 2.5\% et 1\%. 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 5\%.

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é.