Vai al contenuto principale

Mappe di calore di distribuzioni bivariate in R

Impara a mostrare visivamente la relazione tra due variabili, come interagiscono tra loro e dove si concentrano i punti dati.
Aggiornato 29 set 2026  · 6 min leggi

Scopri con l'IA

ChatGPTClaudePerplexity

Come data scientist, dovrai analizzare la distribuzione delle variabili nel tuo dataset. Di solito si usano gli istogrammi: sono molto utili per mostrare l’intervallo di valori della variabile, la loro deviazione e dove si concentrano i valori.

Questo tutorial usa R. Se non hai ancora familiarità con R, ti consiglio il nostro corso gratuito Introduzione a R su DataCamp.

Dataset Bike Sharing

Per questo tutorial userai il Bike Sharing Demand Dataset da una competizione Kaggle.

Segui il link, vai alla scheda dei dati e scarica il file train.csv.

bike sharing data

Carica il dataset in R.

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

Caratteristiche del dataset

Variabile Descrizione
datetime data e ora a livello orario
season 1 = primavera
2 = estate
3 = autunno
4 = inverno
holiday se il giorno è considerato festivo
workingday se il giorno non è né weekend né festivo
weather 1: Sereno, Poche nuvole, Parzialmente nuvoloso, Parzialmente nuvoloso
2: Foschia + Nuvoloso, Foschia + Nubi sparse, Foschia + Poche nuvole, Foschia
3: Neve debole, Pioggia debole + Temporale + Nubi sparse, Pioggia debole + Nubi sparse
4: Pioggia forte + Grandine + Temporale + Foschia, Neve + Nebbia
temp temperatura in Celsius
atemp temperatura "percepita" in Celsius
humidity umidità relativa
windspeed velocità del vento
casual numero di noleggi avviati da utenti non registrati
registered numero di noleggi avviati da utenti registrati
count numero totale di noleggi

Selezione delle variabili

Analizzerai la relazione tra atemp e humidity per season, quindi selezionale dal dataset. Ricordati di caricare il pacchetto dplyr.

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

Istogrammi

Ok, ora sei prontə per iniziare ad analizzare i dati: comincia creando un istogramma per ognuna delle variabili per stagione. Userai la libreria ggplot2, quindi non dimenticare di caricarla.

Istogramma dell'umidità

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

istogrammi

Con l’istogramma puoi vedere che l’umidità è più alta in inverno (il che è ovvio), ma puoi anche farti un’idea di come è distribuita in ciascuna stagione.

Ora aggiungi la densità, un rug di densità e cambia i nomi dei facet, così da ottenere una visualizzazione più gradevole.

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")

istogramma dell'umidità per stagione

Adesso hai una percezione migliore di come si comporta l’umidità; fai lo stesso con atemp.

Istogramma di atemp

Riusa il codice sopra e cambia la variabile in 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")
Istogramma di atemp per stagioneistogramma di atemp per stagione

Fin qui tutto bene: tutto procede come ti aspetteresti per ciascuna stagione. In ogni grafico hai un’approssimazione della funzione di densità di probabilità.

Ma basandoti su questi grafici è difficile visualizzare come le variabili interagiscono tra loro. La prima difficoltà è che il tuo istogramma dovrebbe essere in 3D, perché stai cercando di trovare la funzione di distribuzione per due variabili.

Adattare una distribuzione bivariata ai tuoi dati

L’obiettivo è visualizzare la distribuzione bivariata; per farlo devi prima adattare una distribuzione bivariata ai dati. Lo farai usando la libreria MASS e la funzione kde2d. La funzione kde2d stimerà la distribuzione bivariata, assumendo la normalità delle variabili aleatorie. Gli input della funzione sono i seguenti,

input descrizione
x dati della coordinata x
y dati della coordinata y
n numero di punti della griglia per ciascun asse
lims limiti per x e y

Ora applicala al dataset filtrando per l’estate,

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

Nota: Quando carichi la libreria MASS, questa include una funzione select, che entra in conflitto con la funzione select di dplyr. Per risolvere, quando usi la select di dplyr devi anteporre dplyr::, ad esempio dplyr::select(), affinché funzioni correttamente.

Ora guarda la classe e la struttura di bike_density

class(bike_density)
str(bike_density)

È una lista con 3 valori x, y e z. I primi due contengono i valori delle variabili, il terzo è una matrice con i valori della pdf. Osserva la densità usando la funzione 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)

grafico

Guardando questo grafico puoi identificare alcuni punti di accumulo, che possono essere intesi come i valori più frequenti per la combinazione delle due variabili. I valori per ciascun punto sono riassunti nella seguente tabella,

punto atemp (°C) umidità (%)
1 12.2 89
2 10.4 43
3 21 43
4 21.6 78

Heatmap

Per creare la tua heatmap devi prima definire la scala di colori che vuoi usare; puoi farlo con la funzione colorRampPalette

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

hm_col_scale è un vettore che va dal nero al rosso usando codici RGB in 1000 passi.

Ora disegna la tua mappa di calore usando la funzione image, che si usa per rappresentare matrici.

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)

heatmap

Come vedi, questo grafico contiene più informazioni del contour plot, perché i colori indicano l’intensità del punto di accumulo. Puoi notare che i valori più frequenti di umidità e atemp durante la primavera sono intorno al punto $(10.4,43)$

Conclusione

Ora sai come creare una mappa di calore: tocca a te crearne una. Inizia guardando le altre stagioni e la relazione con le altre variabili.

Pensa a come potresti usare queste informazioni per capire quante bici devi mettere a disposizione per i diversi valori delle variabili, considerando che i punti più frequenti hanno una probabilità più alta.

Se vuoi approfondire la creazione di visualizzazioni con ggplot, dai un’occhiata al nostro corso Data Visualization with ggplot2.

Argomenti
R
Data Science
Data Visualization

Scopri di più su R

Corso

Introduzione a R

4 ore
3.1M
Impara le basi dell'analisi dei dati in R, compresi vettori, liste e data frame, e fai pratica con R con set di dati reali.
Vedi i dettagliRight Arrow
Inizia Il Corso
Mostra altroRight Arrow
Correlato

blog

Che cos'è Snowflake? Guida per principianti alla piattaforma dati cloud

Esplora le basi di Snowflake, la piattaforma dati cloud. Scopri la sua architettura, le sue funzionalità e come integrarla nelle tue pipeline di dati.
Tim Lu's photo

Tim Lu

12 min

blog

Tokenizzazione nel NLP: come funziona, sfide e casi d'uso

Guida al preprocessing NLP nel machine learning. Copriamo spaCy, i transformer di Hugging Face e come funziona la tokenizzazione in casi d'uso reali.
Abid Ali Awan's photo

Abid Ali Awan

10 min

blog

I 15 migliori server MCP remoti che ogni AI builder dovrebbe conoscere nel 2026

Scopri i 15 migliori server MCP remoti che stanno trasformando lo sviluppo AI nel 2026. Scopri come migliorano automazione, ragionamento, sicurezza e velocità dei workflow.
Abid Ali Awan's photo

Abid Ali Awan

15 min

Mostra AltroMostra Altro