Data science : Droite de Henry
De nombreuses procédures statistiques requièrent l’hypothèse de normalité, notamment lors des procédures statistiques paramétriques où on suppose que les données suivent une certaine distribution qui est généralement normale. Cet article est le premier d’une série de 5 qui a pour ambition de présenter le principe de la droite de Henry et les principaux tests de normalité notamment les tests de : Kolmogorov-Smirnov(KS), Lilliefors(LF), Shapiro-Wilks(SW), Anderson-Darling(AD) et enfin Cramer-Von Mises(CVM). Il faut noter qu’il existe plus de 40 tests de normalité dans la littérature statistique( Dufour et al., 1998).
Il est utile de se rappeler qu’en toute rigueur les tests KS et LF ne sont pas des tests de normalité, la normalité n’étant qu’un cas particulier où nous cherchons à déterminer si les données en notre possession suivent une loi normale.
Nous verrons à chaque fois une manière simple d’implémenter chacun de ces tests sous python. Nous utiliserons le module stats de la bibliothèque scipy de python. Scipy est une bibliothèque python à caractère scientifique, elle regorge de nombreux modules pour les études statistiques et probabilistes en particulier et scientifiques en général.
On pourra aussi implémenter ses tests à l’aide de openTURNS grâce à son API python qui permet de l’importer comme un module. openTURNS est un outil open source de traitement des incertitudes en simulation numérique né d’un partenariat entre EDF R&D, EADS IW et PHIMECA ENGINEERING. Il dispose de nombreux outils pour les études statistiques et probabilistes. Si vous utilisez Anaconda, vous pouvez simplement l’installer grâce à la commande pip install openturns. Sinon vous pouvez suivre ce lien https://openturns.github.io/openturns/1.17/install.html pour l’installation.
Les tests de normalité que nous allons voir ensemble sont des tests basés sur la fonction de répartition. L’idée générale est de comparer la distribution de la fonction de répartition empirique estimée sur l’échantillon, à la fonction de répartition (cumulative) de la loi normale, et de voir quelle différence il peut y avoir entre ces deux fonctions de répartition. On peut effectuer cette comparaison grâce au théorème de Glivenko-Cantelli qui dit que la suite des fonctions de répartition empirique d’une variable converge uniformément vers sa fonction de répartition(cumulative).
La fonction de répartition d’une variable aléatoire est définie par :
Ce premier article sera consacré à la présentation de la droite de Henry et de son intérêt pratique dans l’étude d’une distribution.
Un peu de théorie
Mise en place pour la première fois dans les années 1880 par P.J.P Henry, la droite de Henry est une méthode graphique qui permet de tester l’ajustement d’un échantillon à une loi normale. Son intérêt réside dans le fait qu’elle permet non seulement de tester l’ajustement à une loi normale mais aussi de lire graphiquement la moyenne et l’écart-type de l’échantillon en cas d’ajustement.
Soit une variable aléatoire modélisant notre échantillon. Si suit une loi normale de moyenne et d’écart-type , on aura:
et donc
.
La droite de Henry est définie comme la droite ayant pour équation :
pour tout .
Ensuite le test consiste à vérifier pour tout , allant de à où est la taille de l’échantillon, si les points de coordonnées
sont alignés sur la droite de Henry.
En pratique
Exemple 1
Dans cet exemple nous allons simuler un échantillon provenant d’une loi normale de moyenne et d’écart-type qui représente nos données.
import pylab
import scipy.stats as stats
n = 1000
mu = 3
sigma = 1
data = stats.norm.rvs(size=n, loc=mu, scale=sigma)
stats.probplot(data, dist="norm", plot=pylab)
pylab.show()
On peut voir sans surprise une adéquation parfaite entre les quantiles théoriques et les quantiles empiriques. On peut lire la moyenne de nos données à l’endroit où la droite coupe l’axe des abscisses.
Exemple 2
Dans cet exemple considerons une loi lognormale.
import pylab
import scipy.stats as stats
n = 1000
s = 0.9
mu = 5
sigma = 2
data = stats.lognorm.rvs(s=s, loc=mu, scale=sigma, size=n)
stats.probplot(data, dist="norm", plot=pylab)
pylab.show()
La queue de la distribution ne colle pas à la droite de Henry, ce qui montre une non adéquation de nos données a une loi normale.
Exemple 3
Considérons encore une fois une loi normale mais cette fois nous utiliserons l’option VisualTest.drawHenryline de openTURNS.
import openturns as ot
import openturns.viewer as viewer
n = 1000
mu = 13
sigma = 1
distribution = ot.Normal(mu, sigma)
data = distribution.getSample(n)
graph = ot.VisualTest.DrawHenryLine(data)
view = viewer.View(graph)
Exemple 4
Dans ce dernier exemple, toujours grâce à Openturns, testons graphiquement la normalité de nos données, qui en réalité suivent une loi uniforme.
import openturns as ot
import openturns.viewer as viewer
a = -2
b = 3
distribution = ot.Uniform(a, b)
data = distribution.getSample(n)
graph = ot.VisualTest.DrawHenryLine(data)
view = viewer.View(graph)
J’espère que cet article vous aura été utile pour mieux comprendre la droite de Henry. À la prochaine pour de nouvelles aventures.
1 commentaire pour l’instant