TP n°8.

Lycée Roland Garros
BCPST 1ère année
Mathématiques
2014 - 2015
TP INFO no 8. Analyse statistique
Compétences à acquérir :
importer des librairies pour une utilisation particulière de Python,
Utiliser la documentation en ligne d'une librairie pour l'utiliser de manière autonome,
Lire/écrire des chiers informatiques (texte, image) avec Python,
Créer et exporter un graphique avec Python.
Le but de ce TP est de créer un programme qui opère automatiquement le traitement statistique des données étudié dans les chapitres 15 et 16. Les données
à traiter sont stockées dans un chier ".txt". L'exécution de notre programme
devra provoquer :
• la création d'un chier image : histogramme pour une série univariée,
nuage de points pour une série bivariée ;
• la création d'un chier texte contenant un résumé de l'analyse sta-
tistique de nos données : médiane, moyenne, écart-type (etc...) pour une
série univariée ; covariance, coecient de régression, équation de la droite
d'ajustement ane pour une série bivariée.
IMPORTANT. Toutes les commandes de ce TP pourront être dans un premier temps exécutées directement une à une dans le shell, mais il faudra par
ailleurs les regrouper dans un script de façon à pouvoir exécuter l'ensemble
par un simple F5. Vous pouvez donc déjà créer un chier resumestat.py dans
lequel vous recopierez les commandes utilisées.
Pour votre TIPE, si vous avez des données statistiques à présenter il serait
bien de se servir de ce programme, pour 3 raisons :
1. Votre programme sera facile et rapide d'utilisation.
2. Montrer que vous maîtrisez Python fait toujours bon eet.
3. Le rendu graphique fait plus professionnel qu'un graphique obtenu
avec Excel.
1
1 Rappels : importer une librairie
Pour certains usages spéciques de Python, il est nécessaire d'avoir recours
à des librairies additionnelles (on dit aussi bibliothèques). Il existe en particulier deux librairies fondamentales d'usage très courant :
• Matplotlib contient une grande quantité de fonctions pour créer des
représentations graphiques : courbes de fonctions, histogrammes, nuages
de
tant d'autres choses).
points (et
• Numpy permet entre autres de manipuler des vecteurs, matrices. C'est
fondamental pour le calcul scientique ! Elle contient aussi des fonctions
qui permettent de générer des nombres aléatoires.
Nous allons donc commencer notre script par les lignes suivantes pour dire à
Python désormais, je veux pouvoir utiliser toutes les commandes de Numpy
et de Matplotlib
>>> import numpy as np
>>> import matplotlib.pyplot as plt
ce qui signie qu'on importe tout le contenu de numpy sous le nom de np. De
même on importe tout le contenu de matplotlib.pyplot (une sous-bibliothèque
de matplotlib) sous le nom de plt.
Pourquoi utiliser des alias ? En principe quand on utilise une
commande qui fait partie de matplotlib.pyplot, le nom de cette
commande sera toujours précédé du préxe "matplotlib.pyplot".
Mais ceci étant fastidieux à écrire on préfère choisir de l'abréger en
"plt".
Ainsi
on
écrira
par
matplotlib.pyplot.plot().
exemple
plt.plot()
plutôt
que
il y a donc 2 méthodes pour importer une bibliothèque : avec
préxe (import numpy, ou encore import numpy as np) ou sans préxe (from
numpy import *). Vous êtes libre d'adopter celle qui vous convient, mais sachez que la méthode avec préxe est préconisée : avec elle on ne perd jamais de
vue qu'on utilise telle ou telle librairie, et de plus on évite tout conit potentiel
entre des fonctions homonymes provenant de librairies diérentes.
Remarque.
2
2 Traiter des données volumineuses : lire, écrire
des chiers
Lorsqu'on souhaite traiter un petit nombre de données (une liste de 10 valeurs par exemple), on peut sans problème les rentrer manuellement dans Python. Mais cette façon de procéder devient complètement inadéquate lorsque
l'on souhaite traiter une quantité d'information plus importante : imaginezvous rentrer manuellement une série de 10.000 valeurs, ça prendrait des jours !
Supposons qu'on ait à traiter un jeu de données volumineux, et que celuici est contenu dans un chier donnees1var.txt . Ce chier est à télécharger
sur mon site en face du TP 8. Ouvrez-le : c'est un chier texte contenant un
jeu de 10000 valeurs numériques.
Comment importer ces données pour pouvoir les exploiter avec Python ? C'est l'occasion d'acquérir une compétence importante : dialoguer avec
des chiers, c'est-à-dire lire et écrire sur des chiers.
Lecture : comment extraire des données d'un chier .txt
La méthode suivante n'est pas à connaître par c÷ur. Au besoin vous vous réfèrerez à ce TP pour eectuer ce travail.
1) Changer le répertoire courant. Il faut que Python rentre dans le dossier
contenant le chier donnees1var.txt :
I import os . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . os = operating system
I os.chdir("/home/jules/TPpython/TP8") . . . . . . . . . . . . . . . change directory
Pour vérier que l'opération a bien fonctionné :
I os.getcwd() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . get current work directory
2) On ouvre le chier donnees1var.txt. On le fait en mode lecture donc
en précisant "r" comme read. puis on le lit, c'est-à-dire on en fait une chaîne
de caractères contenue dans une variable de Python.
I monfichier=open("donnees1var.txt","r")
I contenu=monfichier.read()
3) On convertit la variable contenu, qui est une simple chaîne de caractères,
donc pas exploitable, en une liste de nombres :
I serie=contenu.split() . . . . . . . . . . . . . . . . . split découpe selon les espaces.
I serie=[float(x) for x in serie] . . . . . . . . . . . . . . . . Pourquoi on fait ça ?
3
Remarque : il est bien sûr possible - mais ce n'est pas le sujet ici d'importer des données d'une autre forme.
En particulier il est facile d'importer des données numériques issues d'un
chier Excel ou Open Oce.
Écriture : comment créer et écrire sur un chier .txt
A la n de ce TP vous allez demander à Python d'écrire le résultat de l'analyse
statistique dans un chier que votre programme aura lui-même créé.
Exemple : Admettons qu'on veuille inscrire le résultat de 6543 × 9876 dans
un chier ma_somme.txt
I monfichier=open("ma_somme.txt", "w") . . . . . . . . . . . . . . "w" comme write
I a=6543
I b=9876
I message="Le résultat de "+str(a)+" fois "+str(b)+" est "+str(a*b)
I monfichier.write(message)
I monfichier.close()
Allez vérier dans votre répertoire que le chier ma_somme.txt a été créé et
ouvrez-le !
Exercice 1
Écrire une fonction puissance(a,b) qui crée un chier ma_puissance.txt
où est inscrit un message donnant le résultat de l'opération ab .
3 Statistiques : traitement d'une série univariée
A ce stade nous disposons d'une liste serie de taille 10000 et allons d'abord
calculer ses caractéristiques. Par exemple pour la moyenne on fera :
I moy=np.mean(serie)
A vous d'utiliser la documentation de la rubrique statistique de Numpy 1
pour calculer de même :
• L'eectif de la série,
• son étendue,
1. Un coup de Google doit sur à trouver cette documentation, mais sinon voici le lien :
http ://docs.scipy.org/doc/numpy/reference/routines.statistics.html
4
•
•
•
•
•
son écart-type,
sa variance,
sa médiane,
son écart interquartile,
son écart interdécile.
Une fois toutes ces caractéristiques calculées, créez une chaîne de caractère
(appelez-la par exemple message) contenant un beau résumé statistique de
notre série. A titre indicatif, le résultat devra ressembler à peu près à ça, avec
bien sûr les bonnes valeurs à la place des pointillés (rappel : un saut à la ligne
s'écrit \n) :
******* Analyse statistique des donnees *******
Effectif : --Etendue : --Moyenne : --Mediane : --Variance : --Ecart-type : --Ecart interquartile : --Ecart interdecile : ---
On fait ensuite écrire à Python ce message, dans un chier qu'on pourra nommer par exemple analyse_statistique.txt. Nous avons déjà vu en page
?? comment faire cela.
Pour nir on va utiliser Matplotlib pour tracer un histogramme avec nos données. Les possibilités de Matplotlib sont immenses 2 , et vous pourrez utiliser
sa documentation en ligne si le besoin se présente d'utiliser l'une ou l'autre de
ces possibilités. Pour l'heure on souhaite simplement tracer un histogramme :
I
I
I
I
I
I
plt.hist(serie, 100, facecolor='green') . . . . . . . . . . . . . . . . . . . . . . . . .(1)
plt.xlabel('Valeurs de x') . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . (2)
plt.ylabel('Effectifs') . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .(3)
plt.title('Repartition des valeurs de x') . . . . . . . . . . . . . . . . . . . . . . (4)
plt.savefig('graphique.png') . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . (5)
plt.show() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . (6)
Explications :
(1) crée un histogramme à partir de la liste serie, en séparant les valeurs
en 100 sous-intervalles.
2. Consultez la galerie Matplotlib
http://matplotlib.org/gallery.html
5
pour vous en rendre compte :
(2), (3) et (4) précisent les légendes des axes et le titre.
(5) enregistre le graphique en tant que chier image dans le répertoire
courant.
(6) ache le graphique.
4 Statistiques : traitement d'une série bivariée
Nous allons maintenant faire un traitement statistique d'une série bivariée, de manière analogue à ce que nous venons de faire pour une série simple.
Commencez par créer un nouveau script resumestat2var.py où vous allez
désormais travailler. Dans ce script importez les mêmes bibliothèques que toutà-l'heure, puis déplacez-vous dans le bon répertoire. Les données à traiter dans
cette partie sont contenues dans un chier texte donnees2var.txt (à télécharger) qui est constitué de 2 lignes :
• la première ligne contient une série de valeurs d'un caractère X ;
• la seconde ligne contient une série de valeurs d'un caractère Y .
Comme tout à l'heure on extrait les données qu'on convertit en variables de
type liste. Attention, cette fois on commencera par couper les données en 2
morceaux X et Y (donc on coupe au saut de ligne), et on coupera dans un
deuxième temps X et Y selon les espaces :
I monfichier2var=open("donnees2var.txt","r")
I contenu2var=monfichier2var.read()
I serie2var=contenu2var.split('\n') . (on coupe en deux à l'endroit du
saut de ligne )
I X=liste2var[0] . . . . . . . . . X correspond donc à la première série de valeurs.
I Y=liste2var[1] . . . . . . . . . . . . . . . Y correspond à la seconde série de valeurs.
Comme tout à l'heure, il faut transformer X et Y en données numériques :
I
I
I
I
X=X.split()
X=[float(x) for x in X]
Y=Y.split()
Y=[float(y) for y in Y]
Faites le calcul de toutes les caractéristiques de la série (X, Y ) :
•
•
•
•
moyenne et écart-type de X ,
moyenne et écart-type de Y ,
covariance,
coecient de régression ,
6
• équation de la droite d'ajustement.
Un coup de pouce vous sera nécessaire pour calculer la covariance :
I X,Y=np.array(X),np.array(Y) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . (?)
I covar=np.mean(X*Y)-moyenneX*moyenneY
(?) Que se passe-t-il si l'on omet cette ligne ? Expliquer l'erreur obtenue. Essayer d'enquêter pour comprendre l'eet de cette commande.
Toutes les valeurs obtenues seront écrites dans un nouveau chier, nommé
par exemple analyse_statistique_2var.txt. Procédez pour cela comme
pour la série univariée.
Il reste à créer un graphique. On souhaite représenter sur un même graphique
le nuage de points, le point moyen ainsi que la droite d'ajustement ane pour
notre série double.
I
I
I
I
I
I
I
I
plt.plot(X, Y, 'ro') . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . (1)
plt.plot(moyenneX, moyenneY, 'bs') . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . (2)
A=np.array([min(X),max(X)])
plt.plot(A, a*A+b, 'g-', linewidth=2) . . . . . . . . . . . . . . . . . . . . . . . . . (3)
plt.xlabel('Valeurs de X')
plt.ylabel('Valeurs de Y')
plt.title('Nuage de points')
pylab.savefig('graphique2var.png')
Explications :
(1) 'ro' signie rond rouge : les points du nuage seront des ronds rouges.
(2) 'bs' signie blue square : le point moyen sera représenté par un carré
bleu.
(3) dessine la droite d'ajustement ('g-' précise qu'on veut une ligne continue verte )
Le mot de la n Voilà, c'est ni ! N'oubliez pas d'aller contempler les beaux chiers .txt et
.png que Python a créés pour vous aujourd'hui. Merci qui ?
Gardez les deux scripts que vous avez tapés, ils pourront vous servir à nouveau
(en TIPE notamment). Il vous sura de placer, dans le même répertoire que
l'un de ces scripts, un chier .txt contenant vos données, puis d'exécuter le
script.
7
Nous n'avons utilisé qu'une inme partie de Matplotlib et Numpy. Si à l'avenir ça vous intéresse leurs documentations sont faciles à trouver, notamment si
vous devez faire un graphique quelconque, vous trouverez forcément la solution
avec Matplotlib.pyplot :
Tutoriel : http ://matplotlib.org/users/pyplot_tutorial.html
Documentation complète : http ://matplotlib.org/api/pyplot_api.html
8