Menu

Histogramm in R: hist() erklärt mit Beispielen

Wie du in R mit hist() ein Histogramm erstellst - breaks wählen, Balken gestalten, auf die Dichteskala wechseln, eine Normalverteilungskurve überlagern und die ggplot2-Variante.

Diese Seite enthält ausführbare Editoren - bearbeiten, ausführen und Ausgabe sofort sehen.

Was ein Histogramm zeigt

Ein Histogramm beantwortet eine Frage zu einer numerischen Variablen: Wie sind die Werte verteilt? Es zerhackt den Wertebereich der Daten in aufeinanderfolgende Intervalle (Klassen), zählt, wie viele Beobachtungen in jedes fallen, und zeichnet pro Klasse einen Balken, dessen Höhe diese Anzahl ist. Wo die Daten dicht liegen, sind die Balken hoch; wo sie dünn liegen, sind sie kurz.

Dieses eine Bild sagt dir Dinge, die Mittelwert und Standardabweichung nicht können: ob die Daten einen Gipfel oder zwei haben, ob sie symmetrisch sind oder zu einem Ende hin schief, und ob es Ausreißer weit weg vom Rest gibt. Es ist meist das allererste Diagramm, das man erstellt, wenn man einem neuen Datensatz begegnet, direkt neben den Zahlen aus der deskriptiven Statistik.

In R heißt die Funktion hist(), und sie ist eine Zeile.

Dein erstes Histogramm mit hist()

Simulieren wir die Körpergrößen von 200 Personen - normalverteilt um 170 cm mit einer Standardabweichung von 10 (siehe Zufallszahlen dazu, was set.seed() und rnorm() tun):

set.seed(42)
heights <- rnorm(200, mean = 170, sd = 10)

hist(heights)

R wählt die Klassen selbst und zeichnet einen glockenförmigen Balkenstapel: kurze Balken um 145 cm, ansteigend durch die 160er, mit Gipfel um 170 und symmetrisch abfallend jenseits von 190. Die vertikale Achse ist mit "Frequency" beschriftet - rohe Anzahlen -, und Titel und Achsenbeschriftung stammen aus dem Variablennamen.

Die Voreinstellungen sind bewusst schlicht. Die üblichen Ausschmückungsargumente funktionieren hier alle:

hist(heights,
     main   = "Distribution of heights",
     xlab   = "Height (cm)",
     col    = "steelblue",
     border = "white")

col füllt die Balken, border färbt ihre Umrisse - border = "white" gibt den sauberen Look getrennter Balken, den du in den meisten Publikationen siehst. Alles, was der plot()-Leitfaden über Farben und Titel sagt, gilt unverändert.

Klassenbreite: das Argument breaks

Das wichtigste Argument von hist() ist breaks, denn die Klassenbreite entscheidet, welche Geschichte das Diagramm erzählt. Dieselben Daten, zwei Einstellungen:

hist(heights, breaks = 5)    # five wide bins: a crude, blocky bell
hist(heights, breaks = 30)   # thirty narrow bins: detail, plus noise

Mit breaks = 5 ist das Histogramm so grob, dass alles wie ein glatter einzelner Buckel aussieht - ein zweiter Cluster oder eine Lücke in den Daten wäre unsichtbar. Mit breaks = 30 siehst du feine Struktur, aber zufällige Zacken beginnen, sich als Merkmale auszugeben. Keines ist "richtig"; der ehrliche Zug ist, ein paar Einstellungen auszuprobieren und zu sehen, welche Merkmale überleben.

breaks akzeptiert drei Formen:

  • Eine Zahl - breaks = 30 - ein Vorschlag für die Klassenzahl. R passt sie an, um auf glatten Grenzen zu landen, sodass du 28 oder 33 Klassen bekommen kannst. Das überrascht jeden einmal.
  • Einen Vektor von Schnittpunkten - breaks = seq(140, 200, by = 5) - exakte Klassengrenzen, keine Verhandlung. Nutze das, wenn Klassen über mehrere verglichene Histogramme hinweg fluchten müssen.
  • Einen Regelnamen - breaks = "FD" für Freedman-Diaconis, das die Breite aus Streuung und Stichprobengröße wählt und sich bei schiefen Daten gut verhält.

Dichtehistogramme und die Normalverteilungskurve

Standardmäßig sind die Balkenhöhen Anzahlen (freq = TRUE). freq = FALSE zu setzen skaliert die Balken so, dass ihre Gesamtfläche 1 ergibt - die Dichteskala. Die Form ändert sich nicht; die vertikale Achse schon. Der Sinn dahinter: Ein Dichtehistogramm liegt auf derselben Skala wie eine Wahrscheinlichkeitsdichtefunktion, sodass du eine theoretische Kurve direkt über die Daten legen kannst:

hist(heights,
     freq = FALSE,
     col = "gray90",
     main = "Heights vs. a normal curve",
     xlab = "Height (cm)")

curve(dnorm(x, mean = mean(heights), sd = sd(heights)),
      add = TRUE, col = "tomato", lwd = 2)

curve() mit add = TRUE zeichnet die Glockenkurve über das bestehende Histogramm (das x in dnorm(x, ...) ist ein Platzhalter, den curve() füllt, keine Variable von dir). Schmiegen sich die Balken an die Kurve, ist ein Normalverteilungsmodell vertretbar; wo sie davon abwölben - ein schwerer Rand, ein zweiter Gipfel -, fehlt dem Modell etwas. Lässt du freq = FALSE weg, kriecht die Kurve nutzlos am Boden des Diagramms entlang, weil Anzahlen und Dichten auf verschiedenen Skalen liegen.

Die Zahlen hinter den Balken

hist() zeichnet nicht nur - es gibt die Klasseneinteilung als Liste zurück. Mit plot = FALSE überspringt es das Zeichnen vollständig und rechnet nur, was bedeutet, dass du dieses hier direkt ausführen kannst:

h$counts ist das Histogramm als Daten: Jede Zahl ist die Höhe eines Balkens. Die Zeile table(cut(...)) ist das Textmodus-Äquivalent - cut() klassiert die Werte, table() zählt jede Klasse - und sie ist eine ordentliche Plausibilitätsprüfung, die man vor oder statt eines Diagramms ausgeben kann. Weist du ohne plot = FALSE zu (h <- hist(heights)), zeichnet R und gibt die Liste zurück; die Zuweisung unterdrückt das Diagramm nicht.

Histogramme mit ggplot2

Die ggplot2-Variante tauscht breaks gegen binwidth, was oft der natürlichere Regler ist - du sagst, wie breit eine Klasse in Dateneinheiten ist, statt wie viele Klassen du willst:

library(ggplot2)

ggplot(data.frame(heights), aes(x = heights)) +
    geom_histogram(binwidth = 5, fill = "steelblue", color = "white") +
    labs(title = "Distribution of heights", x = "Height (cm)", y = "Count")

binwidth = 5 bedeutet, dass jeder Balken 5 cm abdeckt. ggplot2 warnt dich, wenn du binwidth weglässt, und nimmt still 30 Klassen als Standard - beachte die Warnung, denn die Voreinstellung ist selten die richtige Breite für deine Daten. Für einen schnellen Blick auf eine Variable ist hist() weniger Tipparbeit; ggplot2 verdient sich sein Geld, wenn das Histogramm Facetten, Gruppen oder ein einheitliches Thema mit deinen übrigen Abbildungen braucht.

Was du mitnimmst

  • Ein Histogramm zeigt die Verteilung einer numerischen Variablen: hist(x) und du bist fertig.
  • breaks ist das entscheidende Argument - eine Zahl ist nur ein Vorschlag, ein Vektor setzt exakte Grenzen, "FD" wählt eine vertretbare Breite. Probier immer mehr als eine Einstellung.
  • freq = FALSE wechselt auf die Dichteskala, was es curve(dnorm(...), add = TRUE) erlaubt, sinnvoll eine Normalverteilungskurve zu überlagern.
  • hist(x, plot = FALSE) gibt die Klassen als Daten zurück ($breaks, $counts, $mids); table(cut(x, breaks)) ist das reine Textäquivalent.
  • In ggplot2: geom_histogram(binwidth = ...) - und setz binwidth selbst.

Als Nächstes: der Boxplot - das Verteilungsdiagramm, das wirklich glänzt, wenn du Gruppen nebeneinander vergleichst.

Häufig gestellte Fragen

Wie erstellt man in R ein Histogramm?

Ruf hist(x) auf einem numerischen Vektor auf. R teilt den Wertebereich von x in Klassen und zeichnet einen Balken pro Klasse, dessen Höhe zeigt, wie viele Werte hineinfallen. Ergänze breaks =, um die Klassenzahl zu steuern, und col =, um die Balken zu färben.

Was macht das Argument breaks in hist()?

Es steuert die Klasseneinteilung. Eine einzelne Zahl wie breaks = 30 ist ein Vorschlag für die Klassenzahl (R rundet auf glatte Grenzen), ein Vektor wie breaks = seq(140, 200, by = 5) legt die exakten Schnittpunkte fest, und breaks = "FD" nutzt die Freedman-Diaconis-Regel.

Wie überlagert man in R eine Normalverteilungskurve über ein Histogramm?

Zeichne das Histogramm mit freq = FALSE auf der Dichteskala und ergänze dann die Kurve mit curve(dnorm(x, mean = mean(data), sd = sd(data)), add = TRUE). Auf der Häufigkeitsskala läge die Kurve nutzlos nahe null, deshalb ist freq = FALSE unverzichtbar.

Was ist der Unterschied zwischen einem Histogramm und einem Balkendiagramm?

Ein Histogramm klassiert eine numerische Variable, deshalb ist die horizontale Achse eine kontinuierliche Skala und die Balken berühren sich. Ein Balkendiagramm vergleicht verschiedene Kategorien, deshalb stehen die Balken getrennt. In R heißt das hist() für Zahlen und barplot() für Kategorienzählungen.

Coddy programming languages illustration

Lerne mit Coddy zu programmieren

LOS GEHT'S