La loi binomiale avec Python

Exemples de programmes pour loi binomiale

Vous connaissez la loi binomiale et vous vous dites que cette loi de probabilité est un bon terrain d’entraînement pour la programmation en Python. Pourquoi pas ?

Cette page est du niveau d’une classe de terminale générale.

 

Simulation d’une loi binomiale

Le premier type d’algorithme que nous allons élaborer est la simulation d’une loi binomiale.

Rappelons que celle-ci repose sur une loi de Bernoulli. Par conséquent, notre premier programme sera une fonction qui renvoie aléatoirement 0 ou 1 avec pour seul paramètre \(p\) qui est la probabilité de succès.

Par exemple, si \(p = 0,6,\) nous aurons environ \(60\%\) de valeur 1 si nous lançons le programme un grand nombre de fois.

Avec Python, il faut importer la bibliothèque random pour réaliser des tirages aléatoires.

Nous entrons une probabilité et si le tirage aléatoire tombe entre 0 et cette probabilité, la sortie est 1 et 0 sinon. Si vous ne comprenez pas cette logique, dites-vous qu’avec une probabilité très faible, par exemple 0,05, vous avez de grandes chances d’obtenir un 0. Donc sur un grand nombre de tirages, il ne devrait sortir qu’environ \(5\%\) de 1.

from random import random

p = float(input('p : '))
x = random()
if p < 0:
    print("probabilité négative !")
elif p > 1:
    print("probabilité supérieure à 1 !")
elif x < p:             
    print(1)
else:
    print(0)

Construisons maintenant un algorithme qui répète \(n\) fois la loi de bernoulli. Contrairement au précédent, celui-ci sera présenté sous forme de fonctions.

from random import random

p = float(input('p : '))
n = int(input('n : '))

def bernoulli(p):
    x = random()
    if p < 0:
        print("probabilité négative !")
    elif p > 1:
        print("probabilité supérieure à 1 !")
    elif x < p:             
        return(1)
    else:
        return(0)

def binomiale(n,p):
    s = 0
    for k in range(n):
        s = s + bernoulli(p)
    return(s)

print('nombre de succès : ',binomiale(n,p))

Si par exemple vous entrez 0,99 pour \(p\) et 100 pour \(n\), vous devriez obtenir entre 98 et 100 succès (sinon, retentez l’expérience !).

 

Valeur prise par une loi binomiale

Construisons à présent un algorithme qui donne la probabilité de \(k\) succès avec une loi binomiale \(\mathscr{B}(n \, ;p).\) Certes, le résultat est immédiat avec une calculatrice (voir la page sur la loi binomiale à la calculatrice) mais ça ne vous entraîne pas à la programmation en Python.

La difficulté est la détermination du coefficient binomial. On peut l’obtenir soit avec la formule (voir le troisième exercice de combinatoire), soit avec le triangle de Pascal. Cette seconde possibilité demande une maîtrise des listes. Le programme ci-dessous complète celui de la page d’exemple de liste avec Python.

n = int(input("pour n = "))
k = int(input("pour k = "))
p = float(input("pour p = "))

def coeff(n,k):
    lp = [1]
    for j in range(n):
        nl = lp + [1]
        for i in range(len(lp) - 1):
            nl[i + 1] = lp[i] + lp[i + 1]
        lp = nl
    return nl[k]

print(coeff(n,k)*p**k*(1-p)**(n-k))

Exemple d'entrées et sortie :

pour n = 50

pour k = 15

pour p = 0.2
0.0299186568499018

 

Sans programmer

La bibliothèque open-source de fonctions scipy contient plusieurs lois de probabilité situées dans stats. Ci-dessous, nous avons défini une variable supplémentaire \(X.\)

pmf permet d'obtenir la valeur pour laquelle \(X = k\) et cdf celle pour laquelle \(X \leqslant k.\)

from scipy import stats

n = int(input("pour n = "))
k = int(input("pour k = "))
p = float(input("pour p = "))

X = stats.binom(n,p)

print (X.pmf(k))
print (X.cdf(k))

Exemple d'entrées et sortie :

pour n = 50

pour k = 15

pour p = 0.2
0.0299186568499018
0.9691965772179525

Évidemment, c'est plus simple.

 

programme pour loi de Bernoulli