Tests de normalité avec R

Tests abordés dans cette page : Kolmogorov-Smirnov, Lilliefors, Shapiro-Wilk, Anderson-Darling

Les tests de Kolmogorov-Smirnov et de Lilliefors

Un exemple utilisant le test de Kolmogorov-Smirnov

Un test a été étalonné sur une population A de manière que sa distribution suive une loi normale de moyenne 13 et d'écart type 3. sur un échantillon de taille 10 issu d'une population B, on a observé les valeurs suivantes :

8.43 8.70 11.27 12.92 13.05 13.05 13.17 13.44 13.89 18.90

Ces valeurs sont-elles compatibles avec l'hypothèse selon laquelle la variable sous-jacente est distribuée selon une loi normale de moyenne 13 et d'écart type 3 ?

On peut utiliser la commande ks.test du package "stats" :

> X1 <- c(8.43, 8.70, 11.27, 12.92, 13.05, 13.05, 13.17, 13.44, 13.89, 18.90)
> ks.test(X1,"pnorm",mean=13, sd=3)

One-sample Kolmogorov-Smirnov testdata: X1
D = 0.2834, p-value = 0.3982
alternative hypothesis: two-sided
Warning message:
cannot compute correct p-values with ties in: ks.test(X1, "pnorm", mean = 13, sd = 3)

On peut éviter le message d'avertissement concernant les ex aequo en modifiant légèrement l'une des valeurs 13.05 :

> X1 <- c(8.43, 8.70, 11.27, 12.92, 13.05, 13.050001, 13.17, 13.44, 13.89, 18.90)
> ks.test(X1,"pnorm",mean=13, sd=3)

One-sample Kolmogorov-Smirnov test
data: X1
D = 0.2834, p-value = 0.3326
alternative hypothesis: two-sided

On observe effectivement une valeur du niveau de significativité assez différente de la précédente.

Calcul à la main : On calcule, pour chaque valeur observée Xi, les fréquences cumulées F(X < Xi) et F(X <= Xi).
On calcule également les fréquences cumulées théoriques aux points Xi pour la loi normale de paramètres m=13 et s=3. On calcule enfin les écarts entre les fréquences cumulées expérimentales et les fréquences cumulées théoriques. La valeur de D est le maximum de ces écarts :

X
F(X < Xi)
F(X <= Xi)
Theo
Ecart -
Ecart +
8,43
0
0,1
0,0638
0,0638
0,0362
8,7
0,1
0,2
0,0759
0,0241
0,1241
11,27
0,2
0,3
0,2821
0,0821
0,0179
12,92
0,3
0,4
0,4894
0,1894
0,0894
13,05
0,4
0,6
0,5066
0,1066
0,0934
13,17
0,6
0,7
0,5226
0,0774
0,1774
13,44
0,7
0,8
0,5583
0,1417
0,2417
13,89
0,8
0,9
0,6166
0,1834
0,2834
18,9
0,9
1
0,9754
0,0754
0,0246

On retrouve ainsi D = 0.2834

Un exemple utilisant le test de Lilliefors

Sur un échantillon de taille 10, on a observé les valeurs suivantes d'une VD numérique :

8, 9, 9, 10, 10, 10, 11, 13, 14, 14.

Est-il légitime de supposer que la distribution de la VD dans la population parente suit une loi normale ?

Ici, la moyenne et l'écart type de la distribution théorique sont estimés à partir des 10 observations. Le test de Lilliefors est donc préférable au test de Kolmogorov-Smirnov.

Ce test n'est pas disponible "en standard" avec R, mais il se trouve dans le package "nortest" :

> library(nortest)
> X2 <- c(8, 9, 9, 10, 10, 10, 11, 13, 14, 14)
> lillie.test(X2)

Lilliefors (Kolmogorov-Smirnov) normality test
data: X2
D = 0.2451, p-value = 0.0903

Calcul à la main : la statistique de test se calcule de la même façon que celle du test de Kolmogorov-Smirnov.

Un autre exemple d'utilisation de ces deux tests

> X3 <- c(5,5.5,5.5,6,14,16,16,17)
> ks.test(X3,"pnorm",mean=mean(X3),sd=sd(X3))

One-sample Kolmogorov-Smirnov test

data: X3
D = 0.2978, p-value = 0.4771
alternative hypothesis: two-sided

Warning message:
cannot compute correct p-values with ties in: ks.test(X3, "pnorm", mean = mean(X3), sd = sd(X3))
> lillie.test(X3)

Lilliefors (Kolmogorov-Smirnov) normality test

data: X3
D = 0.2978, p-value = 0.03534

> X3 <- c(5,5.5001,5.5002,6,14,16,16.0001,17)
> ks.test(X3,"pnorm",mean=mean(X3),sd=sd(X3))

One-sample Kolmogorov-Smirnov test

data: X3
D = 0.2978, p-value = 0.399
alternative hypothesis: two-sided

On constate, comme précédemment, que le niveau de significativité indiqué pour le test de Kolmogorov-Smirnov est très sensible à la présence d'ex aequo.

Le test de Shapiro-Wilk

On reprend l'exemple illustrant le test de Lilliefors.

Sur un échantillon de taille 10, on a observé les valeurs suivantes d'une VD numérique :

8, 9, 9, 10, 10, 10, 11, 13, 14, 14.

Est-il légitime de supposer que la distribution de la VD dans la population parente suit une loi normale ?

Le test de Shapiro-Wilk est disponible dans le package "stats". La fonction correspondante est shapiro.test.

> X2 <- c(8, 9, 9, 10, 10, 10, 11, 13, 14, 14)
> shapiro.test(X2)

Shapiro-Wilk normality test
data: X2
W = 0.8849, p-value = 0.1485

Le test d'Anderson-Darling

On reprend l'exemple illustrant le test de Lilliefors.

Sur un échantillon de taille 10, on a observé les valeurs suivantes d'une VD numérique :

8, 9, 9, 10, 10, 10, 11, 13, 14, 14.

Est-il légitime de supposer que la distribution de la VD dans la population parente suit une loi normale ?

Le test d'Anderson-Darling est disponible dans le package "nortest". La fonction correspondante est ad.test.

> library(nortest)
> X2 <- c(8, 9, 9, 10, 10, 10, 11, 13, 14, 14)
> ad.test(X2)

Anderson-Darling normality test
data: X2
A = 0.5347, p-value = 0.1264

Un graphique de normalité

L'écart à la normalité peut être représenté par le graphique suivant :

> qqnorm(X2,datax=TRUE)
> qqline(X2,datax=TRUE)