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