Utilisation de numpy pour simuler des lois de probabilités

On peut utiliser le module numpy ou le module scipy

Liens :

http://www.python-simple.com/python-numpy-scipy/random-numpy.php

In [23]:
# -*- coding: utf-8 -*-
from math import *
from random import *
import matplotlib.pyplot as plt 
import numpy as np

Les différentes lois de probabilité avec Numpy

  • numpy.seed(5) : pour donner la graine, afin d'avoir des valeurs reproductibles d'un lancement du programme à un autre.
  • numpy.random.binomial(10, 0.3, 7) : une array de 7 valeurs d'une loi binomiale de 10 tirages avec probabilité de succès de 0.3.
  • numpy.random.poisson(1, 7) : une array de 7 valeurs issues d'une loi de Poisson de paramètre 1.
  • numpy.random.standard_normal(7) : une array de 7 valeurs issues d'une loi normale standard (moyenne 0, écart-type 1).
  • numpy.random.normal(5, 2, 7) : une array de 7 valeurs issues d'une loi normale de moyenne 5 et écart-type 2.
  • numpy.random.uniform(0, 2, 7): une array de 7 valeurs issues d'une loi uniforme entre 0 et 2.
In [11]:
binomiale=np.random.binomial(50, 0.3, 1000)

plt.hist(binomiale,bins=50,range=(1,50),density=True)
plt.show()
In [ ]:
 
In [12]:
normale=np.random.normal(5,2,1000)

plt.hist(normale,bins=50,density=True)
plt.show()
In [13]:
def DensiteNormale(x,mu,sigma):
    return 1/(sigma * sqrt(2*pi))*exp(-0.5*((x-mu)/sigma)**2)
In [14]:
binomiale=np.random.binomial(50, 0.3, 1000)
normale=np.random.normal(15,3.2,1000)
plt.hist(binomiale,density=True,edgecolor='black', hatch='/' , alpha=0.2,  label='loi binomiale')
plt.hist(normale,density=True,edgecolor='yellow', hatch='x', alpha = 0.2 ,label ='loi normale approchant la loi binomiale')
lx=np.linspace(0,50,200)
ly=[DensiteNormale(x,15,3.2) for x in lx]
plt.plot(lx,ly,'rx', label = ' fonction de densité de la loi normale')
plt.legend(loc='upper right')
plt.show()
In [ ]:
 
In [ ]:
 
In [16]:
import random
import numpy
from matplotlib import pyplot

x = [random.gauss(3,1) for _ in range(400)]
y = [random.gauss(4,2) for _ in range(400)]

bins = numpy.linspace(-10, 10, 100)

pyplot.hist(x, bins, alpha=0.5, label='x') # alpha correcpond à un coefficient de transparence
pyplot.hist(y, bins, alpha=0.5, label='y')
pyplot.legend(loc='upper right')
pyplot.show()

Simuler une variable aléatoire avec PYTHON.

Exercice 1. On lance un dé supposé équilibré.

  • Si le résultat est pair, on gagne 2€.
  • Si le résultat est 1, on gagne 3€.
  • Si le résultat est 3 ou 5, on perd 4€.
  • Soit X la variable aléatoire qui donne le gain du joueur.
  • Calculer l’espérance de X et indiquer si le jeu est favorable pour le joueur.
  • Calculer la variance.

Soit X la variable aléatoire qui donne le gain du joueur. X est définie sur l'ensemble {1,2,3,4,5,6}

X(1)=3, X(2)=2, X(3)=-4, X(4)=2, X(5)= -4, X(6) = 2

On obtient la loi de probablilité :

$x_i$ -4 2 3
$ P(X)=x_i$ $\frac{1}{3}$ $\frac{1}{2}$ $\frac{1}{6}$
In [17]:
X=[-4,2,3]
p=[1/3,1/2,1/6]

def esperance(valeurs,probabilites):
  e=0
  a= len(valeurs) # la longueur de la liste
  for i in range(a):
      e = e + probabilites[i]*valeurs[i] # somme des pi*xi
  return e


def variance(valeurs,probabilites):
  var,N = 0,0
  e=esperance(valeurs,probabilites)
  n=len(valeurs)
  for i in range(n):   
    var = var+probabilites[i]*(valeurs[i]-e)**2
  return var

 
def ecarttype(valeurs,probabilites):
  return sqrt(variance(valeurs,probabilites))
In [21]:
# Mise au point de deux méthodes de simulations. simul2 est une généralisation de simul1.

def simul(valeurs,probabilites):
    nb=random()        
    if 0<= nb < 1/3 :
        return valeurs[0] 
    elif 1/3<= nb < 1/3+1/2 :
        return valeurs[1] 
    else : return valeurs[2]

    
def simul2(valeurs,probabilites):
    assert len(valeurs) == len(probabilites)
    nb=random()
    curseur=0
    for i in range(len(valeurs)):
        if curseur<=nb<curseur+probabilites[i]: 
            return valeurs[i]
        curseur=curseur+probabilites[i]
In [24]:
S1=[simul(X,p) for i in range(40)]
S2=[simul2(X,p) for i in range(40)]
In [25]:
print(S1)
print(S2)
[2, 2, 3, 3, 2, 2, 2, -4, 2, 3, -4, 3, 2, 2, -4, 2, 2, 2, 2, -4, 2, 2, -4, 2, 2, -4, 2, 2, 2, 2, 2, -4, 3, -4, 3, 2, 2, 2, 2, 2]
[2, -4, -4, 2, -4, 2, 2, -4, -4, 2, 3, 2, -4, 2, 2, -4, -4, -4, 2, 2, 2, 2, 3, 2, 3, 3, 2, 2, 3, 2, -4, 3, 2, 2, 3, -4, 2, 2, -4, -4]
In [ ]:
 
In [26]:
def echantillon(valeurs,probabilites,taille):
    listeX=[]
    for i in range(taille):
       listeX.append(simul(valeurs,probabilites))
    return listeX 

def echantillon2(valeurs,probabilites,taille):
    listeX=[]
    for i in range(taille):
       listeX.append(simul2(valeurs,probabilites))
    return listeX 



def frequences(valeurs,probabilites,taille):
    echanti=echantillon(valeurs,probabilites,taille)
    n=len(echanti)
    F=[]
    for x in valeurs:
        F.append(echanti.count(x)/n)
    return F

def frequences2(valeurs,probabilites,taille):
    echanti=echantillon2(valeurs,probabilites,taille)
    n=len(echanti)
    F=[]
    for x in valeurs:
        F.append(echanti.count(x)/n)
    return F
In [27]:
print(frequences(X,p,100))
print(frequences2(X,p,100))
[0.32, 0.55, 0.13]
[0.29, 0.58, 0.13]
In [ ]:

In [28]:
def moyenne(liste):
    return np.mean(liste)
In [29]:
moyenne(echantillon(X,p,100))
Out[29]:
0.07

Écrire une fonction de paramètres (valeurs , probabilites , n , N) qui va simuler N échantillons de taille n de la variable aléatoire X (d’espérance μ et d’écart type σ) Si m désigne la moyenne de cet échantillon, la fonction devra renvoyer la proportion des cas où l’écart entre m et μ est inférieur ou égal à $\frac{2σ}{\sqrt(n)}$

In [ ]:
 
In [30]:
mu=esperance(X,p)
sigma=ecarttype(X,p)
print(mu,sigma)
0.16666666666666674 2.967415635794143
In [31]:
# test sur 20 échantillons de taille 100

for i in range(20): 
    L=frequences(X,p,100)
    print(L,esperance(X,L),ecarttype(X,L))
[0.25, 0.5, 0.25] 0.75 2.7726341266023544
[0.27, 0.53, 0.2] 0.5800000000000001 2.8113342028296815
[0.41, 0.42, 0.17] -0.2899999999999999 3.1122178586981986
[0.35, 0.51, 0.14] 0.04000000000000015 2.983018605372752
[0.29, 0.48, 0.23] 0.4900000000000001 2.896532409623618
[0.29, 0.49, 0.22] 0.4800000000000001 2.889567441677041
[0.36, 0.53, 0.11] -0.04999999999999988 2.977834783865619
[0.27, 0.56, 0.17] 0.55 2.790609252475165
[0.32, 0.54, 0.14] 0.22000000000000008 2.914035003221478
[0.35, 0.42, 0.23] 0.13000000000000012 3.0550122749344233
[0.34, 0.48, 0.18] 0.1399999999999999 2.9933927239839413
[0.32, 0.46, 0.22] 0.30000000000000004 2.9748949561287032
[0.4, 0.41, 0.19] -0.21000000000000008 3.1154293444082475
[0.41, 0.44, 0.15] -0.30999999999999994 3.0941719409237747
[0.38, 0.47, 0.15] -0.13000000000000012 3.048458626912952
[0.32, 0.52, 0.16] 0.24 2.929573347776089
[0.29, 0.48, 0.23] 0.4900000000000001 2.896532409623618
[0.34, 0.49, 0.17] 0.1299999999999999 2.985481535699057
[0.27, 0.53, 0.2] 0.5800000000000001 2.8113342028296815
[0.35, 0.52, 0.13] 0.030000000000000138 2.974743686437539
In [32]:
def ecart(valeurs,probabilites,taille,nbechantillons):
    mu=esperance(valeurs,probabilites)
    sigma=ecarttype(valeurs,probabilites)
    nbrecas=0
    for i in range(nbechantillons):
        L=frequences(valeurs,probabilites,taille)
        esperanceEchantillon=esperance(valeurs,L)
        if abs(esperanceEchantillon-mu)<=2*sigma / sqrt(taille): nbrecas=nbrecas+1
     
    return nbrecas/nbechantillons

def ecart2(valeurs,probabilites,taille,nbechantillons):
    mu=esperance(valeurs,probabilites)
    sigma=ecarttype(valeurs,probabilites)
    nbrecas=0
    for i in range(nbechantillons):
        L=echantillon2(valeurs,probabilites,taille)
        m=moyenne(L)
        if abs(m-mu)<=2*sigma / sqrt(taille): nbrecas=nbrecas+1
     
    return nbrecas/nbechantillons
In [33]:
def demo():
    X=[-4,2,3]
    p=[1/3,1/2,1/6]
    n=int(input("Entrer la taille de l'échantillon :"))
    mu,sigma=esperance(X,p),ecarttype(X,p)
    print("mu = %f , sigma = %f"%(mu,sigma))
    L=echantillon(X,p,n)
    print("Un échantillon : ", L)
    print("La moyenne de l'échantillon : ",moyenne(L))
    print("Les fréquences de l'échantillon", frequences(X,p,n))
    nb=int(input("Entrer le nombre d'échantillons souhaités : "))
    print("La proportion dans l'intervalle : ", ecart2(X,p,n,nb))
   
demo()
Entrer la taille de l'échantillon :100
mu = 0.166667 , sigma = 2.967416
Un échantillon :  [2, 2, 2, 2, -4, 2, 2, -4, 2, -4, -4, 2, 2, 3, -4, 2, 2, 2, -4, 2, 3, 2, 3, 2, 2, 2, -4, 2, -4, 2, -4, 2, 2, -4, -4, 2, 2, 2, -4, 3, 3, 2, 2, -4, 2, -4, -4, 2, -4, 2, 2, 2, -4, 3, 3, 3, 2, -4, 2, 2, 2, 2, -4, 2, 2, 2, 2, 3, 3, -4, 2, -4, 2, 2, 2, -4, 2, -4, 2, 2, -4, -4, 3, 2, -4, 2, 3, 3, 2, 2, 2, -4, 2, 2, 3, 2, 2, 2, 3, -4]
La moyenne de l'échantillon :  0.47
Les fréquences de l'échantillon [0.38, 0.42, 0.2]
Entrer le nombre d'échantillons souhaités : 30
La proportion dans l'intervalle :  0.9666666666666667
Exercice 2.

On lance un dé supposé équilibré.

  • On perd 2 Euros si on obtient 1 ou 2.
  • On gagne 0,5 Euros si on obtient 3
  • on gagne 2 Euros si on obtient 4 ou 5 ou 6.

Soit X la variable aléatoire qui donne le gain du joueur.

Exercice 3.

Soit l'expérience aléatoire : "On tire une carte dans un jeu de 32 cartes." On considère le jeu suivant :

  • Si on tire un cœur, on gagne 2€.
  • Si on tire un roi, on gagne 5€.
  • Si on tire une autre carte, on perd 1€.

On appelle X la variable aléatoire qui à une carte tirée associe un gain ou une perte. Déterminer la loi de probabilité de X.

In [ ]: