Module 3 - exercice 2
Table des matières
1 Import des données, vérification, préparation
1.1 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 :
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]
Chargement du fichier local
Vérification visuelle des premières lignes.
table[:5]
week | indicator | inc | inclow | incup | inc100 | inc100low | inc100up | geoinsee | geoname |
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 |
1.2 Extraction des colonnes utilisées
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))
Vérification visuelle des premières et dernières lignes.
[('week', 'inc'), None] + data[:5] + [None] + data[-5:]
week | inc |
---|---|
202016 | 803 |
202015 | 1918 |
202014 | 3879 |
202013 | 7326 |
202012 | 8123 |
199101 | 15565 |
199052 | 19375 |
199051 | 19080 |
199050 | 11079 |
199049 | 1143 |
1.3 Conversion des dates
Code source du mooc.
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])
Visualisation premières lignes. Code source tjrs repris de 1
str_data = [(str(date), str(inc)) for date, inc in converted_data] [('date', 'inc'), None] + str_data[:5] + [None] + str_data[-5:]
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.
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}")
Visiblement aucune ligne manquante.
2 Analyse des données
Contrairement au mooc, je fais l'analyse entièrement avec python, librairie pandas.
2.1 Visualisation au pas semaine
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")
Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/tmp/babel-EgMhYL/python-1puHgN", line 5, in <module> plt.savefig("incidence_hebdo_varicelle.png") NameError: name 'plt' is not defined
Zoom sur une année pour situer à quel mois se situe de pic annuel.
#print(data.index) fig2 = data["2002-01-01":"2002-12-31"].plot() plt.savefig("incidence_hebdo_varicelle_2002.png")
Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/tmp/babel-EgMhYL/python-MvQYNv", line 3, in <module> plt.savefig("incidence_hebdo_varicelle_2002.png") NameError: name 'plt' is not defined
"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.
2.2 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.
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
Epidémie la plus forte.
print("incidence max : ", donn.max()) print("année : ", donn.idxmax())
incidence max : Incidence annuelle 844054 dtype: int64 année : Incidence annuelle 2009 dtype: int64
Epidémie la plus faible.
print("incidence min : ", donn.min()) print("année : ", donn.idxmin())
incidence min : Incidence annuelle 515343 dtype: int64 année : Incidence annuelle 2002 dtype: int64