Accéder au contenu principal

Cartes de chaleur de distributions bivariées en R

Apprenez à visualiser la relation entre deux variables, leur interaction et les zones de concentration des points de données.
Actualisé 19 sept. 2026  · 6 min lire

Explorer avec l’IA

ChatGPTClaudePerplexity

En tant que data scientist, vous devrez analyser la distribution des variables de votre jeu de données. En général, on utilise des histogrammes : c’est très utile pour visualiser l’étendue des valeurs, leur dispersion et les zones de concentration.

Ce tutoriel utilise R. Si vous ne maîtrisez pas encore R, nous vous recommandons notre cours gratuit Introduction to R sur DataCamp.

Jeu de données Bike Sharing

Pour ce tutoriel, vous allez utiliser le jeu de données Bike Sharing Demand issu d’une compétition Kaggle.

Suivez le lien, ouvrez l’onglet Data, puis téléchargez le fichier train.csv.

données bike sharing

Chargez le jeu de données dans R.

library(dplyr)
bike<- read.csv("train.csv",
                na.strings = FALSE,
                strip.white = TRUE)
glimpse(bike)

Variables du jeu de données

Variable Description
datetime date + horodatage à l’heure
season 1 = printemps
2 = été
3 = automne
4 = hiver
holiday indique si le jour est férié
workingday indique si le jour n’est ni un week-end ni un jour férié
weather 1 : Dégagé, Quelques nuages, Partiellement nuageux
2 : Brume + Nuageux, Brume + Éclaircies, Brume + Quelques nuages, Brume
3 : Neige faible, Pluie faible + Orage + Éclaircies, Pluie faible + Éclaircies
4 : Pluie forte + Grésil + Orage + Brume, Neige + Brouillard
temp température en °C
atemp température « ressentie » en °C
humidity humidité relative
windspeed vitesse du vent
casual nombre de locations initiées par des utilisateurs non enregistrés
registered nombre de locations initiées par des utilisateurs enregistrés
count nombre total de locations

Sélection des variables

Vous allez analyser la relation entre atemp et humidity selon la season. Sélectionnez donc ces colonnes dans le jeu de données. N’oubliez pas de charger le package dplyr.

bike_data<-
  bike %>%  
  dplyr::select(season, atemp, humidity)
head(bike_data)

Histogrammes

Vous pouvez maintenant commencer l’analyse. Commencez par créer un histogramme pour chacune des variables, par saison. Nous allons utiliser la librairie ggplot2 : n’oubliez pas de la charger.

Histogramme de l’humidité

library(ggplot2)
bike_data %>%
  ggplot( aes(x=humidity) ) +
  geom_histogram(bins=30) +
  facet_wrap(~season,ncol = 2)

histogrammes

Avec l’histogramme, on voit qu’il y a davantage d’humidité en hiver (ce qui est logique), et l’on perçoit la distribution pour chaque saison.

Ajoutez maintenant la densité, un « rug » de densité et renommez les facettes, pour une visualisation plus soignée.

bike_data %>%
  mutate(season_label = case_when(
    season == 1 ~ "Spring",
    season == 2 ~ "Summer",
    season == 3 ~ "fall",
    season == 4 ~ "winter")) %>%
  ggplot( aes(x=humidity) ) +
  geom_histogram(bins=30,aes(y = ..density..)) +
  geom_rug()+
  geom_density()+
  facet_wrap(~season_label,ncol = 2)+
  ggtitle("Histogram of humidity by season")

histogramme de l’humidité par saison

Vous avez maintenant une meilleure idée du comportement de l’humidité. Faites la même chose avec atemp.

Histogramme d’atemp

Réutilisez le code ci-dessus en remplaçant la variable par atemp,

bike_data %>%
  mutate(season_label = case_when(
    season == 1 ~ "Spring",
    season == 2 ~ "Summer",
    season == 3 ~ "fall",
    season == 4 ~ "winter")) %>%
  ggplot( aes(x=atemp) ) +
  geom_histogram(bins=30,aes(y = ..density..)) +
  geom_rug()+
  geom_density()+
  facet_wrap(~season_label,ncol = 2)+
  ggtitle("Histogram of atemp by season")
Histogramme d’atemp par saisonhistogramme d’atemp par saison

Jusqu’ici, tout se passe comme prévu pour chaque saison. Sur chaque graphique, vous disposez d’une approximation de la fonction de densité de probabilité.

Mais avec ces graphiques, il reste difficile de visualiser l’interaction entre les variables. Première difficulté : il vous faudrait un histogramme en 3D, puisque vous cherchez la fonction de distribution de deux variables.

Ajuster une distribution bivariée à vos données

L’objectif est de visualiser la distribution bivariée. Pour cela, vous devez d’abord l’ajuster aux données. Nous allons utiliser la librairie MASS et la fonction kde2d. Cette fonction estime la distribution bivariée en supposant la normalité des variables aléatoires. Ses entrées sont les suivantes :

entrée description
x coordonnées x
y coordonnées y
n nombre de points de grille par axe
lims bornes pour x et y

Appliquez-la maintenant au jeu de données en filtrant l’été,

library(MASS)
bike_data_summer <- bike_data %>% filter(season==1)
bike_density <- kde2d(bike_data_summer$atemp,bike_data_summer$humidity, n=1000)

Remarque : Lors du chargement de MASS, un objet select est défini, ce qui peut entrer en conflit avec la fonction select de dplyr. Pour éviter cela, lorsque vous utilisez la fonction de dplyr, préfixez-la par dplyr:: comme ceci : dplyr::select().

Examinez maintenant la classe et la structure de bike_density

class(bike_density)
str(bike_density)

Il s’agit d’une liste contenant 3 éléments : x, y et z. Les deux premiers portent les valeurs des variables, et le troisième est une matrice avec les valeurs de la densité (pdf). Visualisez la densité avec la fonction contour :

contour(bike_density)
text(12.2,92,"1",cex=1.5)
points(12.2,89,col="red",pch=18)
text(10.4,47,"2",cex=1.5)
points(10.4,43,col="red",pch=18)
text(21,45,"3",cex=1.5)
points(21,40,col="red",pch=18)
text(21.6,82,"4",cex=1.5)
points(21.6,78,col="red",pch=18)

graphique

À la lecture de ce graphique, vous identifiez des points d’accumulation, que l’on peut interpréter comme les valeurs les plus fréquentes pour la combinaison des deux variables. Les valeurs de chaque point sont résumées dans le tableau suivant :

point atemp (°C) humidité (%)
1 12.2 89
2 10.4 43
3 21 43
4 21.6 78

Carte de chaleur

Pour créer votre carte de chaleur, commencez par définir l’échelle de couleurs à utiliser, via la fonction colorRampPalette

hm_col_scale<-colorRampPalette(c("black","blue","green","orange","red"))(1000)

hm_col_scale est un vecteur allant du noir au rouge, en 1000 paliers RVB.

Tracez ensuite la carte de chaleur avec la fonction image, utilisée pour représenter des matrices.

image(bike_density$z,  
      col = hm_col_scale,
      zlim=c(min(bike_density$z), max(bike_density$z)))
text(0.31,0.46,"Most Frequent",col="blue",cex=0.8)
points(0.31,0.45,col="blue",pch=18)

carte de chaleur

Comme vous le voyez, cette représentation apporte plus d’information que le tracé de contours : la couleur indique l’intensité des points d’accumulation. Les valeurs les plus fréquentes d’humidité et d’atemp au printemps se situent autour du point (10,4 ; 43).

Conclusion

Vous savez désormais créer une carte de chaleur : à vous de jouer. Explorez les autres saisons et la relation avec d’autres variables.

Réfléchissez à la manière d’exploiter ces informations pour estimer le nombre de vélos à fournir selon les valeurs des variables, en gardant à l’esprit que les points les plus fréquents ont une probabilité plus élevée.

Pour aller plus loin dans la création de visualisations avec ggplot, découvrez notre cours Data Visualization with ggplot2.

Sujets
R
Science des données
Visualisation des données

En savoir plus sur R

Cours

Introduction à R

4 h
3.1M
Maîtrisez les bases de l’analyse de données en R et pratiquez les vecteurs, listes et data frames avec des données réelles.
Afficher les détailsRight Arrow
Commencer Le Cours
Voir plusRight Arrow