Distribution binomiale

publicité
Frédéric Legrand
1.
Licence Creative Commons
Distribution binomiale
1
Introduction
On considère une variable aléatoire x pouvant prendre la valeur 1 avec une probabilité
p, ou la valeur 0 avec une probabilité 1 − p.
Dans un premier temps, on fera une simulation de Monte-Carlo de cette variable
aléatoire, pour calculer la moyenne et la variance. On étudiera aussi la distribution de la
moyenne, que l'on comparera à une distribution normale.
La distribution binomiale donne la probabilité d'obtenir n fois la valeur 1 lorsqu'on
fait N tirages. On fera des simulations de Monte-Carlo pour obtenir cette distribution,
pour diérentes valeurs de N et p.
Pour générer des nombres pseudo-aléatoires, on utilisera la fonction random.random().
2.
2.a.
Moyenne et variance
Fonctions de calcul
(1) Écrire une fonction qui génère des échantillons de la variable aléatoire x, en
utilisant la fonction random.random().
(2) Écrire une fonction qui calcule, pour N tirages, la moyenne, l'écart-type, et une
estimation de l'écart-type de la moyenne. On rappelle que la variance de la moyenne est
égale à la variance de la variable x divisée par N .
(3) Tester cette fonction pour diérentes valeurs de p, et pour des valeurs de N
croissantes.
2.b.
Distribution des valeurs moyennes
Considérons Nt calculs de la valeur moyenne, faits avec N tirages et donnant les
valeurs mi . Pour obtenir la distribution de ces valeurs moyennes, on construit un histogramme. L'intervalle de dénition de la variable aléatoire, ici [0, 1], est subdivisé en M
sous-intervalles (de largeur 1/M ). L'histogramme est un tableau H dont l'élément H[i]
contient le nombre de moyennes contenues dans l'intervalle correspondant. Pour représenter graphiquement l'histogramme, on utilisera simplement la fonction matplotlib.pyplot.plot
avec l'option "o" pour tracer des ronds.
Pour que l'histogramme représente une densité de probabilité, il faudra diviser toutes
les valeurs du tableau H , d'une part par le nombre Nt de moyennes calculées, d'autre
part par la largeur de chaque intervalle (ici 1/M ).
(1) Écrire une fonction qui génére l'histogramme, pour N , Nt et M donnés.
(2) Tracer l'histogramme, pour des valeurs de N et Nt croissantes. Choisir une valeur
de N qui donne un écart-type bien visible.
(3) Comparer la distribution obtenue à la distribution normale rappelée ci-dessous,
où µ est l'espérance et σ l'écart-type de la moyenne.
(m − µ)2
1
exp −
p(m) = √
2σ 2
2πσ
(1)
Frédéric Legrand
3.
Licence Creative Commons
2
Distribution binomiale
Pour étudier la distribution binomiale par une simulation de Monte-Carlo, on eectue
Nt fois le tirage de N valeurs de x. On génére un histogramme H , où H[n] est le nombre
de tirages donnant n fois la valeur 1. Cet histogramme représente des probabilités ; il
faudra donc diviser H par le nombre total de tirages.
On remarquera que n est la somme des valeurs de x tirées.
(1) Écrire la fonction générant l'histogramme de la distribution binomiale.
(2) La tester pour N = 10, et pour des valeurs croissantes de Nt . Tester pour diérentes valeurs de la probabilité p. Vérier que la moyenne est bien N p.
(3) Écrire une fonction calculant la moyenne
p et l'écart-type de la distribution binomiale. Comparer à l'écart-type théorique σ = N p(1 − p).
4.
Solution
import numpy
import random
from matplotlib.pyplot import *
class Binomiale:
def __init__(self,p):
self.p = p
def tirage(self):
x = random.random()
if x<self.p:
return 1
else:
return 0
def moyenne(self,N):
somme = 0
somme2 = 0
for k in range(N):
t = self.tirage()
somme += t
somme2 += t*t
moyenne = somme*1.0/N
variance = somme2*1.0/N-moyenne*moyenne
ecart = numpy.sqrt(variance*1.0/N)
return (moyenne,variance,ecart)
def distribution_moyennes(self,N,N_tirages,M):
hist = numpy.zeros(M)
for t in range(N_tirages):
(m,v,e) = self.moyenne(N)
i = int(m*M)
hist[i] += 1
return (numpy.arange(M)*1.0/M,hist/N_tirages*M)
def binomiale(self,N,N_tirages):
Frédéric Legrand
Licence Creative Commons
3
hist = numpy.zeros(N+1)
for t in range(N_tirages):
s = 0
for k in range(N):
s += self.tirage()
hist[int(s)] += 1
return hist/N_tirages
Voici tout d'abord un calcul de moyenne dans le cas p = 0, 5, pour N = 1000
échantillons :
p=0.5
binom = Binomiale(p)
N=1000
(m,v,e) = binom.moyenne(N)
print((m,v,e))
--> (0.492, 0.249936, 0.015809364313595912)
Le dernier nombre est l'estimation de l'écart-type de la moyenne, qui indique quelle
conance on doit donner à l'estimation de la moyenne.
On génère l'histogramme des valeurs moyennes pour Nt = 10000 calculs
√ de la moyenne,
p(1−p)
∆x
puis on le compare à la distribution normale, avec µ = p et σ = √N = √N .
M=1000
Nt=10000
(moy,hist) = binom.distribution_moyennes(N,100000,M)
x=numpy.linspace(0,1,1000)
sigma=numpy.sqrt(p*(1-p)/N)
normale=1.0/(numpy.sqrt(2*numpy.pi)*sigma)*numpy.exp(-(x-p)**2/(2*sigma**2))
figure()
plot(moy,hist,"ko-")
plot(x,normale,"r")
xlabel("m")
ylabel("P")
grid()
Frédéric Legrand
Licence Creative Commons
Voici un histogramme de la ditribution binomiale, pour N = 10 :
p=0.5
binom = Binomiale(p)
hist = binom.binomiale(10,100000)
figure()
plot(hist,"o-")
xlabel("n")
ylabel("P")
grid()
title("Binomiale")
4
Frédéric Legrand
Licence Creative Commons
et pour une probabilité diérente :
p=0.3
binom = Binomiale(p)
hist = binom.binomiale(10,100000)
figure()
plot(hist,"o-")
xlabel("n")
ylabel("P")
grid()
title("Binomiale")
5
Frédéric Legrand
Licence Creative Commons
6
Téléchargement