Médaille
N°1 pour apprendre & réviser du collège au lycée.
Simulation d’une variable aléatoire de loi géométrique - 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 géométrique en langage Python.
Nous rappellerons rapidement la définition de la loi géométrique, et nous donnerons les probabilités sur un exemple.
Ensuite, nous écrirons un programme Python qui simulera un certain nombre de fois une variable aléatoire de loi géométrique et donnera les différentes fréquences obtenues, que nous confronterons au modèle théorique.

Pour revoir les différentes notions de probabilité qui vont être traitées dans cette fiche :

Loi géométrique

On considère une épreuve de Bernoulli où la probabilité de succès est pp.
Soit XX la variable aléatoire qui donne le nombre de répétitions de l’épreuve nécessaires pour obtenir le premier succès :

  • si on obtient le premier succès dès la première épreuve, XX prendra la valeur 11 ;
  • si on obtient le premier succès à la deuxième épreuve, XX prendra la valeur 22 ;
  • et cætera.
  • Alors on dit que XX suit une loi géométrique de paramètre pp.
bannière propriete

Propriété

La probabilité que XX prenne la valeur kk (kk entier naturel non nul) est alors donnée par la formule :

P(X=k)=p(1p)k\text{P}(X=k)=p(1-p)^k

bannière exemple

Exemple

Soit XX une variable aléatoire qui suit la loi géométrique de paramètre p=38p=\frac 38.
Le tableau ci-dessous donne sa loi de probabilité (jusqu’à k=15k=15) ; nous y mettons aussi les probabilités cumulées :

k\footnotesize k 1\footnotesize 1 2\footnotesize 2 3\footnotesize 3 4\footnotesize 4 5\footnotesize 5 6\footnotesize 6 7\footnotesize 7
p(X=k)\footnotesize p(X=k) 0,3750\footnotesize 0,3750 0,2344\footnotesize 0,2344 0,1465\footnotesize 0,1465 0,0916\footnotesize 0,0916 0,0572\footnotesize 0,0572 0,0358\footnotesize 0,0358 0,0224\footnotesize 0,0224
p(Xk)\footnotesize p(X\leq k) 0,3750\footnotesize 0,3750 0,6094\footnotesize 0,6094 0,7559\footnotesize 0,7559 0,8474\footnotesize 0,8474 0,9046\footnotesize 0,9046 0,9404\footnotesize 0,9404 0,9627\footnotesize 0,9627

8\footnotesize 8 9\footnotesize 9 10\footnotesize 10 11\footnotesize 11 12\footnotesize 12 13\footnotesize 13 14\footnotesize 14 15\footnotesize 15
0,0140\footnotesize 0,0140 0,0087\footnotesize 0,0087 0,0055\footnotesize 0,0055 0,0034\footnotesize 0,0034 0,0021\footnotesize 0,0021 0,0013\footnotesize 0,0013 0,0008\footnotesize 0,0008 0,0005\footnotesize 0,0005
0,9767\footnotesize 0,9767 0,9854\footnotesize 0,9854 0,9909\footnotesize 0,9909 0,9943\footnotesize 0,9943 0,9964\footnotesize 0,9964 0,9978\footnotesize 0,9978 0,9986\footnotesize 0,9986 0,9991\footnotesize 0,9991

Programme Python

Épreuve de Bernoulli

Nous avons besoin de simuler une épreuve de Bernoulli.

  • Nous nous servons pour cela de la fonction varbernou\purple{\text{var\textunderscore bernou}}bernou, que nous avons expliquée et programmée dans la fiche sur les variables de Bernoulli :

    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

    Simulation d’une variable aléatoire de loi géométrique

    Ici, nous allons programmer une petite fonction qui simulera une variable aléatoire qui suit une loi géométrique de paramètre pp.
    Pour cela, nous allons faire appel à la fonction varbernou\purple{\text{var\textunderscore bernou}}bernou pour simuler la variable de Bernoulli associée, et nous le ferons tant qu’elle n’obtiendra pas un succès, c’est-à-dire tant qu’elle ne retournera pas 11.

    • Dès qu’elle l’aura obtenu, nous nous arrêterons et nous noterons le nombre de fois que l’épreuve de Bernoulli aura été répétée.
    • Commençons par définir la fonction geo\purple{\text{geo}}, qui prend pour argument la probabilité de succès p\purple{\text{p}}.

    def geo(p):\text{def geo(p):}
    • Nous avons besoin de compter le nombre de répétitions nécessaires pour obtenir un succès.
    • Nous initialisons pour cela un compteur E\purple{\text{E}} à 11 (il faudra évidemment au moins 11 épreuve pour obtenir un succès…) :

    E = 1\text{E = 1}
    • Tant que nous n’aurons pas obtenu un succès, autrement dit, tant que nous obtiendrons un échec, nous répéterons l’épreuve de Bernoulli.
    • Nous nous servons d’une boucle while\purple{\text{while}} et, dans la condition, nous faisons appel à la fonction varbernou\purple{\text{var\textunderscore bernou}}bernou pour regarder s’il y a échec :

      while varbernou(p) == 0:\text{while var\textunderscore bernou(p) == 0:}bernou(p) == 0:
      • Si c’est un échec, nous comptabilisons l’épreuve :

      E = E + 1\text{E = E + 1}
      • Dès que c’est un succès, nous sortons de la boucle.
        E\purple{\text{E}} contient alors le nombre d’épreuves nécessaires pour obtenir le premier succès.
      • Nous demandons alors à la fonction de renvoyer la valeur contenue dans E\purple{\text{E}}.
      bannière à retenir

      À retenir

      La fonction est terminée :

      9def geo(p):10E = 111while varbernou(p) == 0:12E = E + 113return E\begin{aligned} \textcolor{#A9A9A9}{\text{9}}&\quad\text{def geo(p):} \ \textcolor{#A9A9A9}{\text{10}}&\quad\qquad\text{E = 1} \ \textcolor{#A9A9A9}{\text{11}}&\quad\qquad\text{while var\textunderscore bernou(p) == 0:} \ \textcolor{#A9A9A9}{\text{12}}&\quad\qquad\qquad\text{E = E + 1} \ \textcolor{#A9A9A9}{\text{13}}&\quad\qquad\text{return E} \end{aligned}bernou(p) == 0:E = E + 1return E
      bannière exemple

      Exemple

      Illustrons par deux petits exemples ce qui se passe exactement.

      Épreuve 1

      • E\purple{\text{E}} vaut 11.
      • varbernou\purple{\text{var\textunderscore bernou}}bernou renvoie un échec.
      • On incrémente E\purple{\text{E}}, qui vaut désormais 22.
      • Et on relance la boucle.
      • Épreuve 2

        • E\purple{\text{E}} vaut 22.
        • varbernou\purple{\text{var\textunderscore bernou}}bernou renvoie un échec.
        • On incrémente E\purple{\text{E}}, qui vaut désormais 33.
        • Et on relance la boucle.
        • Épreuve 3

          • E\purple{\text{E}} vaut 33.
          • varbernou\purple{\text{var\textunderscore bernou}}bernou renvoie un succès.
          • On sort de la boucle, sans incrémenter E\purple{\text{E}}.
          • E\purple{\text{E}} vaut alors 33, ce qui est bien le nombre d’épreuves nécessaires pour obtenir le premier succès.
          • Épreuve 1

            • E\purple{\text{E}} vaut 11.
            • varbernou\purple{\text{var\textunderscore bernou}}bernou renvoie un succès.
            • On n’exécute pas la boucle.
            • E\purple{\text{E}} vaut alors 11, on a obtenu un succès dès la première épreuve.
            • Fréquences d’obtention du premier succès

              Maintenant que notre fonction de simulation d’une variable de loi géométrique est faite, nous allons y faire appel un certain nombre de fois, afin de la simuler à plusieurs reprises.

              • Nous noterons alors, à chaque simulation, si le nombre de répétitions nécessaires pour obtenir le premier succès est égal à un entier naturel kk donné, et nous afficherons la fréquence associée.
              • Nous définissons la fonction, que nous nommons freqgeo\purple{\text{freq\textunderscore geo}}geo ; elle prendra pour arguments :
              • la probabilité de succès p\purple{\text{p}} de l’épreuve de Bernoulli associée ;
              • le nombre k\purple{\text{k}} d’épreuves nécessaires pour obtenir le premier succès auquel on s’intéresse ;
              • le nombre r\purple{\text{r}} de simulations de la variable que l’on souhaite.
              • def freqgeo(p, k, r):\text{def freq\textunderscore geo(p, k, r):}geo(p, k, r):
                • Nous allons compter combien de fois le nombre d’épreuves nécessaires est égal à k\purple{\text{k}}.
                • Nous nous servirons pour cela d’un compteur c\purple{\text{c}}, que nous initialisons à 0\purple{\text{0}} :

                c = 0\text{c = 0}
                • Nous simulons r\purple{\text{r}} fois l’expérience, comme d’habitude au moyen d’un boucle for\purple{\text{for}} :

                for i in range(r):\text{for i in range(r):}
                • Nous simulons une expérience grâce à la fonction que nous avons programmée dans la partie précédente, et regardons si la valeur renvoyée (soit le nombre de répétitions nécessaires pour obtenir le premier succès) est égale à k\purple{\text{k}}.
                • Auquel cas, nous le comptabilisons en incrémentant c\purple{\text{c}} :

                if(geo(p) == k):c = c + 1\begin{aligned} &\text{if(geo(p) == k):} \ &\qquad\text{c = c + 1} \end{aligned}
                • C’est la fréquence avec laquelle le premier succès a été obtenu à la k-ieˋme\purple{\text{k}}\text{-ième} épreuve qui nous intéresse.
                • Nous la calculons en divisant c\purple{\text{c}} par r\purple{\text{r}}, et nous l’affichons.

                print(Freˊquence d’obtention du premier succeˋaˋ l’eˊpreuve , k, )print(c / r)\begin{aligned} &\text{print($^{\backprime\backprime}$Fréquence d'obtention du premier succès à l'épreuve $^{\prime\prime}$, k, $^{\backprime\backprime}$: $^{\prime\prime}$)} \ &\text{print(c / r)} \end{aligned}
                bannière à retenir

                À retenir

                La fonction est terminée :

                15def freqgeo(p, k, r):16c = 017for i in range(r):18if(geo(p) == k):19¨C11Cc = c + 120¨C12C¨C13Cprint(Freˊquence d’obtention du premier succeˋs¨C14CXX22aˋ l’eˊpreuve , k, )21¨C17C¨C18Cprint(c / r)\begin{aligned} \textcolor{#A9A9A9}{\text{15}}&\quad\text{def freq\textunderscore geo(p, k, r):} \ \textcolor{#A9A9A9}{\text{16}}&\quad\qquad\text{c = 0} \ \textcolor{#A9A9A9}{\text{17}}&\quad\qquad\text{for i in range(r):} \ \textcolor{#A9A9A9}{\text{18}}&\quad\qquad\qquad\text{if(geo(p) == k):} \ \textcolor{#A9A9A9}{\text{19}}&\quad\qquad\qquad\qquad\text{c = c + 1} \ \textcolor{#A9A9A9}{\text{20}}&\quad\qquad\text{print($^{\backprime\backprime}$Fréquence d'obtention du premier succès} \ &\quad\qquad\quad\text{à l’épreuve $^{\prime\prime}$, k, $^{\backprime\backprime}$: $^{\prime\prime}$)} \ \textcolor{#A9A9A9}{\text{21}}&\quad\qquad\text{print(c / r)} \end{aligned}geo(p, k, r):c = 0for i in range(r):if(geo(p) == k):c = c + 1print(Freˊquence d’obtention du premier succeˋsaˋ l’eˊpreuve , k, )print(c / r)

                Simulez grâce à cette fonction un grand nombre de fois (100000100\,000, ou carrément 10000001\,000\,000) la variable XX qui suit une loi géométrique de paramètre p=38p=\frac 38, en cherchant, par exemple, la fréquence d’obtention du premier succès à l’épreuve 55.
                Laissez tourner l’algorithme, puis comparez le résultat avec la probabilité théorique P(X=5)\text{P}(X = 5) donnée dans le tableau de la première partie.

                • Vous pouvez faire de même avec k\purple{\text{k}} compris 11 à 1515, en comparant à chaque fois avec la probabilité théorique du tableau.
                bannière attention

                Attention

                Si vous entrez pour paramètre de loi géométrique une très petite probabilité de succès (par exemple 0,0010,001), alors il est très probable que le programme doive répéter un grand nombre de fois l’épreuve de Bernoulli associée pour obtenir le premier succès.
                Si en plus vous simulez cette variable aléatoire un grand nombre de fois, cela risque de prendre beaucoup de temps… voire d’excéder la capacité que le serveur vous alloue.

                Fréquences cumulées

                Pour terminer, donnons le programme qui permet de déterminer la fréquence avec laquelle le premier succès est rencontré au plus tard à l’épreuve kk.

                • Cette fréquence sera à rapprocher de la probabilité P(Xk)\text{P}(X \leq k).

                Cette fonction Python est très proche de freqgeo\purple{\text{freq\textunderscore geo}}geo : au lieu de comptabiliser quand la fonction geo\purple{\text{geo}} renvoie k\purple{\text{k}}, nous comptabiliserons à chaque fois que le résultat retourné est inférieur ou égal à k\purple{\text{k}}.

                • Nous ne la détaillons donc pas.
                bannière à retenir

                À retenir

                Nous nommons cette fonction freqcumgeo\purple{\text{freq\textunderscore cum\textunderscore geo}} ; elle prend les mêmes arguments que freqgeo\purple{\text{freq\textunderscore geo}}geo :

                23def freqcumgeo(p, k, r):24c = 025for i in range(r):26if(geo(p) <= k):27¨C11Cc = c + 128¨C12C¨C13Cprint(Freˊquence d’obtention du premier succeˋs¨C14C¨C15C¨C16Cau plus tard aˋ l’eˊpreuve , k, )29¨C17C¨C18Cprint(c / r)\begin{aligned} \textcolor{#A9A9A9}{\text{23}}&\quad\text{def freq\textunderscore cum\textunderscore geo(p, k, r):} \ \textcolor{#A9A9A9}{\text{24}}&\quad\qquad\text{c = 0} \ \textcolor{#A9A9A9}{\text{25}}&\quad\qquad\text{for i in range(r):} \ \textcolor{#A9A9A9}{\text{26}}&\quad\qquad\qquad\text{if(geo(p) <= k):} \ \textcolor{#A9A9A9}{\text{27}}&\quad\qquad\qquad\qquad\text{c = c + 1} \ \textcolor{#A9A9A9}{\text{28}}&\quad\qquad\text{print($^{\backprime\backprime}$Fréquence d'obtention du premier succès} \ &\quad\qquad\quad\text{au plus tard à l’épreuve $^{\prime\prime}$, k, $^{\backprime\backprime}$: $^{\prime\prime}$)} \ \textcolor{#A9A9A9}{\text{29}}&\quad\qquad\text{print(c / r)} \end{aligned}

                Récapitulatif

                Nous rappelons ci-dessous l’ensemble des fonctions programmées dans cette fiche :

                1from random import random23def varbernou(p):4if random() <= p:5return 16else:7¨C11Creturn 089¨C12Cdef geo(p):10¨C13C¨C14CE = 111¨C15C¨C16Cwhile varbernou(p) == 0:12¨C17C¨C18C¨C19CE = E + 113¨C20C¨C21Creturn E1415¨C22Cdef freqgeo(p, k, r):16¨C23C¨C24Cc = 017¨C25C¨C26Cfor i in range(r):18¨C27C¨C28C¨C29Cif(geo(p) == k):19XX¨C31C¨C32C¨C33Cc = c + 120¨C34C¨C35Cprint(Freˊquence d’obtention du premier succeˋs¨C36C¨C37Cvarbernou\purple{\text{var\textunderscore bernou}}aˋ l’eˊpreuve , k, )21¨C39C¨C40Cprint(c / r)2223¨C41Cdef freqcumgeo(p, k, r):24¨C42C¨C43Cc = 025¨C44C¨C45Cfor i in range(r):26¨C46Cgeo\purple{\text{geo}}p\purple{\text{p}}if(geo(p) <= k):27¨C49C¨C50C¨C51C¨C52Cc = c + 128¨C53C¨C54Cprint(Freˊquence d’obtention du premier succeˋs¨C55C¨C56C¨C57Cau plus tard aˋ l’eˊpreuve , k, )29¨C58C¨C59Cprint(c / r)\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 geo(p):} \ \textcolor{#A9A9A9}{\text{10}}&\quad\qquad\text{E = 1} \ \textcolor{#A9A9A9}{\text{11}}&\quad\qquad\text{while var\textunderscore bernou(p) == 0:} \ \textcolor{#A9A9A9}{\text{12}}&\quad\qquad\qquad\text{E = E + 1} \ \textcolor{#A9A9A9}{\text{13}}&\quad\qquad\text{return E} \ \textcolor{#A9A9A9}{\text{14}}& \ \textcolor{#A9A9A9}{\text{15}}&\quad\text{def freq\textunderscore geo(p, k, r):} \ \textcolor{#A9A9A9}{\text{16}}&\quad\qquad\text{c = 0} \ \textcolor{#A9A9A9}{\text{17}}&\quad\qquad\text{for i in range(r):} \ \textcolor{#A9A9A9}{\text{18}}&\quad\qquad\qquad\text{if(geo(p) == k):} \ \textcolor{#A9A9A9}{\text{19}}&\quad\qquad\qquad\qquad\text{c = c + 1} \ \textcolor{#A9A9A9}{\text{20}}&\quad\qquad\text{print($^{\backprime\backprime}$Fréquence d'obtention du premier succès} \ &\quad\qquad\quad\text{à l’épreuve $^{\prime\prime}$, k, $^{\backprime\backprime}$: $^{\prime\prime}$)} \ \textcolor{#A9A9A9}{\text{21}}&\quad\qquad\text{print(c / r)} \ \textcolor{#A9A9A9}{\text{22}}& \ \textcolor{#A9A9A9}{\text{23}}&\quad\text{def freq\textunderscore cum\textunderscore geo(p, k, r):} \ \textcolor{#A9A9A9}{\text{24}}&\quad\qquad\text{c = 0} \ \textcolor{#A9A9A9}{\text{25}}&\quad\qquad\text{for i in range(r):} \ \textcolor{#A9A9A9}{\text{26}}&\quad\qquad\qquad\text{if(geo(p) <= k):} \ \textcolor{#A9A9A9}{\text{27}}&\quad\qquad\qquad\qquad\text{c = c + 1} \ \textcolor{#A9A9A9}{\text{28}}&\quad\qquad\text{print($^{\backprime\backprime}$Fréquence d'obtention du premier succès} \ &\quad\qquad\quad\text{au plus tard à l’épreuve $^{\prime\prime}$, k, $^{\backprime\backprime}$: $^{\prime\prime}$)} \ \textcolor{#A9A9A9}{\text{29}}&\quad\qquad\text{print(c / r)} \end{aligned}bernou(p):if random() <= p:return 1else:return 0def geo(p):E = 1while varbernou(p) == 0:E = E + 1return Edef freqgeo(p, k, r):c = 0for i in range(r):if(geo(p) == k):c = c + 1print(Freˊquence d’obtention du premier succeˋsaˋ l’eˊpreuve , k, )print(c / r)def freqcumgeo(p, k, r):c = 0for i in range(r):if(geo(p) <= k):c = c + 1print(Freˊquence d’obtention du premier succeˋsau plus tard aˋ l’eˊpreuve , k, )print(c / r)