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/
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)
Les graphiques que nous allons construire dans cette section aident à examiner dans quelle mesure deux ou plusieurs variables sont corrélées.
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)
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.
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)
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)
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.
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)
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.