La visualisation des données sous forme de graphiques et de figures permet d’explorer ces données et de fournir des informations utiles. De bonnes visualisations vous aident également à communiquer vos données à d’autres et sont utiles aux analystes et aux autres consommateurs de données. Il existe plusieurs packages de R permettant de créer des graphiques dont **ggplot2* qui est certainement le plus utilisé.

ggplot2 est une puissante bibliothèque de R et fait partie des packages de Tidyverse. Utilisée par des centaines de milliers de Data Scientists, cette librairie facilite la création de graphiques informatifs et attrayants. Dans cette formation, vous apprendrez de manière pratique à créer des graphiques courants tels que les nuages de points, les histogrammes, les boîtes à moustache, les diagrammes à barres et d’autres graphiques beaucoup plus complexes. De plus, vous apprendrez à personnaliser vos graphiques afin d’en faciliter la lecture à vos interlocuteurs ce qui vous permettra de mieux communiquer les résultats de vos analyses.

Cette formation se décompose en huit (08) sections :

  • Installation de l’environnement de travail ;

  • Apprendre à créer des graphiques de corrélation ;

  • Apprendre à créer des graphiques de déviation ;

  • Apprendre à créer des graphiques de classement ;

  • Apprendre à créer des graphiques de distribution ;

  • Apprendre à créer des graphiques de composition ;

  • Apprendre à créer des graphiques de visualisation de séries temporelles ;

  • Apprendre à créer des graphiques de clustering.

  • Mon site web : https://afouda-datascience.com/

1 Section 1 : Installation de l’environnement de travail

Pour installer R et RStudio sur votre PC, suivez les instructions présentes dans mon article intitulé : Comment installer R et RStudio sur son PC ? (Tutoriel complet)

Bonne installation :)

Voici les librairies que nous utiliserons tout au long de cette formation :

#  Importation des librairies nécessaires

library(ggplot2)
library(ggalt)
library(ggExtra)
library(ggcorrplot)
library(plotly)
library(quantmod)
library(ggthemes)
library(waffle)
library(highcharter) 
library(dplyr)
library(ggfortify)

S’il y une librairie qui n’est pas encore installée, vous pouvez l’installer avec la fonction install.packages(). Par exemple, pour installer la librairie quantmod, tapez le code ci-dessous dans la console de RStudio :

# Installation de librairie 'quantmod'

install.packages('quantmod')

Soulignons que chaque graphique que nous allons construire au cours de cette formation sera transformé en un graphique interactif en utilisant simplement la fonction ggplotly() du package plotly.

# Installation de la librairie plotly

install.packages('plotly')

# Importation de la librairie plotly

library(plotly)

2 Section 2 : Apprendre à Créer des graphiques de corrélation

Les graphiques que nous allons construire dans cette section aident à examiner dans quelle mesure deux ou plusieurs variables sont corrélées.

2.1 Nuages de points

Le graphique le plus fréquemment utilisé pour l’analyse des données est sans aucun doute le nuage de points (scatterplot en anglais). Chaque fois que vous voulez comprendre la nature de la relation entre deux variables, le premier choix est invariablement le nuage de points.

# Définition d'un thème pour les graphiques

theme_set(theme_bw())

# Importation des données

data("midwest", package = "ggplot2")

head(midwest)
## # A tibble: 6 x 28
##     PID county state  area poptotal popdensity popwhite popblack popamerindian
##   <int> <chr>  <chr> <dbl>    <int>      <dbl>    <int>    <int>         <int>
## 1   561 ADAMS  IL    0.052    66090      1271.    63917     1702            98
## 2   562 ALEXA~ IL    0.014    10626       759      7054     3496            19
## 3   563 BOND   IL    0.022    14991       681.    14477      429            35
## 4   564 BOONE  IL    0.017    30806      1812.    29344      127            46
## 5   565 BROWN  IL    0.018     5836       324.     5264      547            14
## 6   566 BUREAU IL    0.05     35688       714.    35157       50            65
## # ... with 19 more variables: popasian <int>, popother <int>, percwhite <dbl>,
## #   percblack <dbl>, percamerindan <dbl>, percasian <dbl>, percother <dbl>,
## #   popadults <int>, perchsd <dbl>, percollege <dbl>, percprof <dbl>,
## #   poppovertyknown <int>, percpovertyknown <dbl>, percbelowpoverty <dbl>,
## #   percchildbelowpovert <dbl>, percadultpoverty <dbl>,
## #   percelderlypoverty <dbl>, inmetro <int>, category <chr>

L’ensemble des données midwest contient les informations démographiques sur les comtés du Midwest à partir du recensement américain de 2000. Cet ensemble contient 437 lignes et 28 variables. Source : https://ggplot2.tidyverse.org/reference/midwest.html

Traçons le nuage de points de la population totale (variable poptotal) en fonction de la surface du comté (variable area) :

# nuage de points de la population totale en fonction de la surface du comté

gg <- ggplot(midwest, aes(x = area, y = poptotal)) + 
  geom_point()

gg

Supposons que vous voulez que chaque point soit colorié selon l’état dans lequel le comté se trouve (variable state) et que la taille d’un point soit selon la densité de la population (variable popdensity) :

# Mise à jour du nuage de points précédent

gg <- ggplot(midwest, aes(x = area, y = poptotal)) + 
  geom_point(aes(col = state, size = popdensity))

gg

Vous pouvez aussi ajouter une droite de régression :

gg <- ggplot(midwest, aes(x = area, y = poptotal)) + 
  geom_point(aes(col = state, size = popdensity)) + 
  geom_smooth(method = "lm", se = T) 

gg

Pour ne pas représenter l’intervalle de confiance au niveau de la droite de régression, il suffit de spécifier se = F. Vous pouvez personnaliser davantage votre graphique et y ajouter des titres au niveau des axes :

# Nuage de points final

gg <- ggplot(midwest, aes(x = area, y = poptotal)) + 
  geom_point(aes(col = state, size = popdensity)) + 
  geom_smooth(method = "lm", se = F) + 
  xlim(c(0, 0.1)) + 
  ylim(c(0, 500000)) + 
  labs(subtitle = "Surface Vs Population", 
       y = "Population", 
       x = "Surface", 
       title = "Nuage de points de la Population en fonction de la surface du comté", 
       caption = "Source : midwest")

gg

xlim et ylim ont permis de supprimer le point rouge qui était une valeur aberrante (outlier) et ne permettait pas un bon affichage du nuage de points. A présent, vous avez un graphique qui peut être mieux interprèté.

# Nuage de points final interactif

ggplotly(gg)

Lors de la présentation des graphiques, vous aurez souvent besoin de mettre un accent particulier sur certains points spéciaux ou sur certaines régions dans le graphique afin d’attirer l’attention de votre public sur ces cas particuliers. Cela peut être fait facilement en utilisant la fonction geom_encircle() du package ggalt.

# Installation du package 'ggalt'

install.packages('ggalt')
# Importation de la librairie 'ggalt'

library(ggalt)

Créons une dataframe filtrée à partir de la dataframe originelle :

midwest_select <- midwest[midwest$poptotal > 350000 & 
                            midwest$poptotal <= 500000 & 
                            midwest$area > 0.01 & 
                            midwest$area < 0.1, ]

midwest_select
## # A tibble: 6 x 28
##     PID county state  area poptotal popdensity popwhite popblack popamerindian
##   <int> <chr>  <chr> <dbl>    <int>      <dbl>    <int>    <int>         <int>
## 1   659 WILL   IL    0.05    357313      7146.   303420    38361           692
## 2   707 LAKE   IN    0.03    475594     15853.   334203   116688           865
## 3  1221 GENES~ MI    0.037   430459     11634.   336651    84257          3132
## 4  2056 LUCAS  OH    0.021   462361     22017.   380155    68456          1164
## 5  2084 STARK  OH    0.034   367585     10811.   339421    25052           950
## 6  2993 DANE   WI    0.073   367085      5029.   344617    10511          1201
## # ... with 19 more variables: popasian <int>, popother <int>, percwhite <dbl>,
## #   percblack <dbl>, percamerindan <dbl>, percasian <dbl>, percother <dbl>,
## #   popadults <int>, perchsd <dbl>, percollege <dbl>, percprof <dbl>,
## #   poppovertyknown <int>, percpovertyknown <dbl>, percbelowpoverty <dbl>,
## #   percchildbelowpovert <dbl>, percadultpoverty <dbl>,
## #   percelderlypoverty <dbl>, inmetro <int>, category <chr>
# Nuage de points avec encerclement 

gg2 <- ggplot(midwest, aes(x = area, y = poptotal)) + 
  geom_point(aes(col = state, size = popdensity)) +   
  geom_smooth(method = "lm", se = F) + 
  geom_encircle(aes(x = area, y = poptotal), 
                data = midwest_select, 
                color = "red", 
                size = 2, 
                expand = 0.08) +  
  xlim(c(0, 0.1)) + 
  ylim(c(0, 500000)) +
  labs(subtitle = "Surface Vs Population", 
       y = "Population", 
       x = "Area", 
       title = "Nuage de points de la Population en fonction de la surface du comté + Encerclement", 
       caption = "Source : midwest")

gg2

ggplotly(gg2)

2.2 Jitter plot : Nuage de points spécial

Cette fois-ci, nous utiliserons l’ensemble des données mpg. Cet ensemble de données fournit des données sur la consommation de carburant de 1999 et 2008 pour 38 modèles de voitures populaires. Il est aussi livré avec le package ggplot2.

# Chargement des données

data(mpg, package = "ggplot2") 

head(mpg)
## # A tibble: 6 x 11
##   manufacturer model displ  year   cyl trans      drv     cty   hwy fl    class 
##   <chr>        <chr> <dbl> <int> <int> <chr>      <chr> <int> <int> <chr> <chr> 
## 1 audi         a4      1.8  1999     4 auto(l5)   f        18    29 p     compa~
## 2 audi         a4      1.8  1999     4 manual(m5) f        21    29 p     compa~
## 3 audi         a4      2    2008     4 manual(m6) f        20    31 p     compa~
## 4 audi         a4      2    2008     4 auto(av)   f        21    30 p     compa~
## 5 audi         a4      2.8  1999     6 auto(l5)   f        16    26 p     compa~
## 6 audi         a4      2.8  1999     6 manual(m5) f        18    26 p     compa~
# Structure de la dataframe

str(mpg)
## tibble [234 x 11] (S3: tbl_df/tbl/data.frame)
##  $ manufacturer: chr [1:234] "audi" "audi" "audi" "audi" ...
##  $ model       : chr [1:234] "a4" "a4" "a4" "a4" ...
##  $ displ       : num [1:234] 1.8 1.8 2 2 2.8 2.8 3.1 1.8 1.8 2 ...
##  $ year        : int [1:234] 1999 1999 2008 2008 1999 1999 2008 1999 1999 2008 ...
##  $ cyl         : int [1:234] 4 4 4 4 6 6 6 4 4 4 ...
##  $ trans       : chr [1:234] "auto(l5)" "manual(m5)" "manual(m6)" "auto(av)" ...
##  $ drv         : chr [1:234] "f" "f" "f" "f" ...
##  $ cty         : int [1:234] 18 21 20 21 16 18 18 18 16 20 ...
##  $ hwy         : int [1:234] 29 29 31 30 26 26 27 26 25 28 ...
##  $ fl          : chr [1:234] "p" "p" "p" "p" ...
##  $ class       : chr [1:234] "compact" "compact" "compact" "compact" ...

Traçons le nuage de points montrant la consommation en carburant sur l’autoroute (variable hwy) en fonction de la consommation en carburant dans la ville (variable cty). Ces deux variables ont des valeurs qui sont des nombres entiers naturels.

# Nuage de points 'hwy' en fonction de 'cty'

g <- ggplot(mpg, aes(cty, hwy))

g + geom_point() + 
  geom_smooth(method = "lm", se = F) +
  labs(subtitle = "cty VS hwy", 
       title = "Nuage de points avec points qui se chevauchent", 
       caption = "Source : mpg dataset")

Ce graphique donne une idée claire de la façon dont le kilométrage de la ville et le kilométrage de l’autoroute (hwy) sont bien corrélés. Mais ce graphique simple cache quelque chose.

# Dimension de la dataset

dim(mpg)
## [1] 234  11

L’ensemble de donnés contient 234 observations, mais le graphique semble afficher moins de points. Que s’est-il passé ? C’est parce qu’il y a beaucoup de points qui se chevauchent apparaissant comme un seul point. Ceci est dû au fait que les variables cty et hwy soient tous deux composées d’entiers naturels. Soyez donc très prudent la prochaine fois que vous créerez un nuage de points avec des nombres entiers naturels.

Alors comment gérer ça ? Nous pouvons créer un jitter plot avec la fonction ****jitter_geom()*** :

# Jitter plot

g <- ggplot(mpg, aes(cty, hwy))
g + geom_jitter(width = 0.5, size = 1) +
  labs(subtitle = "cty VS hwy", 
       title = "kilométrage autoroute en fonction de kilométrage ville")

Plus de points sont révélés maintenant dans le graphique ci-dessus. Plus la largeur est importante, plus les points sont déplacés de manière saccadée par rapport à leur position d’origine.

2.3 Graphique de décomptes (Counts charts)

La deuxième option pour surmonter le problème du chevauchement des points de données consiste à utiliser ce qu’on appelle un graphique de comptage. Partout où il y a plus de points qui se chevauchent, la taille du cercle s’agrandit.

g <- ggplot(mpg, aes(cty, hwy))
g <- g + geom_count(col = "tomato3", show.legend = F) +
  labs(subtitle = "cty VS hwy",
       title = "kilométrage autoroute en fonction de kilométrage ville (Counts charts)")
g

ggplotly(g)

2.4 Graphique à bulle (Bubble plot)

En termes plus simples, les graphiques à bulles sont plus adaptés si vous avez des données en 4 dimensions où deux d’entre elles sont numériques (X et Y) et une autre catégorielle (couleur) et une autre variable numérique (taille).

# Dataframe mpg filtrée pour certains modèles de voitures

mpg_select <- mpg[mpg$manufacturer %in% c("audi", "ford", "honda", "hyundai"), ]

print(unique(mpg_select$manufacturer))
## [1] "audi"    "ford"    "honda"   "hyundai"
head(mpg_select)
## # A tibble: 6 x 11
##   manufacturer model displ  year   cyl trans      drv     cty   hwy fl    class 
##   <chr>        <chr> <dbl> <int> <int> <chr>      <chr> <int> <int> <chr> <chr> 
## 1 audi         a4      1.8  1999     4 auto(l5)   f        18    29 p     compa~
## 2 audi         a4      1.8  1999     4 manual(m5) f        21    29 p     compa~
## 3 audi         a4      2    2008     4 manual(m6) f        20    31 p     compa~
## 4 audi         a4      2    2008     4 auto(av)   f        21    30 p     compa~
## 5 audi         a4      2.8  1999     6 auto(l5)   f        16    26 p     compa~
## 6 audi         a4      2.8  1999     6 manual(m5) f        18    26 p     compa~
 # Graphique à bulle

g <- ggplot(mpg_select, aes(displ, cty)) + 
  labs(subtitle = "displ VS cty",
       title = "Kilométrage en ville en fonction de la capacité du moteur")

g <- g + geom_jitter(aes(col = manufacturer, size = hwy)) + 
  geom_smooth(aes(col = manufacturer), method = "lm", se = F)

g

ggplotly(g)

2.5 Histogramme marginal

Si vous souhaitez afficher la relation ainsi que la distribution dans le même graphique, utilisez l’histogramme marginal. Ce type de graphique peut être construit avec la fonction *** ggMarginal()*** du package ggExtra.

# Installation du package 'ggExtra'

install.packages('ggExtra')

# Importation de la librairie ggExtra

library(ggExtra)
# dataset mpg filtré

mpg_select <- mpg[mpg$hwy >= 35 & mpg$cty > 27, ]

# Nuage de points hwy en fonction de cty

g <- ggplot(mpg, aes(cty, hwy)) + 
  geom_count(col = "tomato3", show.legend = F) +
  geom_smooth(method = "lm", se = F)

ggMarginal(g, type = "histogram", fill = "transparent")
ggMarginal(g, type = "boxplot", fill = "transparent")
ggMarginal(g, type = "density", fill = "transparent")

SUPER :) Jolis graphiques n’est-ce pas !

Pour finir cette tâche n°2, passons à la matrice de corrélation.

2.6 Matrice de corrélation

La matrice de corrélation, encore appelée corrélogramme, permet d’examiner la corrélation entre plusieurs variables continues présentes dans la même dataframe. Pour la construire, nous utiliserons le package ggcorrplot.

# Installation du package ggcorrplot

install.packages('ggcorrplot')

# Importation de lalibrairie ggcorrplot

library(ggcorrplot)

Pour illustrer cette section, nous allons utiliser l’ensemble des données mtcars. Les données ont été extraites du magazine américain Motor Trend de 1974 et comprennent la consommation de carburant et 10 aspects de la conception et des performances automobiles pour 32 automobiles (modèles 1973-74).

# Les données

head(mtcars)
##                    mpg cyl disp  hp drat    wt  qsec vs am gear carb
## Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
## Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
## Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
## Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
## Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
## Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1
# Structure de la dataframe

str(mtcars)
## 'data.frame':    32 obs. of  11 variables:
##  $ mpg : num  21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
##  $ cyl : num  6 6 4 6 8 6 8 4 4 6 ...
##  $ disp: num  160 160 108 258 360 ...
##  $ hp  : num  110 110 93 110 175 105 245 62 95 123 ...
##  $ drat: num  3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
##  $ wt  : num  2.62 2.88 2.32 3.21 3.44 ...
##  $ qsec: num  16.5 17 18.6 19.4 17 ...
##  $ vs  : num  0 0 1 1 0 1 0 1 1 1 ...
##  $ am  : num  1 1 1 0 0 0 0 0 0 0 ...
##  $ gear: num  4 4 4 3 3 3 3 4 4 4 ...
##  $ carb: num  4 4 1 1 2 1 4 2 2 4 ...

La dataframe comporte 11 variables continues.

# Tableau de corrélation

corr <- round(cor(mtcars), 2)

corr
##        mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
## mpg   1.00 -0.85 -0.85 -0.78  0.68 -0.87  0.42  0.66  0.60  0.48 -0.55
## cyl  -0.85  1.00  0.90  0.83 -0.70  0.78 -0.59 -0.81 -0.52 -0.49  0.53
## disp -0.85  0.90  1.00  0.79 -0.71  0.89 -0.43 -0.71 -0.59 -0.56  0.39
## hp   -0.78  0.83  0.79  1.00 -0.45  0.66 -0.71 -0.72 -0.24 -0.13  0.75
## drat  0.68 -0.70 -0.71 -0.45  1.00 -0.71  0.09  0.44  0.71  0.70 -0.09
## wt   -0.87  0.78  0.89  0.66 -0.71  1.00 -0.17 -0.55 -0.69 -0.58  0.43
## qsec  0.42 -0.59 -0.43 -0.71  0.09 -0.17  1.00  0.74 -0.23 -0.21 -0.66
## vs    0.66 -0.81 -0.71 -0.72  0.44 -0.55  0.74  1.00  0.17  0.21 -0.57
## am    0.60 -0.52 -0.59 -0.24  0.71 -0.69 -0.23  0.17  1.00  0.79  0.06
## gear  0.48 -0.49 -0.56 -0.13  0.70 -0.58 -0.21  0.21  0.79  1.00  0.27
## carb -0.55  0.53  0.39  0.75 -0.09  0.43 -0.66 -0.57  0.06  0.27  1.00
# Graphique de la matrique de corrélation

cor_plot <- ggcorrplot(corr, 
           hc.order = TRUE, 
           type = "lower", 
           lab = TRUE, 
           lab_size = 3,
           colors = c("red", "white", "green"), 
           title = "Matrice de corrélation", 
           ggtheme = theme_bw)

cor_plot

ggplotly(cor_plot)

3 Section 3 : Apprendre à créer des graphiques de déviation

Pour voir la suite de cette formation, c’est-à-dire les sections 4, 5, 6, 7 et 8, RDV sur ma chaîne YouTube ou directement sur mon site web

Mon dernier livre peut vous intéresser : Développement Web en Data Science avec R Shiny sans HTML, CSS, PHP ni JavaScript

Ce livre est 100% pratique et basé sur 03 grands projets de développement d’applications web en Science des données (Data Science) dans les domaines du Marketing, Machine Learning et de l’analyse quantitative. Grâce à des explications claires et précises, vous serez à l’aise avec l’utilisation de R et Shiny pour créer des applications Web interactives et performantes même si vous n’aviez aucune expérience en développement Web.

Que vous soyez Data Scientist, Data Analyst, Statisticien, Chercheur, Etudiant sans connaissances en HTML, CSS, PHP, ou JavaScript, vous pouvez créer des applications web dynamiques en utilisant uniquement du code R.

Josué AFOUDA