diff --git a/module3/exo2/exercice_python_fr.org b/module3/exo2/exercice_python_fr.org index c7157ba42216cf2e1d291112bb351ce48811115c..bcc1cae6be61be1d92003455c6089aa9760621ff 100644 --- a/module3/exo2/exercice_python_fr.org +++ b/module3/exo2/exercice_python_fr.org @@ -1,6 +1,6 @@ -#+TITLE: Votre titre -#+AUTHOR: Votre nom -#+DATE: La date du jour +#+TITLE: Incidence du syndrôme de la varicelle +#+AUTHOR: Konubinix +#+DATE: [2020-08-07 Fri] #+LANGUAGE: fr # #+PROPERTY: header-args :eval never-export @@ -11,83 +11,178 @@ #+HTML_HEAD: #+HTML_HEAD: -* Quelques explications +#+PROPERTY: header-args :session module3_exo2 -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/. +* Préface -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. +Dans l'exemple précédent, j'ai essayé d'utiliser R (récupéré via nix), mais les +graphiques obtenus étaient inexploitables. Je prendrai un jour le temps de lire +la documentation de R en détail. D'ici là, je vais rester dans ma zone de +confort cognitif et utiliser python avec des bibliothèques tierces. -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~): +Un des avantages indiqué de R était le fait que l'analyse de données était +native. Je comprends ici qu'il est considéré pénible ou difficile d'installer +une bibliothèque tierce comme pandas. Essayons de palier ce problème en +utilisant nix. -#+begin_src python :results output :exports both -print("Hello world!") -#+end_src +Il faut donc instrumenter org-babel pour utiliser python dans l'environnement +nix au lieu de celui du système. J'ai fait cela en changeant la valeur de +`org-babel-python-command` dans ce fichier, c'est la raison pour laquelle vous +avez du explicitement accepter ce changement en ouvrant le fichier. + +À noter que le premier lancement peut être long, puisque nix va télécharger +toutes les dépendances. + +* Préparation des données + +Afin de favoriser une recherche reproductible, je laisse ici le soin à nix de +télécharger les données, de vérifier leur intégrité via une empreinte numérique +et de conserver une cache. Vous pouvez consulter le fichier shell.nix pour +constater que les données seront accessibles au chemin contenu dans la variable +d'environnement DATA. + +#+BEGIN_SRC python :results verbatim :exports both + import pandas + import os + + data = pandas.read_csv( + os.environ["DATA"], + # Nous allons analyser ici uniquement les colonnes inc et week, nous allons donc + # simplement charger ces données. + usecols=["week", "inc"], + # nous devons éviter la première ligne qui n'est pas à proprement parler + # dans le format csv. + skiprows=1, + # d'après la documentation, week et inc sont au format int + dtype=int, + # la semaine semble être un bon candidat pour être un index + index_col="week", + parse_dates=["week"], + infer_datetime_format=True, + ) + data.head() +#+END_SRC + + +Transformons les semaines en dates, considérant le lundi de la semaine en question. + +#+BEGIN_SRC python :results verbatim :exports both + data = data.set_index(pandas.to_datetime(data.index.astype(str) + ":1", format="%G%V:%u")) + data.head() +#+END_SRC + + +Enfin, assurons nous d'avoir la bonne période dans l'index. + +#+BEGIN_SRC python :results verbatim :exports both +data = data.set_index(data.index.to_period("W")) +data.head() +#+END_SRC + +Vérifions que nous n'avons aucune donnée manquante + +#+BEGIN_SRC python :results verbatim :exports both +data.isna().any() +#+END_SRC + +#+RESULTS: +: inc False +: dtype: bool + +Tout va bien. + +* Analyse exploratoire de données + +Regardons la répartition des incidences au cours du temps. + +#+BEGIN_SRC python :results file :exports both :var output="overall.png" + import matplotlib.pyplot as plt + data.plot() + plt.savefig(output) + output +#+END_SRC + +#+RESULTS: +[[file:overall.png]] + +On se rend compte que le phénomène est très régulier. Supposons que sa période +est annuelle et essayons d'observer sur quelques années. + +#+BEGIN_SRC python :results file :exports both :var output="peryear.png" + fix, axes = plt.subplots(3, 2) + for ax, year in zip(axes.flatten(), range(2020 - 6, 2020)): + data[data.index.year == year].plot(ax=ax) + ax.set_title(year) + plt.savefig(output) + output +#+END_SRC + +#+RESULTS: +[[file:peryear.png]] + +Mis à part le fait que le rendu laisse à désirer, nous observons effectivement +une période manifeste d'un an, dont le creux d'incidence semble être début +septembre. Pour cette raison (et aussi parce que c'est indiqué dans l'énonce de +l'exercice), nous allons considérer des années décalées, commençant en +septembre. + +Il suffit de regrouper les données suivant le critère suivant : +- si le mois est inférieur à 9, alors considérer qu'il s'agit de l'année en cours +- sinon, considérer qu'il s'agit de l'année suivante + +#+BEGIN_SRC python :results verbatim :exports both + inc = data.groupby(lambda date: date.year if date.month < 9 else date.year + 1, axis=0).sum() + inc.head() +#+END_SRC + +#+RESULTS: +: inc +: 1991 553895 +: 1992 834935 +: 1993 642921 +: 1994 662750 +: 1995 651333 + +Nous ignorons les années extrêmes, pour lesquelles n'avons pas suffisamment de +données. Comme nous ne sommes pas encore en septembre, nous devons aussi enlever +l'année incomplète 2019. + +#+BEGIN_SRC python :results verbatim :exports both + inc = inc.loc[inc.index[1:-2]] + inc.head() +#+END_SRC #+RESULTS: -: Hello world! +: inc +: 1992 834935 +: 1993 642921 +: 1994 662750 +: 1995 651333 +: 1996 564994 + +* Réponse aux questions + +** Quelle est l'année avec l'épidémie la plus forte ? -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) -#+end_src +#+BEGIN_SRC python :results verbatim :exports both + inc[inc == inc.max()].dropna() +#+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) -#+end_src +: inc +: 2009 844054.0 + +** Quelle est l'année avec l'épidémie la plus faible ? + +#+BEGIN_SRC python :results verbatim :exports both + inc[inc == inc.min()].dropna() +#+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 ~