Visualiser des données avec R: barchart, boxplot, bubblechart 3D, clustering, histogram, parallel coordinates, radar chart, stripchart

Thursday, December 01st, 2016 | Author:

R_interface_colored

Cet exercice décrit l’installation de R et introduit l’usage du logiciel avec des exemples concrets.

Installer un environnement de travail

R et RStudio

Téléchargez et installez R avec un installeur correspondant à votre plateforme.

Avec un Mac, utiliser le pkg ici. Installez aussi ou mettez à jour XQuartz. Il est possible d’utiliser Homebrew pour tout cela:

brew tap homebrew/science
brew install gcc
brew install Caskroom/cask/xquartz
brew install r

Installez RStudio avec un installeur correspondant à votre plateforme. Ouvrez RStudio. Vous devriez voir l’interface comme à l’image ci-dessus, pour l’heure sans la partie A. La partie C est en principe vide:

Les fonctions de ces différentes parties sont les suivantes:

  • A : Fenêtre d’affichage des fichiers sources. Ici vous pouvez notamment écrire votre fichier de script, sélectionner des parties et les exécuter avec Ctrl-Enter (Cmd-Enter sur Mac). Les onglets de tableaux de données s’affichent aussi ici.
  • B: Console. Ici, vous pouvez écrire des lignes de commandes directement. Appuyez sur Enter pour exécuter une ligne que vous venez d’écrire. C’est aussi là que s’affichent les éventuels messages d’erreur.
  • C: Fenêtre environnement. Ici s’affiche la liste des objets que vous avez créés. Ces objets peuvent être de simples variables, des tableaux, des fonctions, des objets graphiques etc.
  • D: Fenêtre multionglets: Files sert à naviguer dans le système de fichiers de votre ordinateur, Plots affiche les graphiques, Packages affiche les paquets disponibles et chargés (lorsque cochés). Help donne de l’aide sur les fonctions.

Créez un nouveau projet en choisissant File>New Project… Choisissez New Directory dans la fenêtre de dialogue qui s’ouvre. Placez votre projet sur votre ordinateur à un endroit dont vous vous souviendrez. Par exemple le bureau.

RNewProject

Naviguez jusque dans le dossier où vous venez de déposer votre  nouveau projet et déclarez que vous travaillez dans ce dossier (Set as Working Directory) dans la fenêtre D, sous le menu More. Dès lors, tous les fichiers et dossiers contenus dans ce dossier sont plus facilement accessibles depuis le code R:

RWorkingDirectory

Créez un nouveau fichier de script R. (File>New File>R Script). La fenêtre A s’ouvre. Elle est vide pour l’heure.

Sauvegardez votre nouveau fichier de script en pressant Ctrl+S (ou avec File > Save) et en lui donnant un nom de votre choix. Ce fichier sera sauvegardé dans le Working directory.

Exécuter des lignes de code

Écrivez

demo(graphics)

dans la fenêtre A  qui montre le fichier que vous venez de créer. Vous venez de commencer à écrire un script. Sauvegardez votre travail en pressant Ctrl+S (ou avec File > Save).

Cliquez n’importe où sur la ligne où vous venez d’écrire demo(graphics) et pressez Ctrl+Enter.

Vous venez d’exécuter une ligne de code à partir de votre fichier de script. Une série de graphismes devraient s’afficher dans l’onglet Plots de la fenêtre D.

Dans la console (B) écrivez :

a <- 2

et pressez Ctrl+Enter. Vous venez d’attribuer la valeur 2 à la variable a. Dans la console (B) écrivez :

a

La console devrait afficher:

[1] 2

Pour la suite de ce tutoriel, ajoutez les lignes de code listées ci aprés à votre script dans la fenêtre A. Exécutez-les en les sélectionnant et en pressant Ctrl+Enter, comme vous l’avez fait avec demo(graphics). Utilisez cette méthode pour exécuter chaque bout de code proposé dans le suite du présent tutoriel, après l’avoir copié dans votre fichier de script.

Les lignes ou parties de lignes précédées d’un # sont des commentaires du code, que R n’exécute pas.

NB: Dans les codes qui suivent, remplacer d’éventuels “&lt;-” par un signe “inférieur à” suivi d’une flèche inversée <-  .

Les paquets

Installez tous le paquet suivant à l’aide du Package manager de RStudio. Pendant l’installation, renseignez-vous éventuellement sur le rôle de chaque paquet en faisant une recherche par nom sur Internet. Exemple: ggplot2.

  • ggplot2
  • reshape

Pour installer, choisissez l’onglet Packages dans la fenêtre D. Cliquez sur Install. Une fenêtre de dialogue s’affiche:
R Package Manager

Dans la fenêtre écrivez le nom du paquet que vous souhaitez installer et pressez sur le bouton Install:

R_install_ggplot

Installez les autres paquets dont nous aurons besoin en exécutant le code suivant

install.packages("splines")
install.packages("car")
install.packages("sandwich")
install.packages("RcmdrMisc")
install.packages("scatterplot3d")
install.packages("plot3D")
install.packages("rgl")
install.packages("gtable")
install.packages("gridExtra")
install.packages("MASS")
install.packages("fmsb")
install.packages("plyr")
install.packages("ggdendro")
install.packages("readxl")

Activez les paquets installés

Afin d’activer un paquet, cochez la case correspondante  dans le navigateur des paquets de Rstudio.

Alternativement, et de manière plus rapide, chargez les paquets à l’aide de la commande library(“nom_du_paquet”). Vous pouvez copier les lignes suivantes, les coller dans la fenêtre A et les exécuter en les sélectionnant et en pressant Ctrl+Entrer (Commande+Enter sur un Mac). Il est en effet possible  d’exécuter non pas une seule ligne mais une sélection entière de code.

library("ggplot2")
library("reshape2")
library("splines")
library("car")
library("sandwich") 
library("RcmdrMisc") 
library("scatterplot3d")
library("plot3D")
library("rgl")
library("gtable")
library("gridExtra")
library("MASS")
library("fmsb")
library("plyr")
library("ggdendro")
library("readxl")
R_execute_codeblock

Pour exécuter un bloc de code dans R, sélectionnez les lignes de code et pressez sur Ctrl+Enter (Cmd+Enter sur un Mac).

Charger les données

Téléchargement

Téléchargez le fichier unine_exercice1.zip depuis le site du cours.

Décompressez le contenu de l’archive zip dans le dossier du projet que vous avez créé.

Charger les donées dans R

Pour charger les données, exécutez la commande suivante. Si vous êtes sur une machine Windows remplacez “/” par “\\“.

rfpdata <- readXL("unine_exercice1/donnees_communes.xls",rownames=FALSE, header=TRUE, na="", sheet="GEOSTAT_ORT01_vz2000_nzpers", stringsAsFactors=TRUE)

Si la commande précédente ne fonctionne pas, essayez avec celle-ci

rfpdata <- read_excel("unine_exercice1/donnees_communes.xls",na="", sheet="GEOSTAT_ORT01_vz2000_nzpers")

Examinez vos données en sélectionnant des sous-ensembles (subsetting)

Vous venez de stocker un tableau de données dans la variable rfpdata. R permet d’accéder aux colonnes du tableau à l’aide du signe $. Essayez:

rfpdata$P00B21

Essayez de lister les valeurs d’autres colonnes.

R permet également d’afficher un sous-ensemble de données. Avec la commande suivant, affichez la 1ère colonne et les colonnes 5  à 10 :

rfpdata[c(1,5:10)]

Affichez les 2 premières lignes :

rfpdata[1:2,]

Affichez les 2 premières colonnes:

rfpdata[,1:2]

Affichez les valeurs de la variable P00BTOT pour les 2 premières lignes:

rfpdata[1:2,]$P00BTOT

Listez toutes les données des communes dont la population est inférieure à 2000 personnes:

rfpdata[rfpdata$P00BTOT<2000,]

Listez les noms des communes dont la population est inférieure à 2000

rfpdata[rfpdata$P00BTOT<2000,]$GMDENAME

Vous pouvez aussi stocker le sous-ensemble de données dans une variable

petites_communes<-rfpdata[rfpdata$P00BTOT<2000,]$GMDENAME

Apprenez davantage sur la sélection de sous-ensembles dans R sur cette page internet. Testez les différentes options sur vos données.

Calculez les données proportionnelles

Créez de nouvelles colonnes en calculant de nouvelles variables (vecteurs) qui seront ajoutées comme colonnes au tableau de données (data.frame) rfpdata:

rfpdata$p_P00B21 <- rfpdata$P00B21 / rfpdata$P00BTOT # la proportion des francophones
rfpdata$p_P00B22 <- rfpdata$P00B22 / rfpdata$P00BTOT # la proportion des germanophones
rfpdata$p_P00B23 <- rfpdata$P00B23 / rfpdata$P00BTOT # la proportion des germanophones
rfpdata$p_P00B24 <- rfpdata$P00B24 / rfpdata$P00BTOT # la proportion des locuteurs du romanche
rfpdata$p_P00B25 <- rfpdata$P00B25 / rfpdata$P00BTOT # la proportion des anglophones
langues <- data.frame(rfpdata$p_P00B21,rfpdata$p_P00B22,rfpdata$p_P00B23,rfpdata$p_P00B24,rfpdata$p_P00B25,rfpdata$P00BTOT)
colnames(langues)<-c("germanophones","francophones","italophones","romanchophones","anglophones","population_totale")
rownames(langues)<-rfpdata$GMDENAME
scaler <- c(1,1,1,1,1,max(rfpdata$P00BTOT))
langues.scaled <- data.frame(t(t(langues)/scaler))

Stripchart et scatterplots

# 1 dimension
 
stripchart(langues.scaled,vertical=TRUE)
 
# 2 dimensions
g1 <- ggplot(rfpdata, aes(x=p_P00B21, y=p_P00B22)) +
geom_point() +
xlab("germanophones") +
ylab("francophones") +
ggtitle("Proportion de locuteurs dans les communes suisses")
 
# affichez le premier graphique:
g1
 
# 3 dimensions
g2 <- ggplot(rfpdata, aes(x=p_P00B21, y=p_P00B22)) +
geom_point(aes(size=sqrt(P00BTOT))) +
scale_size_continuous(range = c(1,15),name="population") +
xlab("germanophones") +
ylab("francophones") +
ggtitle("Proportion de locuteurs dans les communes suisses")
 
g2
 
# 4 dimensions
g3 <- ggplot(rfpdata, aes(x=p_P00B21, y=p_P00B22)) +
geom_point(aes(size=sqrt(P00BTOT),color=p_P00B23)) +
scale_size_continuous(range = c(1,15),name="population") +
scale_colour_gradient2(name="italophones",midpoint=0.25,low = "yellow", mid="orange", high = "red") +
xlab("germanophones") +
ylab("francophones") +
ggtitle("Proportion de locuteurs dans les communes suisses")
 
g3

R vous permet aussi d’afficher trois graphiques sur la même feuille:

# export all xy-plots in a consistent plot height and width
g1g <- ggplotGrob(g1)
g2g <- ggplotGrob(g2)
g3g <- ggplotGrob(g3)
g1g$widths <- g2g$widths <- g3g$widths
grid.newpage()
grid.arrange(g1g, g2g, g3g, nrow = 3)
Bubblechart locuteurs suisses

Bubblechart locuteurs suisses

Scatterplot et bubblechart 3D

Explorez la troisième dimension de l’espace.

# 3 dimensions spatiales
scatterplot3d(rfpdata$p_P00B21,rfpdata$p_P00B22,rfpdata$p_P00B23,xlab="germanophones",ylab="francophones",zlab="italophones",type="h",color="red",highlight.3d=T)
scatter3D(rfpdata$p_P00B21,rfpdata$p_P00B22,rfpdata$p_P00B23) # based on plot3D
scatter3D(rfpdata$p_P00B21,rfpdata$p_P00B22,rfpdata$p_P00B23, phi=40, theta=90) # ici, on fixe l'angle de vue
plot3d(x=rfpdata$p_P00B21,y=rfpdata$p_P00B22,z=rfpdata$p_P00B23) 
with(rfpdata, plot3d(p_P00B21, p_P00B22, p_P00B23, size=0)) # équivaut à la ligne précédente
 
 
# 4 dimensions et plus
 
#Construire une palette de couleurs 
rbPal <- colorRampPalette(c('red','blue')
langues.colors <- rbPal(10)[as.numeric(cut(langues.scaled$romanchophones,breaks = 10))]
 
spheres3d(langues.scaled$germanophones,langues.scaled$francophones,langues.scaled$italophones,radius=langues.scaled$population_totale^(1/3)/15,color=langues.colors)
axes3d()
title3d(xlab="germanophones",ylab="francophones",zlab="italophones")

Parallel coordinates

parcoord(langues, col = rainbow(length(langues[,1])), lty = 1, var.label = TRUE)
 
# show profile for the whole country
colMax <- function (colData) { apply(colData, MARGIN=c(2), max) }
colMin <- function (colData) { apply(colData, MARGIN=c(2), min) }
langues.means <- data.frame(rbind(t(colMax(langues)),t(colMin(langues)),t(colMeans(langues))))
parcoord(langues.means, col = 1, lty = 1, var.label = TRUE)

Radar charts et wind-rose chart

radarchart(langues.means)
radarchart(data.frame(rbind(t(colMax(langues)),t(colMin(langues)),langues[1,]))) # la radarchart ne fonctionne que si on donne les maxima et les minima pour chaque colonne dans les lignes 1 et 2 du dataframe
langues.zuerich <- langues[match("Zürich",rfpdata$GMDENAME),] # match() permet de tourver la ligne correspondant à Zürich. On aurait aussi pu utiliser les rownames. Ceci est une variante.
langues.geneve <- langues[match("Genève",rfpdata$GMDENAME),]
langues.scuol <- langues[match("Scuol",rfpdata$GMDENAME),]
 
radarchart(data.frame(rbind(t(colMax(langues)),t(colMin(langues)),t(colMeans(langues)),langues.zuerich)),pfcol = c("grey",NA),pty = 32, plty=1, pcol=c("grey",2)) 
 
radarchart(data.frame(rbind(t(colMax(langues)),t(colMin(langues)),t(colMeans(langues)),langues.geneve)),pfcol = c("grey",NA),pty = 32, plty=1, pcol=c("grey",2)) 
 
radarchart(data.frame(rbind(t(colMax(langues)),t(colMin(langues)),t(colMeans(langues)),langues.scuol)),pfcol = c("grey",NA),pty = 32, plty=1, pcol=c("grey",2)) 
 
radarchart(data.frame(rbind(t(colMax(langues)),t(colMin(langues)),langues.zuerich,langues.geneve)),pfcol = c(NA,NA),pty = 32, plty=1,  pcol=c(2,3)) 
 
# Les wind-rose charts.
 
stars(t(t(rbind(langues.zuerich,langues.geneve,langues.scuol))/scaler), labels=c("Zurich","Genève","Scuol"),radius = T,draw.segments = F,key.loc=c(5,2), mar=c(3,3,3,3),scale=F) # The key.loc refers to the axes. Try option axes=T to see these axes
 
stars(t(t(rbind(langues.zuerich,langues.geneve,langues.scuol))/scaler), labels=c("Zurich","Genève","Scuol"),radius = T,draw.segments = T,key.loc=c(5,2), mar=c(3,3,3,3),scale=F) # The key.loc refers to the axes. Try option axes=T to see these axes
 
langues.mostpopulated <- langues[order(-langues$population_totale),][1:20,]
 
stars(t(t(langues.mostpopulated)/scaler), labels=rownames(langues.mostpopulated),radius = T,key.loc=c(13,3),draw.segments = T, scale = F,mar=c(3,3,3,3))
Wind-rose chart locuteurs suisses

Wind-rose chart locuteurs suisses

Boxplots

langues.forboxlot <- stack(langues.scaled) # melting the dataframe for ggplot boxplot
levels(langues.forboxlot$ind) # the factor levels are ordered alphabetically. This orders also the boxplot boxes order. Reorder the factor levels to arrange this:
langues.forboxlot$ind = factor(langues.forboxlot$ind,levels=c("germanophones","francophones","italophones","romanchophones","anglophones", "population.totale"))
langues.forboxlot$ind = factor(langues.forboxlot$ind,labels=c("germanophones","francophones","italophones","romanchophones","anglophones", "pop. totale (en proportion du max. CH)"))
 
ggplot(langues.forboxlot, aes(x=ind, y=values)) +
geom_boxplot(alpha=0.2) +
stat_summary(fun.y=mean,geom="point") +
# theme_bw(base_size=20) +
xlab("locuteurs ") +
ylab("Proportion dans la population de la commune")

Histogram

qplot(langues$germanophones, geom="histogram") # avec peu de contrôle sur l'apparence
 
histogram <- ggplot(langues, aes(x=germanophones)) +
geom_histogram(breaks=seq(0,1,by=0.05),alpha=0.5) +
xlab("proportion de germanophones") +
ylab("nombre de communes") +
scale_y_sqrt(limit=c(0,2000))
 
histogram
 
histogram + geom_histogram(breaks=seq(0,1,by=0.2),alpha=0.5)
 
histogram + geom_histogram(breaks=seq(0,1,by=0.01),alpha=0.5)
 
histogram <- ggplot(langues, aes(x=germanophones)) +
geom_histogram(aes(y=..density..),breaks=seq(0,1,by=0.02),alpha=0.5) +
xlab("proportion de germanophones") +
ylab("densité de probabilité")
 
histogram + geom_density(alpha=.2)
Estimation par noyau. (Kernel density)

Estimation par noyau. (Kernel density)

Barchart

La fonction geom_bar(stat=”identity”) a besoin du package plyr pour fonctionner. Vérifiez qu’il soit bien installé avant d’exécuter les lignes suivantes.

barchart <- ggplot(langues.mostpopulated[1:10,],aes(x=rownames(langues.mostpopulated[1:10,]),y=germanophones)) +
geom_bar(stat="identity") +
xlab("noms des communes") +
ylab("proportion de germanophones")
 
barchart
 
barchart + coord_flip()

Réductions dimensionnelles

1 dimension à 0 dimensions

Ici nous réduisons une série de données en un point. C’est à dire réduire une série de nombres en un seul nombre. Un nombre est, en effet, un point dans une dimension.

Moyenne, écart type, corrélation etc.

summary(langues$germanophones)
sd(langues$germanophones)
sd(langues$germanophones)/mean(langues$germanophones)
 
cor.test(langues$germanophones, langues$francophones)

Test du Chi2

On crée d’abord des donnés catégorielles fictives. Ensuite on obtient la p-value du Chi2.

voting <- cbind(
c(rep("Femme",600), rep("Homme",400)),
c(rep("Republican",250),rep("Democrat",300),rep("Independent",50),rep("Republican",200),rep("Democrat",150),rep("Independent",50))
)
colnames(voting) <- c("Genre","Parti")
 
tbl = table (voting[,1],voting[,2]) # construct contingency table from raw data
tbl
addmargins(tbl)
chisq.test(tbl)
# X-squared = 16.204, df = 2, p-value = 0.000303 -> selon la p value, il est à 99% sur qu'il y un lien entre sexe et parti
ct <- chisq.test(tbl, rescale.p = TRUE)
ct$expected

Surfaces de régression

orthogonal_regression
Il existe des régressions ordinaires et des régressions orthogonales. Voici quelques régressions ordinaires en 3 dimensions:

# surface simple
splot <- scatterplot3d(langues.scaled$germanophones,langues.scaled$francophones,langues.scaled$italophones,xlab="germanophones",ylab="francophones",zlab="italophones",type="h",color="blue")
regression.plane <- lm(langues.scaled$germanophones ~ langues.scaled$francophones+langues.scaled$italophones)
splot$plane3d(regression.plane)
 
# scatter3d avec des surface de régression
scatter3d(germanophones ~ francophones + italophones, data=langues.scaled[,1:3],surface=F, point.col="black")
scatter3d(germanophones ~ francophones + italophones, data=langues.scaled[,1:3],fit="linear", point.col="black")
scatter3d(germanophones ~ francophones + italophones, data=langues.scaled[,1:3],fit="quadratic", point.col="black")

Analyse en composantes principales

pc2.langues <- prcomp(langues.scaled)
 
eigen3d1 <- pc2.langues$rotation[1:3,1]
eigen3d2 <- pc2.langues$rotation[1:3,2]
eigen3d3 <- pc2.langues$rotation[1:3,3]
center <- pc2.langues$center
 
biplot(pc2.langues,expand=3,xlim=c(-0.1,0.1),ylim=c(-0.1,0.1)) # with labels
biplot(pc2.langues,expand=2,xlim=c(-0.05,0.05),ylim=c(-0.05,0.15),xlabs=rep("●", nrow(langues.scaled))) # only dots
 
 
# fitting the projection planewith eigenvectors
spheres3d(langues.scaled$germanophones,langues.scaled$francophones,langues.scaled$italophones,radius=0.01,color="blue")
axes3d()
title3d(xlab="germanophones",ylab="francophones",zlab="italophones")
#Render the plane. NB: when you plot a plane using planes3d(a, b, c, d, alpha=0.5), you are effectively saying "Plot a point for every x, y and z that satisfies this equation.": a x + b y + c z + d = 0. Therefore d=-(ax+by+cz), and xyz should be the center of my plot. Moreover, abc are coordinates of the NORMAL to the desired plane, which is the third eigenvector in our case (we want the firts two dimensions). It doesn't totally work with prcomp. There is an imprecision, the eigenvectors are not perfectly orthogonal (if they were the crossproduct would be 0):
a = eigen3d3[1]
b = eigen3d3[2]
c = eigen3d3[2]
d = -(a*center[1]+b*center[2]+c*center[3])
planes3d(a,b,c,d, alpha=0.4)
Analyse en compostantes principales pour les langues parlées en Suisse.

Analyse en composantes principales pour les langues parlées en Suisse.

Clustering ascendant hiérarchique

d <- dist(as.matrix(langues.scaled))
hc <- hclust(d)
ggdendrogram(hc, rotate = FALSE, size = 2)
groups <- as.data.frame(as.character(cutree(hc,7)))
colnames(groups) <- c("clus7")
pc1 <- pc2.langues$x[,1] # luckily the PCA coordinates results are also in the same order as original data
pc2 <- pc2.langues$x[,2]
langues.groups <- cbind(langues,pc1,pc2,groups)
 
ggplot(langues.groups, aes(x=pc1, y=pc2)) +
geom_point(aes(size=population_totale^(0.5),color=clus7,alpha=0.8)) +
scale_size_continuous(range = c(1,15),name="population") +
xlab("composante principale 1") +
ylab("composante principale 2") +
ggtitle("Locuteurs dans les communes suisses")
Cite as: André Ourednik (2016) « Visualiser des données avec R: barchart, boxplot, bubblechart 3D, clustering, histogram, parallel coordinates, radar chart, stripchart » in Maps and Spaces from https://ourednik.info/maps/2016/12/01/visualiser-des-donnees-avec-r/ [Last-seen November 20th 2017].
Category: Courses, Tools