Import - Befehl¶
import pandas as pd # Daten einlesen & bearbeiten
import numpy as np # Mathematische Funktionen (z.B. Wurzel, abs)
import matplotlib.pyplot as plt # Visualisierungen (Boxplot etc.)
import seaborn as sns # Stilvolle Diagramme
from scipy.stats import mannwhitneyu, norm, rankdata # U-Test, Z-Wert, Ränge
from IPython.display import display # Tabellenanzeige im Jupyter
import warnings; warnings.filterwarnings("ignore") # unterdrückt Warnunge
Daten einlesen¶
# Daten einlesen
df = pd.read_excel("u.xlsx")
df.columns = df.columns.str.strip()
df.head()
ID | Trainingstatus | koerperliches_Wohlbefinden | |
---|---|---|---|
0 | 18 | untrainiert | 10.0 |
1 | 11 | gut trainiert | 20.0 |
2 | 4 | gut trainiert | 30.0 |
3 | 15 | untrainiert | 30.5 |
4 | 22 | untrainiert | 31.0 |
Hypothese¶
H1: Es gibt einen Unterschied in der zentralen Tendenz zwischen "gut trainierten" und "untrainierten" Teilnehmnern in Punkto körperlichen Wohlbefinden.
H0: Es gibt keinen Unterschied in der zentralen Tendenz zwischen "gut trainierten" und "untrainierten" Teilnehmnern in Punkto körperlichen Wohlbefinden.
Voraussetzungen des Mann-Whitney-U-Tests¶
Die abhängige Variable ist mindestens ordinalskaliert -> Körperliches Wohlbefinden wurde nur einmal erfragt. Es handelt sich um eine sub. Einschätzung.
Es liegt eine unabhängige Variable vor, mittels der die beiden zu vergleichenden Gruppen gebildet werden. (untrainierte vs trainierte Gruppe)
Bei diesen Ausprägungen eignet sich der U-Test:
- kleine Stichproben
- Ausreisser
- ordinalskalierte Daten
- keine Normalverteilung
Boxplot¶
# Boxplot korrekt mit hue + Farbe
sns.boxplot(
data=df,
x="Trainingstatus",
y="koerperliches_Wohlbefinden",
hue="Trainingstatus", # nötig für palette
palette=["deepskyblue", "pink"],
legend=False # keine doppelte Legende
)
plt.xlabel("- Trainingstatus -")
plt.ylabel("körperliches Wohlbefinden")
plt.title("Boxplot: Wohlbefinden nach Trainingstatus")
plt.show()
# Boxplot erstellen
fig, ax = plt.subplots(figsize=(6, 4))
sns.boxplot(
data=df,
x="Trainingstatus",
y="koerperliches_Wohlbefinden",
ax=ax,
palette=["deepskyblue", "darkgrey"] # Zwei Farben für zwei Gruppen
)
# Design anpassen (ähnlich wie theme in ggplot)
ax.set_facecolor("white") # Plot-Hintergrund
fig.patch.set_facecolor("white") # Rahmen drumherum
fig.patch.set_linewidth(1)
fig.patch.set_edgecolor("darkgrey")
# Achsentitel
ax.set_xlabel("Trainingstatus")
ax.set_ylabel("körperliches Wohlbefinden")
plt.title("Boxplot: Wohlbefinden nach Trainingstatus")
plt.tight_layout()
plt.show()
Deskriptive Statistik¶
# Gruppierte Statistik mit Anzahl und Median, gerundet
ergebnis = (
df.groupby("Trainingstatus")["koerperliches_Wohlbefinden"]
.agg(Anzahl="count", Median="median")
.round(2)
)
print(ergebnis)
Anzahl Median Trainingstatus gut trainiert 14 58.5 untrainiert 9 35.0
Alternativ¶
# Gruppierte deskriptive Statistik: count, mean, std, min, max, median
desc_by_group = (
df.groupby("Trainingstatus")["koerperliches_Wohlbefinden"]
.agg(
count="count",
mean="mean",
std="std",
min="min",
median="median",
max="max"
)
.round(2)
)
print(desc_by_group)
count mean std min median max Trainingstatus gut trainiert 14 55.57 17.06 20.0 58.5 80.0 untrainiert 9 35.83 13.46 10.0 35.0 61.0
Es ist zu erkennen, dass sich der Median der beiden Gruppen unterscheidet.
Die Gruppe "untrainierte Teilnehmer" haben einen Median von 35 und die Teilnehmer "gut trainiert" haben einen Median von 58.5. Damit fühlen sich die gut trainierten Teilnehmer körperlich wohler als die Teilnehmer, die untrainiert sind.
Ergebnisse des Mann-Whitney-U-Tests¶
In R gibt es den asymptotische Signifikanz aus, als auch eine exakte Signifikanz. In Abhängigkeit von der Stichprobengrösse wird der eine oder andere Wert berichtet:
Ist die Stichprobe hinreichend gross (n1 + n2 > 30), so wird die asymptotische Signifikanz verwendet.¶
# Gruppen extrahieren
gruppe1 = df[df["Trainingstatus"] == df["Trainingstatus"].unique()[0]]["koerperliches_Wohlbefinden"]
gruppe2 = df[df["Trainingstatus"] == df["Trainingstatus"].unique()[1]]["koerperliches_Wohlbefinden"]
# Mann-Whitney-U-Test (zweiseitig)
u_stat, p_val = mannwhitneyu(gruppe1, gruppe2, alternative='two-sided', method='asymptotic')
# Tabelle erstellen
mw_ergebnisse = pd.DataFrame([{
"Test": "Mann-Whitney-U-Test",
"W-Wert (U)": f"{u_stat:.2f}",
"p-Wert": f"{p_val:.4f}"
}])
# Tabelle anzeigen
print("Ergebnisse des Mann-Whitney-U-Tests:")
print(mw_ergebnisse.to_string(index=False))
Ergebnisse des Mann-Whitney-U-Tests: Test W-Wert (U) p-Wert Mann-Whitney-U-Test 25.00 0.0182
Ist dies nicht der Fall, so wird die exakte Signifikanz verwendet.¶
# Gruppen definieren
gruppe1 = df[df["Trainingstatus"] == df["Trainingstatus"].unique()[0]]["koerperliches_Wohlbefinden"]
gruppe2 = df[df["Trainingstatus"] == df["Trainingstatus"].unique()[1]]["koerperliches_Wohlbefinden"]
# Mann-Whitney-U-Test
testwil = mannwhitneyu(gruppe1, gruppe2, alternative='two-sided', method='exact')
# Tabelle erstellen
mw_ergebnisse = pd.DataFrame([{
"Test": "Mann-Whitney-U-Test",
"Gruppe 1": df["Trainingstatus"].unique()[0],
"Gruppe 2": df["Trainingstatus"].unique()[1],
"W-Wert (U)": f"{testwil.statistic:.2f}",
"p-Wert": f"{testwil.pvalue:.4f}"
}])
# Tabelle anzeigen
print("Ergebnisse des Mann-Whitney-U-Tests:")
print(mw_ergebnisse.to_string(index=False))
Ergebnisse des Mann-Whitney-U-Tests: Test Gruppe 1 Gruppe 2 W-Wert (U) p-Wert Mann-Whitney-U-Test untrainiert gut trainiert 25.00 0.0158
Der Unterschied zwischen den Gruppen ist signifikant (W = 25, p = .015, n = 23).
Berechnung der Effektstärke¶
$$r=\left\| \frac{z}{\sqrt{n}} \right\|$$
# Z-Wert aus zweiseitigem p-Wert berechnen
# Für einen zweiseitigen Test ist z = norm.ppf(1 - p/2) üblich,
# damit der Wert positiv bleibt. |z| wird beim r ohnehin benutzt.
z_stat = norm.ppf(1 - testwil.pvalue / 2)
# Effektstärke r = |Z| / √n
n = len(df)
effektstärke_r = abs(z_stat) / np.sqrt(n)
# Tabelle erstellen
u_r_ergebnisse = pd.DataFrame([{
"Test": "Mann-Whitney-U-Test",
"Z-Wert": f"{z_stat:.2f}",
"n": n,
"Effektstärke (r)": f"{effektstärke_r:.2f}"
}])
# Tabelle anzeigen
print("Effektstärke für den Mann-Whitney-U-Test:")
print(u_r_ergebnisse.to_string(index=False))
Effektstärke für den Mann-Whitney-U-Test: Test Z-Wert n Effektstärke (r) Mann-Whitney-U-Test 2.36 23 0.49
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 .50 einem starken Effekt.
Eine Aussage¶
Es gibt einen signifikanten Unterschied zwischen den Gruppen und dem Wohlbefinden - Mann-Whitney-U-Test (W = 101, p = .015). Gut trainierte Teilnehmer weisen ein höheres körperliches Wohlbefinden auf (Median = 58.5, N = 14) als die untrainierten Teilnehmer (Median = 35 , N = 9). Mann-Whitney-U-Test (W = 101, p = .015). Die Effektstärke nach Cohen (1992) liegt bei r = 0.5 und entspricht einem starken Effekt. H0 kann verworfen werden.
Kompakt: Gut trainierte Teilnehmer weisen ein signifikant höheres körperliches Wohlbefinden auf (Median = 58.5, N = 14) als die untrainierten Teilnehmer (Median = 35 , N = 9) - Mann-Whitney-U-Test (W = 101, p = .015). Die Effektstärke nach Cohen (1992) liegt bei r = 0.5 und entspricht einem starken Effekt. H0 kann verworfen werden.