Introduction :
Dans cette fiche, nous allons voir comment simuler une variable aléatoire suivant une loi de Bernoulli en langage Python. Pour cela, nous allons nous servir d’une fonction Python qui simule une variable aléatoire qui suit la loi uniforme sur .
Cela fait, nous écrirons un programme Python qui simulera une variable aléatoire comptant le nombre de succès obtenus lors de la répétition d’une épreuve de Bernoulli. Et nous simulerons la loi de probabilité de cette variable aléatoire, pour la rapprocher de la loi binomiale.
Pour revoir les différentes notions de probabilité qui vont être traitées dans cette fiche :
- cours sur les lois discrètes ;
- cours sur les lois à densité.
Simulation d’une variable de Bernoulli
Simulation d’une variable de Bernoulli
Loi uniforme sur
Loi uniforme sur
Soit une variable aléatoire qui suit la loi uniforme sur .
Nous savons alors que :
- la densité de probabilité de est la fonction constante définie sur par :
- la fonction de répartition est la fonction définie sur par :
- Ainsi, pour tout :
En Python, pour simuler la loi uniforme sur , nous utilisons la fonction – qui ne prend pas d’arguments –, disponible dans le module .
Cette fonction prendra un nombre au hasard dans l’intervalle .
est exclu, mais ce n’est pas gênant puisque nous travaillons avec une variable aléatoire continue :
Ainsi, la probabilité que le nombre renvoyé par soit inférieur ou égal à un réel est égale à .
- C’est exactement ce dont nous avons besoin pour simuler une variable aléatoire qui suit la loi de Bernoulli de paramètre !
En effet, nous considérons que :
- la probabilité que renvoie un nombre compris entre et est égale à ,
- c’est alors un succès et prend la valeur ;
- la probabilité que renvoie un nombre compris entre et est égale à ,
- c’est alors un échec et prend la valeur .
Considérons une variable aléatoire qui suit la loi de Bernoulli de paramètre . Autrement dit, la probabilité d’obtenir un succès est égale à la probabilité d’obtenir un échec, soit .
On peut alors faire appel à la fonction , aussi disponible dans le module .
- Celle-ci choisira au hasard un entier compris entre et , soit ou .
C’est d’ailleurs cela que nous faisons dans l’algorithme qui simule une planche de Galton.
Programme Python
Programme Python
Nous allons ici écrire un programme Python, qui simulera une variable suivant une loi de Bernoulli de paramètre .
- Elle retournera avec une probabilité , et avec une probabilité .
- Nous commençons par importer la fonction :
- Nous créons la fonction , qui prend donc en argument un nombre compris entre et .
- Nous exécutons la fonction et considérons le cas où le nombre renvoyé est inférieur à .
- Si c’est le cas, il s’agit d’un succès, et la fonction renvoie .
- On s’intéresse au cas contraire, c’est-à-dire lorsque le nombre renvoyé par est supérieur à .
- Il s’agit alors d’un échec, et la fonction renvoie .
La fonction est terminée :
Nombre de succès dans un schéma de Bernoulli
Nombre de succès dans un schéma de Bernoulli
Prérequis
Prérequis
Nous nous intéressons maintenant à une variable aléatoire qui donne le nombre de succès obtenus lors de répétitions identiques et indépendante d’une épreuve de Bernoulli, où la probabilité de succès est .
- Nous allons nous servir de la fonction Python précédente pour simuler cette variable aléatoire.
Le principe est simple.
- Nous allons simuler une épreuve de Bernoulli répétée fois, de manière identique et indépendante.
- Nous compterons au fur et à mesure le nombre de succès obtenus.
- Il s’agit donc simplement de faire appel à la fonction fois, et d’ajouter au fur et à mesure la valeur qu’elle renvoie.
Programme Python
Programme Python
- Commençons par définir notre fonction , qui prend en paramètres :
- le nombre de fois que l’on répète l’épreuve de Bernoulli ;
- la probabilité de succès dans l’épreuve de Bernoulli.
- Nous allons compter le nombre de succès. Nous initialisons une variable à .
- C’est cette variable qui sera incrémentée à chaque fois que l’on obtiendra un succès.
- Nous répétons fois l’épreuve.
- Nous créons donc une boucle qui s’exécutera fois :
- À chaque boucle, nous faisons appel à la fonction . Et nous ajoutons son résultat à :
- si on a obtenu un succès, renvoie , et nous comptabilisons donc bien ce succès dans ;
- si on a obtenu un échec, renvoie , et ne sera pas modifié.
- Au sortir de la boucle, contiendra donc le nombre de succès obtenus après la répétition des épreuves.
- Nous demandons à la fonction de retourner sa valeur :
La fonction est terminée :
Fréquence des succès
Fréquence des succès
Loi binomiale
Loi binomiale
La variable aléatoire que nous avons définie dans la deuxième partie suit une loi binomiale de paramètres et .
L’objectif de cette dernière partie est de simuler, par une fonction Python, la variable aléatoire un grand nombre de fois, de noter à chaque expérience le nombre de succès obtenus, puis d’en calculer la fréquence.
- Nous confronterons alors les résultats donnés par le programme avec le modèle théorique.
Donnons d’ailleurs déjà le modèle théorique pour , une variable aléatoire qui suit la loi binomiale de paramètres et .
Pour déterminer sa loi de probabilité, nous pouvons nous servir de notre calculatrice, d’un tableur, ou tout simplement calculer les probabilités avec la formule apprise en cours.
- Pour tout :
Nous obtenons, en arrondissant à près :
Fonction Python
Fonction Python
- Nous commençons par définir notre fonction , qui prend pour arguments :
- le nombre de répétitions de l’épreuves de Bernoulli (supérieur ou égal à ;
- la probabilité de succès (comprise entre et ) ;
- le nombre de fois que nous souhaitons simuler l’expérience.
- Pour compter combien de fois le nombre de succès obtenus est égal à (compris entre et ) parmi les simulations, nous utilisons une liste de éléments.
Ainsi :
- l’élément de la liste (}} ) contiendra le nombre de fois qu’on a obtenu succès ;
- l’élément de la liste (}} ) contiendra le nombre de fois qu’on a obtenu succès ;
- l’élément de la liste (}} ) contiendra le nombre de fois qu’on a obtenu succès ;
- et cætera.
- Bien sûr, nous initialisons chaque élément à :
- Nous souhaitons simuler fois l’expérience.
- Nous nous servons d’une boucle :
- Nous faisons appel à la fonction que nous avons programmée dans la deuxième partie.
- Celle-ci simule donc la répétition de épreuves de Bernoulli, et donne en retour le nombre de succès obtenus, que nous stockons dans la variable :
- Le nombre de succès obtenus lors de la simulation est .
- Nous incrémentons donc , pour indiquer qu’on obtenu une fois supplémentaire ce nombre de succès :
- Ce qui nous intéresse, c’est, après les simulations, la fréquence d’obtention de succès, pour compris entre et .
- Pour bien le rappeler, nous indiquons que ce sont les fréquences qui sont données ;
\text{print($^{\backprime\backprime}$Fréquences obtenues :$^{\prime\prime}$)} |
- Pour obtenir ces fréquences, nous allons parcourir la liste , toujours au moyen d’une boucle :
- Nous calculons tout simplement chacune des fréquences en prenant le quotient du nombre de fois que succès ont été obtenus (contenu dans ), par le nombre de simulations.
\text{print(k, $^{\backprime\backprime}$succès : $^{\prime\prime}$, L[k] / r)} |
La fonction est terminée :
\begin{aligned} \textcolor{#A9A9A9}{\text{15}}&\quad\text{def freq\textunderscore succes(n, p, r):} \ \textcolor{#A9A9A9}{\text{16}}&\quad\qquad\text{L = [0 for i in range(n + 1)]} \ \textcolor{#A9A9A9}{\text{17}}&\quad\qquad\text{for j in range(r):} \ \textcolor{#A9A9A9}{\text{18}}&\quad\qquad\qquad\text{S = nb\textunderscore succes(n, p)} \ \textcolor{#A9A9A9}{\text{19}}&\quad\qquad\qquad\text{L[S] = L[S] + 1} \ \textcolor{#A9A9A9}{\text{20}}&\quad\qquad\text{print($^{\backprime\backprime}$Fréquences obtenues :$^{\prime\prime}$)} \ \textcolor{#A9A9A9}{\text{21}}&\quad\qquad\text{for k in range(n + 1):} \ \textcolor{#A9A9A9}{\text{22}}&\quad\qquad\qquad\text{print(k, $^{\backprime\backprime}$succès : $^{\prime\prime}$, L[k] / r)} \end{aligned} |
Vous pouvez maintenant exécuter cette fonction, pour la variable aléatoire définie dans la partie précédente, qui suit une loi binomiale de paramètres et . Simulez, pour commencer, un nombre raisonnable de fois l’expérience, afin de vérifier que tout fonctionne bien. Puis simulez-la de fois (en laissant le temps au programme d’exécuter ses multiples boucles – moins d’une dizaine de secondes, normalement).
- Comparez les résultats obtenus avec la loi de probabilité que nous avons donnée.
Récapitulatif
Récapitulatif
Pour terminer, nous rappelons ci-dessous l’ensemble des fonctions programmées dans ce cours.
\begin{aligned} \textcolor{#A9A9A9}{\text{1}}&\quad\text{from random import random} \\ \textcolor{#A9A9A9}{\text{2}}& \\ \textcolor{#A9A9A9}{\text{3}}&\quad\text{def var\textunderscore bernou(p):} \\ \textcolor{#A9A9A9}{\text{4}}&\quad\qquad\text{if random() <= p:} \\ \textcolor{#A9A9A9}{\text{5}}&\quad\qquad\qquad\text{return 1} \\ \textcolor{#A9A9A9}{\text{6}}&\quad\qquad\text{else:} \\ \textcolor{#A9A9A9}{\text{7}}&\quad\qquad\qquad\text{return 0} \\ \textcolor{#A9A9A9}{\text{8}}& \\ \textcolor{#A9A9A9}{\text{9}}&\quad\text{def nb\textunderscore succes(n, p):} \\ \textcolor{#A9A9A9}{\text{10}}&\quad\qquad\text{S = 0} \\ \textcolor{#A9A9A9}{\text{11}}&\quad\qquad\text{for i in range(1, n + 1):} \\ \textcolor{#A9A9A9}{\text{12}}&\quad\qquad\qquad\text{S = S + var\textunderscore bernou(p)} \\ \textcolor{#A9A9A9}{\text{13}}&\quad\qquad\text{return S} \\ \textcolor{#A9A9A9}{\text{14}}& \\ \textcolor{#A9A9A9}{\text{15}}&\quad\text{def freq\textunderscore succes(n, p, r):} \\ \textcolor{#A9A9A9}{\text{16}}&\quad\qquad\text{L = [0 for i in range(n + 1)]} \\ \textcolor{#A9A9A9}{\text{17}}&\quad\qquad\text{for j in range(r):} \\ \textcolor{#A9A9A9}{\text{18}}&\quad\qquad\qquad\text{S = nb\textunderscore succes(n, p)} \\ \textcolor{#A9A9A9}{\text{19}}&\quad\qquad\qquad\text{L[S] = L[S] + 1} \\ \textcolor{#A9A9A9}{\text{20}}&\quad\qquad\text{print($^{\backprime\backprime}$Fréquences obtenues :$^{\prime\prime}$)} \\ \textcolor{#A9A9A9}{\text{21}}&\quad\qquad\text{for k in range(n + 1):} \\ \textcolor{#A9A9A9}{\text{22}}&\quad\qquad\qquad\text{print(k, $^{\backprime\backprime}$succès : $^{\prime\prime}$, L[k] / r)} \end{aligned} |