Introduction à la Visualisation des Données avec R

Visualisation de Vos Données

Dans cette présentation, nous allons découvrir différents types de visualisations de données. Je vais utiliser “Introduction to Data Exploration and Analysis with R” de Michael Mahoney comme référence pour un chapitre de mon cours, offrant un cours intensif sur les compétences de codage avec R et l’analyse de données sans prérequis. Pour plus d’informations, voici le lien vers le livre.

Qu’est-ce qu’une Visualisation ?

Une visualisation de données est une méthode de représentation des données sous forme graphique, utile à la fois pour communiquer les résultats des analyses et pour explorer les ensembles de données afin de déterminer quelles analyses pourraient être appropriées.

plot(iris$Sepal.Length, iris$Sepal.Width)

Iris est un ensemble de données classique en statistique et en apprentissage automatique, comprenant 150 observations de plantes iris. Chaque observation décrit une plante à travers quatre caractéristiques mesurables : la longueur et la largeur des sépales, ainsi que la longueur et la largeur des pétales, le tout accompagné de l’espèce de l’iris (setosa, versicolor, ou virginica). Cet ensemble de données est largement utilisé pour l’illustration de méthodes de classification et de visualisation, faisant de lui un excellent outil pédagogique pour introduire les concepts de la manipulation et de l’analyse de données en R.

L’option warning=FALSE dans un environnement R Markdown sert à supprimer l’affichage des messages d’avertissement générés par l’exécution du code R. Cela rend votre document ou rapport plus clair et plus professionnel, en évitant la distraction que ces messages pourraient causer au lecteur. L’idée est de ne présenter que les résultats essentiels et les visualisations sans encombrer le document avec des avertissements techniques qui ne sont pas cruciaux pour la compréhension du contenu présenté.

La commande plot() représente la manière la plus basique de visualiser les données dans R, illustrant le lien entre la longueur et la largeur des sépales dans le jeu de données iris. Nous explorerons des méthodes de visualisation plus sophistiquées par la suite.

En effet, cette figure présente quelques défis évidents : les étiquettes des axes ne sont pas informatives, il n’y a pas de contexte expliquant ce que représente le graphique et, pour être honnête, c’est un peu laid.

# Code pour améliorer la visualisation initiale
plot(iris$Sepal.Length,
     iris$Sepal.Width,main = "Les iris de Fisher",
     xlab = "Sepal length (cm)",
     ylab = "Sepal width (cm)",
     pch = 19,
     las = 1,
     col = "deepskyblue4")

# Créer le graphique de base
plot(iris$Sepal.Length,
     iris$Sepal.Width,
     xlab = "Sepal Length (cm)",
     ylab = "Sepal Width (cm)",
     pch = 19,
     las = 1,
     col = "deepskyblue4")

# Ajouter des étiquettes
#text(iris$Sepal.Length, iris$Sepal.Width, 
 #    labels =
  #   c(1:50,1:50,1:50)
   #    , pos = 3, cex = 0.8)

Mais aller au-delà de cela devient très rapidement complexe. C’est pourquoi je vous conseille de ne presque jamais utiliser les fonctions de graphiques de base dans R – elles sont simplement trop compliquées à utiliser ! Les fonctions de base tendent à requérir une multitude d’ajustements manuels pour des tâches qui devraient être simples, comme affiner l’esthétique ou ajuster les légendes et les échelles. Ceci peut rapidement rendre le processus fastidieux et source d’erreurs, surtout pour les utilisateurs novices ou ceux travaillant sur des visualisations complexes.

tidyverse

Heureusement, R dispose d’un grand nombre de logiciels complémentaires, appelés packages, qui rendent la création de graphiques (et de nombreuses autres tâches) avec R nettement plus simple. Installons maintenant certains des plus courants :

library(tidyverse)

L’option message=FALSE dans un chunk R Markdown supprime l’affichage des messages générés par le code exécuté dans ce chunk, rendant le document final plus épuré.

Le tidyverse est un exemple assez unique de package, conçu par Hadley Wickham, qui est un peu le maître à penser de cette approche moderne de la manipulation de données en R. Il contient en réalité six packages essentiels pour utiliser R comme un professionnel moderne, dont le plus important pour nous actuellement est ggplot2. Nul besoin de s’inquiéter de le charger séparément : library(tidyverse) charge automatiquement ce package pour vous.

Le tidyverse est un exemple assez unique de package - il contient en réalité six packages, dont la plupart sont essentiels pour utiliser R comme un professionnel moderne. Le plus important pour nous actuellement s’appelle ggplot2. Pas besoin de s’inquiéter de devoir le charger - library(tidyverse) charge automatiquement ce package pour vous.

ggplot2

ggplot2 étend les capacités graphiques de base de R pour permettre la création de graphiques de qualité de publication plus rapidement et facilement que jamais auparavant. En fait, nous pouvons créer une version de notre nuage de points précédent, simplement en tapant :

ggplot(data = iris, aes(x = Sepal.Length, y = Sepal.Width)) + 
  geom_point(col="red")

Cette commande utilise ggplot2 pour produire un graphique en nuage de points qui montre la relation entre la longueur et la largeur des sépales des iris. Le système de ggplot2 repose sur la grammaire des graphiques, une théorie qui fournit une approche méthodique pour construire des visualisations de données. En définissant les données (data = iris) et en mappant les esthétiques (aes(x = Sepal.Length, y = Sepal.Width)), puis en ajoutant une couche pour les points (geom_point()), nous obtenons un graphique clair et informatif avec peu d’effort.

iris %>%
  ggplot(aes(x = Sepal.Length, y = Sepal.Width)) +
  geom_point()

Dans ce code, qui produit exactement la même figure, le jeu de données iris est transmis directement à ggplot via l’opérateur de pipe %>%, avec les axes définis par aes() pour créer un nuage de points. Ceci illustre l’utilisation fluide et concise de la syntaxe du tidyverse pour la visualisation de données.

Pour créer cette figure, l’ordre des étapes est le suivant :

  1. Le jeu de données iris est spécifié en premier.

  2. ggplot() initie la création d’un objet ggplot.

  3. aes() définit les esthétiques, comme les axes X et Y.

  4. Le + ajoute des éléments, toujours placé en fin de ligne pour éviter les erreurs.

  5. geom_point() choisit le type de figure, ici un nuage de points.

Fonctions dans ggplot

Les appels à ggplot() et geom_point sont connus sous le nom de fonctions, un type d’objet R qui, lorsqu’il reçoit certains paramètres, produit un résultat spécifique. Ces paramètres - dans notre graphique, les appels à data =, x =, et y = - sont connus sous le nom d’arguments.

Chacun de ces arguments peut prendre différentes valeurs si nous souhaitons modifier notre figure. Par exemple, si nous voulions colorer les points en fonction de l’espèce d’iris et ajouter une ligne de tendance pour chaque espèce, nous pourrions faire comme suit :

iris%>%ggplot(aes(x = Sepal.Length, y = Sepal.Width, color = Species)) + 
  geom_point() + 
  geom_smooth()

Cette commande enrichit notre figure initiale avec une dimension de couleur basée sur l’espèce et ajoute une ligne de tendance pour chacune, illustrant la polyvalence et la puissance des fonctions dans ggplot2 pour personnaliser et affiner nos visualisations de données.

geom_smooth() ajoute une ligne de tendance à vos graphiques, avec une zone ombrée qui représente l’intervalle de confiance à 95% pour la courbe elle-même. Cela signifie que la zone ombrée montre où nous pouvons raisonnablement nous attendre à ce que la vraie courbe de tendance se trouve, avec 95% de confiance, basée sur les données analysées. geom_smooth() ajoute une ligne de tendance à vos graphiques, avec une ombre représentant l’intervalle de confiance à 95% autour de celle-ci. Alors que certains pourraient le qualifier de graphique en ligne, cela constitue en réalité une notion entièrement différente : un graphique en ligne relie les points directement, comme ceci :

ggplot(data = iris, aes(x = Sepal.Length, y = Sepal.Width, color = Species)) + 
  geom_point() + 
  geom_line()

Pour le moment, nous allons continuer avec notre ligne de tendance lissée.

iris%>%ggplot(aes(x = Sepal.Length, y = Sepal.Width, color = Species)) + 
  geom_point() + 
  geom_smooth()

Dans notre graphique actuel, vous pourriez remarquer que les points sont quelque peu difficiles à distinguer car ils sont tracés sous la courbe de tendance et son ombrage. Cela est dû à l’ordre dans lequel nous invoquons geom_point() et geom_smooth() dans ggplot2 : les éléments sont ajoutés au graphique dans l’ordre des appels. Pour améliorer la visibilité des points, nous pouvons inverser cet ordre. En plaçant geom_smooth() avant geom_point(), la courbe de tendance sera dessinée d’abord, laissant les points se détacher clairement par-dessus.

Voici comment ajuster les appels de fonctions :

iris%>%ggplot(aes(x = Sepal.Length, y = Sepal.Width, color = Species)) + 
  geom_smooth() +
  geom_point()

library(tidyverse)

# Calcul de la corrélation entre Sepal.Length et Sepal.Width pour chaque espèce dans iris
 iris %>%
  group_by(Species) %>%
  summarise(
    correlation = cor(Sepal.Length, Sepal.Width)
  )
# A tibble: 3 × 2
  Species    correlation
  <fct>            <dbl>
1 setosa           0.743
2 versicolor       0.526
3 virginica        0.457

Notre graphique est désormais bien plus explicite - la longueur et la largeur des sépales semblent être corrélées, mais chaque espèce présente des différences.

Modifier les esthétiques

Si nous le voulions vraiment, nous pourrions faire en sorte que d’autres esthétiques varient également en fonction de l’espèce :

iris%>%ggplot(aes(x = Sepal.Length, y = Sepal.Width, color = Species)) + 
  geom_smooth(aes(linetype = Species)) + 
  geom_point(aes(size = Species, shape = Species))
`geom_smooth()` using method = 'loess' and formula = 'y ~ x'

Ce code ajoute une dimension supplémentaire à notre visualisation en utilisant l’espèce (Species) pour modifier non seulement la couleur, mais aussi le type de ligne de la courbe de tendance (linetype) et à la fois la taille et la forme des points dans notre graphique. Cela permet une différenciation plus claire entre les espèces, rendant les tendances spécifiques à chaque espèce plus faciles à identifier et à comprendre.

Mais cela s’avère assez inesthétique. Nous aborderons les meilleures pratiques en matière de graphiques un peu plus loin dans cette présentation - mais en règle générale, un graphique doit contenir exactement ce qu’il faut pour faire passer votre message, et pas plus. Une esthétique par variable est généralement suffisante.

Dans une exception importante à cette règle, il est généralement recommandé d’utiliser simultanément des formes et des couleurs différentes. Les spectateurs daltoniens peuvent ne pas être en mesure de discerner les différentes couleurs utilisées - donc varier la forme de vos points ou le type de vos lignes aide à rendre vos graphiques plus accessibles au lecteur.

Si vous le souhaitez, vous pouvez spécifier les formes en utilisant les fonctions scale_shape, comme scale_shape_manual(). Il y a 25 formes disponibles pour utilisation dans ggplot2.

Si nous le voulions, nous pourrions spécifier des formes pour chaque espèce dans notre jeu de données assez facilement ! Je l’ai fait ci-dessous. Je vais également contrôler les couleurs manuellement - R dispose d’une tonne de couleurs disponibles, et vous pouvez vous amuser à choisir les meilleures couleurs pour un graphique. Vous pouvez aussi spécifier les couleurs en utilisant des codes hexadécimaux (par exemple, “#FFFFFF”), mais soyez averti que vous pourriez ne pas obtenir une correspondance exacte de ce que vous recherchiez - R assortira aussi précisément que possible avec les couleurs qu’il a à disposition.

iris%>%ggplot(aes(x = Sepal.Length, y = Sepal.Width, color = Species)) + 
  geom_point(aes(shape = Species), size = 3) + 
  scale_shape_manual(values = c(16, 17, 18)) + 
  scale_color_manual(values = c("purple", "black", "orange"))

Nous avons également rendu les points un peu plus grands en spécifiant size = 3 - notez que cela n’est pas dans la fonction des esthétiques, car cela ne dépend d’aucune donnée. Les éléments ne sont inclus dans aes() que s’ils réagissent à des changements dans les données que vous représentez graphiquement.

Nous pouvons également varier le type de ligne qui est tracée lorsque nous utilisons geom_smooth avec que six options.

Nous pouvons spécifier manuellement les types de lignes avec les fonctions scale_linetype, de façon similaire à ce que nous avons fait avec les formes. Il est possible d’utiliser soit les noms, soit les numéros - assurez-vous simplement que les noms soient mis entre guillemets, tandis que les numéros ne le soient pas !

Nous allons recréer notre graphique en contrôlant manuellement les types de ligne. Nous allons également éliminer cette ombre - elle représente l’intervalle de confiance à 95% autour de la ligne, tel qu’identifié par l’erreur standard. Nous pouvons la désactiver en réglant se = FALSE dans l’appel de fonction geom_smooth().

iris%>%ggplot(aes(x = Sepal.Length, y = Sepal.Width, color = Species)) + 
  geom_smooth(aes(linetype = Species), size = 1, se = FALSE) + 
  scale_color_manual(values = c("purple", "black", "orange")) + 
  scale_linetype_manual(values = c("solid", "dashed", "twodash"))
Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
ℹ Please use `linewidth` instead.

Nous pouvons également combiner les deux graphiques précédents en un seul graphique plus utile :

iris%>%ggplot(aes(x = Sepal.Length, y = Sepal.Width, color = Species)) + 
  geom_smooth(aes(linetype = Species), size = 1, se = FALSE) + 
  geom_point(aes(shape = Species), size = 3) + 
  scale_shape_manual(values = c(16, 17, 18)) + 
  scale_color_manual(values = c("purple", "black", "orange")) + 
  scale_linetype_manual(values = c("solid", "dashed", "twodash"))

Ce code crée un graphique qui intègre à la fois les lignes de tendance lissées sans l’intervalle de confiance et les points avec des formes distinctes pour chaque espèce, permettant une visualisation riche et détaillée qui met en évidence à la fois la distribution globale et les différences spécifiques à chaque espèce d’iris.

Astucieux ! J’espère que vous commencez à comprendre comment ggplot vous permet de construire un graphique par addition, en dessinant tour à tour les fonctions que vous avez appelées.

Notez, au passage, que nous avons placé des appels à aes() à la fois dans ggplot() et dans les fonctions geom. Les geom héritent de l’appel à ggplot() - ils utiliseront quelle que soit la donnée et les esthétiques spécifiées à l’intérieur des parenthèses. Cependant, si nous souhaitons qu’une esthétique s’applique uniquement à un geom, nous pouvons la placer à l’intérieur de cet appel geom(). Cela est assez couramment utilisé lorsque une esthétique ne s’applique qu’à un geom - par exemple, notre geom_smooth() ne peut pas prendre de shape =.

Il faut cependant être prudent avec ce pouvoir ! Parfois, définir des esthétiques spécifiques aux geom peut conduire à des visualisations trompeuses ou carrément incorrectes. Par exemple, que se passerait-il si nous traçons nos lignes en fonction de la longueur des pétales de chaque espèce, plutôt que de la largeur des sépales ?

iris%>%ggplot(aes(x = Sepal.Length, y = Sepal.Width, color = Species)) + 
  geom_point(aes(shape = Species), size = 3) + 
  geom_smooth(aes(y = Petal.Length, linetype = Species), size = 1, se = FALSE) + 
  scale_shape_manual(values = c(16, 17, 18)) + 
  scale_color_manual(values = c("purple", "black", "orange")) + 
  scale_linetype_manual(values = c("solid", "dashed", "twodash"))

Cette manipulation change la variable que nous utilisons pour l’axe des y dans geom_smooth(), ce qui pourrait non seulement modifier radicalement l’apparence du graphique mais aussi sa signification, potentiellement conduisant à une interprétation erronée des données.

Revenons à notre autre graphique :

Ce graphique est bien, mais je pense qu’il pourrait être encore meilleur. Plus précisément, il y a beaucoup de chevauchement entre les espèces versicolor et virginica - ce serait bien de les voir côte à côte, plutôt que sur le même graphique.

Bien sûr, voici la version modifiée avec “nous” à la place de “je” :

Facettage

Heureusement, ggplot nous facilite la tâche grâce à ce qu’on appelle les facettes. En ajoutant facet_wrap() à notre graphique, nous pouvons diviser les trois espèces sur leurs propres graphiques, tout en gardant les axes standardisés.

iris%>%ggplot(aes(x = Sepal.Length, y = Sepal.Width)) + 
  geom_point(size = 3) + 
  geom_smooth(size = 1, se = FALSE) + 
  facet_wrap(~ Species)

Cela rend les différences beaucoup plus faciles à voir ! Notez que nous avons supprimé les esthétiques des différentes espèces - maintenant que les espèces sont chacune sur leur propre graphique, chaque espèce ayant une couleur et une forme différente n’ajoute aucune information à la visualisation.

facet_wrap() est très utile, car il enveloppera automatiquement nos graphiques dans autant de lignes et de colonnes que nécessaire. Si nous voulons être un peu plus spécifiques sur la manière dont nos données sont arrangées, cependant, nous pouvons utiliser facet_grid(). En spécifiant rows = ou cols =, nous pouvons contrôler précisément comment nos données sont divisées.

iris%>%ggplot(data = , aes(x = Sepal.Length, y = Sepal.Width)) +
  geom_point(size = 3) + 
  geom_smooth(size = 1, se = FALSE) + 
  facet_grid(rows = vars(Species))

En fait, si nous avons deux groupes que nous voulons comparer, nous pouvons utiliser à la fois rows = et cols = en même temps ! Malheureusement, iris n’a pas deux variables de regroupement en elle - donc nous allons en créer une autre (couleur).

iris2 <- iris
iris2$color <- rep(c("purple", "red", "black"), 50)
head(iris2)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species  color
1          5.1         3.5          1.4         0.2  setosa purple
2          4.9         3.0          1.4         0.2  setosa    red
3          4.7         3.2          1.3         0.2  setosa  black
4          4.6         3.1          1.5         0.2  setosa purple
5          5.0         3.6          1.4         0.2  setosa    red
6          5.4         3.9          1.7         0.4  setosa  black

Comme vous pouvez le voir, nous avons dit à R de répliquer (ou de répéter, comme nous l’avons toujours pensé) le vecteur de pourpre, rouge, noir 50 fois - donc environ un tiers de chaque espèce sera dans chaque couleur. En utilisant cela comme notre regroupement de colonnes nous donne :

iris2%>%ggplot(aes(x = Sepal.Length, y = Sepal.Width)) + 
  geom_point(size = 3) + 
  geom_smooth(size = 1, se = FALSE) + 
  facet_grid(rows = vars(Species), cols = vars(color))

D’accord, voici le texte modifié avec “nous” au lieu de “je” :

Jeu de données Diamonds

Visualisation de grands ensembles de données

Pour cet exercice suivant, nous allons utiliser le jeu de données diamonds, qui contient des données sur 54 000 ventes de diamants différentes. Voici un aperçu :

head(diamonds)
# A tibble: 6 × 10
  carat cut       color clarity depth table price     x     y     z
  <dbl> <ord>     <ord> <ord>   <dbl> <dbl> <int> <dbl> <dbl> <dbl>
1  0.23 Ideal     E     SI2      61.5    55   326  3.95  3.98  2.43
2  0.21 Premium   E     SI1      59.8    61   326  3.89  3.84  2.31
3  0.23 Good      E     VS1      56.9    65   327  4.05  4.07  2.31
4  0.29 Premium   I     VS2      62.4    58   334  4.2   4.23  2.63
5  0.31 Good      J     SI2      63.3    58   335  4.34  4.35  2.75
6  0.24 Very Good J     VVS2     62.8    57   336  3.94  3.96  2.48

Nous pouvons facilement tracer le prix de chaque diamant en fonction de son poids (ou carat) en utilisant geom_point() comme précédemment :

diamonds%>%ggplot(aes(carat, price)) + 
  geom_point()

Notez que nous avons arrêté d’écrire explicitement x = et y =. Sans cette spécification, R suppose que vous fournissez des arguments à la fonction dans l’ordre auquel la fonction s’attend normalement - ce qui, pour ggplot(), est sous la forme ggplot(data, aes(x, y)). La plupart du code que vous trouverez est écrit dans ce format plus compact.

Quoi qu’il en soit, revenons au graphique. C’est un peu désordonné ! Il est difficile de discerner un motif lorsque les 54 000 points sont tracés dans la même zone. Nous pouvons améliorer les choses en rendant les points un peu plus transparents, en leur donnant une faible valeur alpha = :

diamonds%>%ggplot(aes(carat, price)) + 
  geom_point(alpha = 0.05)

C’est un peu mieux ! Nous pouvons voir qu’il y a une corrélation entre le prix et le carat - mais il est difficile de dire exactement à quoi ressemble la tendance. De plus, il y a une bonne quantité d’espace vide sur le graphique, que nous pourrions probablement mieux utiliser.

Transformations des axes

Nous pouvons envisager de transformer nos axes pour résoudre tous ces problèmes. Par exemple, si nous tracions les deux axes sur des échelles log10, nous obtiendrions le graphique suivant :

diamonds%>%ggplot(aes(carat, price)) + 
  geom_point(alpha = 0.05) + 
  scale_x_log10() + 
  scale_y_log10()

Ainsi, en transformant nos variables en logarithmes, nous obtenons une relation linéaire dans nos données.

Vous pouvez effectuer de nombreuses autres transformations d’axes en spécifiant l’argument trans à l’intérieur de votre fonction scale. Par exemple, si nous voulions utiliser un logarithme naturel à la place, nous pourrions taper :

diamonds%>%ggplot(aes(carat, price)) + 
  geom_point(alpha = 0.05) + 
  scale_y_continuous(trans = "log") + 
  scale_x_continuous(trans = "log")

Pour en savoir plus sur les transformations, vous pouvez lire la documentation en tapant ?scale_x_continuous() dans la console.

Autres graphiques populaires

Histogrammes

L’un des graphiques les plus populaires est l’histogramme, qui vous permet de visualiser rapidement la distribution d’une valeur numérique :

diamonds%>%ggplot(aes(price)) + 
  geom_histogram()

D’où vient count ? Nous n’avons spécifié qu’une variable x ! La réponse courte est que ggplot l’a calculé lui-même ! ggplot n’a besoin que d’une esthétique x pour créer un histogramme - il calculera le décompte de chaque niveau de la variable et l’utilisera comme y.

R de base possède également une fonction d’histogramme dans hist(), que j’utilise parfois lors de la création de graphiques exploratoires. Elle fonctionne assez semblablement à la méthode ggplot, mais est regroupée dans une seule fonction :

hist(diamonds$price)

Diagrammes à barres

Si nous voulions utiliser une valeur catégorielle plutôt qu’une valeur numérique sur l’axe des x, nous utiliserions un diagramme à barres. C’est assez facile à faire dans ggplot, en utilisant geom_bar() :

diamonds%>%ggplot(aes(x = cut)) + 
  geom_bar()

Si nous voulions communiquer plus d’informations avec ce graphique, nous pourrions réfléchir à ce nombre de chaque type de coupe est composé de chaque niveau de clarté. Une façon de le faire est de mapper le remplissage du barplot à la variable de clarté :

diamonds%>%ggplot(aes(cut, fill = clarity)) + 
  geom_bar()

Notez que nous utilisons fill dans ce cas, car nous définissons la couleur pour l’intérieur du polygone, pas les lignes elles-mêmes. Si nous utilisions color à la place, nous obtiendrions quelque chose comme ceci :

diamonds%>%ggplot(aes(cut, color = clarity)) + 
  geom_bar()

Où seules les bordures de chaque polygone sont colorées.

Maintenant, le comportement par défaut de ggplot lorsqu’il est donné une esthétique de couleur ou de remplissage est de créer un diagramme à barres empilées, comme montré ci-dessus. Les diagrammes à barres empilées sont horribles. Il est vraiment difficile de comparer les valeurs entre les barres, car les limites inférieures ne sont pas standardisées. L’exception est si vous ne comparez que deux valeurs et que toutes les barres totalisent le même montant, comme ceci :

df <- data.frame(x = c(1, 1, 2, 2, 3, 3), 
                 y = c(40, 60, 30, 70, 20, 80), 
                 z = c("A","B","A","B", "A", "B"))

df%>%ggplot(aes(x, y, fill = z)) + 
  geom_col()

Notez que j’utilise geom_col(), qui crée des colonnes. Cela nous permet de définir y comme des valeurs autres que le simple décompte - utile si nous essayons de représenter la valeur moyenne pour chaque groupe, par exemple.

Ce simple diagramme à barres empilées fonctionne assez bien - il vous permet de comparer les valeurs de A et B, car les groupes partagent une bordure à la limite supérieure ou inférieure du graphique. Pour la plupart des fins, cependant, une option un peu meilleure est le diagramme à barres séparées :

diamonds%>%ggplot(aes(cut, fill = clarity)) + 
  geom_bar(position = "dodge")

Les diagrammes à barres séparées sont meilleurs que les barres empilées lors de la comparaison de plus d’une valeur pour chaque élément sur l’axe x d’un graphique. Cependant, avec suffisamment de séries, les diagrammes à barres séparées peuvent également être assez déroutants - essayez de comparer les valeurs I1 entre Premium et Fair sur ce graphique, par exemple.

Jittered points

Si vous devez avoir autant d’informations dans un seul graphique, geom_jitter peut vous aider. Il génère un nuage de points, tout comme geom_point(), mais “jitter” les points en ajoutant du bruit statistique - ce qui facilite la comparaison des décomptes entre toutes les combinaisons des deux variables.

diamonds%>%ggplot(aes(cut, clarity)) + 
  geom_jitter(alpha = 0.05)

Vous pouvez utiliser geom_jitter pour créer des nuages de points réguliers également - par exemple, nous pouvons voir plus de points dans notre nuage de points iris d’origine en ajoutant un peu de bruit au graphique :

iris%>%ggplot(aes(Sepal.Length, Sepal.Width, color = Species)) + 
  geom_jitter() + 
  scale_color_manual(values = c("purple",
                                "black",
                                "orange"))

Notez que cela déplace réellement l’emplacement de vos points sur le graphique - si c’est important qu’un lecteur puisse extraire des valeurs réelles de votre graphique, ne “jitter” pas vos points ! Cela étant dit, dans la plupart des cas où un lecteur a besoin de nombres spécifiques à partir de votre ensemble de données, un tableau est généralement mieux adapté à vos besoins.

Boîte à moustaches

Le dernier type de graphique principal que nous aborderons est la boîte à moustaches. Celle-ci est principalement utilisée pour montrer la distribution des données - elle dessine un graphique avec une ligne à la médiane des données, des bordures de boîte aux valeurs de 25% et 75%, et des lignes atteignant les valeurs de 5% et 95%.

diamonds%>%ggplot(aes(cut, price)) + 
  geom_boxplot()

Il y a beaucoup d’autres choses que vous pouvez faire avec ggplot que nous n’aborderons pas ici - vous pouvez trouver des aides-mémoire sur le package ici, et lire plus de documentation ici.

Notez que vous ne pouvez pas créer de graphiques circulaires avec ggplot. En général, vous ne devriez de toute façon pas utiliser de graphique circulaire.

Enregistrez vos graphiques

Lorsque vous êtes satisfait de votre graphique, appelez simplement la fonction ggsave() pour l’enregistrer dans le fichier avec lequel vous travaillez. Le premier argument de cette fonction doit être le nom de fichier souhaité pour votre graphique, avec l’extension - ggplot peut enregistrer des graphiques au format png, jpeg, pdf et plusieurs autres formats. Vous pouvez l’ajouter à votre flux de travail avec +, ou l’appeler après avoir tracé votre graphique - ggsave() enregistrera l’image qui a été dessinée en dernier. Pour plus d’informations sur les choses spécifiques que ggsave peut faire, tapez ?ggsave() dans R.

Séance d’exercices d’application de DataViz avec les données mtcars

  1. Histogramme de la Consommation de Carburant : Créez un histogramme pour visualiser la distribution de la consommation de carburant (mpg). Identifiez la gamme de consommation la plus commune. Ensuite, convertissez les valeurs de consommation de carburant de miles par gallon (mpg) en litres aux 100 kilomètres, l’unité de mesure couramment utilisée en France, et créez un histogramme avec cette échelle de consommation ajustée. Cet exercice vous permettra de comparer la consommation de carburant dans des unités familières à celles utilisées dans de nombreux pays, y compris la France.

  2. Diagramme à Barres Empilées par Nombre de Cylindres et Type de Transmission : Faites un diagramme à barres empilées pour montrer le nombre total de voitures par nombre de cylindres (cyl), avec des couleurs différentes pour distinguer les types de transmission (automatique am = 0, manuelle am = 1).

  3. Boîtes à Moustaches du Poids par Nombre de Cylindres : Créez des boîtes à moustaches pour comparer la distribution du poids (wt) des voitures, organisées par nombre de cylindres (cyl). Analysez les variations du poids en fonction du nombre de cylindres.

  4. Scatter Plot Puissance vs. Consommation avec Distinction par Type de Transmission : Visualisez la relation entre la puissance (hp) et la consommation de carburant (mpg), en utilisant la couleur pour différencier les transmissions manuelles (am = 1) des automatiques (am = 0). Examinez comment la puissance affecte la consommation et notez les différences entre les types de transmission.

  5. Droites de Régression par Type de Transmission sur Scatter Plot : Pour le scatter plot créé précédemment, ajoutez une droite de régression pour chaque type de transmission (manuelle et automatique), pour mieux visualiser la relation entre puissance et consommation de carburant. Discutez de ce que les pentes des droites de régression révèlent sur cette relation pour chaque type de transmission.

  • Titres et Labels : Chaque graphique doit inclure un titre explicatif et des labels clairs pour les axes.

  • Utilisation des Couleurs : Quand des couleurs sont utilisées pour distinguer des groupes ou catégories, assurez-vous d’inclure une légende claire.

  • Analyse : Pensez à ce que chaque visualisation révèle sur les données. Soyez prêt à discuter de vos observations.

Question Bonus : Utilisation de StarGazer

Créez un Tableau de Résultats de Régression avec StarGazer : Après avoir analysé la relation entre la puissance (hp) et la consommation de carburant (mpg) à travers des régressions linéaires distinctes par type de transmission, utilisez le package stargazer pour présenter les résultats de vos modèles de régression dans un tableau formaté. Explorez le package stargazer pour découvrir comment générer et personnaliser votre tableau de résultats.

  • Package : stargazer
  • Objectif : Génération de tableaux de résultats de régression
  • Ressources : Consultez la documentation de stargazer pour apprendre à utiliser ses fonctionnalités.