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.

Korrelation (Pearsons 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):

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 (Spearmans rho)

Spearmans 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

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.