diff --git a/module3/exo3/exercice_R_fr.org b/module3/exo3/exercice_R_fr.org
index 1bb8f61f1d11b486ceb724afcdd14d11e5329545..9b4621dc3e25a85923544e27b79dd0626139a5df 100644
--- a/module3/exo3/exercice_R_fr.org
+++ b/module3/exo3/exercice_R_fr.org
@@ -1,6 +1,6 @@
-#+TITLE: Votre titre
-#+AUTHOR: Votre nom
-#+DATE: La date du jour
+#+TITLE: Le pouvoir d'achat des ouvriers anglais du XVIe au XIXe siècle
+#+AUTHOR: Antoine RICHARD
+#+DATE: 24/04/2020
#+LANGUAGE: fr
# #+PROPERTY: header-args :eval never-export
@@ -11,74 +11,195 @@
#+HTML_HEAD:
#+HTML_HEAD:
-* Quelques explications
-Ceci est un document org-mode avec quelques exemples de code
-R. 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.
+Pour exécuter le code de cette analyse, il faut disposer des logiciels suivants:
-Comme nous vous l'avons montré dans la vidéo, on inclut du code
-R de la façon suivante (et on l'exécute en faisant ~C-c C-c~):
+** Emacs 25 ou plus
+Une version plus ancienne d'Emacs devrait suffire. Pour une version antérieure à 26, il faut installer une version récente (9.x) d'org-mode.
+** Python 3.6 ou plus
+Nous utilisons le traitement de dates en format ISO 8601, qui a été implémenté en Python seulement avec la version 3.6.
-#+begin_src R :results output :exports both
-print("Hello world!")
+#+BEGIN_SRC python :results output
+import sys
+if sys.version_info.major < 3 or sys.version_info.minor < 6:
+ print("Veuillez utiliser Python 3.6 (ou plus) !")
+#+END_SRC
+
+#+BEGIN_SRC emacs-lisp :results output
+(unless (featurep 'ob-python)
+ (print "Veuillez activer python dans org-babel (org-babel-do-languages) !"))
+#+END_SRC
+
+** R 3.4
+Nous n'utilisons que des fonctionnalités de base du langage R, une version antérieure devrait suffire.
+
+#+BEGIN_SRC emacs-lisp :results output
+(unless (featurep 'ob-R)
+ (print "Veuillez activer R dans org-babel (org-babel-do-languages) !"))
+#+END_SRC
+
+* Préparation des données
+
+Les données de l'étude de [[https://fr.wikipedia.org/wiki/William_Playfair][William Playfair]] sont disponible à l'adresse suivante:
+#+NAME: data-url
+https://raw.githubusercontent.com/vincentarelbundock/Rdatasets/master/csv/HistData/Wheat.csv
+
+Quelques explications des colonnes données sur [[https://www.fun-mooc.fr/courses/course-v1:inria+41016+self-paced/courseware/5b932aa591d245d48d8943385cb3120a/57c96f2c7f7b42018eaac3e6b34546f4/][le site du MOOC]]:
+
+
+| Nom de colonne | Libellé de colonne |
+|----------------+-----------------------------------------------------------------------------------------------------------------------------------|
+| | Numéro de la ligne |
+| ~Year~ | Année au format YYYY |
+| ~Wheat~ | Le prix en shillings pour un quart de boisseau de blé |
+| ~Wages~ | Salaire en shillings par semaine |
+
+Notons que, jusqu'en 1971, la livre sterling était divisée en 20
+shillings, et un shilling en 12 pences.
+
+Notons aussi qu'un quart de boisseau équivaut 15 livres britanniques
+ou 6,8 kg.
+
+** Téléchargement des données
+
+Afin de ne pas avoir à télécharger les données à chaque execution, et
+pour pouvoir travailler dessus sans accès internet, nous sauvegardons
+ces données dans un fichier csv.
+
+De plus, afin d'éviter de possible problèmes d'encodage, nous
+enregistrons le fichier octet par octet.
+
+#+BEGIN_SRC python :results output :var data_url=data-url
+from urllib.request import urlopen
+from os.path import exists
+
+data_file = "data.csv"
+if not exists(data_file):
+ f = open(data_file,"wb")
+ f.write(urlopen(data_url).read())
+ f.close()
+#+END_SRC
+
+#+RESULTS:
+
+Après avoir téléchargé les données (si nécessaire), nous commençons
+par charger les données qui nous intéressent dans un tableau.
+
+#+BEGIN_SRC R :results silent :session *R* :exports none
+table = read.csv("data.csv", sep=",", header=TRUE)
+#+END_SRC
+
+Regardons un résumé de nos données:
+#+BEGIN_SRC R :results value :session *R* :exports both
+summary(table)
+#+END_SRC
+
+#+RESULTS:
+| Min. : 1 | Min. :1565 | Min. :26.00 | Min. : 5.000 |
+| 1st Qu.:14 | 1st Qu.:1630 | 1st Qu.:33.00 | 1st Qu.: 6.145 |
+| Median :27 | Median :1695 | Median :41.00 | Median : 7.800 |
+| Mean :27 | Mean :1695 | Mean :43.26 | Mean :11.582 |
+| 3rd Qu.:40 | 3rd Qu.:1760 | 3rd Qu.:47.00 | 3rd Qu.:14.875 |
+| Max. :53 | Max. :1821 | Max. :99.00 | Max. :30.000 |
+| nil | nil | nil | NA's :3 |
+
+Nous pouvons déjà voir que certaines données semble manquer:
+trois entrées n'ont pas de valeur pour la colonne "Wages".
+
+** Recherches des données manquantes
+
+Afin de ne pas géner de futurs traitements de données, commençons par
+détecter et supprimer les entrées sans donnée pour la colonne "Wages".
+
+#+begin_src R :results output :session *R* :exports both
+table = table[!is.na(table$Wages),]
+summary(table)
+#+end_src
+
+#+RESULTS:
+:
+: X Year Wheat Wages
+: Min. : 1.00 Min. :1565 Min. :26.00 Min. : 5.000
+: 1st Qu.:13.25 1st Qu.:1626 1st Qu.:32.25 1st Qu.: 6.145
+: Median :25.50 Median :1688 Median :40.25 Median : 7.800
+: Mean :25.50 Mean :1688 Mean :42.14 Mean :11.582
+: 3rd Qu.:37.75 3rd Qu.:1749 3rd Qu.:45.75 3rd Qu.:14.875
+: Max. :50.00 Max. :1810 Max. :99.00 Max. :30.000
+
+** Extractions des colonnes utilisées
+
+Nous pouvons remarquer que la première colonne du tableau ne contient
+que les numéro des lignes. Dans notre études seuls les colonnes ~Year~,
+~Wheat~ et ~Wages~ nous intéresse. Nous supprimons donc la première
+colonne de nos données.
+
+#+begin_src R :results output :session *R* :exports both
+table = table[,2:4]
+summary(table)
#+end_src
#+RESULTS:
-: [1] "Hello world!"
+:
+: Year Wheat Wages
+: Min. :1565 Min. :26.00 Min. : 5.000
+: 1st Qu.:1626 1st Qu.:32.25 1st Qu.: 6.145
+: Median :1688 Median :40.25 Median : 7.800
+: Mean :1688 Mean :42.14 Mean :11.582
+: 3rd Qu.:1749 3rd Qu.:45.75 3rd Qu.:14.875
+: Max. :1810 Max. :99.00 Max. :30.000
-Voici la même chose, mais avec une session R (c'est le cas le
-plus courant, R étant vraiment un langage interactif), donc une
-persistance d'un bloc à l'autre (et on l'exécute toujours en faisant
-~C-c C-c~).
+** Vérification des données
+
+Vérifions maintenant si les données de notre tableau sont crédibles
+selon les critères suivants:
+
+- ~Year~: nombre entier composé de quatre chiffres
+- ~Wheat~ et ~Wages~: valeur numerique
#+begin_src R :results output :session *R* :exports both
-summary(cars)
+for(row in 1:nrow(table)){
+ if(!is.integer(table[row,"Year"]) || nchar(table[row,"Year"]) != 4){
+ print("Valeur suspecte dans la colonne 'Year': ")
+ print(table[row,])
+ }
+ if(!is.numeric(table[row,"Wheat"])){
+ print("Valeur suspecte dans la colonne 'Wheat': ")
+ print(table[row,])
+ }
+ if(!is.numeric(table[row,"Wages"])){
+ print("Valeur suspecte dans la colonne 'Wages': ")
+ print(table[row,])
+ }
+}
#+end_src
#+RESULTS:
-: speed dist
-: Min. : 4.0 Min. : 2.00
-: 1st Qu.:12.0 1st Qu.: 26.00
-: Median :15.0 Median : 36.00
-: Mean :15.4 Mean : 42.98
-: 3rd Qu.:19.0 3rd Qu.: 56.00
-: Max. :25.0 Max. :120.00
-
-Et enfin, voici un exemple de sortie graphique:
-#+begin_src R :results output graphics :file "./cars.png" :exports results :width 600 :height 400 :session *R*
-plot(cars)
+
+Tout semble en règles.
+
+** Vérifications des dates
+
+Chaque entrée est supposée être séparé d'exactement cinq année,
+vérifions cela.
+
+#+begin_src R :results output :session *R* :exports both
+for(row in 2:nrow(table)){
+ if(table[row,"Year"] - table[row-1,"Year"] != 5){
+ print(
+ paste("Il y a", table[row,"Year"] - table[row-1,"Year"],
+ "ans entre", table[row,"Year"], "et", table[row-1,"Year"])
+ )
+ }
+}
#+end_src
#+RESULTS:
-[[file:./cars.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é ~cars.png~. N'oubliez pas
-de le committer si vous voulez que votre analyse soit lisible et
-compréhensible sur GitLab.
-
-Enfin, pour les prochains exercices, nous ne vous fournirons pas
-forcément de fichier de départ, ça sera à vous de le créer, par
-exemple en repartant de ce document et de le commiter vers
-gitlab. 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 R (en
-faisant ~