Come si legge un boxplot
Un boxplot comprime un'intera distribuzione in cinque numeri e li disegna come un unico simbolo compatto. Per imparare a leggerlo bastano trenta secondi, quindi partiamo da qui: ogni elemento ha un significato preciso.
- La linea spessa dentro la scatola è la mediana: metà dei dati sta sotto, metà sopra.
- La scatola copre lo scarto interquartile (IQR), dal primo quartile (25% dei dati sotto) al terzo quartile (75% sotto). La metà centrale dei tuoi dati vive dentro la scatola.
- I baffi sono le linee che partono dalla scatola. Ognuno arriva fino al dato più estremo che resta entro 1.5 × IQR dal bordo della scatola: coprono quindi "l'intervallo ordinario" dei dati, non l'intervallo completo.
- I punti singoli oltre i baffi sono valori a più di 1.5 × IQR dalla scatola: segnalati come possibili outlier, disegnati uno per uno così puoi contarli.
Una scatola alta indica dati molto dispersi; una linea della mediana non centrata nella scatola indica asimmetria; una scia di punti oltre un baffo indica una coda pesante da quel lato. Un istogramma mostra la stessa distribuzione con più dettaglio, ma il superpotere del boxplot è che una dozzina di scatole stanno una accanto all'altra, e questo lo rende il grafico per confrontare gruppi.
Boxplot di una sola variabile
La funzione è boxplot() e, per un singolo vettore numerico, basta una chiamata:
scores <- c(52, 55, 58, 60, 61, 63, 64, 66, 68, 70, 72, 95)
boxplot(scores,
main = "Test scores",
ylab = "Score")
Il disegno che ottieni: una scatola da 59 a 69 con la linea della mediana a 63.5, baffi che scendono fino a 52 e salgono fino a 72, e un punto solitario a 95, l'outlier che un riepilogo con media e deviazione standard avrebbe assorbito in silenzio. Quel colpo d'occhio che dice "questo valore non è come gli altri" è lo scopo del boxplot.
(Come in tutte le pagine di questo capitolo, le chiamate grafiche sono frammenti statici: l'esecutore qui sotto mostra solo output testuale. Eseguile in locale per vedere il disegno.)
Confrontare gruppi: l'interfaccia a formula
L'uso reale di tutti i giorni è una scatola per gruppo, e per questo boxplot() accetta una formula: y ~ group, da leggere come "y suddiviso per gruppo". Il dataset integrato di R ToothGrowth, la lunghezza dei denti di 60 porcellini d'India che hanno ricevuto vitamina C tramite succo d'arancia (OJ) o acido ascorbico (VC), è la demo classica:
boxplot(len ~ supp,
data = ToothGrowth,
main = "Tooth growth by supplement",
xlab = "Supplement",
ylab = "Tooth length")
Compaiono due scatole su una scala verticale comune: la scatola OJ sta visibilmente più in alto della scatola VC, con la mediana intorno a 22 contro circa 19. Siccome entrambe condividono lo stesso asse, il confronto è onesto per costruzione: nessun rischio di due grafici con scale diverse che favoriscono un gruppo. La colonna di raggruppamento dovrebbe essere un factor (o un vettore character); ogni livello diventa una scatola.
Le formule si possono anche combinare: boxplot(len ~ supp * dose, data = ToothGrowth) disegna sei scatole, una per ogni combinazione di integratore e dose. Quando una differenza tra gruppi sembra reale nelle scatole, la domanda successiva naturale, cioè se sia più che rumore, è quella a cui risponde un t-test.
Etichette, colori e boxplot orizzontali
Gli argomenti di stile seguono le convenzioni dei grafici base. names etichetta le scatole, col le riempie: passa un vettore per colorare ogni gruppo in modo diverso:
boxplot(len ~ supp,
data = ToothGrowth,
names = c("Orange juice", "Ascorbic acid"),
col = c("orange", "lightblue"),
main = "Tooth growth by supplement",
ylab = "Tooth length")
Altre due opzioni si guadagnano il posto:
horizontal = TRUEruota tutto il grafico così le scatole corrono lungo l'asse orizzontale. Fallo ogni volta che i nomi dei gruppi sono lunghi: le etichette orizzontali restano leggibili dove quelle verticali si scontrerebbero.notch = TRUEintaglia una tacca attorno a ogni mediana; quando le tacche di due gruppi non si sovrappongono, è plausibile che le mediane siano diverse. Consideralo un indizio visivo, non un test.
I numeri dietro la scatola
Tutto ciò che il grafico disegna viene da numeri che puoi stampare. quantile() dà il riepilogo a cinque numeri e boxplot.stats() ti dà esattamente ciò che usa il grafico, outlier compresi. Questo puoi eseguirlo proprio qui:
Nota che i due sono cugini, non gemelli: quantile() riporta il vero minimo e il vero massimo, mentre s$stats si ferma ai baffi, i punti più estremi entro la soglia di 1.5 × IQR. La differenza tra i due è precisamente s$out, qui il solitario 95. Quando qualcuno chiede "quali righe sono quei punti outlier?", ci risponde x[x %in% boxplot.stats(x)$out], oppure un filtro sui valori soglia.
Boxplot con ggplot2
In ggplot2 il raggruppamento va nella mappatura estetica invece che in una formula:
library(ggplot2)
ggplot(ToothGrowth, aes(x = supp, y = len, fill = supp)) +
geom_boxplot() +
labs(title = "Tooth growth by supplement",
x = "Supplement", y = "Tooth length")
Le stesse due scatole, con legenda e tema inclusi. La versione ggplot2 scala meglio quando il grafico cresce: dividi in pannelli per dose, sovrapponi i punti grezzi con geom_jitter(width = 0.1), e il codice resta dichiarativo. Per un confronto veloce durante l'analisi, boxplot(y ~ g, data = df) resta la cosa più rapida da scrivere.
Cosa ti porti a casa
- Anatomia della scatola: linea della mediana, scatola = IQR, baffi = punti più estremi entro 1.5 × IQR, punti oltre = possibili outlier.
boxplot(x)per una variabile;boxplot(y ~ group, data = df)per confrontare gruppi affiancati su un'unica scala comune e onesta.- Personalizza con
names, un vettorecolper gruppo ehorizontal = TRUEquando le etichette sono lunghe. boxplot.stats(x)$statse$outsono il grafico in forma di numeri: usali per estrarre gli outlier che il grafico indica.- ggplot2:
geom_boxplot()con il gruppo associato axo afill.
Prossimo passo: il grafico a dispersione, dalla distribuzione di una variabile alla relazione tra due.
Domande frequenti
Come si crea un boxplot in R?
Chiama boxplot(x) su un vettore numerico per una sola scatola, oppure usa l'interfaccia a formula boxplot(y ~ group, data = df) per avere una scatola per gruppo, affiancate. Entrambe fanno parte di R base, senza bisogno di pacchetti.
Cosa significano le parti di un boxplot?
La linea spessa dentro la scatola è la mediana. La scatola copre lo scarto interquartile, dal primo al terzo quartile. I baffi arrivano fino ai dati più estremi che restano entro 1.5 volte l'IQR dalla scatola, e tutto ciò che sta oltre i baffi viene disegnato come punto singolo: un possibile outlier.
Come si crea un boxplot per gruppi in R?
Usa una formula: boxplot(len ~ supp, data = ToothGrowth) disegna una scatola per ogni livello di supp. La variabile di raggruppamento dovrebbe essere una colonna factor o character; ogni livello diventa una scatola su una scala comune.
Come si trovano gli outlier mostrati da un boxplot?
boxplot.stats(x)$out restituisce esattamente i valori che il grafico disegnerebbe come punti oltre i baffi, e boxplot.stats(x)$stats dà i cinque numeri dietro la scatola: estremi dei baffi, cardini e mediana.