Pakete einlesen¶
# Datenhandling und Berechnungen
import pandas as pd
import numpy as np
# Statistische Tests und Maße
from scipy.stats import (
ttest_rel, # gepaarter t-Test
mannwhitneyu, # Mann-Whitney-U-Test (optional)
pearsonr, # Korrelation
skew, # Schiefe
kurtosis, # Kurtosis
t # t-Verteilung (z. B. für Konfidenzintervall)
)
# Visualisierung
import matplotlib.pyplot as plt
import seaborn as sns
Daten einlesen¶
# Datei einlesen
ttestVER = pd.read_csv("ttestVER.txt", sep=";", encoding="utf-8")
# Ersten Überblick über die Daten anzeigen
print(ttestVER.head())
Fremdeinschaetzung Selbsteinschaetzung 1 25 30 2 26 32 3 20 23 4 21 27 5 24 24
Berechnung der Teststatistik¶
Um zu prüfen, ob die Mittelwertsunterschiede statistisch signifikant sind, muss die zugehörige Teststatistik berechnet werden. Die Verteilung der Teststatistik t folgt einer theoretischen t-Verteilung, deren Form sich in Abhängigkeit der Freiheitsgrade unterscheidet. Die dem Test zu Grunde liegende t-Verteilung gibt dem Test den Namen t-Test.
Die Teststatistik $t$ berechnet sich wie folgt:
$$ t = \frac{\bar x_d}{\hat \sigma_{\bar x_d}} = \frac{\bar x_d}{\sqrt{\frac{\sum^n_{i=1}(d_i-\bar x_d)^2}{(n-1)n}}} $$
mit:
$\bar x_d$ = Mittelwert der Differenzen der Messwertpaare
$\hat \sigma_{\bar x_d}$ = Standardfehler der Verteilung der Differenzmittelwerte
$n$ = Stichprobengrösse
$d_i$ = Differenz des Messwertpaares $i$
Und der Berechnung der Freiheitsgrade mit $$df = n-1$$
$$df = 29-1 =28$$ t-empirsch
$$ t = \frac{\bar x_d}{\hat \sigma_{\bar x_d}} =\frac{-4.724}{\sqrt{\frac{(-5-(-4.724))^2+(-6-(-4.724))^2+..+(-2-(-4.724))^2}{(29-1)29}}}= \frac{-4.724}{\sqrt{\frac{347.79}{812}}}=-7.21 $$
t-kritsch
kritischer_wert = t.ppf(0.975, df=28)
print(f"Kritischer t-Wert für df=28 und α=0.05 (zweiseitig): {kritischer_wert:.4f}")
Kritischer t-Wert für df=28 und α=0.05 (zweiseitig): 2.0484
Signifikanz der Teststatistik¶
Um zu beurteilen, ob der berechnete Wert statistisch signifikant ist, wird er mit einem Um zu beurteilen, ob der berechnete Wert statistisch signifikant ist, wird er mit einem kritischen Wert aus der t-Verteilung verglichen, der anhand der Freiheitsgrade bestimmt wird. Diese kritischen Werte sind in sogenannten t-Tabellen zu finden.
Der Code zeigt einen Auszug aus einer solchen Tabelle mit den kritischen Werten für die Signifikanzniveaus α = .05 und α = .01.
Im vorliegenden Fall beträgt der kritische Wert 2.04 bei 28 Freiheitsgraden und einem Signifikanzniveau von α = .05. Der Betrag der Teststatistik liegt mit |–7.21| deutlich über dem kritischen Wert (7.21 > 2.04), sodass das Ergebnis als statistisch signifikant gilt.
Es kann somit angenommen werden, dass ein Unterschied zwischen den Mittelwerten besteht (t(28) = -7.21, p < .05, n = 29).
Hypothese¶
H1: Es gibt einen Unterschied zwischen der Selbsteinschätzung und der Fremdeinschätzung durch den Ehepartner bei der Extraversion.
H0: Es gibt keinen Unterschied zwischen der Selbsteinschätzung und der Fremdeinschätzung durch den Ehepartner bei der Extraversion.
Voraussetzungen des t-Tests für abhängige Stichproben¶
Die abhängige Variable ist min. intervallskaliert -> Ja, Extraversion ist metrisch.
Es liegen zwei verbundene Stichproben oder Gruppen vor, aber die verschiedenen Messwertpaare sind voneinander unabhängig. 1) Sie sind verbundenen durch die Ehe, 2) aber unabhängige, weil es zwei verschiedene Messpaare (A und B) sind.
Die Unterschiede zwischen den verbundenen Testwerten sind in der Grundgesamtheit normalverteilt (bei Stichproben > 30 sind Verletzungen unproblematisch)
Erzeuge neue Variable¶
# Differenz berechnen
zwischen = ttestVER["Fremdeinschaetzung"] - ttestVER["Selbsteinschaetzung"]
# Neue Spalte an den DataFrame anhängen
ttestVER["Differenz"] = zwischen
print(ttestVER.head(5))
Fremdeinschaetzung Selbsteinschaetzung Differenz 1 25 30 -5 2 26 32 -6 3 20 23 -3 4 21 27 -6 5 24 24 0
Falls es Probleme gibt¶
# Spalte "Differenz" wieder löschen
#ttestVER.drop(columns="Differenz", inplace=True)
# Optional anzeigen
# print(ttestVER.head(5))
# Nur Zeilen löschen, in denen NA in den relevanten Spalten vorkommt
#ttestVER.dropna(subset=["Fremdeinschaetzung", "Selbsteinschaetzung"], inplace=True
# Histogramm der Differenz
plt.figure(figsize=(6, 4))
# Stil setzen (optional)
sns.set(style="whitegrid")
# Besseres Histogramm
sns.set(style="white") # kein 'whitegrid'
plt.figure(figsize=(8, 5))
sns.histplot(ttestVER["Differenz"], bins=6, color="#d63384", edgecolor="black")
# Achsentitel und Beschriftung
plt.xlabel("Differenz: Selbst- vs. Fremdeinschätzung (Extraversion)", fontsize=12)
plt.ylabel("Häufigkeit", fontsize=12)
plt.title("Histogramm der Differenz", fontsize=14, weight='bold')
# Achsenanpassung und Layout
plt.xticks(fontsize=10)
plt.yticks(fontsize=10)
plt.tight_layout()
plt.show()
#
<Figure size 600x400 with 0 Axes>
# QQ-Plot
plt.figure(figsize=(6, 4))
stats.probplot(ttestVER["Differenz"], dist="norm", plot=plt)
plt.title("QQPlot für die Var. Differenz")
plt.grid(True)
plt.show()
sns.regplot(
x=ttestVER["Selbsteinschaetzung"],
y=ttestVER["Fremdeinschaetzung"],
line_kws={"color": "red"},
scatter_kws={"color": "#0072B2", "edgecolor": "black"}
)
<Axes: xlabel='Selbsteinschaetzung', ylabel='Fremdeinschaetzung'>
# Pearson-Korrelation berechnen
korrelation, p_wert = pearsonr(ttestVER["Selbsteinschaetzung"], ttestVER["Fremdeinschaetzung"])
# Ergebnistabelle erstellen
korrelation_ergebnis = pd.DataFrame([{
"Test": "Pearson-Korrelation",
"r (Korrelationskoeffizient)": f"{korrelation:.4f}",
"p-Wert": f"{p_wert:.4f}"
}])
# Tabelle anzeigen
print("Ergebnisse der Korrelationsanalyse:")
print(korrelation_ergebnis.to_string(index=False))
Ergebnisse der Korrelationsanalyse: Test r (Korrelationskoeffizient) p-Wert Pearson-Korrelation 0.7653 0.0000
Die Fremdeinschätzung durch den Ehepartner und die Selbsteinschätzung korrelieren positiv-linear signifikant (r = .77, p = .000, n = 29).
Bei Messwiederholungen ist es möglich, dass die Daten der ersten und zweiten Erhebung (respektive eines Messwertpaars) miteinander korrelieren. Es ist plausibel, dass zwei verbundene Messungen sich ähnlich sind und dass innerhalb eines Messwertpaares eher geringere Unterschiede auftreten als zwischen den Paaren.
Im R-Output wird daher eine Pearson Korrelation der beiden Messzeitpunkte ausgegeben. Für das Beispiel ergibt sich eine sehr hohe Korrelation von r = .77 (p = .000, n = 29).
Deskriptive Statistiken¶
# Statistische Übersicht ähnlich wie describe() aus dem psych-Paket in R
beschreibung = ttestVER.describe().T # transponieren für bessere Lesbarkeit
## Zusätzliche Werte wie Schiefe und Kurtosis hinzufügen (optional)
from scipy.stats import skew, kurtosis
beschreibung["skew"] = ttestVER.skew()
beschreibung["kurtosis"] = ttestVER.kurtosis()
# Ergebnis anzeigen
print("Deskriptive Statistik:")
print(beschreibung.round(2))
Deskriptive Statistik: count mean std min 25% 50% 75% max skew \ Fremdeinschaetzung 29.0 21.79 4.55 14.0 19.0 21.0 25.0 32.0 0.45 Selbsteinschaetzung 29.0 26.52 5.44 15.0 25.0 26.0 30.0 38.0 -0.23 Differenz 29.0 -4.72 3.52 -12.0 -7.0 -5.0 -3.0 3.0 -0.12 kurtosis Fremdeinschaetzung -0.22 Selbsteinschaetzung 0.65 Differenz -0.21
Es zeigt sich, dass es einen Mittelwertsunterschied zwischen Fremdeinschätzung durch den Ehepartner und der Selbsteinschätzung in Punkto Extraversion gibt. Die Mittelwerte unterscheiden sich dahingehend, das die Fremdeinschätzung bei 21.79 (SD = 4.55, n= 29), wohingegen die Selbsteinschätzung bei 26.51 (SD = 5.44 ,n=29) liegt.
Ergebnisse des t-Tests für abhängige Stichproben¶
# Gepaarter t-Test: Selbst- vs. Fremdeinschätzung
t_stat, p_val = ttest_rel(ttestVER["Selbsteinschaetzung"], ttestVER["Fremdeinschaetzung"])
# Freiheitsgrade
df = len(ttestVER) - 1
# Konfidenzintervall (95 %)
diff = ttestVER["Selbsteinschaetzung"] - ttestVER["Fremdeinschaetzung"]
mean_diff = np.mean(diff)
sem = np.std(diff, ddof=1) / np.sqrt(len(diff))
ci = t.ppf(0.975, df) * sem
ci_low = mean_diff - ci
ci_high = mean_diff + ci
# Tabelle erstellen
ttest_ergebnisse = pd.DataFrame([{
"Test": "Gepaarter t-Test",
"t-Wert": f"{t_stat:.4f}",
"df": df,
"p-Wert": f"{p_val:.4f}",
"95%-KI": f"[{ci_low:.4f}, {ci_high:.4f}]",
}])
# Tabelle anzeigen
print("Ergebnisse des gepaarten t-Tests:")
print(ttest_ergebnisse.to_string(index=False))
Ergebnisse des gepaarten t-Tests: Test t-Wert df p-Wert 95%-KI Gepaarter t-Test 7.2184 28 0.0000 [3.3835, 6.0647]
Die Teststatistik beträgt t = 7.218 und der zugehörige Signifikanzwert p = 7.402e-08. Damit ist der Unterschied signifikant: Die Mittelwerte der beiden Messzeitpunkte (Fremdeinschätzung und Selbsteinschätzung) unterscheiden sich (t(28) = 7.218, p = 7.402e-08, n= 29).
Berechnung der Effektstärke¶
Cohen und Pearson¶
$$r=\left\| \sqrt {\frac{t^2}{t^2+df}} \right\|$$
# Effektstärke berechnen
eff1 = abs(t_stat) / np.sqrt(t_stat**2 + df)
print("Effektstärke:")
print(eff1)
Effektstärke: 0.806510503660241
Zur Beurteilung der Groesse des Effektes dient die Einteilung von Cohen (1992):
$$ \begin{align} \text{Schwacher Effekt: } 0.10 &< ||r|| < 0.30 \\ \text{Schwacher bis mittlerer Effekt: } 0.30 &= ||r|| \\ \text{Mittlerer Effekt: } 0.30 &< ||r|| < 0.50 \\ \text{Mittlerer bis starker Effekt: }0.50 &= ||r|| \\ \text{Starker Effekt: } 0.50 &< ||r|| \end{align} $$
Damit entspricht eine Effektstärke von 0.8 einem starken Effekt
ALTERNATIV¶
Hedges g¶
$$\rm{Hedges}\ \hat{g}=\left|\frac{\hat{\mu_1}-\hat{\mu_2}}{\hat{\sigma}}\right|$$
# Gruppen definieren
gruppe1 = ttestVER["Selbsteinschaetzung"]
gruppe2 = ttestVER["Fremdeinschaetzung"]
# Mittelwerte
mean1 = np.mean(gruppe1)
mean2 = np.mean(gruppe2)
# Standardabweichungen
sd1 = np.std(gruppe1, ddof=1)
sd2 = np.std(gruppe2, ddof=1)
# Hedges' g
g = (mean2 - mean1) / (sd2-sd1)
# Ausgabe
print(f"Hedges' g: {hedges_g:.4f}")
Hedges' g: 0.9288
Zur Beurteilung der Größe des Effektes:
$$\begin{align} \text{Schwacher Effekt: } 0.20 &< ||g|| < 0.50 \\ \text{Schwacher bis mittlerer Effekt: } 0.50 &= ||g|| \\ \text{Mittlerer Effekt: } 0.50 &< ||g|| < 0.80 \\ \text{Mittlerer bis starker Effekt: }0.80 &= ||g|| \\ \text{Starker Effekt: } 0.80 &< ||g|| \end{align} $$
Damit entspricht eine Effektstärke von 1.3 einem starken Effekt.
Eine Aussage¶
Es zeigt sich, dass die Extraversionswerte sowohl von der Fremdeinschätzung als auch der Selbsteinschätzung statistisch signifikant sich unterscheiden (t(28) = 7.21, p = .000, n = 29). Die Selbsteinschätzung der Extraversion fällt höher aus (M = 26.51, SD = 5.44) als die Fremdeinschätzung durch den Ehepartner (M = 21.79, SD = 4.55). Die Effektstärke nach Cohen (1992) liegt bei r = 0.8 und entspricht damit einem starken Effekt. H0 kann verworfen werden.