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.

Analyse univariée

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

library(MASS)
data(Insurance)
# Résumé statistiques des données
summary(Insurance)
##  District    Group       Age        Holders            Claims      
##  1:16     <1l   :16   <25  :16   Min.   :   3.00   Min.   :  0.00  
##  2:16     1-1.5l:16   25-29:16   1st Qu.:  46.75   1st Qu.:  9.50  
##  3:16     1.5-2l:16   30-35:16   Median : 136.00   Median : 22.00  
##  4:16     >2l   :16   >35  :16   Mean   : 364.98   Mean   : 49.23  
##                                  3rd Qu.: 327.50   3rd Qu.: 55.50  
##                                  Max.   :3582.00   Max.   :400.00

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 = Insurance) +
  # Histogramme
  geom_histogram(mapping = aes(Claims)) 
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

et d’une boîte à moustache.

ggplot(data = Insurance) + 
  # Boîte à moustache
  geom_boxplot(mapping = aes(y = Claims))

Nous allons maintenant customiser nos graphiques. Nous souhaitons

  • les mettre l’un à coté de l’autre (grid.arrange() fonction de la libraririe gridExtra),

  • Ajouter des noms pour les axes (xlab(‘nom de l’axe des x’) et ylab(‘nom de l’axe des y’)) et un titre (ggtitle(‘Titre’)),

  • 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’)
# Librairie pour placer les graphiques l'un à côté de l'autre
library(gridExtra)
# Histogramme dans l'objet histogram
histogram <- ggplot(data = Insurance) + 
  # Histogramme bleu avec moins de barres
  geom_histogram(mapping = aes(Claims), fill = 'blue', 
                 breaks =seq(0, 400, 20)) +
  # Label axe dex x et des y
  xlab('Montant des sinistres') + ylab('Effectifs') +
  # Titre pour l'histogramme
  ggtitle('Histogramme des montants \n de sinistres') + 
  # Changement de la taille de la police pour les textes sur l'histogramme
  theme(axis.text.x = element_text(size = 12), 
      axis.text.y = element_text(size = 12), 
      axis.title.x = element_text(size = 12),
      axis.title.y = element_text(size = 12),
      plot.title = element_text(size = 14)
      )
# On stocke la boîte à moustache
boxplot <- ggplot(data = Insurance) + 
  # Boxplot rouge
  geom_boxplot(mapping = aes(y = Claims), fill = 'red') +
  # Label axe des y 
  ylab('Montant des sinistres') + 
  # Titre de la boxplot
  ggtitle('Boîte à moustache des \n montants de sinistres')

# Les deux graphiques l'un à côté de l'autre
grid.arrange(histogram, boxplot, 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/PO/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) + 
  # Diagramme en barre vert
  geom_bar(mapping = aes(x = vent), 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(mapping = aes(x = vent, y = (..count..)/sum(..count..),
                         fill = vent)) +
  # Pour afficher les valeurs sous le format pourcentage
  scale_y_continuous(labels = percent) + ylab('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)
EuStockMarkets_V1 <- data.frame(dates = 1:length(EuStockMarkets[ , 1]), EuStockMarkets)
ggplot(data = EuStockMarkets_V1, mapping = aes( x = dates, y = CAC)) + geom_line()

On peut améliorer ce graphique et en particulier l’axes des abscisses. Pour cela nous devons manipuler la variable dates pour qu’elle prenne un format usuel. Les dates sont stockées en R sous la forme d’un nombre de jour par rapport à une date de référence. Nos données commencent au 1er Janvier 1991.

# Transformation des dates au format yyyy-mm-dd
dates <- as.Date(0:(length(EuStockMarkets[ ,1]) - 1), origin = as.Date('01/01/1991', format = '%d/%m/%Y'))
dates[1:5]
## [1] "1991-01-01" "1991-01-02" "1991-01-03" "1991-01-04" "1991-01-05"

Nous pouvons dès lors avoir les dates au bon format pour l’axe des abcisse et ajouter l’évolution d’autres indices boursiers.

# Séries temporelles
EuStockMarkets_V2 <- data.frame(dates = dates, EuStockMarkets)
ggplot(data = EuStockMarkets_V2) + 
  geom_line(mapping = aes( x = dates, y = CAC), colour = 'blue') +
  geom_line(mapping = aes( x = dates, y = FTSE), colour = 'red') +
  geom_line(mapping = aes( x = dates, y = DAX), colour = 'green') +
  geom_line(mapping = aes( x = dates, y = SMI), colour = 'yellow') +
  ylab('Valeur des indices boursiers européens')

L’ajout d’une légende pose problème pour l’instant nous verrons une solution plus tard.

Relation entre deux variables qualitatives

Nous allons travailler sur un jeu de données de la library questionr.

library(questionr)
data(hdv2003)
summary(hdv2003)
##        id              age           sexe     
##  Min.   :   1.0   Min.   :18.00   Homme: 899  
##  1st Qu.: 500.8   1st Qu.:35.00   Femme:1101  
##  Median :1000.5   Median :48.00               
##  Mean   :1000.5   Mean   :48.16               
##  3rd Qu.:1500.2   3rd Qu.:60.00               
##  Max.   :2000.0   Max.   :97.00               
##                                               
##                                                  nivetud        poids         
##  Enseignement technique ou professionnel court       :463   Min.   :   78.08  
##  Enseignement superieur y compris technique superieur:441   1st Qu.: 2221.82  
##  Derniere annee d'etudes primaires                   :341   Median : 4631.19  
##  1er cycle                                           :204   Mean   : 5535.61  
##  2eme cycle                                          :183   3rd Qu.: 7626.53  
##  (Other)                                             :256   Max.   :31092.14  
##  NA's                                                :112                     
##                    occup                           qualif    freres.soeurs   
##  Exerce une profession:1049   Employe                 :594   Min.   : 0.000  
##  Chomeur              : 134   Ouvrier qualifie        :292   1st Qu.: 1.000  
##  Etudiant, eleve      :  94   Cadre                   :260   Median : 2.000  
##  Retraite             : 392   Ouvrier specialise      :203   Mean   : 3.283  
##  Retire des affaires  :  77   Profession intermediaire:160   3rd Qu.: 5.000  
##  Au foyer             : 171   (Other)                 :144   Max.   :22.000  
##  Autre inactif        :  83   NA's                    :347                   
##           clso                              relig    
##  Oui        : 936   Pratiquant regulier        :266  
##  Non        :1037   Pratiquant occasionnel     :442  
##  Ne sait pas:  27   Appartenance sans pratique :760  
##                     Ni croyance ni appartenance:399  
##                     Rejet                      : 93  
##                     NSP ou NVPR                : 40  
##                                                      
##                          trav.imp           trav.satisf  hard.rock  lecture.bd
##  Le plus important           : 29   Satisfaction  :480   Non:1986   Non:1953  
##  Aussi important que le reste:259   Insatisfaction:117   Oui:  14   Oui:  47  
##  Moins important que le reste:708   Equilibre     :451                        
##  Peu important               : 52   NA's          :952                        
##  NA's                        :952                                             
##                                                                               
##                                                                               
##  peche.chasse cuisine    bricol     cinema     sport        heures.tv     
##  Non:1776     Non:1119   Non:1147   Non:1174   Non:1277   Min.   : 0.000  
##  Oui: 224     Oui: 881   Oui: 853   Oui: 826   Oui: 723   1st Qu.: 1.000  
##                                                           Median : 2.000  
##                                                           Mean   : 2.247  
##                                                           3rd Qu.: 3.000  
##                                                           Max.   :12.000  
##                                                           NA's   :5

Nous pouvons éduier le lien entre le viveau d’étude nivetud et la pratique sportive sport. Pour étudier le lien entre deux variables qualitatives, on commence souvent par un tableau de contingence qui est un tableaux à double entrée indiquant des effectifs

tab_contingence <- table(hdv2003$nivetud, hdv2003$sport)
tab_contingence
##                                                                  
##                                                                   Non Oui
##   N'a jamais fait d'etudes                                         38   1
##   A arrete ses etudes, avant la derniere annee d'etudes primaires  78   8
##   Derniere annee d'etudes primaires                               300  41
##   1er cycle                                                       161  43
##   2eme cycle                                                      109  74
##   Enseignement technique ou professionnel court                   307 156
##   Enseignement technique ou professionnel long                     71  60
##   Enseignement superieur y compris technique superieur            186 255

On s’intéresse notamment aux pourcentages ligne

lprop(tab_contingence)
##                                                                  
##                                                                   Non   Oui  
##   N'a jamais fait d'etudes                                         97.4   2.6
##   A arrete ses etudes, avant la derniere annee d'etudes primaires  90.7   9.3
##   Derniere annee d'etudes primaires                                88.0  12.0
##   1er cycle                                                        78.9  21.1
##   2eme cycle                                                       59.6  40.4
##   Enseignement technique ou professionnel court                    66.3  33.7
##   Enseignement technique ou professionnel long                     54.2  45.8
##   Enseignement superieur y compris technique superieur             42.2  57.8
##   Ensemble                                                         66.2  33.8
##                                                                  
##                                                                   Total
##   N'a jamais fait d'etudes                                        100.0
##   A arrete ses etudes, avant la derniere annee d'etudes primaires 100.0
##   Derniere annee d'etudes primaires                               100.0
##   1er cycle                                                       100.0
##   2eme cycle                                                      100.0
##   Enseignement technique ou professionnel court                   100.0
##   Enseignement technique ou professionnel long                    100.0
##   Enseignement superieur y compris technique superieur            100.0
##   Ensemble                                                        100.0

et colonne

cprop(tab_contingence)
##                                                                  
##                                                                   Non   Oui  
##   N'a jamais fait d'etudes                                          3.0   0.2
##   A arrete ses etudes, avant la derniere annee d'etudes primaires   6.2   1.3
##   Derniere annee d'etudes primaires                                24.0   6.4
##   1er cycle                                                        12.9   6.7
##   2eme cycle                                                        8.7  11.6
##   Enseignement technique ou professionnel court                    24.6  24.5
##   Enseignement technique ou professionnel long                      5.7   9.4
##   Enseignement superieur y compris technique superieur             14.9  40.0
##   Total                                                           100.0 100.0
##                                                                  
##                                                                   Ensemble
##   N'a jamais fait d'etudes                                          2.1   
##   A arrete ses etudes, avant la derniere annee d'etudes primaires   4.6   
##   Derniere annee d'etudes primaires                                18.1   
##   1er cycle                                                        10.8   
##   2eme cycle                                                        9.7   
##   Enseignement technique ou professionnel court                    24.5   
##   Enseignement technique ou professionnel long                      6.9   
##   Enseignement superieur y compris technique superieur             23.4   
##   Total                                                           100.0

Ces informations peuvent être visualisées à l’aide de diagramme en barres. La variable nivetud comprends cependant trop de modalités (avec des noms trop long).

ggplot(data = hdv2003) +
  geom_bar(aes(x = nivetud))