module3 exo3 check data done

parent 6d3d77b6
#+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: <script type="text/javascript" src="http://www.pirilampo.org/styles/lib/js/jquery.stickytableheaders.js"></script>
#+HTML_HEAD: <script type="text/javascript" src="http://www.pirilampo.org/styles/readtheorg/js/readtheorg.js"></script>
* 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 ~<r~ ou ~<R~ suivi de ~Tab~).
Maintenant, à vous de jouer! Vous pouvez effacer toutes ces
informations et les remplacer par votre document computationnel.
Pas de problème de ce coté là non plus, nous pouvons passer à
l'analyse de nos données.
* Reproduction des résultats de William Playfair
TODO
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment