Test de Student

en langage python

L'essentiel de cette page

Le test de Student permet de comparer deux échantillons.

Il va estimer la probabilité que la différence entre ces deux échantillons soit due au hasard (la p-value).

Plus la p-value est petite, plus l'intervention du hasard est peu probable et la différence certaine. Le seuil habituel est de 0.05 mais est empirique...

Le module scipy.stats permet de faire un tel test.


Les prérequis : contrôler la normalité et la variance des échantillons

Contrôler la normalité des échantillons

La p-value renvoyer par le test de shapiro doit être supérieur à 0.05 pour rester sur l'hypothèse nulle d'une distribution normale.

X1 = [1,1,1,2,1]

X2 = [4,2,3,1,1]

from scipy.stats import shapiro

x1, pval1 = shapiro(X1)

x2, pval2 = shapiro(X2)

print(pval1)

print(pval2)

Contrôler l'égalité des variances :

X1 = [1,1,1,2,1]

X2 = [4,2,3,1,1]


# Fisher-Snedecor F-test

from scipy.stats import f

f(X1,X2)


# Anova unidirectionnelle

import scipy.stats as stats

stats.f_oneway(X1,X2)

Comparer deux échantillons pour voir s'ils sont significativement différents

X1 = [1,1,1,2,1]

X2 = [4,2,3,1,1]


import scipy.stats as stats

y = stats.ttest_ind(X1,X2) ; print(y)

Sortie :

Ttest_indResult(statistic=-1.62221, pvalue=0.1434146)

  • Afficher la p-value seule

print(y[1])

La valeur renvoyée de p-value est ici de 0.14..., il n'y a donc pas de différence significative entre X1 et X2.

On estime en générale qu'une différence entre deux jeux de valeurs est significative (non-explicable a priori par le hasard) si :

    • La p-value < 0.05 (dans ce cas, on met une *)

    • Différence très significative : p-value < 0.01 (**)

    • Différence très très significative : p-value < 0.01 (***)

Remarque : si l'on a plus de 2 échantillons, il faudra envisager de faire un test de Newman-Keuls ou des comparaisons 2 à 2 de type pairwise.t.test() sous R avec correction/ajustement des p-values (la répétitions n fois d'un test augmente forcément le risque de voir apparaître de fausses p-values significatives). On peut appliquer cette dernière option sous python avec posthoc_ttest() de scipy.

Remarque importante : le test de Student de scipy ne renvoie pas la même valeur de p-valeur que R. Il faut donc creuser l'origine de cette différence et envisager un problème de code.

Attention : cette différence de p-value est vraissemblablement à rechercher dans le code source de la fonction python. Elle utilise peut-être comme des fonctions d'écart-type ou de variance adaptées aux populations et non aux échantillons.

Faire un test de Student pour voir la correspondance entre un échantillon et une population dont on connait la moyenne

echantillon = [1,1,1,2,1]

import scipy.stats as stats

y = stats.ttest_1samp(echantillon,popmean=1) ; print(y) # popmean, moyenne de la population "normale" : 1


Si la p-value est supérieure à 0.05 alors il n'est pas improbable que l'échantillon vienne de la population