TP 2 Python
TP 2 Python
TP 2 Python
1 Illustrations graphiques
Pour tracer des graphes, nous avons besoin du sous module pyplot de matplotlib. Ensuite,
on définit la figure, qu’on appelle en général fig. Puis dans la figure on définit les sous-figures,
selon les axes. On va utiliser la fonction plot qui prend en arguments le vecteur des abscisses et
des ordonnées. Par défaut, chaque point sera relié par un segment.
Plus il y a de points dans un intervalle donné, i.e. plus le pas est petit, plus le tracé sera proche
de la fonction voulue.
Si on veut représenter plusieurs courbes sur le même graphique, on fait des appels à la fonction
plot les uns à la suite des autres, ou on lui donne les différentes courbes en arguments :
x=np.linspace(0,4*pi,100)
y=np.sin(x)
z=np.cos(x)
fig, ax=plt.subplots()
ax.plot(x,y)
ax.plot(x,z)
#ou
ax.plot(x,y, x,z)
plt.show()
1
x=np.linspace(0,pi,100)
fig, axs=plt.subplots(2,2)
axs[0,0].plot(x,np.sin(x))
axs[0,1].plot(x,np.sin(2*x))
axs[1,0].plot(x, np.cos(x))
axs[1,1].plot(x,np.cos(2*x))
plt.show()
N.B. Pour tracer une fonction en escalier, on utilisera l’argument de plot : drawstyle='steps-post'ou
drawstyle='steps-pre'.
Quand le code est long, et qu’on ne veut pas commenter chaque plt.show() qui ne nous
intéresse plus, on peut utiliser plt.close(). Ou encore mieux : écrire son code sous forme de
fonctions qu’on appelle lorsque nécessaire.
Options graphiques
Lorsque vous présentez une illustration graphique au jury, vous devez préciser ce qu’elle
représente i.e. qu’est ce qui est tracé, en fonction de quoi, quels sont les paramètres etc. Pour
faciliter la compréhension et la lisibilité de vos illustrations, vous devez ainsi vous habituer
à les “décorer” en ajoutant un titre général, un également pour chaque axe. Lorsqu’il y a
plusieurs courbes, une légende permet d’afficher la correspondance entre les couleurs/motifs
et les courbes représentées.
Le troisième argument de plot est le style du trait. On mettra "o" ou "+" pour que les points
d’une courbe ne soient pas reliés ou pour avoir un nuage de points. Voici un exemple :
x=stats.uniform.rvs(size=(2,100))
fig, ax=plt.subplots()
ax.plot(x[0,:],x[1,:], 'o')
plt.show()
On peut changer les couleurs avec par exemple : "r" pour red, "b" pour blue, "k" pour black ; le
style avec "." pour un petit point, "o-" pour des gros points et une ligne, " :" pour des pointillés.
Et on peut mixer le tout ! Par exemple : "ko".
D’autres commandes :
2
axs[..].set_ylabel("titre ordonnees") donne un titre aux ordonnées
axs[..].set_ylim([a,b]) limite le graphe aux ordonnées [a, b].
ax[..].set_xticks(rray) graduation axe des abscisses
ax[..].set_sticklabels(["0", "1",...]) noms des graduations de l’axe des abscisses
Voici un exemple :
fig, ax=plt.subplots()
#échantillon de variables exponentielles de paramètre 2:
X=stats.expon.rvs(scale=0.5, size=10000)
#histogramme associé:
ax.hist(X,bins=30, density=True, label="histogramme")
fig.suptitle("Exponentielle de paramètre 2")
#densité de la loi associée:
x=np.arange(0,max(X), 0.01)
ax.plot(x,stats.expon.pdf(x, scale=0.5), label="densité")
ax.legend()
plt.show()
# échantillon
x=stats.binom.pmf(np.arange(0,21),20,0.6)
fig, ax=plt.subplots()
ax.bar(np.arange(0,21),x)
plt.show()
3
Histogramme
Pour superposer avec une densité, il faut demander à Python de normaliser les histogrammes,
ça se fait avec l’option de hist, density=True. Puis on trace la densité.
Exercice 1. Télécharger le fichier donnees2.csv dans votre espace de travail. Importer le tableau
dans Python, et tracer la première colonne en fonction de la seconde.
Exercice 2. Télécharger le fichier donnees3.csv dans votre espace de travail. Importer le docu-
ment dans Python. Tracer le nuage de points dont les abscisses et ordonnées sont stockées dans
le tableau. Les points seront matérialisés par des triangles.
Exercice 3. Dans une même fenêtre graphique, tracer les unes en dessous des autres les trois
fonctions trigonométriques usuelles (sin, cos et tan) sur une période et en regard, sur la droite,
leur fonctions réciproques (là où elles sont définies !).
Exercice 4. Générer une fonction qui prend en entrée un entier n et qui en sortie trace la fonction
étagée binomiale correspondante i.e. la fonction qui vaut Cnk sur l’intervalle [k, k+1], pour k variant
de 0 à n − 1.
Pour représenter les lois empiriques associées à une expérience aléatoire, on peut tracer l’his-
togramme empirique ou la fonction de répartition empirique.
N=5000 p=0.7
#echantillons:
X=stats.binom.rvs(1,p, size=N)
Y1=stats.norm.rvs(loc=0, scale=1, size=N)
Y2=stats.norm.rvs(loc=4, scale=1, size=N)
Z=X*Y1 +(1-X)*Y2
def f(x):
y=(p/sqrt(2*pi))*np.exp(-x**2/2)+((1-p)/sqrt(2*pi))*np.exp(-(x-4)**2/2)
4
return y
u=np.linspace(min(Z),max(Z),200)
fig, ax=plt.subplots()
#histogramme:
ax.hist(Z,bins=100, density=True, label="histogramme")
ax.plot(u,f(u), label="densité")
fig.suptitle("Melange de deux gaussiennes")
ax.legend()
plt.show()
Le résultat :
n=100
#un échantillon
X=stats.norm.rvs(loc=0,scale=1, size=n)
fig,ax=plt.subplots()
#on le classe:
X_sort=np.sort(X)
ax.plot(X_sort,np.arange(n)/n,drawstyle='steps-pre')
ax.plot(X_sort,stats.norm.cdf(X_sort), label='densite')
ax.legend()
plt.show()
5
1.2 Tracés en dimension trois
Pour tracer une courbe paramétrée en dimension 3, il nous faut procéder un peu différem-
ment pour créer la figure. On utilisera toujours la fonction plot mais avec trois arguments : les
projections sur chacun des axes.
#import est nécessaire même si Axes3D'
#n'apparait pas ensuite.
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
ax = fig.add_subplot(1,1,1, projection='3d')
t = np.linspace(0, 5 * np.pi, 100)
r = np.sin(t)
x = np.cos(t)
y = t/2
ax.plot(x, y, z)
ax.legend()
La commande de base pour représenter une surface est plot_surface. La surface d’équation
z = f (x, y) est obtenue en entrant les matrices X et Y de coordonnées et une matrice Z de même
taille telle que Z[i, j] = f (X[i, j], Y [i, j]). X et Y forment une grille. Voici un exemple :
6
#toujours aussi important de l'importer !
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
ax = fig.add_subplot(1,1,1, projection='3d')
X = np.arange(-pi, pi, 0.2)
Y = np.arange(-5, 5, 0.2)
#matrices avec l'ensemble des coordonnées
#de la grille
X, Y = np.meshgrid(X, Y)
Z = X**2 - Y**2
surf = ax.plot_surface(X, Y, Z, antialiased=False)
plt.show()
Exercice 5. Télécharger le fichier donnees4.csv dans votre espace de travail. Importer le docu-
ment dans Python : la première ligne et la prmière colonne sont les coordonnées. Tracer la surface
correspondant aux entrées du tableau.
7
loi(paramètres de forme) Lois
norm() Loi normale N (0, 1).
gamma(a=) Loi gamma γ(a, 1).
beta(a=, b=) Loi béta β(a, b).
t(df=n) Loi Student de n degrés de liberté.
cauchy() Loi de Cauchy.
expon(scale=1/lambda) Loi exponentielle E(λ).
uniform(loc=, scale=) Loi uniforme U(]loc, loc + scale[).
randint(low, high) Loi uniforme U({low, low + 1, · · · , high − 1}).
binom(n=, p=) Loi binomiale B(n, p).
geom(p=) Loi géométrique G(p).
poisson(mu=) Loi de Poisson P(µ).
N.B. Toutes ces lois, ainsi que les relations entre elles sont rappelées dans [Vig18][p. 70].
N.B. On peut aussi demander à Python de calculer les moments d’une variable aléatoire. Pour le
moment d’ordre n : stats.xxx.moment(n,parametres, loc=, scale=).
Exercice 6. Simuler une matrice (Mi,j )i=1...100,j=1...200 contenant 100 échantillons de taille 200 de
variables aléatoires de loi exponentielle de paramètre 1. Pour illustrer le théorème central limite,
tracer l’histogramme associé et sur le même graphique la densité gaussienne correspondante.
On s’intéresse aux chaînes de Markov discrêtes, homogènes en temps, à espace d’états dénom-
brable.
En Python, il n’y a pas (à ma connaissance) de fonction toute faite pour générer une chaîne de
Markov à partir de sa matrice de transition. Mais ce n’est pas bien difficile et vous pouvez retrou-
ver la méthode dans [Vig18][p. 98] :
On commence par créer la matrice de transition P dans un array (cf TP 1). On rappelle que
def markov_avec_P(n,P,x0):
"simule les n premiers pas d'une chaine de Markov "
"à partir de sa matrice de transition"
X=np.zeros(n,dtype=np.int) #on indique que X contiendra seulement des entiers.
X[0]=x0
for k in range(n-1):
X[k+1]=np.random.choice(a=range(len(P)), p=P[X[k],:])
# Les états sont numérotés de 0 à len(P)-1
return X
Exercice 7. Simuler les 100 premiers pas d’une chaîne de Markov dont la matrice de transition
8
est donnée par
1/3 1/3 1/6 1/6
0 1/2 0 1/2
P =
1/4
.
1/4 1/4 1/4
1/3 1/3 1/3 0
Estimer la probabilité invariante à partir des temps d’occupation empiriques.
Lorsqu’on veut simuler une variable aléatoire dont la loi n’est pas classique, on ne peut mal-
heureusement pas utiliser le sous-module stats. Mais, si on connaît sa fonction de répartition F ,
c’est gagné !
Proposition 1. Soit X une variable aléatoire réelle de fonction de répartition F . Pour u ∈ [0, 1],
on désigne par F −1 (u) := inf{x ∈ R, F (x) ≥ u} l’inverse généralisée de la fonction de répartition
F . Si U ∼ U([0, 1]) alors F −1 (U ) a pour fonction de répartition F .
Exercice 8. Simuler une variable aléatoire à valeurs dans {0, 1, 2, 3} dont les probabilités sont
respectivement 0.1, 0.3, 0.2, 0.4. En utilisant np.random.choice puis sans.
Exercice 9. Simuler les variables aléatoires décrites ci-dessous par inversion :
1. À partir de variables uniformes sur [0, 1], générer un n−échantillon de variables de Bernoulli
de paramètre 1/2 à valeurs dans E = {0, 1}. Même question lorsque E = {−1, 1}.
2. Simuler une variable aléatoire Y de loi uniforme à valeurs dans {0, 1, 2, 3}.
3. À partir de variables uniformes, simuler un n−échantillon (X1 , . . . , Xn ) de variables aléa-
toires de loi exponentielle de paramètre 2. Mettre en évidence la loi des grands nombres en
traçant la fonction k 7→ (X1 + . . . + Xk )/k pour k allant de 1 à n.
Proposition 2. Soient A, D ∈ B(Rd ) tels que A ⊂ D. Soit (Xi )i∈N une suite i.i.d. de variables
aléatoires définies sur un espace de probabilité (Ω, F, P) uniformes sur D. Introduisons le temps
τ := inf{i ∈ N∗ , Xi ∈ A}, alors Xτ est uniformément distribuée dans A, i.e. pour B ∈ B(Rd ),
B ⊂ A, P(Xτ ∈ B) = |B|/|A|. Le nombre de tirages avant l’obtention d’une réalisation de la loi
uniforme sur A par ce procédé suit une loi géométrique G(p), avec p = |A|/|D|. En particulier le
nombre moyen de tirages nécessaires est |D|/|A|.
9
Exercice 10. Utiliser la méthode de simulation ci-dessus pour générer une variable aléatoire de
densité x 7→ π2 sin(πx) sur l’intervalle [0, 1].
On peut généraliser la méthode de rejet de la façon suivante. Soit X une variable aléatoire
réelle de loi µX qui possède une densité continue fX (peut ne pas être à support compact) majorée
uniformément par une densité g, i.e. il existe une constante C ≥ 1 telle que
Z
∀x ∈ R, fX (x) ≤ Cg(x), avec g(y)dy = 1.
On suppose que l’on sait facilement simuler des variables aléatoires de loi de densité g. Soient
donc (Xi )i∈N une suite i.i.d. de variables aléatoires de loi de densité g et (Ui )i∈N une suite i.i.d.
de variables aléatoires uniformes sur l’intervalle [0, 1], indépendantes de (Xi )i∈n . Si on considère
le temps τ := inf{i ≥ 1, f (Xi ) > Cg(Xi )Ui }, alors Xτ a pour loi µX .
Exercice 11. On souhaite simuler une variable aléatoire X de loi N (0, 1). On montre sans trop
de difficulté la majoration suivante :
2
! r
e−x /2
2e 1 −|x|
∀x ∈ R, √ ≤ × e .
2π | π}
{z 2
| {z } | {z }
:=C :=g(x)
:=fX (x)
1. Montrer que si ε suit une loi de Bernoulli de paramètre 1/2 dans {−1, 1} et si Z est une
variable exponentielle de paramètre 1 indépendante de ε, alors εZ a pour densité la fonction
g sur R.
2. Implémenter un algorithme qui simule une variable gaussienne via la méthode de rejet.
3. Simuler 1000 variables selon cet algorithme et vérifier que l’histogramme correspondant
approche bien la densité gaussienne.
3 Exercices
Exercice 13. La loi de Fréchet de paramètres a > 0 et α > 0 est la loi sur [0, +∞[ de fonction de
répartition FX (x) = exp(−(a/x)α ). Simuler par inversion un échantillon de grande taille de cette
10
loi. Représenter sur un même graphique la fonction de répartition empirique de cet échantillon et
la fonction de répartition théorique de la loi.
Exercice 14. On rappelle que la distance en variation totale entre deux lois de probabilité µ et
ν supportées par un ensemble au plus dénombrable E est définie par
X
dT V (µ, ν) = |µ({x}) − ν({x})|.
x∈E
Exercice 15. Estimer par simulation la probabilité p(n) que le déterminant d’une matrice aléa-
toire A de taille n dont les coefficients sont des variables aléatoires i.i.d. de loi uniforme sur {−1, 1},
soit nul. On estimera p(n) pour n variant de 2 à 20 et on tracera la courbe représentative de p(n)
en fonction de n. Estimer par simulation l’espérance de det(A)2 pour n = 2 . . . 5. Énoncer, puis
démontrer une conjecture sur l’espérance de ce déterminant.
Références
[Vig18] Vincent Vigon. python proba stat. Independently published, October 2018.
11