diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..c7118792c5a7301f5f4e89e321170d7ad2203e7f Binary files /dev/null and b/.DS_Store differ diff --git a/module2/.DS_Store b/module2/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..ec8de6da157d6e163c90fec502c0bfcf2b6e374b Binary files /dev/null and b/module2/.DS_Store differ diff --git a/module2/exo1/toy_document_orgmode_python_fr.html b/module2/exo1/toy_document_orgmode_python_fr.html new file mode 100644 index 0000000000000000000000000000000000000000..d4f6f14f128b140b1153ff736fcd89e1700b1517 --- /dev/null +++ b/module2/exo1/toy_document_orgmode_python_fr.html @@ -0,0 +1,391 @@ + + + + + + + +À propos du calcul de \(\pi\) + + + + + + + + + + + + + + +
+

À propos du calcul de \(\pi\)

+
+

Table des matières

+ +
+ +
+

1 En demandant à la lib maths

+
+

+Mon ordinateur m'indique que \(\pi\) vaut approximativement: +

+ +
+
import math
+math.pi
+
+
+ +
+3.141592653589793
+
+
+
+
+ +
+

2 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: +

+ +
+
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)
+
+
+ +
+3.128911138923655
+
+
+
+
+ +
+

3 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 méthode de Monte Carle sur +Wikipedia. Le +code suivant illustre ce fait: +

+ +
+
import matplotlib.pyplot as plt
+
+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)
+
+
+ + +
+

'org_babel_python_eoe'
 figure_pi_mc2.png +

+
+ +

+Il est alors aisé d'obtenir une approximation (pas terrible) de \(\pi\) +

+ +

+en comptant combien de fois, en moyenne, \(X^2+Y^2\) est inférieur à 1: +

+ +
+
4*np.mean(accept)
+
+
+ +
+3.112
+
+
+
+
+ + +

+]] +

+
+
+
+
+

Date: 2020-05-14

+

Auteur: Émile Jetzer

+

Created: 2020-05-14 Thu 12:31

+

Validate

+
+ + 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