1. Préparation des données

Les données de Playfair’s Data on Wages and the Price of Wheat sont disponibles à l’adresse suivante: https://raw.githubusercontent.com/vincentarelbundock/Rdatasets/master/csv/HistData/Wheat.csv. Nous les récupérons sous forme d’un fichier en format CSV L’URL est:

data_url = "https://raw.githubusercontent.com/vincentarelbundock/Rdatasets/master/csv/HistData/Wheat.csv"

Je télécharge les données à parir de l’URL du site et je les enregistre en local si je ne l’ai pas déjà fait

data_file = "Playfair-data.csv"
if (!file.exists(data_file)) {
    download.file(data_url, data_file, method="auto")
}

Voici l’explication des colonnes donnée sur le sur le site d’origine:

Nom de colonne Libellé de colonne
`| numéro d'ordre des données (integer) | |year| année (intervalle 5 ans) (integer) | |wheat| prix du blé en (Shillings/Quarter bushel) (integer) | |wages` salaire hebdomadaire (Shillings): a numeric vector
—————- —————————————————–

======= #### Lecture je lis le fichier CSV directement sur les données enregistrées localement.

data = read.csv(data_file)

Regardons ce que nous avons obtenu:

head(data)
##   X Year Wheat Wages
## 1 1 1565  41.0  5.00
## 2 2 1570  45.0  5.05
## 3 3 1575  42.0  5.08
## 4 4 1580  49.0  5.12
## 5 5 1585  41.5  5.15
## 6 6 1590  47.0  5.25
tail(data)
##     X Year Wheat Wages
## 48 48 1800    79  28.5
## 49 49 1805    81  29.5
## 50 50 1810    99  30.0
## 51 51 1815    78    NA
## 52 52 1820    54    NA
## 53 53 1821    54    NA

Y a-t-il des points manquants dans nos données ?

na_records = apply(data, 1, function (x) any(is.na(x)))
data[na_records,]
##     X Year Wheat Wages
## 51 51 1815    78    NA
## 52 52 1820    54    NA
## 53 53 1821    54    NA

On Supprime les 3 dernières lignes sans supprimer le data file

data <- data[-(50:53),]
na_records = apply(data, 1, function (x) any(is.na(x)))
data[na_records,]
## [1] X     Year  Wheat Wages
## <0 lignes> (ou 'row.names' de longueur nulle)

Les trois colonnes qui nous intéressent sont year, Wheat et Wages. Vérifions leurs classes:

class(data$Year)
## [1] "integer"
class(data$Wages)
## [1] "numeric"
class(data$Wheat)
## [1] "numeric"

Ce sont des valeurs numériques, tout va bien !

2. 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.

####Tracer le graphique

#Tracer le graphique (partie gauche)
##### Ajuster les marges
par(mar=c(6,4,3,5))
barplot(data$Wheat, axes=F, ylim=c(0,100), xlab="", ylab="", xaxs="i", col="white", main="Données de Playfair")

# Légende de l'axe Y de gauche
axis(2, ylim=c(0,100),col="black")
mtext("Prix du 1/4 de boisseau de blé en shilling",side=2,line=2.5)
box() # pour encadrer le graphique

# Ajout de la courbe rouge correspondant à l'axe de droite
par(new=T) # Autorise la superposition des courbes et non le remplacement d'un graphique par un autre
plot(data$Year, data$Wages, pch=10,  xlab="", ylab="", ylim=c(0,100), axes=F, type="o", col="red",xaxs="i", yaxs="i",)

# AXE X
xtick<-seq(1565, 1805, by=5)
axis(1,xlim=(1565:1805), at=xtick,las =2 )
#Nom de l'axe des x
mtext("Années",side=1,col="black",line=2.5)
# Legende
legend(x="topleft",legend=c("Salaire hebdomadaire en shilling"),text.col=c("red"),pch=c(10),col=c("red"))

#Surface sous la courbe en rouge
polygon(c(data$Year,max(data$Year),min(data$Year)),c(data$Wages,0,0),col="lightblue",density=NA)

3. 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.

Tracer le graphique

#Tracer le graphique (partie gauche)
##### Ajuster les marges
par(mar=c(6,4,3,5))
barplot(data$Wheat, axes=F, ylim=c(0,100), xlab="", ylab="", xaxs="i", col="white", main="Données de Playfair")

# Légende de l'axe Y de gauche
axis(2, ylim=c(0,100),col="black")
mtext("Prix du boisseau de blé en shilling",side=2,line=2.5)
box() # pour encadrer le graphique

# Ajout de la courbe rouge correspondant à l'axe de droite
par(new=T) # Autorise la superposition des courbes et non le remplacement d'un graphique par un autre
plot(data$Year, data$Wages, pch=10,  xlab="", ylab="", ylim=c(0,40), axes=F, type="o", col="red",xaxs="i", yaxs="i",)

# Légende de l'axe Y de droite
mtext("Salaire hebdomadaire en shilling",side=4,col="red",line=2.5)
axis(4, ylim=c(0,40), col="red",col.axis="red")

# AXE X
xtick<-seq(1565, 1805, by=5)
axis(1,xlim=(1565:1805), at=xtick,las =2 )

mtext("Années",side=1,col="black",line=2.5)

4. L’objectif de Playfair était de montrer que le pouvoir d’achat des ouvriers avait augmenté au cours du temps. Essayez de mieux faire ressortir cette information. Pour cela, faites une représentation graphique du pouvoir d’achat au cours du temps, définie comme la quantité de blé qu’un ouvrier peut acheter avec son salaire hebdomadaire. Dans un autre graphique, montrez les deux quantités (prix du blé, salaire) sur deux axes différents, sans l’axe du temps. Trouvez une autre façon d’indiquer la progression du temps dans ce graphique. Quelle représentation des données vous paraît la plus claire ? N’hésitez pas à en proposer d’autres.

D’abord on recalcule les données en rajoutant la colonne Pouvoir d’achat dans notre dataframe

#calcul du nombre de 1/4 de boisseau de blé que l'on pouvait s'acheter avec son salaire hebdomadaire
data$Pouvoir = data$Wages/data$Wheat
data <- data[-(50:53),]
na_records = apply(data, 1, function (x) any(is.na(x)))
data[na_records,]
## [1] X       Year    Wheat   Wages   Pouvoir
## <0 lignes> (ou 'row.names' de longueur nulle)
plot(data$Year, data$Pouvoir, pch=10,  xlab="", ylab="", ylim=c(0,1), axes=F, type="o", col="red",xaxs="i", yaxs="i",)
# Légende de l'axe Y de gauche
axis(2, ylim=c(0,1),col="black")
mtext("Pouvoir d'achat en 1/4 de boisseau de blé",side=2,line=2.5)
box() # pour encadrer le graphique
# AXE X
xtick<-seq(1565, 1805, by=5)
axis(1,xlim=(1565:1805), at=xtick,las =2 )

mtext("Années",side=1,col="black",line=2.5)

plot(data$Wages, data$Wheat, pch=10,  xlab="", ylab="", ylim=c(25,60), xlim=c(4,20),type="p", col="red",xaxs="i", yaxs="i",)
abline(lm(data$Wheat ~data$Wages)$coefficients, col="blue",lwd=2)

Je remercie pour leur aide en ligne: le forum du Cirad : http://forums.cirad.fr/ et Antoine Massé : https://sites.google.com/site/rgraphiques/home