+Sinon, une méthode plus simple à comprendre et ne faisant pas
+intervenir d'appel à la fonction sinus se base sur le fait que si
+\(X\tilde U(0, 1)\) et \(Y\tilde U(0, 1)\) alors \(P[X^2+Y^2 \leq 1]=\pi /4\)
+(voir méthode de Monte Carle sur
+Wikipedia. Le
+code suivant illustre ce fait:
+
+
+
diff --git a/module2/exo1/toy_document_orgmode_python_fr.org b/module2/exo1/toy_document_orgmode_python_fr.org
index 96675725a8449c83e50a3bb45c85aecd2b125e3e..039857c6949e9c1e40b1df8e21a0ae8b4782a53e 100644
--- a/module2/exo1/toy_document_orgmode_python_fr.org
+++ b/module2/exo1/toy_document_orgmode_python_fr.org
@@ -25,7 +25,7 @@ math.pi
* En utilisant la méthode des aiguilles de Buffon
-Mais calculé avec la *méthode* des[[(https://fr.wikipedia.org/wiki/Aiguille_de_Buffon][aiguilles de
+Mais calculé avec la *méthode* des[(https://fr.wikipedia.org/wiki/Aiguille_de_Buffon][aiguilles de
Buffon]], on
obtiendrait comme *approximation*:
@@ -46,7 +46,7 @@ theta = np.random.uniform(size=N, low=0, high=math.pi/2)
Sinon, une méthode plus simple à comprendre et ne faisant pas
intervenir d'appel à la fonction sinus se base sur le fait que si
\(X\tilde U(0, 1)\) et \(Y\tilde U(0, 1)\) alors \(P[X^2+Y^2 \leq 1]=\pi /4\)
-(voir [[(https://fr.wikipedia.org/wiki/M%C3%A9thode_de_Monte-Carlo#D%C3%A9termination_de_la_valeur_de_%CF%80][méthode de Monte Carle sur
+(voir [[https://fr.wikipedia.org/wiki/M%C3%A9thode_de_Monte-Carlo#D%C3%A9termination_de_la_valeur_de_%CF%80][méthode de Monte Carle sur
Wikipedia]]. Le
code suivant illustre ce fait:
diff --git a/module2/exo1/toy_document_orgmode_python_fr.org~ b/module2/exo1/toy_document_orgmode_python_fr.org~
index c7157ba42216cf2e1d291112bb351ce48811115c..8eba4a5f2b465578366dd99b8baf14475bc6e8eb 100644
--- a/module2/exo1/toy_document_orgmode_python_fr.org~
+++ b/module2/exo1/toy_document_orgmode_python_fr.org~
@@ -1,6 +1,6 @@
-#+TITLE: Votre titre
-#+AUTHOR: Votre nom
-#+DATE: La date du jour
+#+TITLE: À propos du calcul de \(\pi\)
+#+AUTHOR: Émile Jetzer
+#+DATE: 2020-05-14
#+LANGUAGE: fr
# #+PROPERTY: header-args :eval never-export
@@ -11,83 +11,81 @@
#+HTML_HEAD:
#+HTML_HEAD:
-* Quelques explications
+* En demandant à la lib maths
-Ceci est un document org-mode avec quelques exemples de code
-python. Une fois ouvert dans emacs, ce document peut aisément être
-exporté au format HTML, PDF, et Office. Pour plus de détails sur
-org-mode vous pouvez consulter https://orgmode.org/guide/.
+Mon ordinateur m'indique que \(\pi\) vaut /approximativement/:
-Lorsque vous utiliserez le raccourci =C-c C-e h o=, ce document sera
-compilé en html. Tout le code contenu sera ré-exécuté, les résultats
-récupérés et inclus dans un document final. Si vous ne souhaitez pas
-ré-exécuter tout le code à chaque fois, il vous suffit de supprimer
-le # et l'espace qui sont devant le ~#+PROPERTY:~ au début de ce
-document.
-
-Comme nous vous l'avons montré dans la vidéo, on inclue du code
-python de la façon suivante (et on l'exécute en faisant ~C-c C-c~):
-
-#+begin_src python :results output :exports both
-print("Hello world!")
+#+begin_src python :results value :session "Python" :exports both
+import math
+math.pi
#+end_src
#+RESULTS:
-: Hello world!
-
-Voici la même chose, mais avec une session python, donc une
-persistance d'un bloc à l'autre (et on l'exécute toujours en faisant
-~C-c C-c~).
-#+begin_src python :results output :session :exports both
-import numpy
-x=numpy.linspace(-15,15)
-print(x)
+: 3.141592653589793
+
+* En utilisant la méthode des aiguilles de Buffon
+
+Mais calculé avec la *méthode* des[[(https://fr.wikipedia.org/wiki/Aiguille_de_Buffon][aiguilles de
+Buffon]], on
+obtiendrait comme *approximation*:
+
+#+begin_src python :results value :session "Python" :exports both
+import numpy as np
+np.random.seed(seed=42)
+N=10000
+x = np.random.uniform(size=N, low=0, high=1)
+theta = np.random.uniform(size=N, low=0, high=math.pi/2)
+2/(sum((x+np.sin(theta))>1)/N)
#+end_src
#+RESULTS:
-#+begin_example
-[-15. -14.3877551 -13.7755102 -13.16326531 -12.55102041
- -11.93877551 -11.32653061 -10.71428571 -10.10204082 -9.48979592
- -8.87755102 -8.26530612 -7.65306122 -7.04081633 -6.42857143
- -5.81632653 -5.20408163 -4.59183673 -3.97959184 -3.36734694
- -2.75510204 -2.14285714 -1.53061224 -0.91836735 -0.30612245
- 0.30612245 0.91836735 1.53061224 2.14285714 2.75510204
- 3.36734694 3.97959184 4.59183673 5.20408163 5.81632653
- 6.42857143 7.04081633 7.65306122 8.26530612 8.87755102
- 9.48979592 10.10204082 10.71428571 11.32653061 11.93877551
- 12.55102041 13.16326531 13.7755102 14.3877551 15. ]
-#+end_example
-
-Et enfin, voici un exemple de sortie graphique:
-#+begin_src python :results output file :session :var matplot_lib_filename="./cosxsx.png" :exports results
+: 3.128911138923655
+
+* Avec un argument "fréquentiel" de surface
+
+Sinon, une méthode plus simple à comprendre et ne faisant pas
+intervenir d'appel à la fonction sinus se base sur le fait que si
+\(X\tilde U(0, 1)\) et \(Y\tilde U(0, 1)\) alors \(P[X^2+Y^2 \leq 1]=\pi /4\)
+(voir [[https://fr.wikipedia.org/wiki/M%C3%A9thode_de_Monte-Carlo#D%C3%A9termination_de_la_valeur_de_%CF%80][méthode de Monte Carle sur
+Wikipedia]]. Le
+code suivant illustre ce fait:
+
+#+begin_src python :results output file :var matplot_lib_filename="figure_pi_mc2.png" :session "Python" :exports both
import matplotlib.pyplot as plt
-plt.figure(figsize=(10,5))
-plt.plot(x,numpy.cos(x)/x)
-plt.tight_layout()
+np.random.seed(seed=42)
+N = 1000
+x = np.random.uniform(size=N, low=0, high=1)
+y = np.random.uniform(size=N, low=0, high=1)
+
+accept = (x*x + y*y) <= 1
+reject = np.logical_not(accept)
+
+fig, ax = plt.subplots(1)
+ax.scatter(x[accept], y[accept], c='b', alpha=0.2, edgecolor=None)
+ax.scatter(x[reject], y[reject], c='r', alpha=0.2, edgecolor=None)
+ax.set_aspect('equal')
plt.savefig(matplot_lib_filename)
print(matplot_lib_filename)
#+end_src
#+RESULTS:
-[[file:./cosxsx.png]]
-
-Vous remarquerez le paramètre ~:exports results~ qui indique que le code
-ne doit pas apparaître dans la version finale du document. Nous vous
-recommandons dans le cadre de ce MOOC de ne pas changer ce paramètre
-(indiquer ~both~) car l'objectif est que vos analyses de données soient
-parfaitement transparentes pour être reproductibles.
-
-Attention, la figure ainsi générée n'est pas stockée dans le document
-org. C'est un fichier ordinaire, ici nommé ~cosxsx.png~. N'oubliez pas
-de le committer si vous voulez que votre analyse soit lisible et
-compréhensible sur GitLab.
-
-Enfin, n'oubliez pas que nous vous fournissons dans les ressources de
-ce MOOC une configuration avec un certain nombre de raccourcis
-claviers permettant de créer rapidement les blocs de code python (en
-faisant ~
#+HTML_HEAD:
-* Quelques explications
+* Calculs simples divers
-Ceci est un document org-mode avec quelques exemples de code
-python. Une fois ouvert dans emacs, ce document peut aisément être
-exporté au format HTML, PDF, et Office. Pour plus de détails sur
-org-mode vous pouvez consulter https://orgmode.org/guide/.
+#+begin_src python :results value :session "Python"
+données = [ 14.0, 7.6, 11.2, 12.8, 12.5, 9.9, 14.9, 9.4, 16.9, 10.2, 14.9, 18.1, 7.3, 9.8, 10.9,12.2, 9.9,
+ 2.9, 2.8, 15.4, 15.7, 9.7, 13.1, 13.2, 12.3, 11.7, 16.0, 12.4, 17.9, 12.2, 16.2, 18.7, 8.9,
+ 11.9, 12.1, 14.6, 12.1, 4.7, 3.9, 16.9, 16.8, 11.3, 14.4, 15.7, 14.0, 13.6, 18.0, 13.6, 19.9,
+ 13.7, 17.0, 20.5, 9.9, 12.5, 13.2, 16.1, 13.5, 6.3, 6.4, 17.6, 19.1, 12.8, 15.5, 16.3, 15.2,
+ 14.6, 19.1, 14.4, 21.4, 15.1, 19.6, 21.7, 11.3, 15.0, 14.3, 16.8, 14.0, 6.8, 8.2, 19.9, 20.4,
+ 14.6, 16.4, 18.7, 16.8, 15.8, 20.4, 15.8, 22.4, 16.2, 20.3, 23.4, 12.1, 15.5, 15.4, 18.4, 15.7,
+ 10.2, 8.9, 21.0 ]
-Lorsque vous utiliserez le raccourci =C-c C-e h o=, ce document sera
-compilé en html. Tout le code contenu sera ré-exécuté, les résultats
-récupérés et inclus dans un document final. Si vous ne souhaitez pas
-ré-exécuter tout le code à chaque fois, il vous suffit de supprimer
-le # et l'espace qui sont devant le ~#+PROPERTY:~ au début de ce
-document.
+import numpy as np
-Comme nous vous l'avons montré dans la vidéo, on inclue du code
-python de la façon suivante (et on l'exécute en faisant ~C-c C-c~):
-
-#+begin_src python :results output :exports both
-print("Hello world!")
+données = np.array(données)
+données
#+end_src
#+RESULTS:
-: Hello world!
+| 14 | 7.6 | 11.2 | 12.8 | 12.5 | 9.9 | 14.9 | 9.4 | 16.9 | 10.2 | 14.9 | 18.1 | 7.3 | 9.8 | 10.9 | 12.2 | 9.9 | 2.9 | 2.8 | 15.4 | 15.7 | 9.7 | 13.1 | 13.2 | 12.3 | 11.7 | 16 | 12.4 | 17.9 | 12.2 | 16.2 | 18.7 | 8.9 | 11.9 | 12.1 | 14.6 | 12.1 | 4.7 | 3.9 | 16.9 | 16.8 | 11.3 | 14.4 | 15.7 | 14 | 13.6 | 18 | 13.6 | 19.9 | 13.7 | 17 | 20.5 | 9.9 | 12.5 | 13.2 | 16.1 | 13.5 | 6.3 | 6.4 | 17.6 | 19.1 | 12.8 | 15.5 | 16.3 | 15.2 | 14.6 | 19.1 | 14.4 | 21.4 | 15.1 | 19.6 | 21.7 | 11.3 | 15 | 14.3 | 16.8 | 14 | 6.8 | 8.2 | 19.9 | 20.4 | 14.6 | 16.4 | 18.7 | 16.8 | 15.8 | 20.4 | 15.8 | 22.4 | 16.2 | 20.3 | 23.4 | 12.1 | 15.5 | 15.4 | 18.4 | 15.7 | 10.2 | 8.9 | 21 |
+
+ * Calculer la moyenne
-Voici la même chose, mais avec une session python, donc une
-persistance d'un bloc à l'autre (et on l'exécute toujours en faisant
-~C-c C-c~).
-#+begin_src python :results output :session :exports both
-import numpy
-x=numpy.linspace(-15,15)
-print(x)
+#+begin_src python :results output :session "Python"
+print('Moyenne', données.mean())
+print('Écart-type', données.std(ddof=1))
+print('Médiane', np.median(données))
+print('Maximum', données.max())
+print('Minimum', données.min())
#+end_src
#+RESULTS:
-#+begin_example
-[-15. -14.3877551 -13.7755102 -13.16326531 -12.55102041
- -11.93877551 -11.32653061 -10.71428571 -10.10204082 -9.48979592
- -8.87755102 -8.26530612 -7.65306122 -7.04081633 -6.42857143
- -5.81632653 -5.20408163 -4.59183673 -3.97959184 -3.36734694
- -2.75510204 -2.14285714 -1.53061224 -0.91836735 -0.30612245
- 0.30612245 0.91836735 1.53061224 2.14285714 2.75510204
- 3.36734694 3.97959184 4.59183673 5.20408163 5.81632653
- 6.42857143 7.04081633 7.65306122 8.26530612 8.87755102
- 9.48979592 10.10204082 10.71428571 11.32653061 11.93877551
- 12.55102041 13.16326531 13.7755102 14.3877551 15. ]
-#+end_example
-
-Et enfin, voici un exemple de sortie graphique:
-#+begin_src python :results output file :session :var matplot_lib_filename="./cosxsx.png" :exports results
-import matplotlib.pyplot as plt
-
-plt.figure(figsize=(10,5))
-plt.plot(x,numpy.cos(x)/x)
-plt.tight_layout()
-
-plt.savefig(matplot_lib_filename)
-print(matplot_lib_filename)
+: Moyenne 14.113000000000001
+: Écart-type 4.334094455301447
+: Médiane 14.5
+: Maximum 23.4
+: Minimum 2.8
+:
+:
+
+#+begin_src python :results file :session "Python" :exports both
+import matplotlib.pyplot as pyplot
+
+pyplot.clf()
+pyplot.plot(données)
+pyplot.savefig('~/graphe1.svg')
+'~/graphe1.svg'
#+end_src
#+RESULTS:
-[[file:./cosxsx.png]]
+[[file:~/graphe1.svg]]
-Vous remarquerez le paramètre ~:exports results~ qui indique que le code
-ne doit pas apparaître dans la version finale du document. Nous vous
-recommandons dans le cadre de ce MOOC de ne pas changer ce paramètre
-(indiquer ~both~) car l'objectif est que vos analyses de données soient
-parfaitement transparentes pour être reproductibles.
-
-Attention, la figure ainsi générée n'est pas stockée dans le document
-org. C'est un fichier ordinaire, ici nommé ~cosxsx.png~. N'oubliez pas
-de le committer si vous voulez que votre analyse soit lisible et
-compréhensible sur GitLab.
-
-Enfin, n'oubliez pas que nous vous fournissons dans les ressources de
-ce MOOC une configuration avec un certain nombre de raccourcis
-claviers permettant de créer rapidement les blocs de code python (en
-faisant ~
+#+HTML_HEAD:
+#+HTML_HEAD:
+#+HTML_HEAD:
+#+HTML_HEAD:
+#+HTML_HEAD:
+
+* Calculs simples divers
+
+#+begin_src python :results value :session "Python"
+données = [ 14.0, 7.6, 11.2, 12.8, 12.5, 9.9, 14.9, 9.4, 16.9, 10.2, 14.9, 18.1, 7.3, 9.8, 10.9,12.2, 9.9,
+ 2.9, 2.8, 15.4, 15.7, 9.7, 13.1, 13.2, 12.3, 11.7, 16.0, 12.4, 17.9, 12.2, 16.2, 18.7, 8.9,
+ 11.9, 12.1, 14.6, 12.1, 4.7, 3.9, 16.9, 16.8, 11.3, 14.4, 15.7, 14.0, 13.6, 18.0, 13.6, 19.9,
+ 13.7, 17.0, 20.5, 9.9, 12.5, 13.2, 16.1, 13.5, 6.3, 6.4, 17.6, 19.1, 12.8, 15.5, 16.3, 15.2,
+ 14.6, 19.1, 14.4, 21.4, 15.1, 19.6, 21.7, 11.3, 15.0, 14.3, 16.8, 14.0, 6.8, 8.2, 19.9, 20.4,
+ 14.6, 16.4, 18.7, 16.8, 15.8, 20.4, 15.8, 22.4, 16.2, 20.3, 23.4, 12.1, 15.5, 15.4, 18.4, 15.7,
+ 10.2, 8.9, 21.0 ]
+
+import numpy as np
+
+données = np.array(données)
+données
+#+end_src
+
+#+RESULTS:
+| 14 | 7.6 | 11.2 | 12.8 | 12.5 | 9.9 | 14.9 | 9.4 | 16.9 | 10.2 | 14.9 | 18.1 | 7.3 | 9.8 | 10.9 | 12.2 | 9.9 | 2.9 | 2.8 | 15.4 | 15.7 | 9.7 | 13.1 | 13.2 | 12.3 | 11.7 | 16 | 12.4 | 17.9 | 12.2 | 16.2 | 18.7 | 8.9 | 11.9 | 12.1 | 14.6 | 12.1 | 4.7 | 3.9 | 16.9 | 16.8 | 11.3 | 14.4 | 15.7 | 14 | 13.6 | 18 | 13.6 | 19.9 | 13.7 | 17 | 20.5 | 9.9 | 12.5 | 13.2 | 16.1 | 13.5 | 6.3 | 6.4 | 17.6 | 19.1 | 12.8 | 15.5 | 16.3 | 15.2 | 14.6 | 19.1 | 14.4 | 21.4 | 15.1 | 19.6 | 21.7 | 11.3 | 15 | 14.3 | 16.8 | 14 | 6.8 | 8.2 | 19.9 | 20.4 | 14.6 | 16.4 | 18.7 | 16.8 | 15.8 | 20.4 | 15.8 | 22.4 | 16.2 | 20.3 | 23.4 | 12.1 | 15.5 | 15.4 | 18.4 | 15.7 | 10.2 | 8.9 | 21 |
+
+ * Calculer la moyenne
+
+#+begin_src python :results output :session "Python"
+print('Moyenne', données.mean())
+print('Écart-type', données.std(ddof=1))
+print('Médiane', np.median(données))
+print('Maximum', données.max())
+print('Minimum', données.min())
+#+end_src
+
+#+RESULTS:
+: Moyenne 14.113000000000001
+: Écart-type 4.334094455301447
+: Médiane 14.5
+: Maximum 23.4
+: Minimum 2.8
+:
+:
+
+#+begin_src python :results file :session "Python"
+import matplotlib.pyplot as pyplot
+
+fig, ax = pyplot.plot(données)
+
+fig.savefig('graphe1.png')
+'graphe1.png'
+#+end_src
+
+#+RESULTS:
+[[file:]]
+
+#+begin_src python :results file :session "Python"
+fig, ax = pyplot.hist(données)
+
+fig.savefig('graphe2.png')
+'graphe2.png'
+#+end_src
+
+#+RESULTS:
+[[file:]]
diff --git a/module2/exo5/exo5_python_fr.org b/module2/exo5/exo5_python_fr.org
index afff5e05bdb366128291b42847d9bd44d1f8bf04..98e63a3957db0be2452124c8a71ed1169823449d 100644
--- a/module2/exo5/exo5_python_fr.org
+++ b/module2/exo5/exo5_python_fr.org
@@ -32,6 +32,7 @@ de la NASA durant les 6 années précédant le lancement de la navette
Challenger.
* Chargement des données
+
Nous commençons donc par charger ces données:
#+begin_src python :results value :session *python* :exports both
import numpy as np
@@ -42,30 +43,30 @@ data
#+RESULTS:
#+begin_example
- Date Count Temperature Pressure Malfunction
-0 4/12/81 6 66 50 0
-1 11/12/81 6 70 50 1
-2 3/22/82 6 69 50 0
-3 11/11/82 6 68 50 0
-4 4/04/83 6 67 50 0
-5 6/18/82 6 72 50 0
-6 8/30/83 6 73 100 0
-7 11/28/83 6 70 100 0
-8 2/03/84 6 57 200 1
-9 4/06/84 6 63 200 1
-10 8/30/84 6 70 200 1
-11 10/05/84 6 78 200 0
-12 11/08/84 6 67 200 0
-13 1/24/85 6 53 200 2
-14 4/12/85 6 67 200 0
-15 4/29/85 6 75 200 0
-16 6/17/85 6 70 200 0
-17 7/29/85 6 81 200 0
-18 8/27/85 6 76 200 0
-19 10/03/85 6 79 200 0
-20 10/30/85 6 75 200 2
-21 11/26/85 6 76 200 0
-22 1/12/86 6 58 200 1
+ Date Count Temperature Pressure Malfunction
+0 4/12/81 6 66 50 0
+1 11/12/81 6 70 50 1
+2 3/22/82 6 69 50 0
+3 11/11/82 6 68 50 0
+4 4/04/83 6 67 50 0
+5 6/18/82 6 72 50 0
+6 8/30/83 6 73 100 0
+7 11/28/83 6 70 100 0
+8 2/03/84 6 57 200 1
+9 4/06/84 6 63 200 1
+10 8/30/84 6 70 200 1
+11 10/05/84 6 78 200 0
+12 11/08/84 6 67 200 0
+13 1/24/85 6 53 200 2
+14 4/12/85 6 67 200 0
+15 4/29/85 6 75 200 0
+16 6/17/85 6 70 200 0
+17 7/29/85 6 81 200 0
+18 8/27/85 6 76 200 0
+19 10/03/85 6 79 200 0
+20 10/30/85 6 75 200 2
+21 11/26/85 6 76 200 0
+22 1/12/86 6 58 200 1
#+end_example
Le jeu de données nous indique la date de l'essai, le nombre de joints
@@ -112,7 +113,7 @@ print(matplot_lib_filename)
#+end_src
#+RESULTS:
-[[file:freq_temp_python.png]]
+[[file:]]
À première vue, ce n'est pas flagrant mais bon, essayons quand même
d'estimer l'impact de la température $t$ sur la probabilité de
@@ -142,24 +143,6 @@ logmodel.summary()
#+end_src
#+RESULTS:
-#+begin_example
- Generalized Linear Model Regression Results
-==============================================================================
-Dep. Variable: Frequency No. Observations: 7
-Model: GLM Df Residuals: 5
-Model Family: Binomial Df Model: 1
-Link Function: logit Scale: 1.0
-Method: IRLS Log-Likelihood: -3.6370
-Date: Fri, 20 Jul 2018 Deviance: 3.3763
-Time: 16:56:08 Pearson chi2: 0.236
-No. Iterations: 5
-===============================================================================
- coef std err z P>|z| [0.025 0.975]
--------------------------------------------------------------------------------
-Intercept -1.3895 7.828 -0.178 0.859 -16.732 13.953
-Temperature 0.0014 0.122 0.012 0.991 -0.238 0.240
-===============================================================================
-#+end_example
L'estimateur le plus probable du paramètre de température est 0.0014
et l'erreur standard de cet estimateur est de 0.122, autrement dit on
@@ -185,7 +168,28 @@ print(matplot_lib_filename)
#+end_src
#+RESULTS:
-[[file:proba_estimate_python.png]]
+[[file:Traceback (most recent call last):
+ File "", line 1, in
+ File "/var/folders/pz/lqbg3sln3tx3lc20qjf3t7580000gn/T/babel-uHWuHe/python-PvRZB8", line 5, in
+ data_pred['Frequency'] = logmodel.predict(data_pred[['Intercept','Temperature']])
+NameError: name 'logmodel' is not defined
+>>>
+]]
+[[file:Traceback (most recent call last):
+ File "", line 1, in
+ File "/var/folders/pz/lqbg3sln3tx3lc20qjf3t7580000gn/T/babel-uHWuHe/python-kfsyTS", line 5, in
+ data_pred['Frequency'] = logmodel.predict(data_pred[['Intercept','Temperature']])
+NameError: name 'logmodel' is not defined
+
+
+]]
+[[file:Traceback (most recent call last):
+ File "", line 1, in
+ File "/var/folders/pz/lqbg3sln3tx3lc20qjf3t7580000gn/T/babel-uHWuHe/python-DJFd1z", line 5, in
+ data_pred['Frequency'] = logmodel.predict(data_pred[['Intercept','Temperature']])
+NameError: name 'logmodel' is not defined
+>>>
+]]
Comme on pouvait s'attendre au vu des données initiales, la
température n'a pas d'impact notable sur la probabilité d'échec des
@@ -201,6 +205,7 @@ print(np.sum(data.Malfunction)/np.sum(data.Count))
#+RESULTS:
: 0.06521739130434782
+: >>>
Cette probabilité est donc d'environ $p=0.065$, sachant qu'il existe
un joint primaire un joint secondaire sur chacune des trois parties du
diff --git a/module2/exo5/exo5_python_fr.org~ b/module2/exo5/exo5_python_fr.org~
new file mode 100644
index 0000000000000000000000000000000000000000..afff5e05bdb366128291b42847d9bd44d1f8bf04
--- /dev/null
+++ b/module2/exo5/exo5_python_fr.org~
@@ -0,0 +1,222 @@
+#+TITLE: Analyse du risque de défaillance des joints toriques de la navette Challenger
+#+AUTHOR: Arnaud Legrand
+#+LANGUAGE: fr
+
+#+HTML_HEAD:
+#+HTML_HEAD:
+#+HTML_HEAD:
+#+HTML_HEAD:
+#+HTML_HEAD:
+#+HTML_HEAD:
+
+#+LATEX_HEADER: \usepackage{a4}
+#+LATEX_HEADER: \usepackage[french]{babel}
+
+# #+PROPERTY: header-args :session :exports both
+
+Le 27 Janvier 1986, veille du décollage de la navette /Challenger/, eu
+lieu une télé-conférence de trois heures entre les ingénieurs de la
+Morton Thiokol (constructeur d'un des moteurs) et de la NASA. La
+discussion portait principalement sur les conséquences de la
+température prévue au moment du décollage de 31°F (juste en dessous de
+0°C) sur le succès du vol et en particulier sur la performance des
+joints toriques utilisés dans les moteurs. En effet, aucun test
+n'avait été effectué à cette température.
+
+L'étude qui suit reprend donc une partie des analyses effectuées cette
+nuit là et dont l'objectif était d'évaluer l'influence potentielle de
+la température et de la pression à laquelle sont soumis les joints
+toriques sur leur probabilité de dysfonctionnement. Pour cela, nous
+disposons des résultats des expériences réalisées par les ingénieurs
+de la NASA durant les 6 années précédant le lancement de la navette
+Challenger.
+
+* Chargement des données
+Nous commençons donc par charger ces données:
+#+begin_src python :results value :session *python* :exports both
+import numpy as np
+import pandas as pd
+data = pd.read_csv("shuttle.csv")
+data
+#+end_src
+
+#+RESULTS:
+#+begin_example
+ Date Count Temperature Pressure Malfunction
+0 4/12/81 6 66 50 0
+1 11/12/81 6 70 50 1
+2 3/22/82 6 69 50 0
+3 11/11/82 6 68 50 0
+4 4/04/83 6 67 50 0
+5 6/18/82 6 72 50 0
+6 8/30/83 6 73 100 0
+7 11/28/83 6 70 100 0
+8 2/03/84 6 57 200 1
+9 4/06/84 6 63 200 1
+10 8/30/84 6 70 200 1
+11 10/05/84 6 78 200 0
+12 11/08/84 6 67 200 0
+13 1/24/85 6 53 200 2
+14 4/12/85 6 67 200 0
+15 4/29/85 6 75 200 0
+16 6/17/85 6 70 200 0
+17 7/29/85 6 81 200 0
+18 8/27/85 6 76 200 0
+19 10/03/85 6 79 200 0
+20 10/30/85 6 75 200 2
+21 11/26/85 6 76 200 0
+22 1/12/86 6 58 200 1
+#+end_example
+
+Le jeu de données nous indique la date de l'essai, le nombre de joints
+toriques mesurés (il y en a 6 sur le lançeur principal), la
+température (en Fahrenheit) et la pression (en psi), et enfin le
+nombre de dysfonctionnements relevés.
+
+* Inspection graphique des données
+Les vols où aucun incident n'est relevé n'apportant aucune information
+sur l'influence de la température ou de la pression sur les
+dysfonctionnements, nous nous concentrons sur les expériences où au
+moins un joint a été défectueux.
+
+#+begin_src python :results value :session *python* :exports both
+data = data[data.Malfunction>0]
+data
+#+end_src
+
+#+RESULTS:
+: Date Count Temperature Pressure Malfunction
+: 1 11/12/81 6 70 50 1
+: 8 2/03/84 6 57 200 1
+: 9 4/06/84 6 63 200 1
+: 10 8/30/84 6 70 200 1
+: 13 1/24/85 6 53 200 2
+: 20 10/30/85 6 75 200 2
+: 22 1/12/86 6 58 200 1
+
+Très bien, nous avons une variabilité de température importante mais
+la pression est quasiment toujours égale à 200, ce qui devrait
+simplifier l'analyse.
+
+Comment la fréquence d'échecs varie-t-elle avec la température ?
+#+begin_src python :results output file :var matplot_lib_filename="freq_temp_python.png" :exports both :session *python*
+import matplotlib.pyplot as plt
+
+plt.clf()
+data["Frequency"]=data.Malfunction/data.Count
+data.plot(x="Temperature",y="Frequency",kind="scatter",ylim=[0,1])
+plt.grid(True)
+
+plt.savefig(matplot_lib_filename)
+print(matplot_lib_filename)
+#+end_src
+
+#+RESULTS:
+[[file:freq_temp_python.png]]
+
+À première vue, ce n'est pas flagrant mais bon, essayons quand même
+d'estimer l'impact de la température $t$ sur la probabilité de
+dysfonctionnements d'un joint.
+
+* Estimation de l'influence de la température
+
+Supposons que chacun des 6 joints toriques est endommagé avec la même
+probabilité et indépendamment des autres et que cette probabilité ne
+dépend que de la température. Si on note $p(t)$ cette probabilité, le
+nombre de joints $D$ dysfonctionnant lorsque l'on effectue le vol à
+température $t$ suit une loi binomiale de paramètre $n=6$ et
+$p=p(t)$. Pour relier $p(t)$ à $t$, on va donc effectuer une
+régression logistique.
+
+#+begin_src python :results value :session *python* :exports both
+import statsmodels.api as sm
+
+data["Success"]=data.Count-data.Malfunction
+data["Intercept"]=1
+
+
+# logit_model=sm.Logit(data["Frequency"],data[["Intercept","Temperature"]]).fit()
+logmodel=sm.GLM(data['Frequency'], data[['Intercept','Temperature']], family=sm.families.Binomial(sm.families.links.logit)).fit()
+
+logmodel.summary()
+#+end_src
+
+#+RESULTS:
+#+begin_example
+ Generalized Linear Model Regression Results
+==============================================================================
+Dep. Variable: Frequency No. Observations: 7
+Model: GLM Df Residuals: 5
+Model Family: Binomial Df Model: 1
+Link Function: logit Scale: 1.0
+Method: IRLS Log-Likelihood: -3.6370
+Date: Fri, 20 Jul 2018 Deviance: 3.3763
+Time: 16:56:08 Pearson chi2: 0.236
+No. Iterations: 5
+===============================================================================
+ coef std err z P>|z| [0.025 0.975]
+-------------------------------------------------------------------------------
+Intercept -1.3895 7.828 -0.178 0.859 -16.732 13.953
+Temperature 0.0014 0.122 0.012 0.991 -0.238 0.240
+===============================================================================
+#+end_example
+
+L'estimateur le plus probable du paramètre de température est 0.0014
+et l'erreur standard de cet estimateur est de 0.122, autrement dit on
+ne peut pas distinguer d'impact particulier et il faut prendre nos
+estimations avec des pincettes.
+
+* Estimation de la probabilité de dysfonctionnant des joints toriques
+La température prévue le jour du décollage est de 31°F. Essayons
+d'estimer la probabilité de dysfonctionnement des joints toriques à
+cette température à partir du modèle que nous venons de construire:
+
+#+begin_src python :results output file :var matplot_lib_filename="proba_estimate_python.png" :exports both :session *python*
+import matplotlib.pyplot as plt
+
+data_pred = pd.DataFrame({'Temperature': np.linspace(start=30, stop=90, num=121), 'Intercept': 1})
+data_pred['Frequency'] = logmodel.predict(data_pred[['Intercept','Temperature']])
+data_pred.plot(x="Temperature",y="Frequency",kind="line",ylim=[0,1])
+plt.scatter(x=data["Temperature"],y=data["Frequency"])
+plt.grid(True)
+
+plt.savefig(matplot_lib_filename)
+print(matplot_lib_filename)
+#+end_src
+
+#+RESULTS:
+[[file:proba_estimate_python.png]]
+
+Comme on pouvait s'attendre au vu des données initiales, la
+température n'a pas d'impact notable sur la probabilité d'échec des
+joints toriques. Elle sera d'environ 0.2, comme dans les essais
+précédents où nous il y a eu défaillance d'au moins un joint. Revenons
+à l'ensemble des données initiales pour estimer la probabilité de
+défaillance d'un joint:
+
+#+begin_src python :results output :session *python* :exports both
+data = pd.read_csv("shuttle.csv")
+print(np.sum(data.Malfunction)/np.sum(data.Count))
+#+end_src
+
+#+RESULTS:
+: 0.06521739130434782
+
+Cette probabilité est donc d'environ $p=0.065$, sachant qu'il existe
+un joint primaire un joint secondaire sur chacune des trois parties du
+lançeur, la probabilité de défaillance des deux joints d'un lançeur
+est de $p^2 \approx 0.00425$. La probabilité de défaillance d'un des
+lançeur est donc de $1-(1-p^2)^3 \approx 1.2%$. Ça serait vraiment
+pas de chance... Tout est sous contrôle, le décollage peut donc avoir
+lieu demain comme prévu.
+
+Seulement, le lendemain, la navette Challenger explosera et emportera
+avec elle ses sept membres d'équipages. L'opinion publique est
+fortement touchée et lors de l'enquête qui suivra, la fiabilité des
+joints toriques sera directement mise en cause. Au delà des problèmes
+de communication interne à la NASA qui sont pour beaucoup dans ce
+fiasco, l'analyse précédente comporte (au moins) un petit
+problème... Saurez-vous le trouver ? Vous êtes libre de modifier cette
+analyse et de regarder ce jeu de données sous tous les angles afin
+d'expliquer ce qui ne va pas.
+
diff --git a/module2/exo5/freq_temp_python.png b/module2/exo5/freq_temp_python.png
index 93cb9e626441d23f6dff59ed252d7b14eb37abdb..60368ff57389cd4cfc5aa439d8dd53685bb9fe79 100644
Binary files a/module2/exo5/freq_temp_python.png and b/module2/exo5/freq_temp_python.png differ