Korrelation und Rangkorrelation in R

In vielen Forschungs­projekten willst Du herausfinden, ob und wie stark zwei Merkmale zusammenhängen – etwa Körper­größe ↔ Gewicht, Lernzeit ↔ Prüfungs­note oder CO₂-Ausstoß ↔ Einkommen. Dafür liefern Korrelations­analysen einfache, aber wichtige Werkzeuge.

Pearson-Korrelation ($r$)

Die Pearson’sche Produkt-Moment-Korrelation $r$ misst die Stärke und Richtung eines linearen Zusammen­hangs zweier metrischer Variablen. Werte liegen zwischen -1 (perfekt negativ), 0 (kein linearer Zusammenhang) und +1 (perfekt positiv).

Die Voraussetzungen für die Durchführung der Pearson-Korrelation ist:

  1. Metrische Skala (Intervall/Ratio).
  2. Lineare Beziehung – checke immer per Streu­diagramm!
  3. Keine groben Ausreißer; sie können r massiv verzerren.
  4. Homoskedastizität und annähernd Normal­verteilung sind hilfreich, aber nicht zwingend für die reine Schätzung von r; für Signifikanz­tests dagegen schon.

Das wäre die Formel (aber die musst du dir nicht unbedinkt merken):

$r=\frac{\sum_{i=1}^{n}(x_i-\bar x)\,(y_i-\bar y)}{\sqrt{\sum_{i=1}^{n}(x_i-\bar )^2}\,\sqrt{\sum_{i=1}^{n}(y_i-\bar y)^2}}$

In R lässt sich das so umsetzen:

# Beispiel: Körpergröße vs. Gewicht
data <- data.frame(
  groesse = c(168,172,181,176,169,185,160,178,190,174),
  gewicht = c(62,  70,  88,  75,  65,  92,  55,  80,  95,  72)
)

# Visualisierung
plot(data$groesse, data$gewicht,
     xlab = "Größe (cm)", ylab = "Gewicht (kg)",
     main = "Scatterplot Größe vs. Gewicht")
abline(lm(gewicht ~ groesse, data), lty = 2)

# Pearson-Korrelation + Test
cor(data$groesse, data$gewicht, method = "pearson")
cor.test(data$groesse, data$gewicht, method = "pearson")

Die Funktion cor.test() gibt Dir neben rr einen t-Wert, das 95 %-Konfidenz­intervall und den p-Wert aus.

Für die Interpretation achtest du vor allem auf diese drei Werte:

  • Betrag von r zeigt Stärke:
    • 0 – 0.3: schwach
    • 0.3 – 0.6: moderat
    • 0.6 – 1.0: stark
  • Vorzeichen zeigt Richtung.
  • Signifikanz (p-Wert) sagt, ob der beobachtete Zusammenhang zufällig sein könnte. Doch: Signifikant ≠ praktisch relevant (Stichwort Effektgröße).

Achtung Causality-Trap: “Correlation does not imply causation” (siehe Kausalität)

Rangkorrelation (Spearman $\rho$)

Spearmans $\rho$ (rho) misst die monotone Beziehung zweier Variablen, indem es die Daten in Ränge transformiert und anschließend Pearson-$r$ auf diese Ränge anwendet. Robuster gegenüber Ausreißern & Nicht-Normalität; geeignet für Ordinal­daten.

Du verwendest die Rangkorrelation (gegenüber der Pearson-Korrelation) also wenn…

  • Die Daten ordinal skaliert sind oder Ausreißer / Schiefe aufweisen.
  • Die Beziehung ist monoton, aber nicht zwingend linear (z. B. saturierender Effekt).

In R setzt du das so um:

# Beispiel: Stress-Rang vs. Prüfungsrang
set.seed(1)
stress <- sample(1:100, 15)  # 1 = wenig Stress
note   <- sample(1:100, 15)  # 1 = beste Note

cor.test(stress, note, method = "spearman",
         exact = FALSE)      # exact=FALSE für größere n

Ergebnis enthält $/rho$ und p-Wert .

Für die Interpretation könnte man sagen (Angenommen $\rho=-0.72 (p < 0.01)$): Höherer Stress-Rang (mehr Stress) geht monoton mit schlechteren Rängen in der Prüfung einher.

Kendall-Tau ($\tau$)

Kendall’s $\tau$ basiert auf Paar-Weise-Vergleichen (concordant vs. discordant Paare). Es ist besonders robust bei kleinen Stich­proben und vielen Bindungen. Werte: $[-1,1]$.

cor.test(stress, note, method = "kendall")

Wann ist Kendall-Tau besser als Spearman?

  • Viele Bindungen (gleiche Werte) in den Rängen.
  • Sehr kleines n (< 20).

Visualisierung

  1. Basis-Plot plot(x, y); abline(lm(y ~ x))
  2. ggplot2 mit glatter Linie library(ggplot2) ggplot(data, aes(groesse, gewicht)) + geom_point() + geom_smooth(method = "lm", se = FALSE)
  3. Korrelations­matrix als Heatmap library(reshape2); library(ggplot2) m <- cor(data, method = "spearman") m2 <- melt(m) ggplot(m2, aes(Var1, Var2, fill = value)) + geom_tile() + scale_fill_gradient2(limits = c(-1,1)) + theme_minimal()

Vergleich & Entscheidungs­hilfe

KriteriumPearson $r$Spearman $\rho$Kendall $\tau$
DatenniveauMetrischOrdinal+Ordinal+
BeziehungLinearMonotonMonoton
Robust gegen AusreißerNeinMittelHoch
Kleines n + BindungenMittelMittelGut
Test-Statistikt-Verteilungt-Approx.z-Approx.

Beispielstudie

Du sammelst Daten von 60 Studis: mg Koffein pro Tag vs. Reaktions­zeit (ms).

set.seed(42)
koffein <- rpois(60, lambda = 200)
reaktion <- 300 - 0.15*koffein + rnorm(60, 0, 20)
df <- data.frame(koffein, reaktion)

Dann schauen wir uns das ganze mal visuell und analytisch an:

plot(df$koffein, df$reaktion)    # Streuplot
cor.test(df$koffein, df$reaktion)

Ergebnis : $r\approx -0.65, p < 0.001$ → höherer Koffein-Konsum geht (linear) mit kürzerer Reaktions­zeit einher.

Weil Ausreißer (> 450 mg) auftauchen, vergleichst Du am besten auch mit Spearman:

cor.test(df$koffein, df$reaktion, method="spearman")

Oft ist $\rho$ etwas kleiner (z. B. −0.60), bestätigt aber die monotone Tendenz.

Alles klar?

Ich hoffe, der Beitrag war für dich soweit verständlich. Wenn du weitere Fragen hast, nutze bitte hier die Möglichkeit, eine Frage an mich zu stellen!

Stelle Dominik eine Frage