Wie man einen Boxplot liest
Ein Boxplot komprimiert eine ganze Verteilung auf fünf Zahlen und zeichnet sie als ein kompaktes Zeichen. Es zu lesen zu lernen dauert dreißig Sekunden, also machen wir das zuerst - jedes Teil hat eine präzise Bedeutung:
- Die dicke Linie in der Box ist der Median: die Hälfte der Daten liegt darunter, die Hälfte darüber.
- Die Box selbst überspannt den Interquartilsabstand (IQR) - vom ersten Quartil (25 % der Daten darunter) bis zum dritten Quartil (75 % darunter). Die mittlere Hälfte deiner Daten lebt in der Box.
- Die Whisker sind die Linien, die aus der Box herausragen. Jeder reicht zum extremsten Datenpunkt, der noch innerhalb des 1,5-fachen IQR ab der Boxkante liegt - sie decken also "den gewöhnlichen Bereich" der Daten ab, nicht die volle Spannweite.
- Einzelne Punkte jenseits der Whisker sind Werte, die mehr als 1,5 × IQR von der Box entfernt liegen: als Ausreißerverdacht markiert, einzeln gezeichnet, damit du sie zählen kannst.
Eine hohe Box bedeutet gestreute Daten; eine Medianlinie außermittig in der Box bedeutet Schiefe; eine Spur von Punkten hinter einem Whisker bedeutet einen schweren Rand auf dieser Seite. Ein Histogramm zeigt dieselbe Verteilung detaillierter - aber die Superkraft des Boxplots ist, dass ein Dutzend davon nebeneinander passt, was ihn zu dem Diagramm für Gruppenvergleiche macht.
Ein Boxplot einer Variablen
Die Funktion heißt boxplot(), und für einen einzelnen numerischen Vektor ist es ein Aufruf:
scores <- c(52, 55, 58, 60, 61, 63, 64, 66, 68, 70, 72, 95)
boxplot(scores,
main = "Test scores",
ylab = "Score")
Das Bild, das dabei entsteht: eine Box von 59 bis 69 mit der Medianlinie bei 63,5, Whisker bis hinunter zu 52 und hinauf zu 72 und ein einsamer Punkt bei 95 - der Ausreißer, den eine Zusammenfassung aus Mittelwert und Standardabweichung still geschluckt hätte. Dieses sofortige "ein Wert ist anders als die übrigen" ist der Zweck von Boxplots.
(Wie auf jeder Seite dieses Kapitels sind Zeichenaufrufe statische Ausschnitte - der Runner unten zeigt nur Textausgabe. Führ sie lokal aus, um die Zeichnung zu sehen.)
Gruppen vergleichen: die Formelschnittstelle
Der eigentliche Alltagseinsatz ist eine Box pro Gruppe, und dafür akzeptiert boxplot() eine Formel: y ~ group, gelesen als "y aufgeschlüsselt nach group". R's eingebauter Datensatz ToothGrowth - Zahnlänge bei 60 Meerschweinchen, die Vitamin C über Orangensaft (OJ) oder Ascorbinsäure (VC) erhielten - ist die klassische Demonstration:
boxplot(len ~ supp,
data = ToothGrowth,
main = "Tooth growth by supplement",
xlab = "Supplement",
ylab = "Tooth length")
Zwei Boxen erscheinen auf gemeinsamer vertikaler Skala: Die OJ-Box sitzt merklich höher als die VC-Box, mit einem Median um 22 gegenüber etwa 19. Weil beide Boxen sich eine Achse teilen, ist der Vergleich konstruktionsbedingt ehrlich - keine Chance, dass zwei Diagramme mit verschiedenen Skalen eine Gruppe schmeicheln. Die Gruppierungsspalte sollte ein Faktor (oder Zeichenvektor) sein; jedes Level wird zu einer Box.
Formeln verschachteln sich ebenfalls: boxplot(len ~ supp * dose, data = ToothGrowth) zeichnet sechs Boxen, eine je Kombination aus Präparat und Dosis. Wenn ein Gruppenunterschied in den Boxen echt aussieht, ist die natürliche nächste Frage - ist er mehr als Rauschen? - das, was ein t-Test beantwortet.
Beschriftungen, Farben und horizontale Boxplots
Die Gestaltungsargumente folgen den Konventionen des Base-Plottings. names beschriftet die Boxen, col füllt sie - übergib einen Vektor, um jede Gruppe anders zu färben:
boxplot(len ~ supp,
data = ToothGrowth,
names = c("Orange juice", "Ascorbic acid"),
col = c("orange", "lightblue"),
main = "Tooth growth by supplement",
ylab = "Tooth length")
Zwei weitere Schalter verdienen ihr Geld:
horizontal = TRUEdreht das ganze Diagramm, sodass die Boxen entlang der horizontalen Achse laufen. Mach das immer dann, wenn Gruppennamen lang sind - waagerechte Beschriftungen bleiben lesbar, wo senkrechte kollidieren.notch = TRUEschnitzt eine Kerbe um jeden Median; überlappen sich die Kerben zweier Gruppen nicht, unterscheiden sich ihre Mediane plausibel. Behandle das als optischen Hinweis, nicht als Test.
Die Zahlen hinter der Box
Alles, was das Diagramm zeichnet, stammt aus Zahlen, die du ausgeben kannst. quantile() liefert die Fünf-Zahlen-Zusammenfassung, und boxplot.stats() gibt dir genau, was das Diagramm nutzt - einschließlich der Ausreißer. Dieses hier kannst du direkt ausführen:
Beachte, dass die beiden Cousins sind, keine Zwillinge: quantile() meldet das wahre Minimum und Maximum, während s$stats an den Whiskern endet - den extremsten Punkten innerhalb des 1,5-×-IQR-Zauns. Die Lücke dazwischen ist genau s$out, hier die einsame 95. Fragt jemand "Welche Zeilen sind diese Ausreißerpunkte?", beantwortet x[x %in% boxplot.stats(x)$out] - oder ein Filter auf die Zaunwerte - das.
Boxplots mit ggplot2
In ggplot2 wandert die Gruppierung in die ästhetische Zuordnung statt in eine Formel:
library(ggplot2)
ggplot(ToothGrowth, aes(x = supp, y = len, fill = supp)) +
geom_boxplot() +
labs(title = "Tooth growth by supplement",
x = "Supplement", y = "Tooth length")
Dieselben zwei Boxen, mit Legende und Thema gratis. Die ggplot2-Variante skaliert besser, wenn das Diagramm wächst - facettiere nach dose, überlagere die Rohpunkte mit geom_jitter(width = 0.1), und der Code bleibt deklarativ. Für einen einmaligen Vergleich während der Analyse bleibt boxplot(y ~ g, data = df) das Schnellste, was du tippen kannst.
Was du mitnimmst
- Box-Anatomie: Medianlinie, Box = IQR, Whisker = extremste Punkte innerhalb 1,5 × IQR, Punkte darüber hinaus = Ausreißerverdacht.
boxplot(x)für eine Variable;boxplot(y ~ group, data = df)für den Gruppenvergleich nebeneinander auf einer ehrlichen gemeinsamen Skala.- Gestalte mit
names, einemcol-Vektor je Gruppe undhorizontal = TRUE, wenn Beschriftungen lang sind. boxplot.stats(x)$statsund$outsind das Diagramm als Zahlen - nutze sie, um die Ausreißer zu extrahieren, auf die das Diagramm zeigt.- ggplot2:
geom_boxplot()mit der Gruppe aufxoderfillabgebildet.
Als Nächstes: das Streudiagramm - von der Verteilung einer Variablen zur Beziehung zwischen zweien.
Häufig gestellte Fragen
Wie erstellt man in R einen Boxplot?
Ruf boxplot(x) auf einem numerischen Vektor für eine einzelne Box auf oder nutze die Formelschnittstelle boxplot(y ~ group, data = df), um eine Box pro Gruppe nebeneinander zu bekommen. Beides kommt mit Base R - keine Pakete nötig.
Was bedeuten die Teile eines Boxplots?
Die dicke Linie in der Box ist der Median. Die Box überspannt den Interquartilsabstand, vom ersten bis zum dritten Quartil. Die Whisker reichen zu den extremsten Datenpunkten innerhalb des 1,5-fachen Interquartilsabstands ab der Box, und alles darüber hinaus wird als einzelner Punkt gezeichnet - ein Ausreißerverdacht.
Wie erstellt man in R einen Boxplot nach Gruppen?
Nutze eine Formel: boxplot(len ~ supp, data = ToothGrowth) zeichnet eine Box je Level von supp. Die Gruppierungsvariable sollte eine Faktor- oder Zeichenspalte sein; jedes Level wird zu einer Box auf gemeinsamer Skala.
Wie findet man die Ausreißer, die ein Boxplot zeigt?
boxplot.stats(x)$out gibt genau die Werte zurück, die das Diagramm als Punkte jenseits der Whisker zeichnen würde, und boxplot.stats(x)$stats liefert die fünf Zahlen hinter der Box - Whiskerenden, Angelpunkte und Median.