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.
Veuillez trouver cette formation sous format vidéos sur la chaîne YouToube en cliquant ici
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
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)
N.B : Pour pourvoir suivre cette formation, vous devez avoir au mouns un niveau débutant en programmation avec R. Si ce n’est pas le cas, vous pouvez commencer à apprendre ce langage avec mon livre intitulé : APPRENDRE A PROGRAMMER AVEC R ET RSTUDIO
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)
| PID | county | state | area | poptotal | popdensity | popwhite | popblack | popamerindian | popasian | popother | percwhite | percblack | percamerindan | percasian | percother | popadults | perchsd | percollege | percprof | poppovertyknown | percpovertyknown | percbelowpoverty | percchildbelowpovert | percadultpoverty | percelderlypoverty | inmetro | category |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 561 | ADAMS | IL | 0.052 | 66090 | 1270.9615 | 63917 | 1702 | 98 | 249 | 124 | 96.71206 | 2.5752761 | 0.1482826 | 0.3767590 | 0.1876229 | 43298 | 75.10740 | 19.63139 | 4.355859 | 63628 | 96.27478 | 13.151443 | 18.01172 | 11.009776 | 12.443812 | 0 | AAR |
| 562 | ALEXANDER | IL | 0.014 | 10626 | 759.0000 | 7054 | 3496 | 19 | 48 | 9 | 66.38434 | 32.9004329 | 0.1788067 | 0.4517222 | 0.0846979 | 6724 | 59.72635 | 11.24331 | 2.870315 | 10529 | 99.08714 | 32.244278 | 45.82651 | 27.385647 | 25.228976 | 0 | LHR |
| 563 | BOND | IL | 0.022 | 14991 | 681.4091 | 14477 | 429 | 35 | 16 | 34 | 96.57128 | 2.8617170 | 0.2334734 | 0.1067307 | 0.2268028 | 9669 | 69.33499 | 17.03382 | 4.488572 | 14235 | 94.95697 | 12.068844 | 14.03606 | 10.852090 | 12.697410 | 0 | AAR |
| 564 | BOONE | IL | 0.017 | 30806 | 1812.1176 | 29344 | 127 | 46 | 150 | 1139 | 95.25417 | 0.4122574 | 0.1493216 | 0.4869181 | 3.6973317 | 19272 | 75.47219 | 17.27895 | 4.197800 | 30337 | 98.47757 | 7.209019 | 11.17954 | 5.536013 | 6.217047 | 1 | ALU |
| 565 | BROWN | IL | 0.018 | 5836 | 324.2222 | 5264 | 547 | 14 | 5 | 6 | 90.19877 | 9.3728581 | 0.2398903 | 0.0856751 | 0.1028101 | 3979 | 68.86152 | 14.47600 | 3.367680 | 4815 | 82.50514 | 13.520249 | 13.02289 | 11.143211 | 19.200000 | 0 | AAR |
| 566 | BUREAU | IL | 0.050 | 35688 | 713.7600 | 35157 | 50 | 65 | 195 | 221 | 98.51210 | 0.1401031 | 0.1821340 | 0.5464022 | 0.6192558 | 23444 | 76.62941 | 18.90462 | 3.275892 | 35107 | 98.37200 | 10.399635 | 14.15882 | 8.179287 | 11.008586 | 0 | AAR |
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
| PID | county | state | area | poptotal | popdensity | popwhite | popblack | popamerindian | popasian | popother | percwhite | percblack | percamerindan | percasian | percother | popadults | perchsd | percollege | percprof | poppovertyknown | percpovertyknown | percbelowpoverty | percchildbelowpovert | percadultpoverty | percelderlypoverty | inmetro | category |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 659 | WILL | IL | 0.050 | 357313 | 7146.260 | 303420 | 38361 | 692 | 4774 | 10066 | 84.91715 | 10.735965 | 0.1936677 | 1.3360835 | 2.8171379 | 215823 | 80.43026 | 24.75686 | 5.887232 | 348384 | 97.50107 | 6.03472 | 7.463086 | 4.799198 | 8.563398 | 1 | HLU |
| 707 | LAKE | IN | 0.030 | 475594 | 15853.133 | 334203 | 116688 | 865 | 2772 | 21066 | 70.27065 | 24.535213 | 0.1818778 | 0.5828501 | 4.4294083 | 298552 | 73.47832 | 17.66861 | 4.939173 | 469774 | 98.77627 | 13.80515 | 21.511037 | 11.093432 | 9.955780 | 1 | AAU |
| 1221 | GENESEE | MI | 0.037 | 430459 | 11634.027 | 336651 | 84257 | 3132 | 2902 | 3517 | 78.20745 | 19.573757 | 0.7275954 | 0.6741641 | 0.8170348 | 265430 | 76.76600 | 20.14542 | 4.802019 | 425331 | 98.80871 | 16.46318 | 25.235707 | 13.843950 | 9.706895 | 1 | AAU |
| 2056 | LUCAS | OH | 0.021 | 462361 | 22017.191 | 380155 | 68456 | 1164 | 4981 | 7605 | 82.22039 | 14.805747 | 0.2517513 | 1.0772967 | 1.6448187 | 289965 | 76.23403 | 23.55043 | 6.005897 | 454351 | 98.26759 | 15.26881 | 21.491653 | 13.494457 | 11.422802 | 1 | AAU |
| 2084 | STARK | OH | 0.034 | 367585 | 10811.324 | 339421 | 25052 | 950 | 1529 | 633 | 92.33810 | 6.815294 | 0.2584436 | 0.4159582 | 0.1722051 | 241153 | 76.00901 | 18.98960 | 4.620303 | 359231 | 97.72733 | 11.06057 | 16.399197 | 9.510669 | 8.458447 | 1 | AAU |
| 2993 | DANE | WI | 0.073 | 367085 | 5028.562 | 344617 | 10511 | 1201 | 8666 | 2090 | 93.87935 | 2.863370 | 0.3271722 | 2.3607611 | 0.5693504 | 225973 | 88.89867 | 43.62645 | 13.471521 | 351558 | 95.77019 | 10.49301 | 8.767781 | 12.168011 | 4.974351 | 1 | HAU |
# 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)
| manufacturer | model | displ | year | cyl | trans | drv | cty | hwy | fl | class |
|---|---|---|---|---|---|---|---|---|---|---|
| audi | a4 | 1.8 | 1999 | 4 | auto(l5) | f | 18 | 29 | p | compact |
| audi | a4 | 1.8 | 1999 | 4 | manual(m5) | f | 21 | 29 | p | compact |
| audi | a4 | 2.0 | 2008 | 4 | manual(m6) | f | 20 | 31 | p | compact |
| audi | a4 | 2.0 | 2008 | 4 | auto(av) | f | 21 | 30 | p | compact |
| audi | a4 | 2.8 | 1999 | 6 | auto(l5) | f | 16 | 26 | p | compact |
| audi | a4 | 2.8 | 1999 | 6 | manual(m5) | f | 18 | 26 | p | compact |
# Structure de la dataframe
str(mpg)
## tibble [234 × 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)
| manufacturer | model | displ | year | cyl | trans | drv | cty | hwy | fl | class |
|---|---|---|---|---|---|---|---|---|---|---|
| audi | a4 | 1.8 | 1999 | 4 | auto(l5) | f | 18 | 29 | p | compact |
| audi | a4 | 1.8 | 1999 | 4 | manual(m5) | f | 21 | 29 | p | compact |
| audi | a4 | 2.0 | 2008 | 4 | manual(m6) | f | 20 | 31 | p | compact |
| audi | a4 | 2.0 | 2008 | 4 | auto(av) | f | 21 | 30 | p | compact |
| audi | a4 | 2.8 | 1999 | 6 | auto(l5) | f | 16 | 26 | p | compact |
| audi | a4 | 2.8 | 1999 | 6 | manual(m5) | f | 18 | 26 | p | compact |
# 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)
Dans cette section, les graphiques que nous construiront serviront à comparer la variation des valeurs entre un petit nombre d’éléments (ou catégories) par rapport à une référence fixe.
Le diagramme à barres divergentes est un graphique à barres qui peut gérer à la fois des valeurs négatives et positives. Il ne s’agit pas d’un simple graphique à barres.
# Préparation des données
mtcars$`car name` <- rownames(mtcars) # Création d'une nouvelle colonne des noms des voitures
head(mtcars)
| mpg | cyl | disp | hp | drat | wt | qsec | vs | am | gear | carb | car name | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Mazda RX4 | 21.0 | 6 | 160 | 110 | 3.90 | 2.620 | 16.46 | 0 | 1 | 4 | 4 | Mazda RX4 |
| Mazda RX4 Wag | 21.0 | 6 | 160 | 110 | 3.90 | 2.875 | 17.02 | 0 | 1 | 4 | 4 | Mazda RX4 Wag |
| Datsun 710 | 22.8 | 4 | 108 | 93 | 3.85 | 2.320 | 18.61 | 1 | 1 | 4 | 1 | Datsun 710 |
| Hornet 4 Drive | 21.4 | 6 | 258 | 110 | 3.08 | 3.215 | 19.44 | 1 | 0 | 3 | 1 | Hornet 4 Drive |
| Hornet Sportabout | 18.7 | 8 | 360 | 175 | 3.15 | 3.440 | 17.02 | 0 | 0 | 3 | 2 | Hornet Sportabout |
| Valiant | 18.1 | 6 | 225 | 105 | 2.76 | 3.460 | 20.22 | 1 | 0 | 3 | 1 | Valiant |
# Variable mpg_z : Standardisation de la variable mpg (Z score)
mtcars$mpg_z <- round((mtcars$mpg - mean(mtcars$mpg))/sd(mtcars$mpg), 2)
print(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
## car name mpg_z
## Mazda RX4 Mazda RX4 0.15
## Mazda RX4 Wag Mazda RX4 Wag 0.15
## Datsun 710 Datsun 710 0.45
## Hornet 4 Drive Hornet 4 Drive 0.22
## Hornet Sportabout Hornet Sportabout -0.23
## Valiant Valiant -0.33
print(summary(mtcars$mpg_z))
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## -1.610000 -0.772500 -0.150000 0.000625 0.450000 2.290000
print(sd(mtcars$mpg_z))
## [1] 0.9997611
Les véhicules avec mpg_z au-dessus de 0 seront marqués en vert et ceux en-dessous de 0 seront marqués en rouge :
# Création de la variable mpg_type
mtcars$mpg_type <- ifelse(mtcars$mpg_z < 0, "below", "above")
head(mtcars)
| mpg | cyl | disp | hp | drat | wt | qsec | vs | am | gear | carb | car name | mpg_z | mpg_type | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Mazda RX4 | 21.0 | 6 | 160 | 110 | 3.90 | 2.620 | 16.46 | 0 | 1 | 4 | 4 | Mazda RX4 | 0.15 | above |
| Mazda RX4 Wag | 21.0 | 6 | 160 | 110 | 3.90 | 2.875 | 17.02 | 0 | 1 | 4 | 4 | Mazda RX4 Wag | 0.15 | above |
| Datsun 710 | 22.8 | 4 | 108 | 93 | 3.85 | 2.320 | 18.61 | 1 | 1 | 4 | 1 | Datsun 710 | 0.45 | above |
| Hornet 4 Drive | 21.4 | 6 | 258 | 110 | 3.08 | 3.215 | 19.44 | 1 | 0 | 3 | 1 | Hornet 4 Drive | 0.22 | above |
| Hornet Sportabout | 18.7 | 8 | 360 | 175 | 3.15 | 3.440 | 17.02 | 0 | 0 | 3 | 2 | Hornet Sportabout | -0.23 | below |
| Valiant | 18.1 | 6 | 225 | 105 | 2.76 | 3.460 | 20.22 | 1 | 0 | 3 | 1 | Valiant | -0.33 | below |
# Ordonner la variable 'mpg_z' par ordre croissant
mtcars <- mtcars[order(mtcars$mpg_z), ]
# Variable 'car name' au format factor
mtcars$`car name` <- factor(mtcars$`car name`, levels = mtcars$`car name`)
print(head(mtcars))
## mpg cyl disp hp drat wt qsec vs am gear carb
## Cadillac Fleetwood 10.4 8 472 205 2.93 5.250 17.98 0 0 3 4
## Lincoln Continental 10.4 8 460 215 3.00 5.424 17.82 0 0 3 4
## Camaro Z28 13.3 8 350 245 3.73 3.840 15.41 0 0 3 4
## Duster 360 14.3 8 360 245 3.21 3.570 15.84 0 0 3 4
## Chrysler Imperial 14.7 8 440 230 3.23 5.345 17.42 0 0 3 4
## Maserati Bora 15.0 8 301 335 3.54 3.570 14.60 0 1 5 8
## car name mpg_z mpg_type
## Cadillac Fleetwood Cadillac Fleetwood -1.61 below
## Lincoln Continental Lincoln Continental -1.61 below
## Camaro Z28 Camaro Z28 -1.13 below
## Duster 360 Duster 360 -0.96 below
## Chrysler Imperial Chrysler Imperial -0.89 below
## Maserati Bora Maserati Bora -0.84 below
# Structure de la dataframe finale
str(mtcars)
## 'data.frame': 32 obs. of 14 variables:
## $ mpg : num 10.4 10.4 13.3 14.3 14.7 15 15.2 15.2 15.5 15.8 ...
## $ cyl : num 8 8 8 8 8 8 8 8 8 8 ...
## $ disp : num 472 460 350 360 440 ...
## $ hp : num 205 215 245 245 230 335 180 150 150 264 ...
## $ drat : num 2.93 3 3.73 3.21 3.23 3.54 3.07 3.15 2.76 4.22 ...
## $ wt : num 5.25 5.42 3.84 3.57 5.34 ...
## $ qsec : num 18 17.8 15.4 15.8 17.4 ...
## $ vs : num 0 0 0 0 0 0 0 0 0 0 ...
## $ am : num 0 0 0 0 0 1 0 0 0 1 ...
## $ gear : num 3 3 3 3 3 5 3 3 3 5 ...
## $ carb : num 4 4 4 4 4 8 3 2 2 4 ...
## $ car name: Factor w/ 32 levels "Cadillac Fleetwood",..: 1 2 3 4 5 6 7 8 9 10 ...
## $ mpg_z : num -1.61 -1.61 -1.13 -0.96 -0.89 -0.84 -0.81 -0.81 -0.76 -0.71 ...
## $ mpg_type: chr "below" "below" "below" "below" ...
# Diagramme à barres divergentes
bar_div <- ggplot(mtcars, aes(x = `car name`, y = mpg_z, label = mpg_z)) +
geom_bar(stat = 'identity', aes(fill = mpg_type), width = 0.5) +
scale_fill_manual(name = "Kilométrage",
labels = c("Above Average", "Below Average"),
values = c("above" = "green", "below" = "red")) +
labs(subtitle = "Kilométrage normalisé",
title = "Diagramme à barres divergentes") +
coord_flip()
bar_div
ggplotly(bar_div)
Voyons à présent une manière beaucoup plus moderne de construire un diagramme à barres divergentes.
# Diagramme à barres divergentes moderne
bdm <- ggplot(mtcars, aes(x = `car name`, y = mpg_z, label = mpg_z)) +
geom_point(stat = 'identity', fill = "black", size = 6) +
geom_segment(aes(y = 0,
x = `car name`,
yend = mpg_z,
xend = `car name`),
color = "black") +
geom_text(color = "white", size = 2) +
labs(title = "Diagramme à barres divergentes moderne",
subtitle = "Kilométrage normalisé") +
ylim(-2.5, 2.5) +
coord_flip()
bdm
ggplotly(bdm)
Les principes sont les mêmes que ce que nous avons vu dans les barres divergentes, sauf que seul le point est utilisé.
# Diagramme de points divergents
dpd <- ggplot(mtcars, aes(x = `car name`, y = mpg_z, label = mpg_z)) +
geom_point(stat = 'identity', aes(col = mpg_type), size = 6) +
scale_color_manual(name = "Mileage",
labels = c("Above Average", "Below Average"),
values = c("above" = "green", "below" = "red")) +
geom_text(color = "white", size = 2) +
labs(title = "Diagramme de points divergents",
subtitle = "Kilométrage normalizé") +
ylim(-2.5, 2.5) +
coord_flip()
dpd
ggplotly(dpd)
Les graphiques en aires sont généralement utilisés pour visualiser les performances d’une mesure particulière (telle que le pourcentage de rendement d’une action) par rapport à une certaine référence. D’autres types de données de rendements ou de variation en % sont également couramment utilisés. La fonction geom_area() de ggplot2 permet de construire un graphique en aire. Pour illustrer cette partie, nous utiliserons l’ensemble de données economics présent dans ggplot2 et produit à partir de données de séries chronologiques économiques américaines disponibles sur le site : https://fred.stlouisfed.org/. Dans cette partie, nous aurons aussi besoin du package quantmod. La librairie quantmod est un package qui a été construit pour assister les trader et les analystes quantitatifs dans le développement, le test et le déployement de modèles statistiques de trading. Commençons par installer et importer cette librairie :
# Installation de 'quantmod'
install.packages('quantmod')
# Importation de la librairie 'quantmod'
library(quantmod)
# Chargement des données
data("economics", package = "ggplot2")
head(economics)
| date | pce | pop | psavert | uempmed | unemploy |
|---|---|---|---|---|---|
| 1967-07-01 | 506.7 | 198712 | 12.6 | 4.5 | 2944 |
| 1967-08-01 | 509.8 | 198911 | 12.6 | 4.7 | 2945 |
| 1967-09-01 | 515.6 | 199113 | 11.9 | 4.6 | 2958 |
| 1967-10-01 | 512.2 | 199311 | 12.9 | 4.9 | 3143 |
| 1967-11-01 | 517.4 | 199498 | 12.8 | 4.7 | 3066 |
| 1967-12-01 | 525.1 | 199657 | 11.8 | 4.8 | 3018 |
# Préparation des données (Ne vous préoccupez pas de ce code)
# L'important pour cette formation est la visualisation des données
economics$returns_perc <-c(
0, diff(economics$psavert)/economics$psavert[-length(economics$psavert)]
)
# Création des breaks points et des étiquettes pour les graduations d'axe
brks <- economics$date[seq(1, length(economics$date), 12)]
lbls <- lubridate::year(economics$date[seq(1, length(economics$date), 12)])
Notez l’utilisation du package lubridate. Il faudra l’installer à votre niveau si ce n’est pas encore fait.
# Evolution du rendement
air_plot <- ggplot(economics[1:100, ], aes(date, returns_perc)) +
geom_area() +
scale_x_date(breaks = brks, labels = lbls) +
theme(axis.text.x = element_text(angle = 90)) +
labs(title = ,
subtitle = "Rendement (%) pour les économies personnelles",
y = "Rendement (%) pour l'épargne personnelle",
caption = "Source : economics")
air_plot
ggplotly(air_plot)
Les graphiques qui vont suivre sont appelés graphiques de classement. Ils sont utilisés pour comparer la position ou les performances de plusieurs éléments les uns par rapport aux autres.
Le graphique à barres ordonné est un graphique à barres classé par la variable de l’axe Y. Il ne suffit pas de trier la dataframe par la variable d’intérêt pour ordonner le graphique à barres. Pour que le graphique à barres conserve l’ordre des lignes, la variable de l’axe X (c’est-à-dire les catégories) doit être convertie en un facteur.
Traçons le kilométrage moyen de la ville (cty) pour chaque fabricant à partir de l’ensemble de données mpg.
Commençons d’abord par préparer les données :
# Agrégation du kilométrage en ville pour chaque fabricant
# La fonction d'agrégation est la moyenne
cty_mpg <- aggregate(mpg$cty, by = list(mpg$manufacturer), FUN = mean)
head(cty_mpg)
| Group.1 | x |
|---|---|
| audi | 17.61111 |
| chevrolet | 15.00000 |
| dodge | 13.13514 |
| ford | 14.00000 |
| honda | 24.44444 |
| hyundai | 18.64286 |
# Changement des noms de colonnes
colnames(cty_mpg) <- c("make", "mileage")
# Ordonner les observations par ordre croissant des valeurs de la variable 'mileage'
cty_mpg <- cty_mpg[order(cty_mpg$mileage), ]
# Variable 'make' en factor (variable catégorielle)
cty_mpg$make <- factor(cty_mpg$make, levels = cty_mpg$make)
head(cty_mpg)
| make | mileage | |
|---|---|---|
| 9 | lincoln | 11.33333 |
| 8 | land rover | 11.50000 |
| 3 | dodge | 13.13514 |
| 10 | mercury | 13.25000 |
| 7 | jeep | 13.50000 |
| 4 | ford | 14.00000 |
# Kilométrage moyen en ville par fabricant
gbo <- ggplot(cty_mpg, aes(x = make, y = mileage)) +
geom_bar(stat = "identity", width = .5, fill = "tomato3") +
labs(title = "Kilométrage moyen en ville par fabricant",
caption = "source : mpg dataset") +
theme(axis.text.x = element_text(angle = 45, vjust = 0.6))
gbo
ggplotly(gbo)
En réduisant les barres épaisses en lignes fines, cela réduit l’encombrement et met davantage l’accent sur la valeur.
# Diagramme à barres minces
dbarm <- ggplot(cty_mpg, aes(x = make, y = mileage)) +
geom_point(size = 3) +
geom_segment(aes(x = make,
xend = make,
y = 0,
yend = mileage)) +
labs(title="Diagramme à barres minces",
caption="source : mpg dataset") +
theme(axis.text.x = element_text(angle = 65, vjust = 0.6))
dbarm
ggplotly(dbarm)
Il est très simmilaire au diagramme à barres minces mais sans la ligne et sont retournés en position horizontale. Il met davantage l’accent sur le classement des éléments par rapport aux valeurs réelles et à quelle distance sont les entités les unes par rapport aux autres.
# Diagramme à points
dot_plot <- ggplot(cty_mpg, aes(x = make, y = mileage)) +
geom_point(col="tomato2", size=3) +
geom_segment(aes(x = make,
xend = make,
y = min(mileage),
yend = max(mileage)),
linetype = "dashed",
size = 4) +
labs(title = "Diagramme à points",
caption = "source : mpg dataset") +
coord_flip()
dot_plot
ggplotly(dot_plot)
Les graphiques de distribution sont utilisés lorsque vous avez beaucoup de points de données et que vous souhaitez étudier où et comment les points de données sont distribués.
Nous allons d’abord créer un histogramme sur une variable continue et ensuite sur une variable catégorielle.
# Histogramme simple de la capacité du moteur
h0 <- ggplot(mpg, aes(displ)) + geom_histogram()
h0
En abscisse, on a les valeurs de la variable regroupées dans des bacs (bins en Anglais). Les hauteurs des barres représentent le nombre de points de données qui entrent dans un bac. L’histogramme ci-dessus est obtenu avec un regroupement automatique car nous n’avons pas spécifié le nombre de bins (Par défaut, ce nombre est égal à 30).
# Spécification du nombre de bins (bins = 20)
h0 <- ggplot(mpg, aes(displ)) + geom_histogram(bins = 20)
h0
# Spécification du nombre de bins (bins = 10)
h0 <- ggplot(mpg, aes(displ)) + geom_histogram(bins = 10)
h0
Comme vous le remarquez, le nombre de bins peut modifier l’apparence de l’histogramme.
ggplotly(h0)
# Distribution de la capacité du moteur pour divers types de voitures
h1 <- ggplot(mpg, aes(displ)) + scale_fill_brewer(palette = "Spectral") +
geom_histogram(aes(fill = class),
binwidth = 0.1,
col = "black",
size = 0.1) +
labs(title = "Histogramme avec regroupement automatique",
subtitle = "Capacité du moteur pour divers types de voitures")
h1
ggplotly(h1)
Créons le même graphique mais cette fois-ci avec un nombre fixe de bins :
# Histograme avec un nombre de fixe de bins
h2 <- ggplot(mpg, aes(displ)) + scale_fill_brewer(palette = "Spectral") +
geom_histogram(aes(fill = class),
bins = 5,
col = "black",
size = 0.1) +
labs(title = "Histograme avec un nombre de fixe de bins",
subtitle = "Capacité du moteur pour divers types de voitures")
h2
ggplotly(h2)
Passons à la construction d’un histogramme sur une variable catégorielle. L’histogramme sur une variable catégorielle se traduirait par un graphique de fréquence affichant des barres pour chaque catégorie.
hc <- ggplot(mpg, aes(manufacturer)) +
geom_bar(aes(fill = class), width = 0.5) +
theme(axis.text.x = element_text(angle = 65, vjust = 0.6)) +
labs(title = "Histograme d'une variable catégorielle",
subtitle = "Concessionnaire pour chaque type de voiture")
hc
ggplotly(hc)
Un graphique de densité visualise la distribution des données sur un intervalle ou une période de temps continu.
# Graphique de densité du kilométrage en ville regroupé par nombre de cylindres
density_plot <- ggplot(mpg, aes(cty)) +
geom_density(aes(fill = factor(cyl)), alpha = 1) +
labs(title = "Graphique de densité",
subtitle = "Kilométrage en ville regroupé par nombre de cylindres",
caption = "Source : mpg dataset",
x = "Kilométrage en ville",
fill = "Nombre de cylindres")
density_plot
ggplotly(density_plot)
Comme les histogrammes, les boîtes à moustaches servent aussi à représenter la distribution des variables numériques. Les histogrammes sont meilleurs pour montrer la forme d’une distribution ; les boîtes à moustache aident à mieux identifier les valeurs aberrantes. Par ailleurs, l’autre avantage des boîtes à moustache est qu’ils permettent d’afficher les distributions au sein de plusieurs groupes, ainsi que la médiane, la gamme interquartile (IQR) et les valeurs aberrantes.

La ligne sombre à l’intérieur de la boîte représente la médiane. Le haut de la boîte est de 75 % et le bas de la boîte est de 25 %. Les points d’extrémité des lignes (alias moustaches) sont à une distance de 1,5 * IQR, où IQR (Inter Quartile Range) est la distance entre le 25e et le 75e centiles. Les points à l’extérieur des moustaches sont marqués comme des points et sont normalement considérés comme des points extrêmes (outliers).
Pour tracer les boîtes à moustache avec ggplot2, vous devez utiliser la fonction geom_boxplot() :
# Boîte à moustache du Kilométrage urbain regroupé par classe de voiture
box_plot <- ggplot(mpg, aes(class, cty, fill = factor(class))) +
geom_boxplot() +
labs(title = "Kilométrage urbain regroupé par classe de voiture",
caption = "Source : mpg dataset",
x= "Type de voiture",
y= "kilométrage urbain",
fill = "Type de voiture")
box_plot
ggplotly(box_plot)
En plus des informations fournies par une boîte à moustaches, le diagramme à points peut fournir des informations plus claires sous forme de statistiques récapitulatives par groupe. Les points sont décalés de telle sorte que chaque point représente une observation. Ainsi, dans le graphique ci-dessous, le nombre de points pour un fabricant donné correspondra au nombre de lignes de ce fabricant dans la dataset.
# Dot Plot + Box Plot
dot_box <- ggplot(mpg, aes(manufacturer, cty)) +
geom_boxplot() +
geom_dotplot(binaxis = 'y',
stackdir = 'center',
dotsize = 0.5,
fill = "red") +
theme(axis.text.x = element_text(angle = 65, vjust = 0.6)) +
labs(title = "Kilométrage urbain pour chaque type de voiture",
subtitle = "Chaque point représente une observation dans la dataset",
caption = "Source : mpg dataset",
x = "Type de voiture",
y = "Kilométrage urbain")
dot_box
La boîte à moustaches de Tufte, fournie par le package ggthemes est inspirée des travaux d’Edward Tufte. C’est juste une boîte à moustache à rendu minimal.
# Installation de ggthemes
install.packages('ggthemes')
# Importation de la librairie ggthemes
library(ggthemes)
# Boîte à moustache de tufte
t_box <- ggplot(mpg, aes(manufacturer, cty)) +
geom_tufteboxplot() +
theme(axis.text.x = element_text(angle = 65, vjust = 0.6)) +
labs(title = "Boîte à moustache de tufte : Kilométrage urbain par concessionnaire",
caption = "Source : mpg dataset",
x = "Concessionnaire",
y = "Kilométrage urbain")
t_box
La fonction geom_tufteboxplot() n’est pas encore prise en compte dans Plotly afin de permettre la transformation en graphique interactif d’une boîte à moustache de tufte.
Un tracé de violon est similaire à une boîte à moustache mais montre la densité au sein des groupes. Cependant, il ne fournit pas beaucoup d’informations comme dans les boîtes à moustache. Il peut être construit en utilisant la fonction geom_violin().
# Graphique de violon
violin_plot <- ggplot(mpg, aes(class, cty, fill = factor(class))) +
geom_violin() +
labs(title="Violin plot : Kilométrage urbain par type de voiture",
caption = "Source : mpg dataset",
x = "Type de voiture",
y="Kilométrage urbanisé",
fill = "Type de voiture")
violin_plot
ggplotly(violin_plot)
Dans cette section, nous construirons un graphique en gaufre (Waffle chart), un graphique à secteurs (Pie chart) et une carte d’arbre (Tree map).
Les diagrammes à secteurs carrés (ou diagrammes de gaufres) peuvent être utilisés pour communiquer des parties d’un tout pour des quantités catégoriques. Pour émuler la vue en pourcentage d’un graphique à secteurs, une grille 10x10 doit être utilisée avec chaque carré représentant 1% du total. Les utilisations modernes des tableaux de gaufres ne respectent pas nécessairement cette règle et peuvent être créées avec une grille de n’importe quelle forme rectangulaire. Les meilleures pratiques suggèrent de limiter le nombre de catégories, comme cela doit être fait lors de la création de graphiques à secteurs.
Nous aurons besoin du package waffle pour tracer ce graphique.
# Installation du package 'waffle'
install.packages('waffle')
# Importation de la librairie 'waffle'
library(waffle)
# waffle chart : exemple simple
parts <- c(80, 30, 20, 10)
chart <- waffle(parts, rows = 8)
chart
# waffle chart : Deuxième exemple
var <- factor(mpg$class)
n_lignes <- 10
categ_table <- round(table(var) * ((n_lignes*n_lignes)/(length(var))))
categ_table
## var
## 2seater compact midsize minivan pickup subcompact suv
## 2 20 18 5 14 15 26
chart2 = waffle(categ_table)
chart2
df <- as.data.frame(table(mpg$class))
colnames(df) <- c("class", "freq")
pie <- ggplot(df, aes(x = "", y=freq, fill = factor(class))) +
geom_bar(stat = "identity") +
theme(axis.line = element_blank(),
plot.title = element_text(hjust=0.5)) +
labs(fill="class",
x = NULL,
y = NULL,
title = "Fréquence du type de voitures",
caption = "Source : mpg dataset") +
coord_polar(theta = "y", start = 0)
pie
Pour construire un treemap, nous aurons besoin du package highcharter :
# Installation du package highcharter
install.packages('highcharter')
# Importation du package
library(highcharter)
Créons un tableau de synthèse des données de la dataset mpg. Nous utiliserons la fonction pipe (%>%) du package dplyr :
# Installation du package dplyr
install.packages('dplyr')
# Importation de la librairie dplyr
library(dplyr)
# Préparation des données : Tableau de synthèse
summary.table <- mpg %>%
group_by(manufacturer) %>%
summarise(
nb_cars = n(),
nb_model = length(unique(model))
) %>%
arrange(-nb_cars, -nb_model)
summary.table
| manufacturer | nb_cars | nb_model |
|---|---|---|
| dodge | 37 | 4 |
| toyota | 34 | 6 |
| volkswagen | 27 | 4 |
| ford | 25 | 4 |
| chevrolet | 19 | 4 |
| audi | 18 | 3 |
| hyundai | 14 | 2 |
| subaru | 14 | 2 |
| nissan | 13 | 3 |
| honda | 9 | 1 |
| jeep | 8 | 1 |
| pontiac | 5 | 1 |
| land rover | 4 | 1 |
| mercury | 4 | 1 |
| lincoln | 3 | 1 |
# Tree map
tree_map <- summary.table %>%
hchart(
"treemap",
hcaes(x = manufacturer, value = nb_cars, color = nb_model)
)
tree_map
Le package ggfortify permet de construire un graphique de série temporelle directement à partir d’un objet de ts (time serie).
# Installation de ggfortify
install.packages('ggfortify')
# Importation de la librairie ggfortify
library(ggfortify)
L’ensemble de données AirPassengers contient les informations sur les totaux mensuels des passagers des compagnies aériennes internationales entre 1949 à 1960.
# Données
head(AirPassengers)
## [1] 112 118 132 129 121 135
class(AirPassengers)
## [1] "ts"
# Evolution du nombre de passagers
autoplot(AirPassengers) +
labs(title = "Evolution du nombre total de passagers")
class(economics)
## [1] "spec_tbl_df" "tbl_df" "tbl" "data.frame"
# EVolution des rendements
ts_plot <- ggplot(economics, aes(x = date)) +
geom_line(aes(y = returns_perc)) +
labs(title = "EVolution des rendements journaliers",
y="Rendement (%)")
ts_plot
ggplotly(ts_plot)
Le graphique en aires empilées ressemble à un graphique en courbes, sauf que la région située sous le tracé est entièrement colorée.
# Evolution du nombre de personnes au chômage
stacked_air_plot <- ggplot(economics, aes(date, unemploy)) +
geom_area(position = 'stack')
stacked_air_plot
Si vous disposez d’une variable catégorielle dans votre dataset, vous pouvez l’utiliser pour colorier vos aires comme dans l’exemple ci-dessous :
library(gcookbook)
print(head(uspopage))
## Year AgeGroup Thousands
## 1 1900 <5 9181
## 2 1900 5-14 16966
## 3 1900 15-24 14951
## 4 1900 25-34 12161
## 5 1900 35-44 9273
## 6 1900 45-54 6437
stacked_air_plot2 <- ggplot(uspopage, aes(x = Year, y = Thousands, fill = AgeGroup)) +
geom_area()
stacked_air_plot2
ggplotly(stacked_air_plot2)
Comprenez le mot clustering comme regroupement en classes. Le Clustering est une technique d’apprentissage automatique non-supervisé dont l’objectif est de découvrir les groupes sousjacents (ou “clusters”) dans un ensemble de données. Ici on ne dispose pas de données étiquetées comme c’est le cas dans l’apprentissage automatique supervisé. L’algorithme regroupe les objets similaires en termes de leurs caractéristiques. Dans chaque groupe, on a donc des observations similaires mais les groupes sont distincts les uns des autres.
Cette technique est très utilisée dans le domaine du Marketing pour réaliser la segmentation de clientèle. La Segmentation est une pratique de partitionnement des clients en groupes d’individus ayant les mêmes caractéristiques (On utilise souvent les données démographiques des clients car elles sont plus faciles à collecter). Cette stratégie permet de comprendre le comportement des clients, sur la base de leurs données historiques, et donc d’utiliser efficacement les ressources allouées au Marketing.
Les deux paragraphes ci-dessus qui expliquent le clustering sont extraits de mon livre Machine Learning par la pratique avec Python: Projets réels dans les Finances, l’Immobilier, le Trading, la Santé, le Marketing, etc..
Supposons qu’on a pas les noms des différentes espèces d’iris dans l’ensemble de données iris :
# Données iris sans étiquettes
df <- iris[c(1, 2, 3, 4)]
head(df)
| Sepal.Length | Sepal.Width | Petal.Length | Petal.Width |
|---|---|---|---|
| 5.1 | 3.5 | 1.4 | 0.2 |
| 4.9 | 3.0 | 1.4 | 0.2 |
| 4.7 | 3.2 | 1.3 | 0.2 |
| 4.6 | 3.1 | 1.5 | 0.2 |
| 5.0 | 3.6 | 1.4 | 0.2 |
| 5.4 | 3.9 | 1.7 | 0.4 |
Réalisons une analyse en composantes principales :
# ACP
pca_mod <- prcomp(df)
pca_mod
## Standard deviations (1, .., p=4):
## [1] 2.0562689 0.4926162 0.2796596 0.1543862
##
## Rotation (n x k) = (4 x 4):
## PC1 PC2 PC3 PC4
## Sepal.Length 0.36138659 -0.65658877 0.58202985 0.3154872
## Sepal.Width -0.08452251 -0.73016143 -0.59791083 -0.3197231
## Petal.Length 0.85667061 0.17337266 -0.07623608 -0.4798390
## Petal.Width 0.35828920 0.07548102 -0.54583143 0.7536574
# Data frame des composantes principales
df_pc <- data.frame(pca_mod$x, Species=iris$Species)
head(df_pc)
| PC1 | PC2 | PC3 | PC4 | Species |
|---|---|---|---|---|
| -2.684126 | -0.3193972 | 0.0279148 | 0.0022624 | setosa |
| -2.714142 | 0.1770012 | 0.2104643 | 0.0990266 | setosa |
| -2.888991 | 0.1449494 | -0.0179003 | 0.0199684 | setosa |
| -2.745343 | 0.3182990 | -0.0315594 | -0.0755758 | setosa |
| -2.728716 | -0.3267545 | -0.0900792 | -0.0612586 | setosa |
| -2.280860 | -0.7413304 | -0.1686777 | -0.0242009 | setosa |
# Dataframe de chaque espèce
df_pc_vir <- df_pc[df_pc$Species == "virginica", ]
df_pc_set <- df_pc[df_pc$Species == "setosa", ]
df_pc_ver <- df_pc[df_pc$Species == "versicolor", ]
# Graphique montrant les deux premières composantes
theme_set(theme_bw())
clusters <- ggplot(df_pc, aes(PC1, PC2, col = Species)) +
geom_point(aes(shape=Species), size = 2) +
labs(title = "Iris Clustering",
caption ="Source : Iris dataset") +
#coord_cartesian(xlim = 1.2 * c(min(df_pc$PC1), max(df_pc$PC1)),
#ylim = 1.2 * c(min(df_pc$PC2), max(df_pc$PC2))) + # change axis limits
geom_encircle(data = df_pc_vir, aes(x = PC1, y = PC2)) +
geom_encircle(data = df_pc_set, aes(x=PC1, y = PC2)) +
geom_encircle(data = df_pc_ver, aes(x = PC1, y = PC2))
clusters
ggplotly(clusters)
Vous êtes désormais capable de créer de superbes graphiques pour visualiser tout type de données à l’aide de R dans vos propres projets en Data Science.
Ne vous arrêtez pas en si bon chemin ! Apprenez aussi à créer des applications web et des tableaux de bords (dashboards) interactifs pour automatiser vos tâches et sublimer votre public. Je vous conseille de vous proccurer mon livre intitulé : 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.