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 :

https://gitlab.inria.fr/learninglab/mooc-rr/mooc-rr-ressources/blob/master/module3/ressources/analyse-syndrome-grippal-orgmode.org

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

incidence_hebdo_varicelle.png

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

Date: La date du jour

Auteur: Votre nom

Created: 2020-04-28 mar. 14:05

Validate