boxplot() in R: come realizzare BoxGrafici in RStudio

⚡ Riepilogo intelligente

BoxIn R, la funzione `plot` riassume una distribuzione numerica attraverso la mediana, i quartili, i baffi e i valori anomali, utilizzando la funzione `geom_boxplot()` di ggplot2. Questa guida illustra come creare un box plot sul dataset relativo alla qualità dell'aria, sovrapponendo colori, punti, jitter, tacche e confronti tra gruppi.

  • 📐 Riepilogo in cinque punti: Il riquadro si estende dal primo al terzo quartile, la linea indica la mediana e i baffi raggiungono 1.5 volte l'intervallo interquartile.
  • 🧱 Sintassi di base: ggplot(df, aes(x = gruppo, y = valore)) + geom_boxplot() produce una scatola per ogni livello del gruppoping fattore.
  • 🔴 Stile anomale: outlier.colour, outlier.shape e outlier.size controllano il modo in cui vengono disegnati i punti al di fuori dei baffi.
  • 💠 Visualizzazione delle osservazioni: geom_jitter() sposta la sovrapposizioneping puntano lateralmente, rivelando la dimensione del campione dietro ogni riquadro.
  • 📉 dentellato Boxè: notch = TRUE disegna l'intervallo di confidenza della mediana e non sovrapposizioneping Le tacche indicano una differenza reale.
  • 🎨 Grouping: Mappaping La funzione `fill inside geom_boxplot()` suddivide ciascuna categoria in diverse caselle affiancate.

Boxgrafico in R

boxplot() in R

boxplot() in R aiuta a visualizzare la distribuzione dei dati per quartile e a rilevare la presenza di valori anomali. Puoi usare l'oggetto geometrico geom_boxplot() dalla libreria ggplot2 per disegnare un boxplot() in R.

Utilizzeremo il dataset sulla qualità dell'aria per introdurre la funzione boxplot() in R con ggplot. Il dataset registra le misurazioni giornaliere della qualità dell'aria a New York da maggio a settembre 1973 e contiene 153 osservazioni. Utilizzeremo le seguenti variabili:

  • Ozono: variabile numerica
  • Vento: variabile numerica
  • Mese: da maggio a settembre. Variabile numerica

Prima di disegnarne uno, è utile sapere esattamente cosa rappresenta ogni parte del riquadro.

Come leggere a Box Grafico: Quartili, IQR e valori anomali

Ogni elemento di un diagramma a scatola codifica un numero tratto dal riepilogo a cinque numeri. Sapere a quale numero corrisponde ciascun elemento trasforma il grafico da semplice elemento decorativo a strumento di analisi.

  • Cerniera inferiore: il primo quartile, Q1. Il venticinque percento delle osservazioni si trova al di sotto di esso.
  • Linea mediana: il secondo quartile. La sua posizione all'interno del riquadro rivela l'asimmetria: una linea spinta verso il basso significa che i dati sono asimmetrici a destra.
  • Cerniera superiore: il terzo quartile, Q3. Il settantacinque percento delle osservazioni si trova al di sotto di esso.
  • Box Altezza: l'intervallo interquartile, IQR = Q3 – Q1, che contiene la metà centrale dei dati ed è la misura standard robusta della dispersione.
  • Basettoni: Si estendono fino all'osservazione più estrema, rimanendo comunque entro 1.5 volte l'IQR della cerniera più vicina. Non rappresentano il minimo e il massimo.
  • Punti che vanno oltre i baffi: osservazioni segnalate come valori anomali da quella regola dell'IQR di 1.5.

Due avvertenze. In primo luogo, un "valore anomalo" in questo caso è un segnale statistico, non un errore: in una distribuzione asimmetrica come quella della concentrazione di ozono, i valori elevati sono prevedibili e non dovrebbero essere eliminati. In secondo luogo, un box plot nasconde la forma della distribuzione, quindi due gruppi con box identici possono avere dati sottostanti molto diversi. L'aggiunta di punti con dispersione, come mostrato di seguito, previene questo problema.

Box Grafico vs Istogramma vs Grafico a violino in R

Tutti e tre i grafici descrivono una distribuzione numerica, ma ognuno rivela qualcosa che gli altri nascondono.

Criteri Box Terreno Istogramma Trama del violino
Spettacoli Mediana, quartili, valori anomali Frequenza in ciascun intervallo Curva di densità completa
Revpicchi multipli Non Si Si
Segnala i valori anomali Sì, esplicitamente Solo visivamente Non direttamente
Confronto di molti gruppi Ottimo Scomodo Buone
Richiede una scelta di accordatura Non Sì, conteggio dei bidoni Sì, larghezza di banda
oggetto ggplot2 geom_boxplot() geom_histogram() geom_violin()

Un compromesso comune è quello di disegnare un grafico a violino con un box plot stretto al suo interno, che mantiene la forma della densità e il riepilogo dei quartili in un unico grafico. Vedi il tutorial sull'istogramma per quanto riguarda il lato del confronto relativo alla suddivisione in contenitori.

Crea Box Terreno

Prima di iniziare a creare il tuo primo boxplot() in R, devi manipolare i dati come segue:

  • Passaggio 1: importa i dati
  • Passaggio 2: eliminare le variabili non necessarie
  • Passaggio 3: Convertire il mese in un fattore ordinato
  • Passaggio 4: Crea una nuova variabile categoriale che suddivida ogni mese in tre parti: Inizio, Metà e Fine
  • Passaggio 5: rimuovere le osservazioni mancanti

Tutti questi passaggi vengono eseguiti con dplyr e l'operatore pipeline %>%.

library(dplyr)
library(ggplot2)
# Step 1
data_air <- airquality %>%

#Step 2
select(-c(Solar.R, Temp)) %>%

#Step 3
mutate(Month = factor(Month, order = TRUE, labels = c("May", "June", "July", "August", "September")), 
       
#Step 4 
day_cat = factor(ifelse(Day < 10, "Begin", ifelse(Day < 20, "Middle", "End"))))

Una buona pratica è verificare la struttura dei dati con la funzione scorce().

glimpse(data_air)

Produzione:

## Observations: 153
## Variables: 5
## $ Ozone   <int> 41, 36, 12, 18, NA, 28, 23, 19, 8, NA, 7, 16, 11, 14, ...
## $ Wind    <dbl> 7.4, 8.0, 12.6, 11.5, 14.3, 14.9, 8.6, 13.8, 20.1, 8.6...
## $ Month   <ord> May, May, May, May, May, May, May, May, May, May, May,...
## $ Day     <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,...
## $ day_cat <fctr> Begin, Begin, Begin, Begin, Begin, Begin, Begin, Begi...

Sia Ozone che Solar.R contengono valori NA. Poiché geom_boxplot() li ignorerebbe silenziosamente e visualizzerebbe un avviso, è più pulito rimuoverli esplicitamente.

# Step 5
data_air_nona <-data_air %>% na.omit()	

Box plot di base

Ora tracciamo la distribuzione dell'ozono per mese.

# Store the graph
box_plot <- ggplot(data_air_nona, aes(x = Month, y = Ozone))
# Add the geometric object box plot
box_plot +
    geom_boxplot()

Code Spiegazione

  • Memorizzare il grafico per un ulteriore utilizzo
    • box_plot: il grafico di base è memorizzato nell'oggetto box_plot, che consente di aggiungere livelli in seguito senza ripetere l'intera chiamata
  • Aggiungi l'oggetto geometrico
    • Si passa il set di dati data_air_nona a ggplot boxplot.
    • All'interno dell'argomento aes() aggiungi l'asse x e l'asse y.
    • Il segno + significa che vuoi che R continui a leggere il codice. Rende il codice più leggibile rompendolo.
    • Utilizzare geom_boxplot() per creare un box plot

Produzione:

Basic Box Terreno

Cambia lato del grafico

Puoi capovolgere il lato del grafico.

box_plot +
  geom_boxplot()+
  coord_flip()

Code Spiegazione

  • box_plot: Utilizzi il grafico che hai memorizzato. Evita di riscrivere tutti i codici ogni volta che aggiungi nuove informazioni al grafico.
  • geom_boxplot(): disegna le scatole e i baffi
  • coord_flip(): capovolge il lato del grafico

Produzione:

Cambia lato del grafico

Cambia il colore del valore anomalo

È possibile modificare il colore, la forma e la dimensione dei valori anomali.

box_plot +
    geom_boxplot(outlier.colour = "red",
        outlier.shape = 2,
        outlier.size = 3) +
    theme_classic()

Code Spiegazione

  • outlier.color="red": controlla il colore dei valori anomali
  • outlier.shape=2: modifica la forma dell'outlier. 2 si riferisce al triangolo
  • outlier.size=3: Modifica la dimensione del triangolo. Numeri più grandi disegnano marcatori più grandi.

Produzione:

Cambia colore del valore anomalo

Aggiungi una statistica riassuntiva

È possibile sovrapporre una statistica riassuntiva, come la media del gruppo, che il diagramma a scatola non mostra.

box_plot +
    geom_boxplot() +
    stat_summary(fun.y = mean,
        geom = "point",
        size = 3,
        color = "steelblue") +
    theme_classic()

Code Spiegazione

  • La funzione stat_summary() aggiunge una statistica calcolata sopra il diagramma a scatola.
  • L'argomento `fun` controlla quale statistica viene restituita. In questo caso, si tratta della media. Si noti che il codice precedente utilizzava `fun.y`, che ggplot2 ha deprecato nella versione 3.3.0.
  • Nota: sono disponibili altre statistiche, ad esempio min e max. È possibile visualizzare più statistiche nello stesso grafico
  • geom = “punto”: traccia la media con un punto
  • size=3: dimensione del punto
  • color =”steelblue”: Colore dei punti

Produzione:

Aggiungi una statistica riassuntiva

Box Traccia con punti

Successivamente, aggiungi un livello di grafico a punti sopra i riquadri. Ogni punto rappresenta una singola osservazione, rendendo visibile la dimensione del campione dietro ogni riquadro.

box_plot +
    geom_boxplot() +
    geom_dotplot(binaxis = 'y',
        dotsize = 1,
        stackdir = 'center') +
    theme_classic()

Code Spiegazione

  • geom_dotplot() disegna un punto per ogni osservazione, impilato all'interno di ogni bin
  • binaxis='y': cambia la posizione dei punti lungo l'asse y. Per impostazione predefinita, asse x
  • dotsize=1: dimensione dei punti
  • stackdir='center': modo di impilare i punti: quattro valori:
    • “su” (predefinito),
    • "giù"
    • "centro"
    • “centrointero”

Produzione:

Box Traccia con punti

Controllo Estetico del Box Terreno

Cambia il colore della scatola

Puoi cambiare i colori del gruppo.

ggplot(data_air_nona, aes(x = Month, y = Ozone, color = Month)) +
    geom_boxplot() +
    theme_classic()

Code Spiegazione

  • I colori dei gruppi sono controllati nella mappa aes()pingÈ possibile utilizzare color=Month per cambiare il colore del box plot e del diagramma a baffi in base ai mesi

Produzione:

Cambia il colore del Box

Box trama con più gruppi

È anche possibile aggiungere più gruppi. È possibile visualizzare la differenza della qualità dell'aria in base al giorno della misurazione.

ggplot(data_air_nona, aes(Month, Ozone)) +
    geom_boxplot(aes(fill = day_cat)) +
    theme_classic()

Code Spiegazione

  • La mappa aes()ping l'oggetto geometrico controlla i gruppi da visualizzare (questa variabile deve essere un fattore)
  • aes(fill= day_cat) consente di creare tre caselle per ogni mese sull'asse x

Produzione:

Box Tracciare con più gruppi

Box Tracciare con punti tremolanti

Un altro modo per mostrare le singole osservazioni è tramite punti con jittering. Il jittering è la scelta usuale quando un asse x categorico fa sì che molti punti si trovino nella stessa posizione.

Questo metodo evita la sovrapposizioneping dei dati discreti.

box_plot +
    geom_boxplot() +
    geom_jitter(shape = 15,
        color = "steelblue",
        position = position_jitter(width = 0.21)) +
    theme_classic()

Code Spiegazione

  • geom_jitter() aggiunge un piccolo spostamento casuale a ciascun punto in modo che si sovrappongaping I valori diventano visibili.
  • shape=15 cambia la forma dei punti. 15 rappresenta i quadrati
  • color = “steelblue”: cambia il colore del punto
  • position = position_jitter(width = 0.21): controlla di quanto vengono spostati lateralmente i punti, misurato in unità dell'asse x. Il valore predefinito è il 40% della spaziatura tra le categorie.

Produzione:

Box Tracciare con punti tremolanti

Puoi vedere la differenza tra il primo grafico con il metodo jitter e il secondo con il metodo point.

box_plot +
    geom_boxplot() +
    geom_point(shape = 5,
        color = "steelblue") +
    theme_classic()

Box Tracciare con punti tremolanti

dentellato Box Terreno

Una caratteristica interessante di geom_boxplot() è una funzione boxplot a tacche in R. Il grafico a tacche restringe la scatola attorno alla mediana. Lo scopo principale di un grafico a tacche è confrontare la significatività della mediana tra i gruppi. Ci sono forti prove che due gruppi hanno mediane diverse quando le tacche non si sovrappongono. Una tacca viene calcolata come segue:

dentellato Box Terreno

Qui IQR rappresenta l'intervallo interquartile e n è il numero di osservazioni nel gruppo. L'incavo copre approssimativamente l'intervallo di confidenza del 95% della mediana.

box_plot +
    geom_boxplot(notch = TRUE) +
    theme_classic()

Code Spiegazione

  • geom_boxplot(notch = TRUE): disegna il box plot con le tacche attorno alla mediana

Produzione:

dentellato Box Terreno

Come aggiungere titoli, etichette e colori personalizzati a un Box Tracciare in R

I grafici sopra riportati utilizzano le impostazioni predefinite di ggplot2, che prendono i nomi delle variabili direttamente dal dataframe. Un grafico pubblicabile necessita di etichette leggibili e di una palette di colori ben definita.

Titoli ed etichette degli assi. Una chiamata a labs() imposta ogni elemento di testo:

box_plot +
    geom_boxplot(fill = "coral", alpha = 0.7) +
    labs(title = "Ozone concentration by month",
        subtitle = "New York, May to September 1973",
        x = "Month",
        y = "Ozone (parts per billion)",
        caption = "Source: airquality dataset") +
    theme_classic()

Scegliere i propri colori. Utilizzare scale_fill_manual() quando il riempimento è mappato all'interno di aes() e scale_colour_manual() quando il colore è:

ggplot(data_air_nona, aes(x = Month, y = Ozone, fill = Month)) +
    geom_boxplot() +
    scale_fill_manual(values = c("#0e9cd1", "coral", "#7dc27d", "#c9a227", "grey60")) +
    theme_classic() +
    theme(legend.position = "none")

La legenda è disattivata in questo caso perché l'asse x riporta già i nomi di ciascun mese, quindi ripeterli comporterebbe uno spreco di spazio.

Riordino le scatole. I livelli del fattore determinano l'ordine sull'asse. Poiché il mese è stato creato come fattore ordinato, la visualizzazione è già cronologica. Per un fattore non ordinato, si procede invece all'ordinamento in base alla mediana:

ggplot(data_air_nona, aes(x = reorder(Month, Ozone, FUN = median), y = Ozone)) +
    geom_boxplot() +
    theme_classic()

Salvataggio del grafico. La funzione ggsave() salva l'ultimo grafico su disco a una risoluzione da te controllata:

ggsave("ozone_boxplot.png", width = 8, height = 5, dpi = 300)

Box Traccia in R: Code Referenze

La tabella seguente elenca la chiamata a ggplot2 per ciascuna variante di box plot descritta in precedenza:

Obiettivo Code
Box plot di base
ggplot(df, aes(x = x1, y = y)) + geom_boxplot()
Inverti l'orientamento
ggplot(df, aes(x = x1, y = y)) + geom_boxplot() + coord_flip()
Box plot con tacche
ggplot(df, aes(x = x1, y = y)) + geom_boxplot(notch = TRUE)
Box trama con punti tremolanti
ggplot(df, aes(x = x1, y = y)) + geom_boxplot() + geom_jitter(position = position_jitter(0.21))
Colorare per gruppo
ggplot(df, aes(x = x1, y = y, color = x1)) + geom_boxplot()
Gruppi multipli per categoria
ggplot(df, aes(x = x1, y = y)) + geom_boxplot(aes(fill = x2))
Aggiungere la media del gruppo
ggplot(df, aes(x = x1, y = y)) + geom_boxplot() + stat_summary(fun = mean, geom = "point")

Controlla anche: - Tutorial R per principianti: impara il linguaggio di programmazione R

DOMANDE FREQUENTI

I baffi raggiungono l'osservazione più estrema che si trova entro 1.5 volte l'intervallo interquartile del quartile più vicino. Non rappresentano il minimo e il massimo, e qualsiasi valore al di fuori di essi viene disegnato come un punto anomalo.

Non automaticamente. La regola dell'IQR di 1.5 è una convenzione, non una prova di errore. Esamina prima ogni punto: dati distorti come le letture dell'ozono producono naturalmente valori elevati che sono misurazioni reali.

sovrapposizioneping Le tacche suggeriscono che non vi sono prove concrete che le due mediane differiscano. Non sovrapposizioneping Le tacche indicano una probabile differenza reale, approssimativamente equivalente a un confronto con un livello di confidenza del 95%.

Box I grafici sono una fase esplorativa standard prima dell'addestramento: mettono in evidenza asimmetrie, valori anomali e diverse scale delle caratteristiche tra le classi. I team li utilizzano anche per confrontare l'accuratezza del modello tra le diverse iterazioni della convalida incrociata.

Sì. Gli assistenti IA possono spiegare errori come un asse x continuo che produce un singolo riquadro, suggerire la mappa aes() correttapinge segnala gli argomenti obsoleti come fun.y. Esegui sempre nuovamente il codice corretto sui tuoi dati.

Riassumi questo post con: