From 0b6cab29e510c4d6e197ae64ac5c6181fcfb6fa9 Mon Sep 17 00:00:00 2001 From: Antoine Date: Tue, 11 Jun 2024 16:16:05 +0200 Subject: [PATCH] feat: exo5 --- module2/exo5/exo5_python_fr.html | 490 +++++++++++++++++++++++ module2/exo5/exo5_python_fr.org | 169 ++++---- module2/exo5/exo5_python_fr_original.org | 222 ++++++++++ module2/exo5/freq_temp_python.png | Bin 12556 -> 12717 bytes module2/exo5/proba_estimate_python.png | Bin 14660 -> 22383 bytes 5 files changed, 785 insertions(+), 96 deletions(-) create mode 100644 module2/exo5/exo5_python_fr.html create mode 100644 module2/exo5/exo5_python_fr_original.org diff --git a/module2/exo5/exo5_python_fr.html b/module2/exo5/exo5_python_fr.html new file mode 100644 index 0000000..75143be --- /dev/null +++ b/module2/exo5/exo5_python_fr.html @@ -0,0 +1,490 @@ + + + + + + + +Analyse du risque de défaillance des joints toriques de la navette Challenger + + + + + + + + + + + + + + +
+

Analyse du risque de défaillance des joints toriques de la navette Challenger

+ +

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

+ +
+

1. Chargement des données

+
+

+Nous commençons donc par charger ces données: +

+
+
import numpy as np
+import pandas as pd
+data = pd.read_csv("shuttle.csv")
+data
+
+
+ +
+        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
+
+ +

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

+
+
+ +
+

2. Inspection graphique des données

+
+

+À première vue, ni l'information de pression ni la date nous apporteront des réponses sur la fréquence des incidents. On va donc chercher à filtrer les colonnes restantes en fusionnant les doublons pour la température. +

+ +
+
agg_functions = {'Count': 'sum', 'Malfunction': 'sum'}
+data = data[['Temperature','Count','Malfunction']].groupby('Temperature', as_index=False).sum()
+data
+
+
+ +
+    Temperature  Count  Malfunction
+0            53      6            2
+1            57      6            1
+2            58      6            1
+3            63      6            1
+4            66      6            0
+5            67     18            0
+6            68      6            0
+7            69      6            0
+8            70     24            2
+9            72      6            0
+10           73      6            0
+11           75     12            2
+12           76     12            0
+13           78      6            0
+14           79      6            0
+15           81      6            0
+
+ +

+Comment la fréquence d'échecs varie-t-elle avec la température ? +

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

freq_temp_python.png +

+
+ +

+Contrairement à l'analyse précédente où les températures sans incidents n'étaient pas incluses, on voit ici une augemntation un peu plus nette de la fréquence des incidents à mesure que la température. +

+ +

+On peut procéder à une estimation de l'impact de la température \(t\) sur la probabilité de dysfonctionnements d'un joint. +

+
+
+ +
+

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

+ +
+
import statsmodels.api as sm
+
+data["Success"]=data.Count-data.Malfunction
+data["Intercept"]=1
+
+logmodel=sm.GLM(data['Frequency'], data[['Intercept','Temperature']], family=sm.families.Binomial(sm.families.links.logit())).fit()
+
+logmodel.summary()
+
+
+ +
+                 Generalized Linear Model Regression Results                  
+==============================================================================
+Dep. Variable:              Frequency   No. Observations:                   16
+Model:                            GLM   Df Residuals:                       14
+Model Family:                Binomial   Df Model:                            1
+Link Function:                  logit   Scale:                          1.0000
+Method:                          IRLS   Log-Likelihood:                -2.4880
+Date:                Tue, 11 Jun 2024   Deviance:                       1.1965
+Time:                        16:14:26   Pearson chi2:                     1.82
+No. Iterations:                     6   Pseudo R-squ. (CS):            0.07675
+Covariance Type:            nonrobust                                         
+===============================================================================
+                  coef    std err          z      P>|z|      [0.025      0.975]
+-------------------------------------------------------------------------------
+Intercept       6.8667      8.822      0.778      0.436     -10.424      24.157
+Temperature    -0.1458      0.143     -1.023      0.306      -0.425       0.134
+===============================================================================
+
+ +

+L'estimateur le plus probable du paramètre de température est -0.1458 donc on peut s'attendre à une correlation négative entre la température et la propabilité de dysfonctionnement. L'erreur standard reste plutôt élevée mais le pseudo-R² reste bas, on peut avoir une certaine confiance en nos prédictions. +

+
+
+ + +
+

4. 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: +

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

proba_estimate_python.png +

+
+ +

+Contrairement à l'analyze précédente, on voit que la température a bien un effet considérable sur la probabilité de dysfonctionnement des joins toriques. Ainsi à 31°F, notre modèle prédit qu'un joint torique à plus de 90% de chances de dysfonctionner. +

+ +
+
data_pred[data_pred.Temperature<=31.0]
+
+
+ +
+   Temperature  Intercept  Frequency
+0         30.0          1   0.923566
+1         30.5          1   0.918258
+2         31.0          1   0.912615
+
+ + +

+La probabilité qu'un joint défaille à cette température est de \(p=0.913\). 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.833569\). La probabilité de défaillance d'un des lançeur est donc de \(1-(1-p^2)^3 \approx 99.5%\). La catastrophe était certaine. +

+
+
+
+
+

Auteur: Antoine Geimer

+

Created: 2024-06-11 Tue 16:14

+

Validate

+
+ + diff --git a/module2/exo5/exo5_python_fr.org b/module2/exo5/exo5_python_fr.org index afff5e0..7b0a2a9 100644 --- a/module2/exo5/exo5_python_fr.org +++ b/module2/exo5/exo5_python_fr.org @@ -1,5 +1,5 @@ #+TITLE: Analyse du risque de défaillance des joints toriques de la navette Challenger -#+AUTHOR: Arnaud Legrand +#+AUTHOR: Antoine Geimer #+LANGUAGE: fr #+HTML_HEAD: @@ -42,30 +42,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 @@ -74,29 +74,35 @@ 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. + +À première vue, ni l'information de pression ni la date nous apporteront des réponses sur la fréquence des incidents. On va donc chercher à filtrer les colonnes restantes en fusionnant les doublons pour la température. #+begin_src python :results value :session *python* :exports both -data = data[data.Malfunction>0] +agg_functions = {'Count': 'sum', 'Malfunction': 'sum'} +data = data[['Temperature','Count','Malfunction']].groupby('Temperature', as_index=False).sum() 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. +#+begin_example + Temperature Count Malfunction +0 53 6 2 +1 57 6 1 +2 58 6 1 +3 63 6 1 +4 66 6 0 +5 67 18 0 +6 68 6 0 +7 69 6 0 +8 70 24 2 +9 72 6 0 +10 73 6 0 +11 75 12 2 +12 76 12 0 +13 78 6 0 +14 79 6 0 +15 81 6 0 +#+end_example 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* @@ -114,19 +120,13 @@ print(matplot_lib_filename) #+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. +Contrairement à l'analyse précédente où les températures sans incidents n'étaient pas incluses, on voit ici une augemntation un peu plus nette de la fréquence des incidents à mesure que la température. + +On peut procéder à une estimation de 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. +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 @@ -134,9 +134,7 @@ 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=sm.GLM(data['Frequency'], data[['Intercept','Temperature']], family=sm.families.Binomial(sm.families.links.logit())).fit() logmodel.summary() #+end_src @@ -145,26 +143,25 @@ logmodel.summary() #+begin_example Generalized Linear Model Regression Results ============================================================================== -Dep. Variable: Frequency No. Observations: 7 -Model: GLM Df Residuals: 5 +Dep. Variable: Frequency No. Observations: 16 +Model: GLM Df Residuals: 14 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 +Link Function: logit Scale: 1.0000 +Method: IRLS Log-Likelihood: -2.4880 +Date: Tue, 11 Jun 2024 Deviance: 1.1965 +Time: 15:04:48 Pearson chi2: 1.82 +No. Iterations: 6 Pseudo R-squ. (CS): 0.07675 +Covariance Type: nonrobust =============================================================================== 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 +Intercept 6.8667 8.822 0.778 0.436 -10.424 24.157 +Temperature -0.1458 0.143 -1.023 0.306 -0.425 0.134 =============================================================================== #+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. +L'estimateur le plus probable du paramètre de température est -0.1458 donc on peut s'attendre à une correlation négative entre la température et la propabilité de dysfonctionnement. L'erreur standard reste plutôt élevée mais le pseudo-R² reste bas, on peut avoir une certaine confiance en nos prédictions. + * Estimation de la probabilité de dysfonctionnant des joints toriques La température prévue le jour du décollage est de 31°F. Essayons @@ -187,36 +184,16 @@ print(matplot_lib_filename) #+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: +Contrairement à l'analyze précédente, on voit que la température a bien un effet considérable sur la probabilité de dysfonctionnement des joins toriques. Ainsi à 31°F, notre modèle prédit qu'un joint torique à plus de 90% de chances de dysfonctionner. -#+begin_src python :results output :session *python* :exports both -data = pd.read_csv("shuttle.csv") -print(np.sum(data.Malfunction)/np.sum(data.Count)) +#+begin_src python :results value :session *python* :exports both +data_pred[data_pred.Temperature<=31.0] #+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. +: Temperature Intercept Frequency +: 0 30.0 1 0.923566 +: 1 30.5 1 0.918258 +: 2 31.0 1 0.912615 +La probabilité qu'un joint défaille à cette température est de $p=0.913$. 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.833569$. La probabilité de défaillance d'un des lançeur est donc de $1-(1-p^2)^3 \approx 99.5%$. La catastrophe était certaine. diff --git a/module2/exo5/exo5_python_fr_original.org b/module2/exo5/exo5_python_fr_original.org new file mode 100644 index 0000000..afff5e0 --- /dev/null +++ b/module2/exo5/exo5_python_fr_original.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..79bce59542d6a7912aa0baa3ad644596f47e8014 100644 GIT binary patch literal 12717 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 diff --git a/module2/exo5/proba_estimate_python.png b/module2/exo5/proba_estimate_python.png index 77fc4b275dd8815b1ab91cd3b67b1beb93e00748..8f0e0d2eba9b59684bcd117c965c6f1203e7c0a9 100644 GIT binary patch literal 22383 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 -- 2.18.1