Pour une création d’objet, plusieurs syntaxes sont possibles :
x <- 2
y=3
x+y -> z
z
Un exemple :
x <- "La mort"
y <- "aux trousses"
paste(x,y)
Voici les principales méthodes pour construire un vecteur :
x <- c(5.6,-2,78,42.3)
y <- c(x,3,c(12,8))
y
x = 1:6
x
seq(1,6,by=0.5)
seq(1,6,length=5)
rep(1,4)
rep(c(1,2),each=3)
L’extraction s’effectue à partir des indices des éléments du vecteur que l’on souhaite extraire :
x <- 15:25
x[2]
x[2:5]
x[c(1,3,5,7)]
Les opérations sur les vecteurs s’effectuent élément par élément :
x <- 1:5
y <- 3:7
x+y
x*y
On peut aussi appliquer des opérateurs booléens comme ==, !=, >, >=, etc. Par exemple :
y <- x>3
y
z=x[x<=3]
z
La principale méthode pour créer une matrice est d’utiliser la fonction matrix qui prend en arguments les coefficients de la matrice ainsi que son nombre de lignes (ou de colonnes) :
m <- matrix(1:6,ncol=2)
m
m <- matrix(1:8,nrow=2)
m
Par défaut, R range les valeurs par colonne. Pour ranger par ligne, on utilise l’argument byrow :
m <- matrix(1:8,nrow=2,byrow=T)
m
L’emplacement d’un élément dans une matrice est donné par ses indices de ligne et de colonne :
m[1,3]
Il est rare qu’on ait besoin de ne sélectionner qu’un élément d’une matrice. Usuellement, on sélectionne une ou plusieurs lignes et/ou une ou plusieurs colonnes. Exemples :
m[2,]
m[-1,]
m[1:2,-1]
Attention au fait que le produit par * ne donne pas le produit de 2 matrices au sens usuel de l’algèbre linéaire, idem pour l’exponentielle d’une matrice, etc.
m <- matrix(1:4,ncol=2)
m
n <- matrix(3:6,ncol=2,byrow=T)
n
m+n
m*n
m%*%n
Exemples de fonctions classiques en algèbre linéaire :
det(m)
solve(m)
eigen(m)
Les listes permettent de regrouper différents objets. Elles permettent, par exemple, de stocker dans un même objet un vecteur et une matrice :
vec <- c(1,2,3)
mat <- matrix(1,ncol=2,nrow=3)
L <- list(vec,mat)
L
L’objet L ainsi créé est une liste de longueur 2. La première composante est le vecteur vec, la seconde la matrice mat. On extrait les composantes d’une liste à l’aide de doubles crochets :
L[[1]]
Il est également possible, et souvent utile, de donner des noms aux différentes composantes d’une liste. Ceci peut se faire grâce à la fonction names :
names(L) <- c("vecteur","matrice")
L
Dans ce cas, l’extraction peut toujours se faire via les doubles crochets ou bien à partir des noms des différentes composantes, le symbole $ séparant le nom de la liste du nom de la composante :
L$vecteur
De nombreuses fonctions de R renvoient un résultat sous la forme d’une liste, c’est le cas par exemple de la fonction eigen vue ci-dessus, dont on liste les éléments via la fonction ls. Exemple :
m <- matrix(1:4,ncol=2)
dec <- eigen(m)
ls(dec)
dec$values
dec$vectors
Les data-frames sont les objets typiques pour faire des statistiques sous R. Ce sont des listes particulières dont les composantes sont de même longueur, mais de types éventuellement différents. Les tableaux de données utilisés en statistique, de forme (individus,variables), doivent être mis sous la forme d’un data-frame. En effet, un tableau de données est constitué de variables quantitatives et/ou qualitatives mesurées sur les mêmes individus. Les data-frames permettent de tenir compte de la nature de chaque variable. Considérons un jeu de données de 6 individus et 2 variables :
age <- c(17,28,64,8,25,36)
sexe <- c("H","F","F","H","H","F")
donnees <- data.frame(age,sexe)
donnees
L’extraction d’éléments peut se faire :
donnees[3,1]
donnees[4,]
donnees[,2]
donnees[[2]]
donnees$sexe
La fonction names permet de retrouver les noms des variables, ce qui peut être utile lorsque le tableau de données contient beaucoup de variables :
names(donnees)
Le data-frame iris est disponible sous R. Il suffit
de taper data(iris) pour le charger.
1. Obtenir un résumé de ce jeu de données grâce à la fonction
summary.
#iris
# A vous de jouer
Quelles sont ses dimensions ?
# A vous de jouer
Les dimensions sont 150 (lignes) 5 (colonnes) 3. Visualiser ses cinq premières lignes.
# A vous de jouer
# A vous de jouer
# A vous de jouer
Dans le cadre d’une étude de la population, un hôpital s’est intéressé à la propension à ronfler d’hommes et de femmes. Le fichier Snore.txt contient un échantillon de 100 patients, les variables considérées sont :
Le but de cette étude est d’essayer d’expliquer le ronflement (variable ronfle) par les six autres variables présentées ci-dessus. On dispose de 100 individus pour faire l’analyse.
La première étape consiste à importer le jeu de données sous R. Pour ce faire, il faut au préalable vérifier que le fichier est enregistré dans le répertoire où R travaille. L’importation s’effectue alors à partir de la fonction read.table :
donnees <- read.table("Snore.txt")
head(donnees)
## V1 V2 V3 V4 V5 V6 V7
## 1 age poids taille alcool sexe ronfle tabac
## 2 47 71 158 0 H N O
## 3 56 58 164 7 H O N
## 4 46 116 208 3 H N O
## 5 70 96 186 3 H N O
## 6 51 91 195 2 H O O
donnees[0:1,]
## V1 V2 V3 V4 V5 V6 V7
## 1 age poids taille alcool sexe ronfle tabac
Problème : le premier individu correspond au nom des variables. Ce n’est pas ce qu’on veut. On corrige le tir en spécifiant que la première ligne du data-frame correspond au nom des variables.
donnees <- read.table("Snore.txt",header=T)
head(donnees)
## age poids taille alcool sexe ronfle tabac
## 1 47 71 158 0 H N O
## 2 56 58 164 7 H O N
## 3 46 116 208 3 H N O
## 4 70 96 186 3 H N O
## 5 51 91 195 2 H O O
## 6 46 98 188 0 F N N
summary(donnees)
## age poids taille alcool
## Min. :23.00 Min. : 42.00 Min. :158.0 Min. : 0.00
## 1st Qu.:43.00 1st Qu.: 77.00 1st Qu.:166.0 1st Qu.: 0.00
## Median :52.00 Median : 95.00 Median :186.0 Median : 2.00
## Mean :52.27 Mean : 90.41 Mean :181.1 Mean : 2.95
## 3rd Qu.:62.25 3rd Qu.:107.00 3rd Qu.:194.0 3rd Qu.: 4.25
## Max. :74.00 Max. :120.00 Max. :208.0 Max. :15.00
## sexe ronfle tabac
## Length:100 Length:100 Length:100
## Class :character Class :character Class :character
## Mode :character Mode :character Mode :character
##
##
##
Nous rappelons dans cette partie les commandes permettant d’obtenir des indicateurs statistiques tels que la moyenne, la variance, les quantiles, etc.
Nous étudions ici la variable age du jeu de données.
age <- donnees$age
moyenne <- mean(age)
ecart_type <- sd(age)
premier_quantile <- quantile(age, probs = 0.25)
moyenne
## [1] 52.27
ecart_type
## [1] 11.3972
premier_quantile
## 25%
## 43
quantile(age,probs=c(0.25,0.5,0.75))
## 25% 50% 75%
## 43.00 52.00 62.25
summary(age)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 23.00 43.00 52.00 52.27 62.25 74.00
Nous reprenons les indicateurs de la question précédente dans le cas d’un tableau de données constitué uniquement de variables quantitatives. Par exemple :
donnees1 <- donnees[,c(1,2,3)]
head(donnees1)
## age poids taille
## 1 47 71 158
## 2 56 58 164
## 3 46 116 208
## 4 70 96 186
## 5 51 91 195
## 6 46 98 188
mean(c(donnees1$age))
## [1] 52.27
mean(c(donnees1$poids))
## [1] 90.41
mean(c(donnees1$taille))
## [1] 181.1
donnees1$age <- as.numeric(donnees1$age)
donnees1$poids <- as.numeric(donnees1$poids)
donnees1$taille <- as.numeric(donnees1$taille)
La fonction apply permet d’effectuer la même opération sur un ensemble de variables : le premier argument correspond au jeu de données, le second à la dimension sur laquelle l’opération doit s’appliquer (1 pour ligne, 2 pour colonne), le troisième à la fonction à appliquer :
apply(donnees1, 2, mean)
## age poids taille
## 52.27 90.41 181.10
apply(donnees1, 2, sd)
## age poids taille
## 11.39720 18.73585 13.36625
moyenne_donnees <- apply(X = donnees1,MARGIN = 2,FUN = mean)
moyenne_donnees
## age poids taille
## 52.27 90.41 181.10
quantile_donnees <- apply(X = donnees1,MARGIN = 2,FUN = quantile, probs = 0.25)
quantile_donnees
## age poids taille
## 43 77 166
#class(donnees1)
La fonction quantile a comme argument probs, que l’on précise à la suite de la fonction.
On cherche à comparer les indicateurs numériques suivant les modalités de la variable à expliquer, à savoir la variable ronfle.
# A vous de jouer
# A vous de jouer
Pour déterminer la proportion d’hommes ronfleurs :
# A vous de jouer
Pour déterminer la proportion de ronfleurs parmi les hommes :
# A vous de jouer
Le package ggplot2 est un outil de plus en plus utilisé pour représenter des données. Les graphes proposés par ggplot2 sont généralement plus élaborés et mieux finalisés que les graphes effectués avec les fonctions classiques de R. Ce package permet également d’obtenir des représentations graphiques par sous-groupes d’individus avec très peu de code. Les légendes sont le plus souvent gérées automatiquement. La syntaxe de ggplot2 est spécifique et totalement différente de celle des graphiques conventionnels de R. Cette fiche n’en présente qu’une simple introduction.
N’hésitez pas consulter la cheatsheet ou le site cookbook-r.
Il faut bien entendu commencer par installer le package ggplot2.
Il faut bien entendu commencer par installer le package ggplot2. On considère le jeu de données diamonds qui contient le prix ainsi que certaines caractéristiques de 54000 diamants. Afin d’avoir des représentations graphiques moins lourdes, on se restreint à un sous-échantillon de taille 5000 :
library(ggplot2)
diamants <- diamonds[sample(nrow(diamonds), 5000), ]
#diamants
L’approche ggplot2 consiste à séparer les instructions qui vont permettre d’obtenir la représentation graphique souhaitée.
Les diagrammes en barres peuvent représenter aussi bien des variables qualitatives que quantitatives discrètes. Prenons l’exemple d’un diagramme en barres pour la variable cut qui représente la qualité de la coupe du diamant. Afin d’obtenir une telle représentation on doit spécifier :
On utilise cette décomposition pour construire le graphe comme suit :
ggplot(diamants) + aes(x = cut) + geom_bar()
Le jeu de données est renseigné dans la fonction ggplot, la variable à représenter dans la fonction aes, le type de représentation souhaitée est spécifié ensuite par la fonction geom_bar(). Les 3 instructions sont séparées par un “+”. C’est le schéma classique de construction de graphes avec ggplot2.
Nous étudions ici la variable continue price.
En utilisant un protocole identique, l’histogramme de la variable continue price s’obtient comme suit :
ggplot(diamants) + aes(x = price) + geom_histogram()
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
Les deux représentations précédentes nécessitent la spécification d’une seule variable : cut pour le diagrame en barres et price pour l’histogramme. Cependant, de nombreuses représentations font intervenir plus d’une variable. Par exemple, dans le cas d’un nuage de points, deux variables sont à spécifier. Il suffit alors d’indiquer ces deux variables dans la fonction aes. Ainsi, si on souhaite représenter le prix d’un diamant en fonction de son nombre de carats, on utilisera :
ggplot(diamants) + aes(x = carat, y = price) + geom_point()
Comme nous venons de le voir, une représentation graphique ggplot se construit à partir d’un ensemble d’éléments indépendants. Ces éléments constituent la grammaire de la syntaxe. Les principaux éléments de la grammaire sont :
Nous présentons dans la suite quelques notions élémentaires sur ces différents éléments.
Ces deux éléments de la grammaire servent à spécifier le jeu de données et les variables que l’on souhaite représenter. Le jeu de données est un data-frame que l’on renseignera dans le fonction ggplot. Les variables seront spécifiées dans la fonction aes. Si on souhaite par exemple représenter la variable price en fonction de carat, on utilisera
ggplot(diamants) + aes(x = carat, y = price)
La fonction aes admet également des arguments tels que color, size, fill. Ces arguments sont à utiliser lorsqu’une couleur ou une taille est définie à partir d’une variable du jeu de données. Si pour la représentation précédente on souhaite une couleur différente selon les modalités de la variable cut, on ajoutera color=cut dans aes :
ggplot(diamants) + aes(x = carat, y = price, color = cut)
Les commandes du paragraphe précédent ne renvoient pas de graphes ! Elles servent uniquement à définir les variables du jeu de données que l’on veut représenter. L’élément geom_… permet d’ajouter le type de représentation que l’on souhaite. Pour obtenir le nuage de points carat\(\times\)price avec une couleur différente selon cut, on exécutera donc
ggplot(diamants) + aes(x = carat, y = price, color = cut) + geom_point()
Nous remarquons sur cette figure qu’une légende précisant le code couleur est ajoutée directement. Le tableau ci-dessous donne quelques exemples de fonctions (accompagnés des aesthetics) permettant de faire les représentations graphiques classiques.
Geom | Description | Aesthetics |
---|---|---|
geom_point() | Nuage de points | x, y, shape, fill |
geom_line() | Ligne (ordonnée selon x) | x, y, linetype |
geom_abline() | Droite | slope, intercept |
geom_path() | Ligne (ordre original) | x, y, linetype |
geom_text() | Texte | x, y, label, hjust, vjust |
geom_rect() | Rectangle | xmin, xmax, ymin, ymax, fill, linetype |
geom_polygon() | Polygone | x, y, fill, linetype |
geom_segment() | Segment | x, y, fill, linetype |
geom_bar() | Diagramme en barres | x, fill, linetype, weight |
geom_histogram() | Histogramme | x, fill, linetype, weight |
geom_boxplot() | Boxplots | x, y, fill, weight |
geom_density() | Densité | x, y, fill, linetype |
geom_contour() | Lignes de contour | x, y, fill, linetype |
geom_smooth() | Lissage | x, y, fill, linetype |
Tous | color, size, group |
Chaque geom admet également des arguments particuliers permettant de modifier le graphe (couleur, taille de points, épaisseur de traits, etc.). Si on souhaite par exemple représenter un nuage de points rouges, c’est dans la fonction geom_point, non dans la fonction aes, qu’il faudra mettre l’argument color. De même, pour faire un diagramme en barres bleu, on utilisera fill=“blue” dans geom_bar :
ggplot(diamants) + aes(x = carat, y = price) + geom_point(color = "red")
ggplot(diamants) + aes(x = cut) + geom_bar(fill = "blue")
De nombreuses représentations graphiques ne se déduisent pas directement des données, elles nécessitent de transformer des variables ou de calculer des indicateurs à partir des variables. Lorsque la transformation est fonctionnelle, il suffit de spécifier cette transformation dans la fonction aes. On représentera par exemple la fonction sinus sur \([-2\pi,2\pi]\) avec
D <- data.frame(X = seq(-2 * pi, 2 * pi, by = 0.01))
ggplot(D) + aes(x = X, y = sin(X)) + geom_line()
On peut aussi utiliser la fonction qplot (pour “quick plot”) dont la syntaxe ressemble à celle de plot. Ainsi, pour le graphe précédent :
X = seq(-2 * pi, 2 * pi, by = 0.01)
qplot(X, sin(X), geom = "line")
D’autres représentations nécessitent des transformations plus complexes que l’application d’une fonction usuelle. C’est par exemple le cas de l’histogramme où il faut calculer le nombre d’individus dans chaque classe pour déduire la hauteur de l’histogramme. Les statistics permettent de gérer ces éléments intermédiaires. Ils sont renseignés dans l’argument stat des fonctions geom_. Pour geom_histogram, la valeur par défaut est par exemple stat=bin. Cet argument permet de calculer 4 indicateurs :
La fonction geom_histogram permettra ainsi de représenter en ordonnée le premier de ces 4 indicateurs, en l’occurence count. Ainsi, la commande
ggplot(diamonds) + aes(x = price) + geom_histogram(bins = 40)
renvoie l’histogramme où figure en ordonnées le nombre d’individus par classe, non la densité. Si on souhaite visualiser un autre indicateur sur l’axe des ordonnées, il faudra préciser son nom dans la fonction aes en utilisant le format ..nom... Pour représenter l’histogramme de la densité, on utilisera donc
ggplot(diamonds) + aes(x = price, y = ..density..) + geom_histogram(bins = 40)
Le package ggplot2 possède une alternative à la modification des indicateurs via l’argument stat dans les fonctions geom_ : il s’agit des fonctions stat_. On pourra par exemple obtenir un lissage via la méthode loess en utilisant
ggplot(diamants) + aes(x = carat, y = price) + geom_smooth(method = "loess")
## `geom_smooth()` using formula 'y ~ x'
ou en utilisant la fonction stat_smooth :
ggplot(diamants) + aes(x = carat, y = price) + stat_smooth(method = "loess")
## `geom_smooth()` using formula 'y ~ x'
Tout comme les fonctions geom_ possèdent un argument stat, les fonctions stat_ possèdent un argument geom. En modifiant ce argument, on changera la représentation graphique. On a par exemple
ggplot(diamants) + aes(x = carat, y = price) + stat_smooth(method = "loess", geom = "point")
## `geom_smooth()` using formula 'y ~ x'
ggplot(diamants) + aes(x = carat, y = price) + stat_smooth(method = "loess", geom = "line")
## `geom_smooth()` using formula 'y ~ x'
Le tableau suivant présente quelques exemples de fonctions stat_.
Stat | Description | Paramètres |
---|---|---|
stat_identity() | Aucune transformation | |
stat_bin() | Comptage | binwidth, origin |
stat_density() | Densité | adjust, kernel |
stat_smooth() | Lissage | method, se |
stat_boxplot() | Boxplot | coef |
De nombreuses représentations graphiques pourront être obtenues en utilisant soit les fonctions de type geom_, soit les fonctions de type stat_. C’est à l’utilisateur de choisir sa syntaxe préférée.
Les scales contiennent tous les paramètres qui permettent de faire le lien entre les données (data) et les aesthetics. Ils définissent ce qui est vu par l’oeil : couleurs, axes, tailles, etc. On les modifie le plus souvent pour affiner le graphe : modifier les palettes de couleur, gérer les axes, les tailles des points… Les fonctions scales sont nommées selon le même schéma :
On pourra par exemple modifier la couleur des points du graphe vu précédemment avec la commande
ggplot(diamants) + aes(x = carat, y = price, color = cut) + geom_point() +
scale_color_manual(
values = c(
"Fair" = "black",
"Good" = "yellow",
"Very Good" = "blue",
"Premium" = "red",
"Ideal" = "green"
)
)
Le tableau suivant présente les principaux types de scales.
aes | Discrètes | Continues |
---|---|---|
Couleur (color et fill) | brewer | gradient |
- | grey | gradient2 |
- | hue | gradientn |
- | identity | |
- | manual | |
Position (x et y) | discrete | continous |
- | date | |
Forme | shape | |
- | identity | |
- | manual | |
Taille | identity | size |
- | manual |
Voici quelques exemples concrets d’utilisation des scales :
p1 <- ggplot(diamants) + aes(x = cut) + geom_bar(aes(fill = cut))
p1
On change la couleur des barres en utilisant la palette Purples :
p1 + scale_fill_brewer(palette = "Purples")
p2 <- ggplot(diamants) + aes(x = carat, y = price) + geom_point(aes(color = depth))
p2
On modifie le dégradé de couleur en proposant un nouveau dégradé allant du jaune au rouge à l’aide de scale_color_gradient :
p2 + scale_color_gradient(low = "red", high = "yellow")
p2 + scale_x_continuous(breaks = seq(0.5, 3, by = 0.5)) + scale_y_continuous(name = "prix") + scale_color_gradient("Profondeur")
Reprenons le jeu de données Snore.txt
library(ggplot2)
donnees <- read.table("Snore.txt")
colnames(donnees) <- c("age","poids", "taille", "alcool", "sexe", "ronfle", "tabac")
donnees <- donnees[-1, ]
donnees$age <- as.numeric(donnees$age)
donnees$taille <- as.numeric(donnees$taille)
donnees$sexe <- as.factor(donnees$sexe)
donnees$poids <- as.numeric(donnees$poids)
donnees$alcool <- as.numeric(donnees$alcool)
head(donnees)
## age poids taille alcool sexe ronfle tabac
## 2 47 71 158 0 H N O
## 3 56 58 164 7 H O N
## 4 46 116 208 3 H N O
## 5 70 96 186 3 H N O
## 6 51 91 195 2 H O O
## 7 46 98 188 0 F N N
# A vous de jouer
# A vous de jouer
require("gridExtra")
## Le chargement a nécessité le package : gridExtra
require("cowplot")
## Le chargement a nécessité le package : cowplot
# A vous de jouer
# A vous de jouer
# A vous de jouer
# A vous de jouer
ls(donnees)
## [1] "age" "alcool" "poids" "ronfle" "sexe" "tabac" "taille"
Alcool <- as.factor(donnees$alcool)
# A vous de jouer
# A vous de jouer
# A vous de jouer