module3 exo3 check data done

parent 6d3d77b6
#+TITLE: Votre titre #+TITLE: Le pouvoir d'achat des ouvriers anglais du XVIe au XIXe siècle
#+AUTHOR: Votre nom #+AUTHOR: Antoine RICHARD
#+DATE: La date du jour #+DATE: 24/04/2020
#+LANGUAGE: fr #+LANGUAGE: fr
# #+PROPERTY: header-args :eval never-export # #+PROPERTY: header-args :eval never-export
...@@ -11,74 +11,195 @@ ...@@ -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/lib/js/jquery.stickytableheaders.js"></script>
#+HTML_HEAD: <script type="text/javascript" src="http://www.pirilampo.org/styles/readtheorg/js/readtheorg.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 * Préface
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/.
Lorsque vous utiliserez le raccourci =C-c C-e h o=, ce document sera Pour exécuter le code de cette analyse, il faut disposer des logiciels suivants:
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.
Comme nous vous l'avons montré dans la vidéo, on inclut du code ** Emacs 25 ou plus
R de la façon suivante (et on l'exécute en faisant ~C-c C-c~): 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 #+BEGIN_SRC python :results output
print("Hello world!") 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 #+end_src
#+RESULTS: #+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 ** Vérification des données
plus courant, R étant vraiment un langage interactif), donc une
persistance d'un bloc à l'autre (et on l'exécute toujours en faisant Vérifions maintenant si les données de notre tableau sont crédibles
~C-c C-c~). 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 #+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 #+end_src
#+RESULTS: #+RESULTS:
: speed dist
: Min. : 4.0 Min. : 2.00 Tout semble en règles.
: 1st Qu.:12.0 1st Qu.: 26.00
: Median :15.0 Median : 36.00 ** Vérifications des dates
: Mean :15.4 Mean : 42.98
: 3rd Qu.:19.0 3rd Qu.: 56.00 Chaque entrée est supposée être séparé d'exactement cinq année,
: Max. :25.0 Max. :120.00 vérifions cela.
Et enfin, voici un exemple de sortie graphique: #+begin_src R :results output :session *R* :exports both
#+begin_src R :results output graphics :file "./cars.png" :exports results :width 600 :height 400 :session *R* for(row in 2:nrow(table)){
plot(cars) 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 #+end_src
#+RESULTS: #+RESULTS:
[[file:./cars.png]]
Pas de problème de ce coté là non plus, nous pouvons passer à
Vous remarquerez le paramètre ~:exports results~ qui indique que le code l'analyse de nos données.
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 * Reproduction des résultats de William Playfair
(indiquer ~both~) car l'objectif est que vos analyses de données soient
parfaitement transparentes pour être reproductibles. TODO
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.
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