Was ein Streudiagramm zeigt
Ein Streudiagramm stellt die Beziehung zwischen zwei numerischen Variablen dar: Jede Beobachtung wird zu einem Punkt, positioniert durch ihren ersten Wert entlang der horizontalen und ihren zweiten Wert entlang der vertikalen Achse. Bewegen sich die beiden Variablen gemeinsam, bilden die Punkte ein Muster; tun sie es nicht, bekommst du eine formlose Wolke. Es ist der übliche erste Blick, bevor man irgendein Modell anpasst - und R zeichnet es mit derselben plot()-Funktion, die im plot()-Leitfaden behandelt wird.
Wir nutzen mtcars, einen eingebauten Datensatz mit 32 Autos, und stellen eine physikalische Frage: Haben schwerere Autos stärkere Motoren?
Das Diagramm erstellen
wt ist das Gewicht in Tausend Pfund, hp die Pferdestärken:
plot(mtcars$wt, mtcars$hp,
main = "Horsepower vs. weight",
xlab = "Weight (1000 lbs)",
ylab = "Horsepower",
pch = 19,
col = "steelblue")
Das Bild: zweiunddreißig gefüllte Punkte, die von der unteren Ecke des Diagramms (leichte Autos, rund 1,5 auf der Gewichtsskala, nahe 60-90 PS) hin zu schweren Autos über 5 steigen, die über 200 PS hinausschießen. Der Anstieg ist unverkennbar, aber nicht ordentlich - bei einem gegebenen Gewicht streuen die Punkte über ein ordentliches PS-Band.
Die Gestaltung ist der übliche Base-Plot-Werkzeugkasten: pch = 19 für gefüllte Kreise (die hohle Voreinstellung verschwindet in Screenshots), col für Farbe, cex = 1.3, falls die Punkte größer sein müssen. Um Punkte nach einer dritten, kategorialen Variablen zu färben, indizierst du einen Farbvektor mit einem Faktor - col = c("tomato", "steelblue", "darkgreen")[factor(mtcars$cyl)] gibt jeder Zylinderzahl eine eigene Farbe.
Es lesen: Richtung, Stärke, Form
Drei Fragen, in dieser Reihenfolge, jedes Mal, wenn du ein Streudiagramm anschaust:
- Richtung. Steigen die Punkte (positive Beziehung) oder fallen sie (negative), während du die horizontale Achse entlangschaust? Hier steigen sie: schwerer heißt stärker. Plotte stattdessen
mpggegenwt, und die Wolke fällt - schwerer heißt durstiger. - Stärke. Wie eng schmiegen sich die Punkte an einen einzigen Pfad? Ein bleistiftdünnes Band ist eine starke Beziehung; ein loser Sprühnebel eine schwache. Diese Wolke ist mäßig eng.
- Form und Überraschungen. Ist der Pfad gerade oder gekrümmt? Gibt es Cluster oder Punkte weit weg von allem anderen? In
mtcarssitzt der Maserati Bora auffällig über dem Feld - 335 PS bei mittlerem Gewicht. Ein solcher Punkt kann eine angepasste Gerade merklich ziehen, und genau deshalb schaust du hin, bevor du anpasst.
Die Trendlinie ergänzen
Ein Streudiagramm behauptet eine Beziehung; eine Gerade hindurch fasst die Behauptung zusammen. Passe ein lineares Modell an und übergib es direkt an abline():
plot(mtcars$wt, mtcars$hp,
pch = 19, col = "steelblue",
xlab = "Weight (1000 lbs)", ylab = "Horsepower")
abline(lm(hp ~ wt, data = mtcars), col = "tomato", lwd = 2)
lm(hp ~ wt) passt die Kleinste-Quadrate-Gerade an - lies die Formel als "hp erklärt durch wt", mit der Variablen der vertikalen Achse vor dem ~ - und abline() zeichnet sie über das Diagramm. Die Gerade steigt um etwa 46 PS pro tausend Pfund. Was dieses Modell bedeutet und wie man seine Zusammenfassung liest, ist Thema der linearen Regression.
Willst du keine Gerade voraussetzen, zeichnet lowess() eine glatte Kurve, die den Daten folgt, wohin sie auch gehen:
lines(lowess(mtcars$wt, mtcars$hp), col = "darkgreen", lwd = 2, lty = 2)
Stimmen Lowess-Kurve und Gerade grob überein, ist eine lineare Zusammenfassung fair. Biegt die Kurve weg, ist die Beziehung nichtlinear und eine Gerade würde sie falsch darstellen.
Die Zahlen prüfen mit cor()
Das Diagramm gibt dir die Form; cor() gibt dir die Stärke als eine Zahl. Dieser Schritt ist reine Textausgabe, also führ ihn hier aus:
Gewicht und PS korrelieren mit etwa 0,66 - die mäßig enge steigende Wolke, als Zahl. Die Matrix ergänzt, dass mpg mit beiden stark negativ korreliert (etwa −0,87 mit dem Gewicht). Halte aber die Reihenfolge ein: erst das Diagramm, dann der Koeffizient. Ein einzelner r-Wert kann eine Kurve verbergen oder durch einen Ausreißer aufgebläht sein - siehe Korrelation für die klassischen Arten, wie er in die Irre führt.
Die Streudiagramm-Matrix: pairs()
Bei mehreren numerischen Spalten wird es mühsam, jede Paarung von Hand zu zeichnen. pairs() erledigt das in einem Aufruf:
pairs(mtcars[, c("mpg", "wt", "hp")],
pch = 19, col = "steelblue")
Das Ergebnis ist ein 3-×-3-Gitter: Die Variablennamen laufen entlang der Diagonale, und jedes Feld abseits davon ist das Streudiagramm eines Paares - mpg gegen wt, mpg gegen hp, wt gegen hp, jedes zweimal mit vertauschten Achsen. Es ist der schnellste Weg, einen neuen Datensatz zu sichten: Ein Blick zeigt, welche Paare zusammenhängen, welche Beziehungen sich krümmen und wo die Ausreißer stecken. Bilde vorher eine Spaltenteilmenge wie hier - jenseits von sechs oder sieben Variablen schrumpfen die Felder unter die Lesbarkeitsgrenze.
Die ggplot2-Variante
In ggplot2 sind Streudiagramm plus angepasste Gerade zwei Schichten:
library(ggplot2)
ggplot(mtcars, aes(x = wt, y = hp)) +
geom_point(color = "steelblue", size = 2) +
geom_smooth(method = "lm", color = "tomato") +
labs(title = "Horsepower vs. weight",
x = "Weight (1000 lbs)", y = "Horsepower")
geom_smooth(method = "lm") ist abline(lm(...)) mit Bonus: einem schattierten Konfidenzband um die Gerade. Lässt du method weg, passt es stattdessen eine Loess-Kurve an - das ggplot2-Gegenstück zu lowess(). Base R gewinnt beim Tipptempo für einen schnellen Blick; ggplot2 gewinnt in dem Moment, in dem du die Punkte nach Gruppe gefärbt und mit automatischer Legende willst.
Was du mitnimmst
plot(x, y)mit zwei numerischen Vektoren ist ein Streudiagramm;pch = 19und beschriftete Achsen machen es vorzeigbar.- Lies Richtung, Stärke und Form - und finde Ausreißer -, bevor du irgendetwas berechnest.
abline(lm(y ~ x, data = df))ergänzt die Regressionsgerade;lines(lowess(x, y))ergänzt eine Kurve, die keine Geradlinigkeit voraussetzt.cor()quantifiziert, was das Diagramm zeigt; das Diagramm hält die Zahl ehrlich.pairs(df[, cols])zeichnet alle paarweisen Streudiagramme auf einmal - die schnellste Sichtung eines neuen Datensatzes.
Als Nächstes: das Balkendiagramm - weg von numerischen Paaren, hin zum Vergleich von Anzahlen über Kategorien.
Häufig gestellte Fragen
Wie erstellt man in R ein Streudiagramm?
Ruf plot(x, y) mit zwei numerischen Vektoren auf - zum Beispiel plot(mtcars$wt, mtcars$hp). Jede Beobachtung wird zu einem Punkt. Ergänze pch = 19 für gefüllte Punkte und main, xlab, ylab für Beschriftungen.
Wie fügt man in R eine Regressionsgerade zu einem Streudiagramm hinzu?
Passe das Modell an und übergib es an abline(): abline(lm(hp ~ wt, data = mtcars)) zeichnet die Kleinste-Quadrate-Gerade über das bestehende Diagramm. Beachte die Formelreihenfolge - die Variable der vertikalen Achse steht vor dem ~.
Wie plottet man in R viele Variablenpaare auf einmal?
pairs(df) zeichnet eine Streudiagramm-Matrix: ein kleines Feld für jedes Spaltenpaar. Bilde vorher eine Teilmenge - pairs(mtcars[, c("mpg", "wt", "hp")]) -, denn jenseits von sechs oder sieben Spalten werden die Felder zu klein zum Lesen.
Was sagt ein Streudiagramm, was die Korrelation nicht sagt?
Die Form. Ein Korrelationskoeffizient ist eine Zahl und kann für eine saubere Gerade, eine Kurve oder eine Wolke mit einem extremen Ausreißer identisch sein. Das Streudiagramm zeigt Krümmung, Cluster und Ausreißer direkt - deshalb plottest du zuerst und berechnest cor() danach.