Médaille
N°1 pour apprendre & réviser du collège au lycée.
Simulation d'une variable de Bernoulli et schéma de Bernoulli - Python
Découvrez, sur SchoolMouv, des milliers de contenus pédagogiques, du CP à la Terminale, rédigés par des enseignants de l’Éducation nationale.
Les élèves de troisième, de première ou de terminale bénéficient, en plus, de contenus spécifiques pour réviser efficacement leur brevet des collèges, leur bac de français ou leur baccalauréat édition 2023.
Fiche méthode

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 [0 ;1][0\ ;\, 1].
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 :

Simulation d’une variable de Bernoulli

Loi uniforme sur [0 ;1][0\ ;\, 1]

Soit YY une variable aléatoire qui suit la loi uniforme sur [0 ;1][0\ ;\, 1].
Nous savons alors que :

  • la densité de probabilité de YY est la fonction constante ff définie sur [0 ;1][0\ ;\, 1] par :

f(x)=1f(x)=1

  • la fonction de répartition est la fonction FF définie sur R\mathbb R par :

{F(x)=0si x<0F(x)=xsi x[0 ;1]F(x)=1si x>0\begin{cases} F(x)=0 &\textcolor{#A9A9A9}{\text{si $x < 0$}} \ F(x)=x &\textcolor{#A9A9A9}{\text{si $x\in[0\ ;\, 1]$}} \ F(x)=1 &\textcolor{#A9A9A9}{\text{si $x > 0$}} \end{cases}

  • Ainsi, pour tout p[0 ;1]p\in [0\ ;\, 1] :

P(Xp)=p\text{P}(X \leq p)=p

bannière à retenir

À retenir

En Python, pour simuler la loi uniforme sur [0 ;1][0\ ;\, 1], nous utilisons la fonction random()\purple{\text{random()}} – qui ne prend pas d’arguments –, disponible dans le module random\purple{\text{random}}.

Cette fonction prendra un nombre au hasard dans l’intervalle [0 ;1[[0\ ;\, 1[.
11 est exclu, mais ce n’est pas gênant puisque nous travaillons avec une variable aléatoire continue :

P(0Y1)=P(0Y<1)=1\text{P}(0\leq Y \leq 1)= \text{P}(0\leq Y < 1)=1

Ainsi, la probabilité que le nombre renvoyé par random()\purple{\text{random()}} soit inférieur ou égal à un réel pp est égale à pp.

  • C’est exactement ce dont nous avons besoin pour simuler une variable aléatoire XX qui suit la loi de Bernoulli de paramètre pp !

En effet, nous considérons que :

  • la probabilité que random()\purple{\text{random()}} renvoie un nombre compris entre 00 et pp est égale à pp,
  • c’est alors un succès et XX prend la valeur 11 ;
  • la probabilité que random()\purple{\text{random()}} renvoie un nombre compris entre pp et 11 est égale à 1p1-p,
  • c’est alors un échec et XX prend la valeur 00.
bannière astuce

Astuce

Considérons une variable aléatoire qui suit la loi de Bernoulli de paramètre 0,50,5. Autrement dit, la probabilité d’obtenir un succès est égale à la probabilité d’obtenir un échec, soit 0,50,5.

On peut alors faire appel à la fonction randint(0,1)\purple{\text{randint(0,1)}} , aussi disponible dans le module random\purple{\text{random}}.

  • Celle-ci choisira au hasard un entier compris entre 00 et 11, soit 00 ou 11.

C’est d’ailleurs cela que nous faisons dans l’algorithme qui simule une planche de Galton.

Programme Python

Nous allons ici écrire un programme Python, qui simulera une variable suivant une loi de Bernoulli de paramètre pp.

  • Elle retournera 11 avec une probabilité pp, et 00 avec une probabilité 1p1-p.
  • Nous commençons par importer la fonction random()\purple{\text{random()}} :

from random import random\text{from random import random}
  • Nous créons la fonction varbernou\purple{\text{var\textunderscore bernou}}bernou, qui prend donc en argument un nombre p\purple{\text{p}} compris entre 00 et 11.

    def varbernou(p):\text{def var\textunderscore bernou(p):}bernou(p):
    • Nous exécutons la fonction random\purple{\text{random}} et considérons le cas où le nombre renvoyé est inférieur à p\purple{\text{p}}.
    • Si c’est le cas, il s’agit d’un succès, et la fonction varbernou\purple{\text{var\textunderscore bernou}}bernou renvoie 1\purple{\text{1}}.

      if random() <= preturn 1\begin{aligned} &\text{if random() <= p} \ &\qquad\text{return 1} \end{aligned}
      • On s’intéresse au cas contraire, c’est-à-dire lorsque le nombre renvoyé par random()\purple{\text{random()}} est supérieur à p\purple{\text{p}}.
      • Il s’agit alors d’un échec, et la fonction renvoie 0\purple{\text{0}}.

      elsereturn 0\begin{aligned} &\text{else} \ &\qquad\text{return 0} \end{aligned}
      bannière à retenir

      À retenir

      La fonction est terminée :

      1from random import random23def varbernou(p):4if random() <= p:5return 16else:7¨C11Creturn 0\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} \end{aligned}bernou(p):if random() <= p:return 1else:return 0

      Nombre de succès dans un schéma de Bernoulli

      Prérequis

      Nous nous intéressons maintenant à une variable aléatoire XX qui donne le nombre de succès obtenus lors de nn répétitions identiques et indépendante d’une épreuve de Bernoulli, où la probabilité de succès est pp.

      • 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 nn 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 varbernou\purple{\text{var\textunderscore bernou}}bernou nn fois, et d’ajouter au fur et à mesure la valeur qu’elle renvoie.

        Programme Python

        • Commençons par définir notre fonction nbsucces\purple{\text{nb\textunderscore succes}}succes, qui prend en paramètres :
        • le nombre de fois n\purple{\text{n}} que l’on répète l’épreuve de Bernoulli ;
        • la probabilité de succès p\purple{\text{p}} dans l’épreuve de Bernoulli.
        • def nbsucces(n, p):\text{def nb\textunderscore succes(n, p):}succes(n, p):
          • Nous allons compter le nombre de succès. Nous initialisons une variable S\purple{\text{S}} à 0\purple{\text{0}}.
          • C’est cette variable qui sera incrémentée à chaque fois que l’on obtiendra un succès.

          S = 0\text{S = 0}
          • Nous répétons n\purple{\text{n}} fois l’épreuve.
          • Nous créons donc une boucle for\purple{\text{for}} qui s’exécutera n\purple{\text{n}} fois :

          for i in range(1, n + 1):\text{for i in range(1, n + 1):}
          • À chaque boucle, nous faisons appel à la fonction varbernou\purple{\text{var\textunderscore bernou}}bernou. Et nous ajoutons son résultat à S\purple{\text{S}} :
          • si on a obtenu un succès, varbernou\purple{\text{var\textunderscore bernou}}bernou renvoie 11, et nous comptabilisons donc bien ce succès dans S\purple{\text{S}} ;
          • si on a obtenu un échec, varbernou\purple{\text{var\textunderscore bernou}}bernou renvoie 00, et S\purple{\text{S}} ne sera pas modifié.

            S = S + varbernou(p)\text{S = S + var\textunderscore bernou(p)}bernou(p)
            • Au sortir de la boucle, S\purple{\text{S}} contiendra donc le nombre de succès obtenus après la répétition des n\purple{\text{n}} épreuves.
            • Nous demandons à la fonction de retourner sa valeur :

            return S\text{return S}
            bannière à retenir

            À retenir

            La fonction est terminée :

            9def nbsucces(n, p):10S = 011for i in range(1, n + 1):12S = S + varbernou(p)13return S\begin{aligned} \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} \end{aligned}

            Fréquence des succès

            Loi binomiale

            La variable aléatoire XX que nous avons définie dans la deuxième partie suit une loi binomiale de paramètres nn et pp.
            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 XX, une variable aléatoire qui suit la loi binomiale de paramètres n=9n=9 et p=38p=\frac 38.
            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 k{0,1,2,,8,9}k\in \lbrace 0,\,1,\,2,\,…,\,8,\,9\rbrace :

            P(X=k)=(9k)×(38)k×(58)9k\text{P}(X=k)=\begin{pmatrix} 9 \ k \end{pmatrix}\times \left(\dfrac 38\right)^k\times \left(\dfrac 58\right)^{9-k}

            Nous obtenons, en arrondissant à 10410^{-4} près :

            k\scriptsize k 0\scriptsize 0 1\scriptsize 1 2\scriptsize 2 3\scriptsize 3 4\scriptsize 4 5\scriptsize 5 6\scriptsize 6 7\scriptsize 7 8\scriptsize 8 9\scriptsize 9
            P(X=k)\scriptsize \text P(X=k) 0,0146\scriptsize 0,0146 0,0786\scriptsize 0,0786 0,1886\scriptsize 0,1886 0,2640\scriptsize 0,2640 0,2376\scriptsize 0,2376 0,1426\scriptsize 0,1426 0,0570\scriptsize 0,0570 0,0147\scriptsize 0,0147 0,0022\scriptsize 0,0022 0,0001\scriptsize 0,0001

            Fonction Python

            • Nous commençons par définir notre fonction freqsucces\purple{\text{freq\textunderscore succes}}succes, qui prend pour arguments :
            • le nombre n\purple{\text{n}} de répétitions de l’épreuves de Bernoulli (supérieur ou égal à 1)1) ;
            • la probabilité p\purple{\text{p}} de succès (comprise entre 00 et 11) ;
            • le nombre r\purple{\text{r}} de fois que nous souhaitons simuler l’expérience.
            • def freqsucces(n, p, r):\text{def freq\textunderscore succes(n, p, r):}succes(n, p, r):
              • Pour compter combien de fois le nombre de succès obtenus est égal à kk (compris entre 00 et nn) parmi les r\purple{\text{r}} simulations, nous utilisons une liste L\purple{\text{L}} de n+1n+1 éléments.

              Ainsi :

              • l’élément 00 de la liste (L\purple{\text{L}}) contiendra le nombre de fois qu’on a obtenu 00 succès ;
              • l’élément 11 de la liste (L\purple{\text{L}}) contiendra le nombre de fois qu’on a obtenu 11 succès ;
              • l’élément 22 de la liste (L\purple{\text{L}}) contiendra le nombre de fois qu’on a obtenu 22 succès ;
              • et cætera.
              • Bien sûr, nous initialisons chaque élément à 00 :

              L = [0 for i in range(n + 1)]\text{L = [0 for i in range(n + 1)]}
              • Nous souhaitons simuler r\purple{\text{r}} fois l’expérience.
              • Nous nous servons d’une boucle for\purple{\text{for}} :

              for j in range(r):\text{for j in range(r):}
              • Nous faisons appel à la fonction nbsucces\purple{\text{nb\textunderscore succes}}succes que nous avons programmée dans la deuxième partie.
              • Celle-ci simule donc la répétition de n\purple{\text{n}} épreuves de Bernoulli, et donne en retour le nombre de succès obtenus, que nous stockons dans la variable S\purple{\text{S}} :
              • S = nbsucces(n, p)\text{S = nb\textunderscore succes(n, p)}succes(n, p)
                • Le nombre de succès obtenus lors de la simulation est S\purple{\text{S}}.
                • Nous incrémentons donc L[S]\purple{\text{L[S]}}, pour indiquer qu’on obtenu une fois supplémentaire ce nombre de succès :

                L[S] = L[S] + 1\text{L[S] = L[S] + 1}
                • Ce qui nous intéresse, c’est, après les r\purple{\text{r}} simulations, la fréquence d’obtention de kk succès, pour kk compris entre 00 et n\purple{\text{n}}.
                • 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 L\purple{\text{L}}, toujours au moyen d’une boucle for\purple{\text{for}} :

                for k in range(n + 1):\text{for k in range(n + 1):}
                • Nous calculons tout simplement chacune des fréquences en prenant le quotient du nombre de fois que k\purple{\text{k}} succès ont été obtenus (contenu dans L[k]\purple{\text{L[k]}}), par le nombre r\purple{\text{r}} de simulations.

                \text{print(k, $^{\backprime\backprime}$succès : $^{\prime\prime}$, L[k] / r)}
                bannière à retenir

                À retenir

                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 n=9n=9 et p=38p=\frac 38. Simulez, pour commencer, un nombre raisonnable de fois l’expérience, afin de vérifier que tout fonctionne bien. Puis simulez-la 10000001\,000\,000 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

                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}