* Module 3 : La main à la pâte, une analyse réplicable
** 1. Une analyse réplicable, c'est quoi ?
- Dans le cas d'une analyse traditionnelle, on se focalise sur les résultats obtenus. On présente brièvement la méthodologie adoptée qui a permis d'obtenir les résultats. Puis l'on fini avec une discussion sur les résultats.
- En constraste, une analyse de donnés répblicable remplace la présentation de la méthodologie par la totatlité du code qui a permis d'obtenir ces résultats, accompagnée d'une explication sur les différents choix effectuées.
- Pourquoi faire une analyse répblicable : facile à refaire si les données changent, facile à modifier, facile à inspecter et vérifier.
- Dans le cas d'une analyse traditionnelle, on se focalise sur les
résultats obtenus. On présente brièvement la méthodologie adoptée
qui a permis d'obtenir les résultats. Puis l'on fini avec une
discussion sur les résultats.
- En constraste, une analyse de donnés répblicable remplace la
présentation de la méthodologie par la totatlité du code qui a
permis d'obtenir ces résultats, accompagnée d'une explication sur
les différents choix effectuées.
- Pourquoi faire une analyse répblicable : facile à refaire si les
données changent, facile à modifier, facile à inspecter et vérifier.
** 2. Étude de cas : l'incidence de syndromes grippaux
- Utilisation du site Sentinelles afin d'utiliser des données médicales.
- Année et semaine en format ISO : la première semaine c'est la semaine qui contient le 4 janvier.
- Aucune modification des données brutes à la main, cela rend l'analyse non replicable. Toutes les modification doivent se faire dans du code.
- Format des dates ISO 8601, il y a deux façons différentes de représenter une date, considérons le 8 août 2018 :
- Utilisation du site Sentinelles afin d'utiliser des données
médicales.
- Année et semaine en format ISO : la première semaine c'est la
semaine qui contient le 4 janvier.
- Aucune modification des données brutes à la main, cela rend
l'analyse non replicable. Toutes les modification doivent se faire
dans du code.
- Format des dates ISO 8601, il y a deux façons différentes de
représenter une date, considérons le 8 août 2018 :
1. 2018-08-08 : année, mois, jour du mois
2. 2018-W32-3 : année, semaine et jour de la semaine (mercredi = 3ème jour). La première semaine de l'année est celle qui contient le premier jeudi de l'année.
** 3. Importer les données avec OrgMode / Python+R
- Il faut spécifier l'url de téléchargement dans le document computationel. Avec la "commande" =#+NAME:= on peut attribuer un nom à l'url et la passer dans le code par la suite.
- Présentation d'un petit script qui permet de télécharger les données en utilisant l'url.
2. 2018-W32-3 : année, semaine et jour de la semaine (mercredi =
3ème jour). La première semaine de l'année est celle qui contient
le premier jeudi de l'année.
** 3. Importer les données avec OrgMode / Python+R
- Il faut spécifier l'url de téléchargement dans le document
computationel. Avec la "commande" =#+NAME:= on peut attribuer un nom
à l'url et la passer dans le code par la suite.
- Présentation d'un petit script qui permet de télécharger les données
en utilisant l'url.
- Lorsqu'on utilise l'option =results value= org mode permet d'avoir
un affichage agréable sur les résultats du code.
- Les données doivent être directement traitées depuis la source sans intervention manuelle.
- Les données doivent être directement traitées depuis la source sans
intervention manuelle.
** 4. Vérification et inspection avec org-mode
- Le langage python (à partir de 3.6) elle gère les dates en format ISO.
- Conversion des date + tri chronologique + vérification des données.
...
...
@@ -126,7 +144,8 @@
l'intermédiaire entre python et R.
- Faire des vérifications : analyse visuelle + des codes de vérification.
** 5. Questions et réponses
- Dans quelle année il y a eu l'épidémie la plus forte, puis leurs fréquences ?
- Dans quelle année il y a eu l'épidémie la plus forte, puis leurs
fréquences ?
- Conversions des années hebdomadaires en années annuelles.
- Expliquer les détails techniques car c'est là que l'on fait les
@@ -27,11 +27,15 @@ if sys.version_info.major < 3 or sys.version_info.minor < 6:
print("Veuillez utiliser Python 3.6 (ou plus) !")
#+END_SRC
#+RESULTS:
#+BEGIN_SRC emacs-lisp :results output
(unless (featurep 'ob-python)
(print "Veuillez activer python dans org-babel (org-babel-do-languages) !"))
#+END_SRC
#+RESULTS:
** R 3.4
Nous n'utilisons que des fonctionnalités de base du langage R, une version antérieure devrait suffire.
...
...
@@ -40,6 +44,8 @@ Nous n'utilisons que des fonctionnalités de base du langage R, une version ant
(print "Veuillez activer R dans org-babel (org-babel-do-languages) !"))
#+END_SRC
#+RESULTS:
* Préparation des données
Les données de l'incidence du syndrome grippal sont disponibles du site Web du [[http://www.sentiweb.fr/][Réseau Sentinelles]]. Nous les récupérons sous forme d'un fichier en format CSV dont chaque ligne correspond à une semaine de la période d'observation. Nous téléchargeons toujours le jeu de données complet (rien d'autre n'est proposé), qui commence en 1984 et se termine avec une semaine récente. L'URL est:
...
...
@@ -67,12 +73,28 @@ L'indication d'une semaine calendaire en format [[https://en.wikipedia.org/wiki/
Après avoir téléchargé les données, nous commençons par l'extraction des données qui nous intéressent. D'abord nous découpons le contenu du fichier en lignes, dont nous jetons la première qui ne contient qu'un commentaire. Les autres lignes sont découpées en colonnes.
Il y a malheureusement beaucoup de façon d'indiquer l'absence d'un point de données. Nous testons ici seulement pour la présence de champs vides. Il faudrait aussi rechercher des valeurs non-numériques dans les colonnes à priori numériques. Nous ne le faisons pas ici, mais une vérification ultérieure capterait des telles anomalies.
Il y a deux colonnes qui nous intéressent: la première (~"week"~) et la troisième (~"inc"~). Nous vérifions leurs noms dans l'en-tête, que nous effaçons par la suite. Enfin, nous créons un tableau avec les deux colonnes pour le traitement suivant.
#+BEGIN_SRC python :results silent
...
...
@@ -111,6 +143,8 @@ Regardons les premières et les dernières lignes. Nous insérons ~None~ pour in
Il est toujours prudent de vérifier si les données semblent crédibles. Nous savons que les semaines sont données par six chiffres (quatre pour l'année et deux pour la semaine), et que les incidences sont des nombres entiers positifs.
#+BEGIN_SRC python :results output
...
...
@@ -121,6 +155,8 @@ for week, inc in data:
print("Valeur suspecte dans la colonne 'inc': ", (week, inc))
#+END_SRC
#+RESULTS:
Pas de problème !
** Conversions
...
...
@@ -140,6 +176,8 @@ str_data = [(str(date), str(inc)) for date, inc in converted_data]
Nous faisons encore une vérification: nos dates doivent être séparées d'exactement une semaine, sauf autour du point manquant.
#+BEGIN_SRC python :results output
...
...
@@ -149,6 +187,8 @@ for date1, date2 in zip(dates[:-1], dates[1:]):
print(f"Il y a {date2-date1} entre {date1} et {date2}")
#+END_SRC
#+RESULTS:
** Passage Python -> R
Nous passons au langage R pour inspecter nos données, parce que l'analyse et la préparation de graphiques sont plus concises en R, sans nécessiter aucune bibliothèque supplémentaire.
: Error in head(inc_annuelle[order(-inc_annuelle$incidence), ]) :
: object 'inc_annuelle' not found
Enfin, un histogramme montre bien que les épidémies fortes, qui touchent environ 10% de la population française, sont assez rares: il y en eu trois au cours des 35 dernières années.
#+BEGIN_SRC R :results output graphics :file annual-inc-hist.png