{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "![En tête general](img/En_tete_general.png)\n", "\n", "\n", "*(C) Copyright Franck CHEVRIER 2019-2021 http://www.python-lycee.com/*\n", "\n", " Pour exécuter une saisie Python, sélectionner la cellule et valider avec SHIFT+Entrée.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Inférence bayésienne (corrigé)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Sommaire \n", "\n", "1. De cause à effet...
\n", "2. ...et de l'effet à la cause.
\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 1. De cause à effet..." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", " \n", "
\n", "On dispose de deux urnes, numérotées 1 et 2 :
\n", "\n", "L'expérience étudiée dans cette activité consiste à lancer une pièce de monnaie équilibrée, puis :
\n", "\n", "\n", "Lorsqu'on souhaite répéter l'expérience, on remet la boule tirée précédemment dans l'urne avant chaque nouveau tirage.
\n", "On donnera les résultats sous la forme de fractions irréductibles.
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "__1.1. On fournit la fonction Python Piece ci-dessous, permettant de simuler le lancer d'une pièce de monnaie équilibrée.__
\n", "$\\quad\\;\\;$__Tester cette fonction et expliquer brièvement son fonctionnement.__
\n", "$\\quad\\;\\;$On conviendra que la fonction renvoie True si on obtient \"Pile\" et False sinon." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "False" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Exécuter cette cellule pour tester la fonction Piece\n", "\n", "from random import*\n", "\n", "def Piece():\n", " \"fonction qui simule le lancer d'une pièce équilibrée\"\n", " return random()<0.5\n", "\n", "Piece()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "__1.2. a. On tire une boule de l'urne n°1. Quelle est la probabilité qu'elle soit rouge ?__
\n", "
\n", "$\\quad\\quad p_{U_1}(R)=\\frac{7}{10}=0,7$\n", "

\n", "$\\quad\\;\\;$__b. Écrire une fonction Python urne_1 permettant de simuler le tirage aléatoire d'une boule de l'urne n°1.__
\n", "$\\quad\\quad\\;$__La fonction renverra True si la boule est rouge et False sinon.__" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "# Écrire ici la fonction urne_1\n", "def urne_1():\n", " \"fonction qui simule le tirage d'une boule dans l'urne n°1\"\n", " return random()<0.7" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Exécuter cette cellule pour tester la fonction urne_1\n", "urne_1()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$\\quad\\;\\;$__c. On tire une boule de l'urne n°2. Quelle est la probabilité qu'elle soit rouge?__
\n", "
\n", "$\\quad\\quad p_{U_2}(R)=\\frac{2}{5}=0,4$\n", "

\n", "$\\quad\\;\\;$__d. Écrire une fonction Python urne_2 permettant de simuler le tirage aléatoire d'une boule de l'urne n°2.__
\n", "$\\quad\\quad\\;\\;$On utilisera la même convention pour les couleurs que dans la fonction urne_1." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "# Écrire ici la fonction urne_2\n", "def urne_2():\n", " \"fonction qui simule le tirage d'une boule dans l'urne n°2\"\n", " return random()<0.4" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Exécuter cette cellule pour tester la fonction urne_2\n", "urne_2()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "__1.3. a. Écrire une fonction Python experience qui simule le protocole de l'expérience :__
\n", "$\\quad\\quad\\;$__Lancer d'une pièce de monnaie puis tirage aléatoire d'une boule dans l'urne correspondante.__
\n", "$\\quad\\quad\\;$__La fonction renverra le booléen True ou False correspondant à la couleur de la boule obtenue.__
\n", "$\\quad\\quad\\;$On utilisera la même convention pour les couleurs que dans les fonctions urne_1 et urne_2.
\n", "$\\quad\\;$__b. Tester cette fonction.__" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'\\n#Autre version\\ndef experience():\\n return urne_1() if Piece() else urne_2()\\n'" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Écrire ici la fonction experience\n", "def experience():\n", " \"fonction qui simule le protocole de l'expérience\"\n", " if Piece():\n", " return urne_1()\n", " else:\n", " return urne_2()\n", " \n", "\"\"\"\n", "#Autre version\n", "def experience():\n", " return urne_1() if Piece() else urne_2()\n", "\"\"\"\n" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Tester la fonction ici\n", "experience()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "__1.5. a. Écrire une fonction Python repetition qui simule successivement 100 fois l'expérience et renvoie le nombre de boules rouges obtenues.__
\n", "$\\quad\\;\\;$__b. Tester cette fonction.__" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "# Écrire ici la fonction\n", "def repetition():\n", " \"fonction qui compte les boules rouges lors de 1000 simulations de l'expérience\"\n", " S=0\n", " for k in range(100):\n", " if experience(): S = S+1\n", " return S\n", " " ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "61" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Tester la fonction ici\n", "repetition()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "__1.6. a. Adapter la fonction repetition pour qu'elle reçoive n en argument et renvoie la fréquence de boules rouges obtenues lors de $n$ expériences.__" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "# Écrire ici la fonction modifiée\n", "def repetition(n):\n", " \"fonction qui renvoie la fréquence de boules rouges lors de n simulations de l'expérience\"\n", " S=0\n", " for k in range(n):\n", " if experience(): S = S+1\n", " return S/n\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$\\quad$__b. Tester cette fonction pour obtenir les fréquences de boules rouges pour $1000$ puis $10000$ expériences successives.__" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.531" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Tester la fonction ici\n", "repetition(1000)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.5456" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Tester la fonction ici\n", "repetition(10000)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "__1.7. a. Réaliser un arbre de probabilités pour modéliser la situation étudiée.__
\n", "$\\quad\\;\\;$On pourra noter respectivement $U_1$ et $R$ les événements \"On a tiré la boule de l'urne n°1\" et \"La boule tirée est Rouge\".
\n", "$\\quad\\;\\;$__b. Calculer la probabilité que la boule obtenue soit rouge. Comparer avec les fréquences obtenues en 1.7.b.__\n", "\n", "
\n", "\n", "$\\quad\\quad$À l'aide d'un arbre de probabilités, on peut établir que :
\n", "$\\displaystyle \\quad\\quad p(R)=p(U_1\\cap R)+p(U_2\\cap R)=p(U_1)p_{U_1}(R)+p(U_2)p_{U_2}(R)=\\frac{1}{2}\\times\\frac{7}{10}+\\frac{1}{2}\\times\\frac{2}{5}=\\frac{11}{20}=0,55$
\n", "

\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 2. ... et de l'effet à la cause.\n", "\n", "Dans cette partie, on va évaluer la probabilité d'une cause connaissant le résultat de l'expérience.
\n", "Ainsi, sachant qu'une boule rouge a été tirée, on souhaite évaluer la probabilité que cette boule ait été tirée de l'urne n°1, c'est à dire la probabilité qu'on ait obtenu \"Pile\" lors du lancer de la pièce de monnaie." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "__2.1. Démontrer le théorème suivant :__

\n", "\n", "
\n", " Théorème de Bayes:

\n", " Étant donné $A$ et $B$ deux événements de probabilités non nulles, on a :

\n", " $$\\displaystyle p_B(A)=\\frac{p_A(B)\\;p(A)}{p(B)}=\\frac{p_A(B)\\;p(A)}{p_A(B)\\;p(A)+p_{\\bar{A}}(B)\\;p(\\bar{A})}$$\n", "
\n", "\n", "

\n", "\n", "$$\\displaystyle p_B(A)=\\frac{p(A\\cap B)}{p(B)}=\\frac{p_A(B)\\;p(A)}{p(B)}=\\frac{p_A(B)\\;p(A)}{p(A\\cap B)+p(A\\cap \\bar{B})}=\\frac{p_A(B)\\;p(A)}{p_A(B)\\;p(A)+p_{\\bar{A}}(B)\\;p(\\bar{A})}$$\n", "
\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "__2.2. À l'aide du théorème de Bayes, déterminer la probabilité que la boule ait été tirée de l'urne n°1 sachant qu'elle est rouge.__\n", "

\n", "\n", "$$\\displaystyle p_R(U_1)=\\frac{p_{U_1}(R)\\;p(U_1)}{p(R)}=\\frac{\\frac{7}{10} \\times \\frac{1}{2} }{\\frac{11}{20}}=\\frac{7}{11}$$\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "__2.3 On souhaite maintenant vérifier expérimentalement les résultats précédents. La fonction Python Synthese donnée ci-dessous permet d'effectuer une répétition de l'expérience et renvoie un tableau consignant une synthèse des résultats obtenus.__

\n", "\n", "$\\quad$__a. Exécuter cette cellule.__
\n", "$\\quad\\;\\;\\;$Attention, l'exécution de cette cellule nécessite que les fonctions Piece, urne_1 et urne_2 aient été définies précédemment.
" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/html": [ " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Lancers de pièces



242 Piles et 258 Faces

Urne n°1

Urne n°2
Tirages des boules



184 boules rouges et 58 boules vertes



93 boules rouges et 165 boules vertes
Total

277 boules rouges et 223 boules vertes
\n", " \n", " " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import IPython ; from IPython.display import display, HTML \n", "\n", "def Synthese(n=500,f=[urne_2,urne_1]): \n", " \"\"\"\n", " Fonction qui génère une liste de n couples contenant chacun :\n", " - une information Pile/Face (True/False)\n", " - une information Rouge/Vert (True/False)\n", " \"\"\"\n", " #f est la liste des fonctions de simulations de tirages dans les urnes\n", " res=[] # stockage des résultats (True pour urne n°1, False pour urne n°2)\n", " \n", " for k in range(n): \n", " Choix=Piece() # lancer d'une pièce\n", " res.append((Choix,(f[Choix]()))) # ajout du couple pièce/boule dans la liste des résultats\n", " \n", " return res\n", " \n", " \n", "def Genere_html(res):\n", " \"\"\"\n", " Fonction qui génère un affichage de la liste des résultats (format html)\n", " \"\"\"\n", " \n", " #code html pour la pièce (Face et Pile)\n", " Piece_img=\"\",\"\"\n", " \n", " #code html pour les boules colorées (Rouges et vertes)\n", " boule_coloree_img = \"\",\"\"\n", " \n", " #calculs et génération des affichages (pièces et boules):\n", " pieces=\"\"\n", " contenu_urne={True:\"\",False:\"\"}\n", " nb_faces=0\n", " nb_rouges=[0,0]\n", " for couple in res:\n", " piece,couleur=couple\n", " pieces+=Piece_img[piece]\n", " contenu_urne[piece]+=boule_coloree_img[couleur]\n", " nb_rouges[piece]+=couleur\n", " nb_faces+=piece\n", " nb_piles=len(res)-nb_faces\n", " \n", " #en-tête du rendu html (avec balise de style) \n", " html=\"\"\n", " html+=\"\"\" \n", " \n", " \n", " \n", " \n", " \"\"\"\n", " #corps du rendu html\n", " html+=\"\"\"\n", " \n", " \n", " \n", " \n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Lancers de pièces

\"\"\"+pieces+\"

\"+str(nb_piles)+\" Piles et \"+str(nb_faces)+\"\"\" Faces

Urne n°1

Urne n°2
Tirages des boules

\"\"\"+contenu_urne[True]+\"

\"+str(nb_rouges[True])+\" boules rouges et \"+str(nb_piles-nb_rouges[True])+\"\"\" boules vertes

\"\"\"+contenu_urne[False]+\"

\"+str(nb_rouges[False])+\" boules rouges et \"+str(nb_faces-nb_rouges[False])+\"\"\" boules vertes
Total

\"\"\"+str(sum(nb_rouges))+\" boules rouges et \"+str(len(res)-sum(nb_rouges))+\"\"\" boules vertes
\n", " \n", " \"\"\"\n", " html+=\"\"\n", " return html\n", " \n", "display(HTML(Genere_html(Synthese())))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$\\quad$__b. Calculer, parmi les boules tirées de l'urne n°1, la fréquence de celles qui sont rouges. Comparer avec la réponse à la question 1.2.a.__
\n", "$\\quad$__c. Calculer la fréquence de boules rouges parmi toutes les boules tirées. Comparer avec la réponse à la question 1.7.b.__
\n", "$\\quad$__d. Calculer, parmi les boules rouges tirées, la fréquence de celles qui ont été tirées de l'urne n°1. Comparer avec la réponse à la question 2.2.__
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "![Thomas_Bayes](img/Thomas_Bayes.png)\n", "\n", "
Thomas Bayes (1702-1761)
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "*(C) Copyright Franck CHEVRIER 2019-2021 http://www.python-lycee.com/*\n" ] } ], "metadata": { "celltoolbar": "Raw Cell Format", "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.9" } }, "nbformat": 4, "nbformat_minor": 2 }