Pakete einlesen¶

In [54]:
# 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¶

In [55]:
# 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

In [56]:
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¶

In [57]:
# 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¶

In [58]:
# 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

Pruefung der Verteilung¶

Histogramm zur Prüfung des Normalverteilung¶

In [59]:
# 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>
No description has been provided for this image

ALTERNATIVE¶

QQ-Diagramm zur Prüfung des Normalverteilung¶

Deine Werte müssen entlang einer aufsteigenden Gerade liegen, so dass Du eine ähnliche Verteilung vermuten kannst.

In [60]:
# 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()
No description has been provided for this image

Es gibt eine Normalverteilung.

Deskriptive Statistiken und Korrelation¶

Korrelation¶

In [61]:
sns.regplot(
    x=ttestVER["Selbsteinschaetzung"],
    y=ttestVER["Fremdeinschaetzung"],
    line_kws={"color": "red"},
    scatter_kws={"color": "#0072B2", "edgecolor": "black"}
)
Out[61]:
<Axes: xlabel='Selbsteinschaetzung', ylabel='Fremdeinschaetzung'>
No description has been provided for this image
In [62]:
# 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¶

In [63]:
# 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¶

In [64]:
# 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\|$$

In [65]:
# 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|$$

In [66]:
# 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.