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 ~