#+TITLE: Module 3 - exercice 2 #+AUTHOR: Votre nom #+DATE: La date du jour #+LANGUAGE: fr # #+PROPERTY: header-args :eval never-export #+HTML_HEAD: #+HTML_HEAD: #+HTML_HEAD: #+HTML_HEAD: #+HTML_HEAD: #+HTML_HEAD: * Import des données, vérification, préparation ** Import et vérification rapide Les données au format csv sont téléchargées depuis l'adresse : http://www.sentiweb.fr/datasets/incidence-PAY-7.csv Code source adapté de : #+NAME: code-source-mooc https://gitlab.inria.fr/learninglab/mooc-rr/mooc-rr-ressources/blob/master/module3/ressources/analyse-syndrome-grippal-orgmode.org #+begin_src python :results output :session :exports both from urllib.request import urlretrieve import os if os.path.isfile("incidence-PAY-7.csv"): print("Chargement du fichier local") else: urlretrieve("http://www.sentiweb.fr/datasets/incidence-PAY-7.csv", "incidence-PAY-7.csv") data = open("incidence-PAY-7.csv", encoding="iso-8859-1").read() lines = data.strip().split('\n') data_lines = lines[1:] table = [line.split(',') for line in data_lines] #+end_src #+RESULTS: : : Chargement du fichier local Vérification visuelle des premières lignes. #+begin_src python :results value :session :exports both table[:5] #+end_src #+RESULTS: | week | indicator | inc | inc_low | inc_up | inc100 | inc100_low | inc100_up | geo_insee | geo_name | | 202016 | 7 | 803 | 83 | 1523 | 1 | 0 | 2 | FR | France | | 202015 | 7 | 1918 | 675 | 3161 | 3 | 1 | 5 | FR | France | | 202014 | 7 | 3879 | 2227 | 5531 | 6 | 3 | 9 | FR | France | | 202013 | 7 | 7326 | 5236 | 9416 | 11 | 8 | 14 | FR | France | ** Extraction des colonnes utilisées #+begin_src python :results output :session :exports both week = [row[0] for row in table] assert week[0] == 'week' del week[0] inc = [row[2] for row in table] assert inc[0] == 'inc' del inc[0] data = list(zip(week, inc)) #+end_src #+RESULTS: Vérification visuelle des premières et dernières lignes. #+begin_src python :results value :session :exports both [('week', 'inc'), None] + data[:5] + [None] + data[-5:] #+end_src #+RESULTS: | week | inc | |--------+-------| | 202016 | 803 | | 202015 | 1918 | | 202014 | 3879 | | 202013 | 7326 | | 202012 | 8123 | |--------+-------| | 199101 | 15565 | | 199052 | 19375 | | 199051 | 19080 | | 199050 | 11079 | | 199049 | 1143 | ** Conversion des dates Code source du mooc. #+begin_src python :results output :session :exports both import datetime converted_data = [(datetime.datetime.strptime(year_and_week + ":1" , '%G%V:%u').date(), int(inc)) for year_and_week, inc in data] converted_data.sort(key = lambda record: record[0]) #+end_src #+RESULTS: Visualisation premières lignes. Code source tjrs repris de [[code-source-mooc]] #+begin_src python :results value :session :exports both str_data = [(str(date), str(inc)) for date, inc in converted_data] [('date', 'inc'), None] + str_data[:5] + [None] + str_data[-5:] #+end_src #+RESULTS: | date | inc | |------------+-------| | 1990-12-03 | 1143 | | 1990-12-10 | 11079 | | 1990-12-17 | 19080 | | 1990-12-24 | 19375 | | 1990-12-31 | 15565 | |------------+-------| | 2020-03-16 | 8123 | | 2020-03-23 | 7326 | | 2020-03-30 | 3879 | | 2020-04-06 | 1918 | | 2020-04-13 | 803 | Vérification des dates : voyons si il y a des données manquantes, i.e. plus de 7 jours d'écart entre deux dates. #+begin_src python :results output :session :exports both dates = [date for date, _ in converted_data] for date1, date2 in zip(dates[:-1], dates[1:]): if date2-date1 != datetime.timedelta(weeks=1): print(f"Il y a {date2-date1} entre {date1} et {date2}") #+end_src #+RESULTS: Visiblement aucune ligne manquante. * Analyse des données Contrairement au mooc, je fais l'analyse entièrement avec python, librairie pandas. ** Visualisation au pas semaine #+begin_src python :results output :session :exports both import pandas data = pandas.DataFrame(converted_data, columns=("Date", "Incidence")) data.set_index(pandas.to_datetime(data["Date"]), inplace=True) fig = data.plot() plt.savefig("incidence_hebdo_varicelle.png") #+end_src #+RESULTS: : Traceback (most recent call last): : File "", line 1, in : File "/tmp/babel-Aj6Qqg/python-2n3UZl", line 5, in : plt.savefig("incidence_hebdo_varicelle.png") : NameError: name 'plt' is not defined [[./incidence_hebdo_varicelle.png]] Zoom sur une année pour situer à quel mois se situe de pic annuel. #+begin_src python :results output :session :exports both #print(data.index) fig2 = data["2002-01-01":"2002-12-31"].plot() plt.savefig("incidence_hebdo_varicelle_2002.png") #+end_src #+RESULTS: : Traceback (most recent call last): : File "", line 1, in : File "/tmp/babel-Aj6Qqg/python-Jyd2GV", line 3, in : plt.savefig("incidence_hebdo_varicelle_2002.png") : NameError: name 'plt' is not defined [[file:"incidence_hebdo_varicelle_2002.png"]] Le pic semble être au printemps de chaque année, légèrement plus tard que le pic de grippe. ** Analyse année par année La période de référence commence au 1er septembre. La période commençant en septembre de l'année N a l'étiquette N+1 car le pic annuel se situe en début/printemps de l'année N+1 (sur le modèle de l'analyse du syndrome grippal dans le mooc). De plus, on supprime les données antérieures au 01-09-1991 car pas de données pour la période du 01-09-1990 au 03-12-1990, qui compte pour l'année 1991. L'année 1991 n'est donc pas analysée. De manière similaire, on ne tient pas compte des données postérieures au 01-09-2019 car les données s'arrêtent au 13-04-2020. L'année 2020 n'est donc pas analysée non plus. #+begin_src python :results output :session :exports both data = data["1991-09-01":"2019-09-01"] années = [N for N in range(1992,2020,1)] incidence_annuelle = [] for N in années : incidence_annuelle.append(data["{}-09-01".format(N-1):"{}-08-31".format(N)]["Incidence"].sum()) donn = pandas.DataFrame() donn["Année"] = années donn.set_index("Année", inplace=True) donn["Incidence annuelle"] = incidence_annuelle #+end_src Epidémie la plus forte. #+begin_src python :results output :session :exports both print("incidence max : ", donn.max()) print("année : ", donn.idxmax()) #+end_src #+RESULTS: : incidence max : Incidence annuelle 844054 : dtype: int64 : année : Incidence annuelle 2009 : dtype: int64 Epidémie la plus faible. #+begin_src python :results output :session :exports both print("incidence min : ", donn.min()) print("année : ", donn.idxmin()) #+end_src #+RESULTS: : incidence min : Incidence annuelle 515343 : dtype: int64 : année : Incidence annuelle 2002 : dtype: int64