Importation des modules
import os # pour gérer les répertoires
import numpy as np # pour quelques fonctions mathématiques et pour stocker les données
import scipy.stats as sps # pour toutes les fonctions statistiques (moyenne, variance, tests, ...)
import matplotlib.pyplot as plt
Lecture des données dans un fichier .txt
os.chdir('D:\\Users\\ridard\\Desktop') # on change le répertoire de travail
f=open('data_1.txt','r') # on ouvre le fichier en mode lecture
lst=f.readlines()
x=''
for ligne in lst:
x=x+ligne
f.close()
x
Stockage des données dans un tableau numpy
y=x.replace('\n','\t')
lst=y[:-1].split('\t')
lstc=lst[:]
for i in range(len(lst)):
lstc[i]=eval(lst[i])
data=np.array(lstc)
data
Description statistique des données
sps.describe(data)
NB : la variance fournie est la variance empirique corrigée
Première approche (graphique) : l'histogramme ressemble-t-il à une courbe de Gauss ?
stat = sps.describe(data)
n, moyEmp, varEmpC = stat.nobs, stat.mean, stat.variance
valmin, valmax = stat.minmax
x = np.linspace(valmin, valmax, 1000)
yTh = sps.norm(moyEmp, np.sqrt(varEmpC)).pdf(x)
plt.plot(x, yTh, 'r', label='Courbe de Gauss')
# Plusieurs possibilités pour déterminer le nombre de classes d'un histogramme
# Règle de Sturges
# nbCl = int(1 + np.log2(n))
# Règle de Rule (sans mauvais jeu de mots)
# nbCl = int(2*n**(1/3))
# Choix simple de la racine carrée
nbCl = int(np.sqrt(n))
plt.hist(data, bins=nbCl, normed=1, edgecolor='black', label='Histogramme')
plt.legend(loc='best')
plt.show()
Test de normalité à partir des coefficients d'asymétrie (skewness) et d'applatissement (kurtosis)
sps.normaltest(data)
La première composante de la réponse (statistic) est la réalisation $w$ de la variable de décision du test $W$
La deuxième (pvalue) est la probabilité sous $H_0$ (l'échantillon est gaussien) d'avoir $|W|>|w|$, c'est la p-value bilatérale
On peut alors rejeter $H_0$ dès que la p-value est inférieure à l'erreur de première espèce $\alpha$, mais attention il s'agit là d'un test bilatéral
NB : pour récupérer la p-value unilatérale, il suffit de diviser par deux la p-value fournie par Python !
Test de normalité de Shapiro-Wilk
sps.shapiro(data)
Directement
sps.ttest_1samp(data,2400) # cf. exercice du cours
A la main
D'abord, on calcule la réalisation $w$ de la variable de décision $W$
w=(moyEmp-2400)/np.sqrt(varEmpC/n)
w
Ensuite, on calcule la valeur critique c'est à dire l'extrémité de la zone de rejet (test unilatéral à droite avec une erreur de première espèce égale à 5%)
alpha=0.05
dl=n-1
valCrit=sps.t.ppf(1-alpha,dl)
valCrit
On décide
if w>valCrit:
print('On rejette H0')
else :
print('Aucune raison de rejeter H0')
On peut aussi retrouver la p-value bilatérale fournie par Python
pValBil=(1-sps.t.cdf(np.abs(w),dl))*2
pValBil
Ecrire un script "à la main" permettant de répondre à l'exercice du cours (toujours le même) concernant la variance.
# Réponse