Nous allons voir comment utiliser la librairie ggplot2 pour visualiser les données.

library(ggplot2)

Il s’agit d’une composante de la librairie tidyverse.

Un graphique ggplot comprends les éléments de bases suivant

  1. ggplot(data = ) : Les données à visualiser
  2. geom_: La forme géométrique pour visualiser les données, cela inclut la couleur des courbes, le remplissage des barre, la taille/forme/couleur des points.
  3. aes(): Le lien entre les axes du graphique (X et Y) et les vatriables du jeu de données (à placer dans ggplot ou geom_)
  4. labs(): Précise le nom des axes, du titre, de la légende
  5. theme(): Apparence globale comprenant le fond, le quadrillage. Pour le texte: la police, sa taille et sa couleur.

D’autres éléments peuvent se rajouter comme

  1. xlim(), ylim(): limiter la longeur des axes
  2. coord_: Changer la projection des données sur les axes (coord_polar() ou coord_flip()), changer l’aspect ratio coord_fixed()
  3. scale_x_continuous scale_y_continuouss: Changer l’échelle de graduation d’une variable quantitative
  4. theme_bw() pour changer l’aspect global du graphique (par défaut theme_gray())

Analyse univariée

Reprenons le jeu de données Insurance dans la librairie MASS.

library(insuranceData)
data(AutoClaims)
# Résumé statistiques des données
summary(AutoClaims)
##       STATE          CLASS      GENDER        AGE             PAID        
##  STATE 15:2180   C11    :1151   F:2582   Min.   :50.00   Min.   :    9.5  
##  STATE 02:1122   C71    :1129   M:4191   1st Qu.:54.00   1st Qu.:  523.7  
##  STATE 04: 666   C7     : 913            Median :62.00   Median : 1001.7  
##  STATE 06: 622   C6     : 911            Mean   :63.81   Mean   : 1853.0  
##  STATE 17: 491   C1     : 726            3rd Qu.:72.00   3rd Qu.: 2137.4  
##  STATE 03: 348   C7B    : 686            Max.   :97.00   Max.   :60000.0  
##  (Other) :1344   (Other):1257

Variable quantitative

La variable Claims est une variables quantitative. L’analyse de la distribution d’une variable quantitative passe par la production d’un histogramme

# Repère cartésien et chargement des données
ggplot(data = AutoClaims, aes(x = PAID)) +
  # Histogramme
  geom_histogram()
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

et d’une boîte à moustache.

ggplot(data = AutoClaims, aes(y = PAID)) + 
  # Boîte à moustache
  geom_boxplot() 

Vous pouvez tester l’alternative à la boxplot avec geom_violin, réduire l’échelle de l’axe y avec ylim pour lire plus facilement les quartiles et le mettre à l’horizontal via coord_flip().

Nous allons maintenant customiser nos graphiques. Nous souhaitons

  • les mettre l’un à coté de l’autre (paquet gridExtra),

  • Ajouter des noms pour les axes labs(x = "“, y =”“, title =”"),

  • Changer la taille de la police (theme(axis.text.x= element_text(family, face, colour, size)), où

    • family pour la famille de police
    • face pour type de police, e.g. italic
    • colour pour la couleur
    • size pour la taille en pts
    • mettre un peu de couleur (fill = ‘couleur’)
  • Ajouter la moyenne empirique sur la boîte à moustache et l’histogramme.

  • Changer le découpage des blocs pour l’histogramme.

  • Changer la graduation de l’axe des abscisse dans l’histogramme via scale_x_continuous

# Librairie pour placer les graphiques l'un à côté de l'autre
library(gridExtra)
# Histogramme dans l'objet h
h <- ggplot(data = AutoClaims, aes(x = PAID)) + 
  # Histogramme bleu avec moins de barres
  geom_histogram(fill = 'blue', 
                 breaks =seq(0, 60000, 200)) +
  # Noms des axes et titres
  labs(x = "Montant des sinistres", 
       y = "Fréquence", 
       # \n permet d'aller à la ligne
       title = "Histogramme des \n montant de sinistres") +
  # Taille de la police et ajustement horizontal du titre entre 0 (à gauche) 
  # et 1 (à droite) 
  theme(axis.text.x = element_text(size = 10), 
        axis.text.y = element_text(size = 10),
        axis.title.x = element_text(size = 10),
        axis.title.y = element_text(size = 10),
        plot.title = element_text(hjust = 1/2, size = 14)
        ) + 
  scale_x_continuous(breaks = c(0, 30000, 60000))

# Boxplot dans l'objet b
b <- ggplot(data = AutoClaims, aes(y = PAID)) +
  # Boxplot rouge
  geom_boxplot( fill = 'red') +
  # Label axe des y
  labs(y = 'Montant des sinistres', title = 'Boîte à moustache des \n montants de sinistres') + 
  theme(axis.text.x = element_blank(), 
        axis.ticks.x = element_blank(), 
        plot.title = element_text(hjust = 1/2, size = 14))
  
# Les deux graphiques l'un à côté de l'autre

grid.arrange(h, b, ncol=2)

Variable qualitative

Nous allons utiliser le jeu de données ozone.csv comprenant des mesures d’ozone quotidiennes à Rennes.

#Mac
#ozone <- read.csv2("~/Dropbox/PO/Enseignements/ISFA/R/BDD/ozone.csv")
#PC
ozone <- read.csv2("C:/Users/pierr/Dropbox/Enseignements/ISFA/R/BDD/ozone.csv")

La variable vent est une variable qualitative dont les modalités sont les directions du vent.

# Effectifs pour chaque modalité
table(ozone$vent)
## 
##   Est  Nord Ouest   Sud 
##    10    31    50    21

Pour apprécier la répartition des directions de vents, on a recours à un diagramme en bar

ggplot(data = ozone,  aes(x = vent)) + 
  # Diagramme en barre vert
  geom_bar(fill = 'green')

On peut personaliser le diagramme en bar et

  • attribuer une couleur différente à chaque barre (fill = variable dans la fonction aes()).
  • Afficher des proportions plutôts que les effectifs.
library(scales)
ggplot(data = ozone) +
  # ..count.. est une variable calculée automatiquement lorsqu'on utilise geom_bar
  geom_bar(aes(x = vent, y = (..count..) / sum(..count..), fill = vent)) + 
  scale_y_continuous(labels = percent) +
  labs( y = 'pourcentage')

#   # Pour afficher les valeurs sous le format pourcentage

On peut aussi produire un diagramme en secteur, pour ce faire, il faut transformer le diagramme en bar via un passage en coordonnées polaires (+ coord_polar()).

ggplot(data = ozone) +
  #Diagramme en barre ne contenant qu'une seule barre
  geom_bar(mapping = aes(x = 1, fill = vent), position = 'fill') +
  # Passage en coordonnées polaires
  coord_polar(theta ='y')

On peut améliorer le visuel en supprimant l’axe qui s’intitule x et en plaçant des marqueurs aux points de démarcation des différents secteurs.

# Récupération des pourcentages cummulés
cum_percent_vent <- cumsum(rev(table(ozone$vent))) / length(ozone$vent)
names(cum_percent_vent) <- NULL

ggplot(data = ozone) +
  #Diagramme en barre ne contenant qu'une seule barre
  geom_bar(mapping = aes(x = 1, fill = vent), position = 'fill') +
  # Passage en coordonnées polaires
  coord_polar(theta ='y') +
  # On place les marqueurs de manière adéquate
  scale_y_continuous(breaks = round(cum_percent_vent * 100) / 100) +
  # On efface tout ce qui concerne l'axe des y qui correspond au module en coordonées polaires
  theme(axis.text.y = element_blank(), 
        axis.title.y = element_blank(),
        axis.ticks.y = element_blank()
        )

Analyse bivariée

Relation entre deux variables quantitatives

Lorsque l’on étudie deux variables quantitatives, on distingue généralement deux cas:

  1. L’étude de la relation entre une variable à prédire \(Y\) (réponse) et d’un prédicteur ou covariable \(X\). Il s’agit d’une régression où l’on cherche à identifier une fonction \(f\) telle que \[ Y\approx f(X). \] On doit alors (en plus de calculer des coefficients de corrélation) tracer \(Y\) en fonction de \(X\).
  2. L’étude d’une quantité au cours du temps, lorsqu’on a des observations à des intervalles de temps réguliers. On trace alors la fonction \(X(t)\) en fonction du temps \(t\), on parle dans ce cas de série temporelles. On cherche à observer des tendances et des saisonalités.

Nous pouvons commencer par tracer une fonction classique \[ f(x) = \sin(x)\text{, }x\in\mathbb{R}. \] On crée un jeu de données contenant les valeurs pour \(x\) (donnant les limites de l’axes des abscisses) et les valeurs pour \(f(x)\) correspondantes. La fonction geom_point permet de produire des nuages de points.

grid <- seq(-2 * pi, 2 * pi, 4 * pi / 100)
values <- sin(grid)
sin_data <- data.frame(x = grid , f_x = values)
ggplot(data = sin_data,  mapping = aes(x = grid, y = f_x)) + 
  # Traçage de la courbe
  geom_line(linetype="solid", color="red", size=0.5) +
  #Attribution d'un titre pour les axes
  xlab('x') + ylab('sin(x)') +
  # Dessine des lignes verticales et horizontales en guise d'axes
  geom_hline(yintercept = 0) + geom_vline(xintercept = 0)

Via le jeu de données ozone, nous pouvons étudier l’incidence de la température T12 sur la hauteur du pic d’ozone mesuré max03.

ggplot(data = ozone, mapping = aes(x = T12, y = maxO3)) +
  # Nuage de point
  geom_point(shape=23, fill="blue", color="darkred", size=3)

Il est assez clair que les fortes températures influence positivement les mesures d’ozone! On peut calculer le coefficient de corrélation linéaire de Pearson

# Coeficient de corrélation linéaire
cor(ozone$maxO3, ozone$T12)
## [1] 0.7842623

Nous allons maintenant étudier les fluctuation du cac 40 au cours du temps

data(EuStockMarkets)
library(lubridate)
## 
## Attaching package: 'lubridate'
## The following objects are masked from 'package:base':
## 
##     date, intersect, setdiff, union
EuStockMarkets_V1 <- data.frame(dates = date_decimal(as.numeric(time(EuStockMarkets))), EuStockMarkets)
ggplot(data = EuStockMarkets_V1, mapping = aes( x = dates, y = CAC)) + geom_line()