From f6409023ed774dd2996dd594e0c22559ea932f23 Mon Sep 17 00:00:00 2001 From: 4d52d6ae01a66c6c65b5830dea97c51d <4d52d6ae01a66c6c65b5830dea97c51d@app-learninglab.inria.fr> Date: Sat, 13 Jun 2020 13:40:29 +0000 Subject: [PATCH] Replace exercice_R_fr.org --- module3/exo3/exercice_R_fr.org | 483 ++++++++++++++++++++++++++++----- 1 file changed, 411 insertions(+), 72 deletions(-) diff --git a/module3/exo3/exercice_R_fr.org b/module3/exo3/exercice_R_fr.org index 1bb8f61..f6c8dcd 100644 --- a/module3/exo3/exercice_R_fr.org +++ b/module3/exo3/exercice_R_fr.org @@ -1,84 +1,423 @@ -#+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: Thibault +#+DATE: <2020-05-19> #+LANGUAGE: fr -# #+PROPERTY: header-args :eval never-export - -#+HTML_HEAD: -#+HTML_HEAD: -#+HTML_HEAD: -#+HTML_HEAD: -#+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/. - -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. - -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~): - -#+begin_src R :results output :exports both -print("Hello world!") +#+PROPERTY: header-args :session *R* +#+OPTIONS: toc:nil +#+PROPERTY: results output + +* COMMENT Consignes + +#+begin_quote +William Playfair était un des pionniers de la présentation graphique des données. Il est notamment +considéré comme l'inventeur de l'histogramme. Un de ses graphes célèbres, tiré de son livre "A +Letter on Our Agricultural Distresses, Their Causes and Remedies", montre l'évolution du prix du blé +et du salaire moyen entre 1565 et 1821. Playfair n'a pas publié les données numériques brutes qu'il +a utilisées, car à son époque la réplicabilité n'était pas encore considérée comme essentielle. Des +valeurs obtenues par numérisation du graphe sont aujourd'hui téléchargeables, la version en format +CSV étant la plus pratique. + +Quelques remarques pour la compréhension des données : + +- Jusqu'en 1971, la livre sterling était divisée en 20 shillings, et un shilling en 12 pences. + +- Le prix du blé est donné en shillings pour un quart de boisseau de blé. Un quart de boisseau + équivaut 15 livres britanniques ou 6,8 kg. + +- Les salaires sont donnés en shillings par semaine. + +Votre mission si vous l'acceptez : + +1. Votre première tâche est de reproduire le graphe de Playfair à partir des données + numériques. Représentez, comme Playfair, le prix du blé par des barres et les salaires par une + surface bleue délimitée par une courbe rouge. Superposez les deux de la même façon dans un seul + graphique. Le style de votre graphique pourra rester différent par rapport à l'original, mais + l'impression globale devrait être la même. + +2. Par la suite, améliorez la présentation de ces données. Pour commencer, Playfair a combiné les + deux quantités dans un même graphique en simplifiant les unités "shillings par quart de boisseau + de blé" et "shillings par semaine" à un simple "shillings", ce qui aujourd'hui n'est plus + admissible. Utilisez deux ordonnées différentes, une à gauche et une à droite, et indiquez les + unités correctes. À cette occasion, n'hésitez pas à proposer d'autres représentations que des + barres et des surface/courbes pour les deux jeux de données si ceci vous paraît judicieux. +#+end_quote + +* COMMENT Vincentare analysis + :PROPERTIES: + :header-args: :eval no + :END: + +#+begin_src R +data(Wheat) + +data(Wheat) + +# ------------------------------------ +# Playfair's graph, largely reproduced +# ------------------------------------ + +# convenience function to fill area under a curve down to a minimum value +fillpoly <- function(x,y, low=min(y), ...) { + n <- length(x) + polygon( c(x, x[n], x[1]), c(y, low, low), ...) +} + +# For best results, this graph should be viewed with width ~ 2 * height +# Note use of type='s' to plot a step function for Wheat +# and panel.first to provide a background grid() +# The curve for Wages is plotted after the polygon below it is filled +with(Wheat, { + plot(Year, Wheat, type="s", ylim=c(0,105), + ylab="Price of the Quarter of Wheat (shillings)", + panel.first=grid(col=gray(.9), lty=1)) + fillpoly(Year, Wages, low=0, col="lightskyblue", border=NA) + lines(Year, Wages, lwd=3, col="red") + }) + + +# add some annotations +text(1625,10, "Weekly wages of a good mechanic", cex=0.8, srt=3, col="red") + +# cartouche +text(1650, 85, "Chart", cex=2, font=2) +text(1650, 70, + paste("Shewing at One View", + "The Price of the Quarter of Wheat", + "& Wages of Labor by the Week", + "from the Year 1565 to 1821", + "by William Playfair", + sep="\n"), font=3) + +# add the time series bars to show reigning monarchs +# distinguish Cromwell visually, as Playfair did +with(Wheat.monarchs, { + y <- ifelse( !commonwealth & (!seq_along(start) %% 2), 102, 104) + segments(start, y, end, y, col="black", lwd=7, lend=1) + segments(start, y, end, y, col=ifelse(commonwealth, "white", NA), lwd=4, lend=1) + text((start+end)/2, y-2, name, cex=0.5) + }) + +# ----------------------------------------- +# plot the labor cost of a quarter of wheat +# ----------------------------------------- +Wheat1 <- within(na.omit(Wheat), {Labor=Wheat/Wages}) +with(Wheat1, { + plot(Year, Labor, type='b', pch=16, cex=1.5, lwd=1.5, + ylab="Labor cost of a Quarter of Wheat (weeks)", + ylim=c(1,12.5)); + lines(lowess(Year, Labor), col="red", lwd=2) + }) + +# cartouche +text(1740, 10, "Chart", cex=2, font=2) +text(1740, 8.5, + paste("Shewing at One View", + "The Work Required to Purchase", + "One Quarter of Wheat", + sep="\n"), cex=1.5, font=3) + +with(Wheat.monarchs, { + y <- ifelse( !commonwealth & (!seq_along(start) %% 2), 12.3, 12.5) + segments(start, y, end, y, col="black", lwd=7, lend=1) + segments(start, y, end, y, col=ifelse(commonwealth, "white", NA), lwd=4, lend=1) + text((start+end)/2, y-0.2, name, cex=0.5) + }) + +#+end_src + +* Reproduction du graphique de Playfair + +On importe le fichier de données qu'on définit comme fonction pour pouvoir le manipuler: +#+begin_src R +wheat <- read.csv("Wheat.csv", header = TRUE) +#View(wheat) +#+end_src + +#+RESULTS: +| 1 | 1565 | 41 | 5 | +| 2 | 1570 | 45 | 5.05 | +| 3 | 1575 | 42 | 5.08 | +| 4 | 1580 | 49 | 5.12 | +| 5 | 1585 | 41.5 | 5.15 | +| 6 | 1590 | 47 | 5.25 | +| 7 | 1595 | 64 | 5.54 | +| 8 | 1600 | 27 | 5.61 | +| 9 | 1605 | 33 | 5.69 | +| 10 | 1610 | 32 | 5.78 | +| 11 | 1615 | 33 | 5.94 | +| 12 | 1620 | 35 | 6.01 | +| 13 | 1625 | 33 | 6.12 | +| 14 | 1630 | 45 | 6.22 | +| 15 | 1635 | 33 | 6.3 | +| 16 | 1640 | 39 | 6.37 | +| 17 | 1645 | 53 | 6.45 | +| 18 | 1650 | 42 | 6.5 | +| 19 | 1655 | 40.5 | 6.6 | +| 20 | 1660 | 46.5 | 6.75 | +| 21 | 1665 | 32 | 6.8 | +| 22 | 1670 | 37 | 6.9 | +| 23 | 1675 | 43 | 7 | +| 24 | 1680 | 35 | 7.3 | +| 25 | 1685 | 27 | 7.6 | +| 26 | 1690 | 40 | 8 | +| 27 | 1695 | 50 | 8.5 | +| 28 | 1700 | 30 | 9 | +| 29 | 1705 | 32 | 10 | +| 30 | 1710 | 44 | 11 | +| 31 | 1715 | 33 | 11.75 | +| 32 | 1720 | 29 | 12.5 | +| 33 | 1725 | 39 | 13 | +| 34 | 1730 | 26 | 13.3 | +| 35 | 1735 | 32 | 13.6 | +| 36 | 1740 | 27 | 14 | +| 37 | 1745 | 27.5 | 14.5 | +| 38 | 1750 | 31 | 15 | +| 39 | 1755 | 35.5 | 15.7 | +| 40 | 1760 | 31 | 16.5 | +| 41 | 1765 | 43 | 17.6 | +| 42 | 1770 | 47 | 18.5 | +| 43 | 1775 | 44 | 19.5 | +| 44 | 1780 | 46 | 21 | +| 45 | 1785 | 42 | 23 | +| 46 | 1790 | 47.5 | 25.5 | +| 47 | 1795 | 76 | 27.5 | +| 48 | 1800 | 79 | 28.5 | +| 49 | 1805 | 81 | 29.5 | +| 50 | 1810 | 99 | 30 | +| 51 | 1815 | 78 | nil | +| 52 | 1820 | 54 | nil | +| 53 | 1821 | 54 | nil | + + +On définit une fonction qui permet d'établir la moyenne de la pente de la courbe des salaires: + +#+begin_src R + fillpoly <- function(x,y, low=min(y), ...) { + n <- length(x) + polygon( c(x, x[n], x[1]), c(y, low, low), ...) + } +#+end_src + +#+RESULTS: + + +On établit deux représentations graphiques à partir des mêmes axes: l'évolution du prix du quart de +boisseau de blé en histogramme, et l'évolution du salaire en courbe. + +#+begin_src R + with(wheat, { + plot(Year, Wheat, type="s", ylim=c(0,105), + ylab="Price of the Quarter of Wheat (shillings)", + panel.first=grid(col=gray(.9), lty=1)) + fillpoly(Year, Wages, low=0, col="lightskyblue", border=NA) + lines(Year, Wages, lwd=3, col="red") + }) +#+end_src + +#+RESULTS: + + +On ajoute les annotations et le cartouche de Playfair: + +#+begin_src R + text(1625,10, "Weekly wages of a good mechanic", cex=0.8, srt=3, col="red") + text(1650, 85, "Chart", cex=2, font=2) + text(1650, 70, + paste("Shewing at One View", + "The Price of the Quarter of Wheat", + "& Wages of Labor by the Week", + "from the Year 1565 to 1821", + "by William Playfair", + sep="\n"), font=3) +#+end_src + +#+RESULTS: + + +On distingue le prix du travail par quart de boisseau de blé: + +#+begin_src R +Wheat1 <- within(na.omit(Wheat), {Labor=Wheat/Wages}) +with(Wheat1, { + plot(Year, Labor, type='b', pch=16, cex=1.5, lwd=1.5, + ylab="Labor cost of a Quarter of Wheat (weeks)", + ylim=c(1,12.5)); + lines(lowess(Year, Labor), col="red", lwd=2) + }) +#+end_src + +#+RESULTS: + +\includegraphics{playfair.jpg} + +\newpage + +** COMMENT Ajout d'un cartouche + +On met un cartouche: + +#+begin_src R :noeval +text(1740, 10, "Chart", cex=2, font=2) +text(1740, 8.5, + paste("Shewing at One View", + "The Work Required to Purchase", + "One Quarter of Wheat", + sep="\n"), cex=1.5, font=3) +#+end_src + +#+RESULTS: + + +* Nouveau graphe qui distingue les unités + +#+begin_src R +wheat <- read.csv("Wheat.csv", header = TRUE) +#View(wheat) #+end_src #+RESULTS: -: [1] "Hello world!" +| 1 | 1565 | 41 | 5 | +| 2 | 1570 | 45 | 5.05 | +| 3 | 1575 | 42 | 5.08 | +| 4 | 1580 | 49 | 5.12 | +| 5 | 1585 | 41.5 | 5.15 | +| 6 | 1590 | 47 | 5.25 | +| 7 | 1595 | 64 | 5.54 | +| 8 | 1600 | 27 | 5.61 | +| 9 | 1605 | 33 | 5.69 | +| 10 | 1610 | 32 | 5.78 | +| 11 | 1615 | 33 | 5.94 | +| 12 | 1620 | 35 | 6.01 | +| 13 | 1625 | 33 | 6.12 | +| 14 | 1630 | 45 | 6.22 | +| 15 | 1635 | 33 | 6.3 | +| 16 | 1640 | 39 | 6.37 | +| 17 | 1645 | 53 | 6.45 | +| 18 | 1650 | 42 | 6.5 | +| 19 | 1655 | 40.5 | 6.6 | +| 20 | 1660 | 46.5 | 6.75 | +| 21 | 1665 | 32 | 6.8 | +| 22 | 1670 | 37 | 6.9 | +| 23 | 1675 | 43 | 7 | +| 24 | 1680 | 35 | 7.3 | +| 25 | 1685 | 27 | 7.6 | +| 26 | 1690 | 40 | 8 | +| 27 | 1695 | 50 | 8.5 | +| 28 | 1700 | 30 | 9 | +| 29 | 1705 | 32 | 10 | +| 30 | 1710 | 44 | 11 | +| 31 | 1715 | 33 | 11.75 | +| 32 | 1720 | 29 | 12.5 | +| 33 | 1725 | 39 | 13 | +| 34 | 1730 | 26 | 13.3 | +| 35 | 1735 | 32 | 13.6 | +| 36 | 1740 | 27 | 14 | +| 37 | 1745 | 27.5 | 14.5 | +| 38 | 1750 | 31 | 15 | +| 39 | 1755 | 35.5 | 15.7 | +| 40 | 1760 | 31 | 16.5 | +| 41 | 1765 | 43 | 17.6 | +| 42 | 1770 | 47 | 18.5 | +| 43 | 1775 | 44 | 19.5 | +| 44 | 1780 | 46 | 21 | +| 45 | 1785 | 42 | 23 | +| 46 | 1790 | 47.5 | 25.5 | +| 47 | 1795 | 76 | 27.5 | +| 48 | 1800 | 79 | 28.5 | +| 49 | 1805 | 81 | 29.5 | +| 50 | 1810 | 99 | 30 | +| 51 | 1815 | 78 | nil | +| 52 | 1820 | 54 | nil | +| 53 | 1821 | 54 | nil | + + +Les données comportent 3 variables (année, blé, salaire). -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~). +On améliore le graphique de Playfair en distinguant 2 axes pour avoir l'évolution du prix du blé +selon l'année d'une part (unité: quart de boisseau), selon le salair d'un ouvrier d'autre part +(unité:) -#+begin_src R :results output :session *R* :exports both -summary(cars) +On rajoute de l'espace à droite pour rendre visible le titre de l'axe: + +#+begin_src R :results silent +par(mar=c(5, 4, 4, 5) + 0.1) #+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) +| 5.1 | +| 4.1 | +| 4.1 | +| 5.1 | + + +On refait le graphique précédent sans le salaire. + +On change le type de représentation pour afficher une ligne pleine, on a donc la courbe du prix du +blé en fonction du temps: + +#+begin_src R +with(wheat, { + plot(Year, Wheat, type="l", ylim=c(0,110), + ylab="Price of the Quarter of Wheat (shillings)", + col="blue", lty = 1) +}) #+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 ~