Sommersemester 2024
09.04.2024
© 2024 Prof. Dr. Rüdiger W. Braun
Zwei Versuchsreihen liefern Messergebnisse. Der Test soll entscheiden, ob sich diese Ergebnisse signifikant unterscheiden.
Unverbundene Stichproben: Die Messerergebnisse werden an verschiedenen Populationen gewonnen.
scipy.stats
ist der Z-Test nicht implementiertWiederholung aus dem Wintersemester
import pandas as pd
from scipy import stats
df = pd.read_csv('treatment.csv', index_col=0)
df
t0 | t1 | Treatment | Difference | |
---|---|---|---|---|
0 | 63.0 | 62.0 | Verum | -1.0 |
1 | 24.0 | 22.0 | Verum | -2.0 |
2 | 77.0 | 72.0 | Verum | -5.0 |
3 | 43.0 | 41.0 | Verum | -2.0 |
4 | 88.0 | 84.0 | Verum | -4.0 |
... | ... | ... | ... | ... |
1764 | 62.0 | 53.0 | Placebo | -9.0 |
1765 | 54.0 | 56.0 | Placebo | 2.0 |
1766 | 57.0 | 52.0 | Placebo | -5.0 |
1767 | 95.0 | 93.0 | Placebo | -2.0 |
1768 | 41.0 | 39.0 | Placebo | -2.0 |
1769 rows × 4 columns
dfv = df[df.Treatment=='Verum']
dfv.describe()
t0 | t1 | Difference | |
---|---|---|---|
count | 887.000000 | 887.000000 | 887.000000 |
mean | 61.073281 | 57.054115 | -4.019166 |
std | 20.169044 | 20.405522 | 3.093843 |
min | 5.000000 | 1.000000 | -15.000000 |
25% | 47.000000 | 43.000000 | -6.000000 |
50% | 61.000000 | 57.000000 | -4.000000 |
75% | 75.000000 | 71.000000 | -2.000000 |
max | 100.000000 | 100.000000 | 5.000000 |
dfp = df[df.Treatment=='Placebo']
dfp.describe()
t0 | t1 | Difference | |
---|---|---|---|
count | 882.000000 | 882.000000 | 882.000000 |
mean | 63.548753 | 59.189342 | -4.359410 |
std | 20.061947 | 20.266874 | 3.089117 |
min | 0.000000 | 0.000000 | -13.000000 |
25% | 50.000000 | 45.000000 | -6.000000 |
50% | 64.000000 | 60.000000 | -4.000000 |
75% | 78.000000 | 74.000000 | -2.000000 |
max | 100.000000 | 100.000000 | 5.000000 |
stats.ttest_ind(dfv.Difference, dfp.Difference, alternative='greater')
TtestResult(statistic=2.314493969317715, pvalue=0.010377396661800722, df=1767.0)
Die Nullhypothese, dass das Medikament nicht besser wirkt als Placebo, kann zum Signifikanzniveau $\alpha=0.011$ abgelehnt werden.
Beim Vergleich zweier Mittelwerte kann "Cohen's d" zur Messung der Effektstärke verwendet werden.
$$ d = \left| \frac{\overline x - \overline y}s \right| $$wobei $\overline x$ und $\overline y$ die beiden Mittelwerte, $s$ die Stichprobenstreuung und $|a|$ den Betrag von $a$ bezeichnet.
import numpy as np
n1 = dfv.Difference.count()
n2 = dfp.Difference.count()
xq = dfv.Difference.mean()
yq = dfp.Difference.mean()
sx = dfv.Difference.std()
sy = dfp.Difference.std()
zaehler = (n1-1)*sx**2 + (n2-1)*sy**2
nenner = n1+n2-2
sp = np.sqrt(zaehler/nenner)
sp
3.091487580276715
d = (xq - yq) / sp
d
0.11005857045633365
d-Wert | Interpretation |
---|---|
0.2 | geringer Effekt |
0.5 | mittlerer Effekt |
0.8 | starker Effekt |
Wir haben also einen geringen Effekt beobachtet
Bauer Pillenhuber wird verdächtigt, seine Bio-Hühnchen mit Antibiotika vollzudröhnen. Wir wollen das durch Blutuntersuchungen nachweisen.
import statsmodels.stats.power as smp
import seaborn as sns
sns.set_theme()
Power: Wahrscheinlichkeit, dass die Nullhypothese abgelehnt wird, wenn tatsächlich die Alternative gilt
poweranalyse = smp.TTestPower()
poweranalyse.power(effect_size=0.7, alpha=0.01, nobs=10)
0.2260109972762325
poweranalyse.plot_power(effect_size=[0.7], alpha=0.01, nobs=np.arange(2,100),
alternative='larger');
# nobs: "number of observations"
Wir sollten 35 Hühner untersuchen
poweranalyse.power(effect_size=0.7, alpha=0.01, nobs=35, alternative='larger')
0.9502228513191198
poweranalyse = smp.TTestIndPower() # Ind = Independent
poweranalyse.plot_power(effect_size=[0.5], alpha=0.05, nobs=np.arange(2,150));
Sie müssen ca 100 Parzellen von jeder Sorte ansehen, um eine Power von knapp 95% zu erreichen
poweranalyse.power(effect_size=0.5, alpha=0.05, nobs1=100, ratio=1)
0.9404271933839895
ratio
ist das Verhältnis $\frac{n_2}{n_1}$ratio=1
poweranalyse.power
weglassen