Le statisticien dans sa profession est amené à collecter, traiter, analyser et présenter ou diffuser les résultats issus de sa collecte.
Ces données sont sous forme de tableau ou d’une feuille de calcul quelconque.
A moins qu’il ne soit très petit, il serait difficile d’avoir une bonne idée des tendances et des modèles.
Certains techniques statistiques sont conçus pour résumer vos données de diverses manières: moyenne, médiane, écart-type, etc.
Mais, parfois il est agréable de pouvoir «voir» des centaines ou des milliers de points de données de brutes en une seule, sans statistiques récapitulatives: représentations graphiques.
Recours à des logiciels statistiques (R, Stata, SAS, etc.).
Ici, il s’agit de présenter, un système graphique de R, le ggplot2, qui permet de faire de jolis graphiques, et très puissants.
Système graphique de base: écrit par Ross Ihaka et est inclus dans chaque installation de R.
Le système graphique de grille (grid graphics system): écrit par Paul Murrell (2006): alternative au système graphique standard.
Le système de graphique lattice écrit par Deepayan Sarkar (2008): système complet pour créer des graphiques statistiques dans R.
Le package ggplot2 écrit par Hadley Wickham (2009a); système de graphiques basé sur la grammaire des graphiques décrite par Wilkinson (2005), générer des graphiques de manière unifiée et cohérente.
ggplot2 fournit de magnifiques graphiques sans tracas qui permettent de prendre en compte les détails délicats comme: dessiner les légendes, ajouter des labels.
Un ensemble de valeurs par défaut soigneusement choisis (les thèmes), donc vous pouvez faire des graphiques de qualité en quelques secondes.
Dans ggplot2, les expressions utilisées pour créer un nouveau graphique sont composées d’éléments de niveau supérieur tels que des représentations des données brutes et des transformations statistiques
Si vous songez à créer un tracé avec le système graphique de base, le tracé est construit en appelant une série de fonctions qui créent ou annotent un tracé.
Pour une exploration très rapide des données, il est parfois utile pour utiliser les fonctions de traçage dans la base R.
library(car)
## Loading required package: carData
library(ggplot2)
## Warning in as.POSIXlt.POSIXct(Sys.time()): unable to identify current timezone 'T':
## please set environment variable 'TZ'
library(dplyr)
##
## Attaching package: 'dplyr'
## The following object is masked from 'package:car':
##
## recode
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
data(Salaries)
plot(Salaries$yrs.since.phd,Salaries$salary, main = "Salaires suivant le nombre d'années depuis le PhD", xlab = "Année depuis Phd", ylab = "Salaires")+
#lm(salary ~ yrs.since.phd,data = Salaries)
abline(lm(salary ~ yrs.since.phd,data = Salaries))
## integer(0)
ggplot(data=Salaries, aes(x=yrs.since.phd, y=salary)) +
geom_smooth(method="lm", formula= y~x, se=FALSE) + geom_point()
En bref, la grammaire nous dit qu’un graphique statistique est un mappage des données aux attributs esthétiques (couleur, forme, taille) des objets, les géométriques (points, lignes, barres).
Le graphique peut également contenir des transformations statistiques des données et est dessiné sur un système de coordonnées spécifique.
Le facettage peut être utilisé pour générer le même graphique pour différents sous-ensembles de l’ensemble de données.
data
aesthetic : aes signifie l’esthétique, ou comment l’information est représentée visuellement.
geom object: points, des lignes, des barres, des diagrammes en boîte et des régions ombrées; sont ajoutés au graphique à l’aide d’une ou de plusieurs fonctions géométriques (geom_point(): dessine des points sur le graphique, créant un nuage de points.
statistical transformation
scales
faceting
thems
labs(): facultative et ajoute des annotations (étiquettes d’axe et un titre).
La grammaire ne suggère pas quels graphiques vous devez utiliser pour répondre aux questions qui vous intéressent.
Il ne décrit pas l’interactivité: la grammaire des graphiques ne décrit que des graphiques statiques.
Le travail sur ggvis, le successeur de ggplot2, a commencé en 2014. Il reprend les idées fondamentales de ggplot2 mais les étend au Web et aux graphiques interactifs.
Il est interactif et dynamique, donc les tracés se redessinent automatiquement lorsque les données sous-jacentes ou la spécification de tracé changent.
Dans cette présentation, il s’agira de faire une analyse exploratoire de l’ensemble de données sur les salaires du package car dans R.
Ces données ont été recueillies auprès d’un collège aux États-Unis et contiennent des informations sur les salaires académiques de neuf mois de 2008-2009 des adjoints, des associés et des professeurs.
Nous essayons de répondre à certaines question dans notre analyse:
À quoi ressemblent les distributions des variables de cet ensemble de données?
Quelle est la relation entre le salaire et le nombre d’années depuis l’obtention du doctorat?
glimpse(Salaries)
## Observations: 397
## Variables: 6
## $ rank <fct> Prof, Prof, AsstProf, Prof, Prof, AssocProf, Prof, Pr...
## $ discipline <fct> B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, A,...
## $ yrs.since.phd <int> 19, 20, 4, 45, 40, 6, 30, 45, 21, 18, 12, 7, 1, 2, 20...
## $ yrs.service <int> 18, 16, 3, 39, 41, 6, 23, 45, 20, 18, 8, 2, 1, 0, 18,...
## $ sex <fct> Male, Male, Male, Male, Male, Male, Male, Male, Male,...
## $ salary <int> 139750, 173200, 79750, 115000, 141500, 97000, 175000,...
library("knitr")
kable(head(Salaries))
rank | discipline | yrs.since.phd | yrs.service | sex | salary |
---|---|---|---|---|---|
Prof | B | 19 | 18 | Male | 139750 |
Prof | B | 20 | 16 | Male | 173200 |
AsstProf | B | 4 | 3 | Male | 79750 |
Prof | B | 45 | 39 | Male | 115000 |
Prof | B | 40 | 41 | Male | 141500 |
AssocProf | B | 6 | 6 | Male | 97000 |
salary_sum <- summary(Salaries$salary)
rank_sum <- summary(Salaries$rank)
discpl_sum <- summary(Salaries$discipline)
sex_sum <- summary(Salaries$sex)
salary_sum
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 57800 91000 107300 113706 134185 231545
rank_sum
## AsstProf AssocProf Prof
## 67 64 266
discpl_sum
## A B
## 181 216
sex_sum
## Female Male
## 39 358
Elle permet de spécifier la base de données utilisées et les variables à représenter.
Alors que la fonction ggplot() spécifie la base de données et les différentes variables à représenter.
Les fonctions geom spécifient comment ces variables doivent être représentées visuellement (en utilisant des points, des barres, des lignes et des régions ombrées).
La figure ci dessous donne une idée des fonctions geoms courantes et leurs différentes options.
Chaque fonction geom possède un ensemble d’options qui peuvent être utilisées pour modifier sa représentation.
Les options courantes sont répertoriées dans le tableau suivant:
ggplot(Salaries, aes(x=salary)) + geom_histogram()
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
ggplot(Salaries, aes(y=salary)) + geom_boxplot()
ggplot(Salaries, aes(x=salary)) + geom_histogram()+theme_light()
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
ggplot(Salaries, aes(x=salary)) + geom_histogram()+theme_dark()
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
salary_hist <- Salaries %>% ggplot(aes(x = salary)) +
geom_histogram(color = "black", fill = "blue", bins = 50, binwidth=5000) + labs(x = "Nine-Month Salary (in dollars)", y = "Count",title = "Nine-Month Salary Distribution")
salary_hist
phd_hist <- Salaries %>% ggplot(aes(x = yrs.since.phd)) +
geom_histogram(color = "black", fill = "green", bins = 50) +
labs(x = "Years since Ph.D.", y = "Count",
title = "Years since Ph.D. Distribution")
phd_hist
Au lieu de l’histogramme, je peux représenter les densités des variables:
Nous pouvons représenter également les densités des variables
ggplot(data=Salaries, aes(x = salary))+geom_density(alpha=.3)
Une manière d’étudier la distribution des variables quantitatives, est de faire une boite à moustache (boxplot). Elle permet d’avoir une idée des valeurs aberrantes.
Boxplot de la variable salaire:
ggplot(Salaries, aes(y=salary)) + geom_boxplot()
ggplot(Salaries, aes(y=salary)) + geom_boxplot(outlier.colour = "green", outlier.size = 3)
ggplot(Salaries, aes(y=salary)) + geom_boxplot(color="red", fill="blue", alpha=0.50, notch=FALSE)+ labs(y = "Salaire",
title = "Salary distribution")
ggplot(Salaries, aes(x=rank, y=salary)) + geom_boxplot()+geom_point()
ggplot(Salaries, aes(x=rank, y=salary)) +
geom_boxplot(fill="cornflowerblue",
color="black", notch=TRUE)+
geom_point(position="jitter", color="blue", alpha=.5)+
geom_rug(side="l", color="black")
## Warning: Ignoring unknown parameters: side
ggplot(Salaries, aes(x=rank, y=salary)) +
geom_violin(fill="lightblue") +
geom_boxplot(fill="lightgreen", width=.2)
ggplot(data=Salaries, aes(x=salary, fill = rank)) +
geom_density(alpha=.3)
ggplot(data = Salaries, aes(x = yrs.since.phd, y = salary)) +
geom_point()+labs(title="Relation entre salaire et année après le doctorat")
- Plus d’options:
ggplot(data=Salaries, aes(x=yrs.since.phd, y=salary)) +geom_point(colour = "red", size = 3, shape=15)
ggplot(data = Salaries, aes(x = yrs.since.phd, y = salary, color = sex)) + geom_point()
ggplot(data = Salaries, aes(x = yrs.since.phd, y = salary, color = sex, shape=sex)) + geom_point()
Parfois, les relations sont plus claires si les groupes apparaissent dans des graphiques côte à côte plutôt que de se chevaucher dans un seul graphique.
Utiliser des fonctions facet_wrap () et facet_grid ().
La syntaxe est donnée dans le tableau suivant, où var, rowvar et colvar sont des facteurs.
ggplot(data = Salaries, aes(x = yrs.since.phd, y = salary, shape = rank, color=rank)) +
geom_point() +
facet_wrap(~ rank, nrow = 2)
ggplot(data = Salaries) +
geom_point(mapping = aes(x = yrs.since.phd, y = salary)) +
facet_grid(rank ~ sex)
ggplot(data = Salaries,aes(x = yrs.since.phd, y = salary)) +
geom_point() +facet_grid(. ~ rank)
ggplot(data = Salaries, aes(x = yrs.since.phd, y = salary)) +
geom_point() +
facet_grid(rank ~ .)
Parlons des transformations statistiques. Il faut signaler que ggplot2 contient un large éventail de fonctions permettant de calculer des résumés statistiques qui peuvent être ajoutés aux graphiques.
Il s’agit notamment des fonctions de regroupement des données et de calcul des densités, des contours et des quantiles.
Cette section examine les méthodes d’ajout de lignes lissées (linéaires, non linéaires et non paramétriques) aux nuages de points.
Vous pouvez utiliser la fonction geom_smooth () pour ajouter une variété de lignes lissées et de régions de confiance.
La figure ci dessous résume les principales options de cette fonctions
Examinons la relation entre les années depuis l’obtention d’un doctorat et les salaires des professeurs.
Tout, d’abord; on ajoute une droite de régression linéaire simple avec les limites de confiance de 95% au nuage de points.
ggplot(data=Salaries, aes(x=yrs.since.phd, y=salary)) +
geom_smooth(method="lm", formula= y~x, se=TRUE) + geom_point()
library(ggplot2)
ggplot(data=Salaries, aes(x=yrs.since.phd, y=salary)) +
geom_smooth(method="loess", formula= y~x, se=TRUE) + geom_point()
ggplot(data=Salaries, aes(x=yrs.since.phd, y=salary,
linetype=sex, shape=sex, color=sex)) +
geom_smooth(method=lm, formula=y~poly(x,2),
se=FALSE, size=1) +
geom_point(size=2)
Nous pouvons essayer de visualiser le nombre de professeurs suivant la variable “rank” et le “sex” en utilisant un graphique à barres groupées.
ggplot(Salaries, aes(x=rank)) +
geom_bar()
ggplot(Salaries, aes(x=rank)) +
geom_bar(color="red", fill="blue") + labs(title='Bar graphics')
Faisons un peu compliqué: combiner deux variables qualitatives
Approche 1:
ggplot(Salaries, aes(x=rank, fill=sex)) +
geom_bar(position="stack") + labs(title='position="stack"')
ggplot(Salaries, aes(x=rank, fill=sex)) +
geom_bar(position="dodge") + labs(title='position="dodge"')
ggplot(Salaries, aes(x=rank, fill=sex)) +
geom_bar(position="fill") + labs(title='position="fill"')
Notez que l’étiquette sur l’axe des y pour le troisième graphique n’est pas correcte. Il devrait indiquer la proportion plutôt que le nombre. Vous pouvez corriger cela en ajoutant y = “Proportion” à la fonction labs ().
Les options peuvent être utilisées de différentes manières, selon qu’elles se produisent à l’intérieur ou à l’extérieur de la fonction aes (). Regardez les exemples suivants et essayez de deviner ce qu’ils font:
ggplot(Salaries, aes(x=rank, fill=sex))+ geom_bar()
ggplot(Salaries, aes(x=rank)) + geom_bar(fill="red")
ggplot(Salaries, aes(x=rank, fill="red")) + geom_bar()
Dans cette section, nous allons examiner plusieurs fonctions qui vous permettent de personnaliser les graphes ggplot2.
Vous apprendrez à personnaliser l’apparence des axes (limites, graduations et étiquettes de graduation), l’emplacement et le contenu des légendes, et les couleurs utilisées pour représenter les valeurs variables.
Vous apprendrez également à créer des personnalisations thèmes (vous permettant d’ajouter une apparence cohérente à vos graphiques) et organiser plusieurs graphiques en un seul graphique.
Le package ggplot2 crée automatiquement des axes de tracé avec des graduations, des étiquettes de graduation,et les étiquettes des axes.
Souvent, ils ont l’air bien, mais parfois vous voudrez prendre un plus grand contrôle sur leur apparence.
Vous avez déjà vu comment utiliser la fonction labs () pour ajouter un titre et modifier les étiquettes des axes.
Dans cette section, vous allez personnaliser les axes eux-mêmes.
Les fonctions sont regroupées dans les tableaux suivants:
Comme vous pouvez le voir, les fonctions ggplot2 distinguent les axes x et y et si un axe représente une variable continue ou discrète (facteur).
Appliquons ces fonctions à un graphique avec des boîtes à moustaches groupées pour les salaires des professeurs par rang et sexe. Le code est comme suit:
ggplot(data=Salaries, aes(x=rank, y=salary, fill=sex)) +
geom_boxplot() +
scale_x_discrete(breaks=c("AsstProf", "AssocProf", "Prof"),
labels=c("Assistant\nProfessor",
"Associate\nProfessor",
"Full\nProfessor")) +
scale_y_continuous(breaks=c(50000, 100000, 150000, 200000),
labels=c("$50K", "$100K", "$150K", "$200K")) +
labs(title="Faculty Salary by Rank and Sex", x="", y="")
ggplot(data=Salaries, aes(x=rank, y=salary, fill=sex)) +
geom_boxplot() +
scale_x_discrete(breaks=c("AsstProf", "AssocProf", "Prof"),
labels=c("Assistant\nProfessor",
"Associate\nProfessor",
"Full\nProfessor")) +
scale_y_continuous(breaks=c(50000, 100000, 150000, 200000),
labels=c("$50K", "$100K", "$150K", "$200K")) +
labs(title="Faculty Salary by Rank and Gender",
x="", y="", fill="Gender") +
theme(legend.position="top")
ggplot(data=Salaries, aes(x=rank, y=salary, fill=sex)) +
geom_boxplot() +
scale_x_discrete(breaks=c("AsstProf", "AssocProf", "Prof"),
labels=c("Assistant\nProfessor",
"Associate\nProfessor",
"Full\nProfessor")) +
scale_y_continuous(breaks=c(50000, 100000, 150000, 200000),
labels=c("$50K", "$100K", "$150K", "$200K")) +
labs(title="Faculty Salary by Rank and Gender",
x="", y="", fill="Gender") +
theme(legend.position=c(.1,.8))
ggplot(data=Salaries, aes(x=yrs.since.phd, y=salary, color=rank)) +
scale_color_manual(values=c("orange", "olivedrab", "navy")) +
geom_point(size=2)
ggplot(data=Salaries, aes(x=yrs.since.phd, y=salary, color=rank)) +
scale_color_brewer(palette="Accent") + geom_point(size=2)
To see the available color sets, use
library(RColorBrewer)
display.brewer.all()
mytheme <- theme(plot.title=element_text(face="bold.italic",
size="14", color="brown"),
axis.title=element_text(face="bold.italic",
size=10, color="brown"),
axis.text=element_text(face="bold", size=9,
color="darkblue"),
panel.background=element_rect(fill="white",
color="darkblue"),
panel.grid.major.y=element_line(color="grey",
linetype=1),
panel.grid.minor.y=element_line(color="grey",
linetype=2),
panel.grid.minor.x=element_blank(),
legend.position="top")
ggplot(Salaries, aes(x=rank, y=salary, fill=sex)) +
geom_boxplot() +
labs(title="Salary by Rank and Sex", x="Rank", y="Salary") +
mytheme
ggplot(Salaries, aes(x=rank))+ geom_bar() + mytheme
mfrow que vous connaissez ne marche pas avec les graphiques ggplot2
La façon la plus simple de placer plusieurs graphiques ggplot2 dans une seule figure consiste à utiliser la fonction grid.arrange () disponible dans le package gridExtra.
#install.packages("gridExtra")
library(gridExtra)
##
## Attaching package: 'gridExtra'
## The following object is masked from 'package:dplyr':
##
## combine
p1 <- ggplot(data=Salaries, aes(x=rank)) + geom_bar()
p2 <- ggplot(data=Salaries, aes(x=sex)) + geom_bar()
p3 <- ggplot(data=Salaries, aes(x=yrs.since.phd, y=salary)) + geom_point()
grid.arrange(p1, p2, p3, ncol=3)
Vous avez la possibilité d’enregister vos graphiques sous forme png, jpeg ou pdf dans notre répertoire de travail.
On enregistre d’abord au format .png
myplot <- ggplot(data=mtcars, aes(x=mpg)) + geom_histogram()
ggsave(file="mygraph.png", plot=myplot, width=5, height=4)
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
ggplot(data=mtcars, aes(x=mpg)) + geom_histogram()
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
ggsave(file="mygraph.pdf", plot=myplot, width=5, height=4)
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
On se rend compte que ggplot2 permet de jolis graphiques en quelques secondes, contrairement aux autres méthodes, particulièrement le système basique de R.
Faut-il laisser le système graphique? Non, pas totalement.
Généralement, on fait des grapphiques pour deux raisons: voir soi même ou soit faire voir aux autres tes résultats.
Si c’est juste pour toi, pour voir juste le comportement de tes résidus, c’est peut être pas la peine d’aller vers ggplot2.
Mais, si c’est pour un public, alors vas-y, impressionne-les avec du ggplot2. ## Exercice:
Essayer de faire un graphique assez proche de celui ci en utilisant les données sur les variables économiques :