16.1 Nullmodell és p-érték

16.1.1 Helyzet, bemenet és előzetes becslés

A Predikciós, paraméter- és Monte Carlo intervallum alfejezetben megismert intervallumok azt mutatták, hogy egy becslés mekkora tartományban mozoghat. Most azt vizsgáljuk, hogy az adatok mennyire egyeztethetők össze azzal a nullmodellel, hogy a kezelésnek nincs hatása. A nullhipotézist a nem szignifikáns eredmény alapján nem „fogadjuk el”. A Northstar kísérleti projektben a bemenet a lab/assignments.csv és a lab/outcomes.csv. A megfigyelési egység egy randomizált ügyfél; a primer célváltozó a conversion_7d, értéke 0 vagy 1. A variant oszlop control vagy treatment.

Az estimand a hétnapos konverziós arányok különbsége:

Δ=P(conversion7d=1∣treatment)−P(conversion7d=1∣control).\Delta = P(\text{conversion}_7d=1 \mid \text{treatment}) - P(\text{conversion}_7d=1 \mid \text{control}).

Ennek pontbecslése

tobs=p̂t−p̂c=ktnt−kcnc,t_{\text{obs}} = \hat p_t - \hat p_c = \frac{k_t}{n_t} - \frac{k_c}{n_c},

ahol ktk_t a treatment csoport konvertálóinak száma, ntn_t a treatment csoport mérete; kck_c és ncn_c ugyanez a kontrollra. A különbség mértékegysége aránypont, például 0,100{,}10 azt jelenti, hogy a kezelt csoportban 10 százalékponttal nagyobb a becsült konverziós arány. A tanulókérdés: ez a különbség elég nagy-e ahhoz, hogy a „nincs hatás” modellt elvessük α=0,05\alpha=0{,}05 mellett? Az előzetes várakozás szerint a generáló hatás 0,10, de a p-értéket a tényleges minta és a permutációs nullmodell adja.

16.1.2 Nullhipotézis, alternatíva, statisztika és farok

A nullhipotézis (null hypothesis, H0H_0) az a kimondottan egyszerű állapot, amelyből a meglepő adatot mérjük. Itt:

H0:Δ=0,H_0:\ \Delta = 0,

tehát a két csoport konverziós valószínűsége azonos. A kétoldali alternatíva (two-sided alternative) szerint

H1:Δ≠0.H_1:\ \Delta \neq 0.

A tesztstatisztika (test statistic) a minta egy előre rögzített függvénye. A mi T=p̂t−p̂cT = \hat p_t - \hat p_c statisztikánk skalár, mértékegysége aránypont. A p-érték megbízhatósága megköveteli, hogy a statisztikát az adat megnézése előtt rögzítsük; ha utólag választunk statisztikát, a küszöb valódi hibavédelme elromlik.

A farok (tail) azt rögzíti, hogy mely irányban számít szélsőségesnek egy nullmodell alatti érték. Felső egyoldali tesztnél a nagy pozitív TT, alsó egyoldalinál a nagy negatív TT szélsőséges. Kétoldali tesztnél az abszolút értékben nagy eltérés szélsőséges.

A feladat megfigyelési egysége fontos: a permutációt ügyfélszinten végezzük. A conversion_7d csak egy érték ügyfelenként; ha rendelési tételeket kevernénk, az összefüggő megfigyeléseket kezelnénk függetlenként, és a p-érték megtévesztően kicsi lehet.

16.1.3 Kézi kontroll: hat lehetséges felosztás

Legyen egy tanító méretű, szintetikus kísérlet: a kontroll kimenetei yc=(0,0)y_c=(0,0), a treatment kimenetei yt=(1,1)y_t=(1,1). Ekkor nt=nc=2n_t=n_c=2, és a megfigyelt statisztika

tobs=1+12−0+02=1.t_{\text{obs}} = \frac{1+1}{2} - \frac{0+0}{2} = 1.

A nullmodell szerint a négy kimenet a hozzárendeléstől független, tehát az összes lehetséges „két elem a treatment csoportba, két elem a kontrollba” felosztás egyformán elképzelhető. A négy megfigyelt érték rögzített halmaza {0,0,1,1}\{0,0,1,1\}. A hat lehetőség:

treatment értékei p̂t−p̂c\hat p_t - \hat p_c
{0,0}\{0,0\} −1-1
{0,1}\{0,1\} négy esetben 00
{1,1}\{1,1\} 11

A nullmodell alatt a statisztika eloszlása:

PH0(T=−1)=16,PH0(T=0)=46,PH0(T=1)=16.P_{H_0}(T=-1)=\frac{1}{6},\quad P_{H_0}(T=0)=\frac{4}{6},\quad P_{H_0}(T=1)=\frac{1}{6}.

Az egyoldali felső p-érték a megfigyelt 11-hez:

pone=PH0(T≥1)=16≈0,1667.p_{\text{one}} = P_{H_0}(T \ge 1) = \frac{1}{6} \approx 0{,}1667.

A kétoldali p-érték az abszolút értékben legalább ekkora eltérés valószínűsége:

ptwo=PH0(|T|≥1)=26≈0,3333.p_{\text{two}} = P_{H_0}(|T| \ge 1) = \frac{2}{6} \approx 0{,}3333.

Ez a kézi példa azért tanulságos, mert a megfigyelt hatás nagynak látszik, de a minta olyan kicsi, hogy a nullmodell szerint is könnyen létrejön.

A hat lehetséges null-felosztás különbsége - A tanulópélda összes felosztásából számított, nem mért adat.

16.1.4 Teljes minimális példa: egzakt és Monte Carlo permutációs teszt

A kis példa egzakt permutációs eloszlását a Python itertools.combinations függvényével állítjuk elő. A kód a projekt gyökeréből futtatható.

from itertools import combinations
import numpy as np

# Szintetikus tanulóadat: n_t = 2, n_c = 2.
y = np.array([0, 0, 1, 1])
n_t = 2

observed_diff = y[:n_t].mean() - y[n_t:].mean()

null_diffs = []
for idx in combinations(range(y.size), n_t):
    treatment = np.zeros(y.size, dtype=bool)
    treatment[list(idx)] = True
    control = ~treatment
    null_diffs.append(y[treatment].mean() - y[control].mean())

null_diffs = np.array(null_diffs)
p_one_sided = np.mean(null_diffs >= observed_diff)
p_two_sided = np.mean(np.abs(null_diffs) >= abs(observed_diff))

print(observed_diff, null_diffs, p_one_sided, p_two_sided)

A kód elméletileg várt kimenete a fenti kézi számításnak felel meg:

1.0 [-1.  0.  0.  0.  0.  1.] 0.16666666666666666 0.3333333333333333

A laboradatra a permutációs tesztet Monte Carlo közelítéssel futtatjuk. A kód a lab/assignments.csv és a lab/outcomes.csv fájlokat olvassa, ügyfélszinten kapcsolja, és 10 000 permutációt használ. A seed rögzíti a pszeudovéletlen sorrendet.

import numpy as np
import pandas as pd

# Futtatás a projekt gyökeréből: python s061_permutation_test.py
assign = pd.read_csv("lab/assignments.csv")
outcomes = pd.read_csv("lab/outcomes.csv")

df = assign.merge(outcomes, on="customer_id", how="inner", validate="one_to_one")
y = df["conversion_7d"].to_numpy()
is_treatment = (df["variant"] == "treatment").to_numpy()

observed_diff = y[is_treatment].mean() - y[~is_treatment].mean()

rng = np.random.default_rng(20261020)
n_permutations = 10_000
extreme_count = 0

for _ in range(n_permutations):
    shuffled = rng.permutation(y)
    null_diff = shuffled[is_treatment].mean() - shuffled[~is_treatment].mean()
    if abs(null_diff) >= abs(observed_diff):
        extreme_count += 1

# +1 korrekció: a megfigyelt felosztást is a null-eloszlás mintájába számítjuk.
p_two_sided = (extreme_count + 1) / (n_permutations + 1)

print(observed_diff, p_two_sided)

A laborfájlokból kapott pontos szám automatikusan még nem ellenőrzött kimenet, ezért csak a számítási utat ellenőriztük. A validate="one_to_one" egyúttal adatminőségi kapu: ha egy ügyfélhez több kimenet tartozna, a kapcsolás hibát adna, és a p-érték helyett a séma-eltérést kellene először javítani.

16.1.5 Eredmény értelmezése: mit mér a p-érték?

A p-érték formális definíciója itt:

p=PH0(T legalább olyan szélsőséges, mint tobs).p = P_{H_0}\left(T \text{ legalább olyan szélsőséges, mint } t_{\text{obs}}\right).

Szavakban: ha a nullhipotézis igaz, mekkora valószínűséggel kapnánk a megfigyelttel legalább egyezően szélsőséges statisztikát? A kis példában ptwo=1/3p_{\text{two}}=1/3 nem azt mondja, hogy a nullhipotézis igazságának valószínűsége 1/31/3, hanem azt, hogy a nullmodell alatt a lehetséges újrafelosztások harmada ilyen szélsőséges.

Az α\alpha szignifikanciaszint (significance level) egy előre rögzített döntési küszöb. Ha p<αp < \alpha, a nullhipotézist elutasítjuk; ha p≥αp \ge \alpha, nem utasítjuk el. Az α\alpha tehát nem a p-értékből utólag képzett érték, hanem a hibavédelem specifikációja.

A kétféle döntési hiba:

Döntés H0H_0 igaz H1H_1 igaz
Elutasít I. típusú hiba, valószínűsége legfeljebb α\alpha helyes döntés
Nem utasít el helyes döntés II. típusú hiba, valószínűsége β\beta

A Monte Carlo p-értéknek saját közelítési hibája van. Ha a p nagyságrendje 0,010{,}01, akkor a standard hiba közelítőleg p(1−p)/B≈0,001\sqrt{p(1-p)/B}\approx 0{,}001, tehát a harmadik tizedesjegy már bizonytalan. A statisztikai bizonytalanság és a szimulációs bizonytalanság tehát külön jelentésre kerül, ahogyan Predikciós, paraméter- és Monte Carlo intervallum alfejezetben is szétválasztottuk. A jelen példa döntését a p-érték tartománya, nem a tizedesjegyek finomsága befolyásolja.

Feltétel: a csoportcímkék újrakeverése a randomizáció kiosztási mechanizmusát utánozza. A Fisher-féle egzakt randomizációs teszt szigorú, minden egyedre nulla kezelési hatást megfogalmazó sharp null mellett egzakt. Az átlagos hatás nulla önmagában nem ugyanaz a hipotézis; heterogén hatásoknál a naiv permutáció érvényessége külön indoklást igényel.

16.1.6 Feladatok

  1. Értelmezés. Egy elemző ezt írja: „A p-érték 0,03, tehát 3% annak a valószínűsége, hogy a kezelésnek nincs hatása.” Melyik állítás igaz?

    1. Ez helyes.
    2. Ez nem helyes: a p-érték a nullmodell alatti feltételes valószínűsége annak, hogy a statisztika legalább ilyen szélsőséges.
    3. Ez nem helyes: a p-érték a hatásnagyság alsó korlátja.
  2. Megvalósítás. Írjon függvényt, amely a kis példa {0,0,1,1}\{0,0,1,1\} adatán a teljes permutációs eloszlásból felső egyoldali p-értéket ad, ha a megfigyelt treatment-kontroll különbség 11. Ellenőrizze az invariánsokat: 0≤p≤10 \le p \le 1, és a p-érték összege a felső farok valószínűségeivel konzisztens.

  3. Hibadiagnózis. Az alábbi kód a laboros kétoldali tesztet próbálja megvalósítani. Mi a hiba, ha a megfigyelt különbség pozitív?

    p_wrong = 1 - np.mean(null_diffs >= observed_diff)

    A null_diffs a permutációs statisztikák tömbje. Adjon ellenpéldát a kis példa null_diffs = [-1, 0, 0, 0, 0, 1] tömbjével és observed_diff = 1 értékkel, majd adja meg a helyes egyoldali p-értéket.

  4. Transzfer megváltozott feltételre. Tegyük fel, hogy a kis példa minden megfigyelését megduplázzuk: a kontroll kimenetei (0,0,0,0)(0,0,0,0), a treatment kimenetei (1,1,1,1)(1,1,1,1) lesznek. A megfigyelt különbség továbbra is 11. Hány lehetséges felosztás van, és mennyi a kétoldali p-érték? Vesse össze az eredeti p-értékkel. Mit mutat ez a p-érték és a hatásméret viszonyáról?

  5. Szimulációs ellenőrzés. Tiszta nullmodellben, nt=nc=50n_t=n_c=50 és p=0,4p=0{,}4 Bernoulli-kimenettel, szimuláljon 1000 kísérletet. Minden kísérletben számítsa ki a T=p̂t−p̂cT=\hat p_t-\hat p_c statisztikát, és döntsön egy szabályos kétoldali z-próbával α=0,05\alpha=0{,}05 mellett. Az I. típusú hibák aránya milyen érték körül várható? Adja meg a várható arány Monte Carlo standard hibáját is: 0,05⋅0,95/1000≈0,0069\sqrt{0{,}05\cdot 0{,}95/1000}\approx 0{,}0069.

16.1.7 Megoldások és indoklás

  1. A helyes válasz b. A p-érték feltételes valószínűség: feltétele a nullmodell, nem pedig a nullhipotézis igazságának valószínűségét méri. A p-érték nem hatásnagyság és nem is annak alsó korlátja.

  2. Egy lehetséges függvény:

    def exact_upper_p(y, n_t, observed_diff):
        from itertools import combinations
        import numpy as np
        null_diffs = []
        for idx in combinations(range(len(y)), n_t):
            mask = np.zeros(len(y), dtype=bool)
            mask[list(idx)] = True
            null_diffs.append(y[mask].mean() - y[~mask].mean())
        null_diffs = np.array(null_diffs)
        return np.mean(null_diffs >= observed_diff)
    
    print(exact_upper_p(np.array([0, 0, 1, 1]), 2, 1.0))  # 0.166666...

    Ellenőrzés: a p-érték nemnegatív és legfeljebb 1, mert gyakorisági arány. A felső farok a háromféle null-érték közül csak az 11-eket foglalja magába: 1/61/6.

  3. A hiba az, hogy 1 - np.mean(null_diffs >= observed_diff) a P(T<tobs)P(T < t_{\text{obs}}) valószínűséget becsli, nem a felső farok valószínűségét. A kis példában np.mean(null_diffs >= 1) = 1/6, ezért p_wrong = 5/6 ≈ 0,8333, ami azt sugallná, hogy az extrém megfigyelés a nullmodell alatt nagyon gyakori; valójában a helyes felső p 1/61/6. A kód a farok komplementerét számolja.

  4. A nyolc megfigyelt érték {0,0,0,0,1,1,1,1}\{0,0,0,0,1,1,1,1\} közül a treatment csoport négy elemet kap; ez (84)=70\binom{8}{4}=70 felosztás. A treatment csoport maximális átlaga akkor jön létre, ha mind a négy 1-es a treatmentbe kerül; ez egyetlen felosztás. A minimális átlag ugyanilyen, amikor minden 1-es a kontrollba kerül. A megfigyelt abszolút eltérés 11, ezért a kétoldali p-érték

    ptwo=PH0(|T|≥1)=270=135≈0,0286.p_{\text{two}} = P_{H_0}(|T|\ge 1) = \frac{2}{70} = \frac{1}{35} \approx 0{,}0286.

    Az eredeti p 1/31/3 volt. A hatásméret ugyanaz, a p mégis jelentősen csökkent, mert a nagyobb minta ugyanakkora eltérést már kevésbé tart valószínűnek a nullmodell alatt. A p-érték tehát a minta nagyságát és a hatást együtt tükrözi, nem önmagában a hatás nagyságát.

  5. Az 1000 szimulációból α=0,05\alpha=0{,}05 mellett körülbelül 50 elutasítás várható; a tapasztalt arány szórása közelítőleg 0,00690{,}0069, ezért egy 0,04 és 0,06 közötti arány még konzisztens a névleges 0,05 szinttel. Előre rögzített magvet használva a tapasztalt arány ismételhető. Ellenőrző invariáns, hogy a z-statisztika a nullmodell alatt közelítőleg standard normális, ahol z=tobs/p̂(1−p̂)(1/nt+1/nc)z = t_{\text{obs}} / \sqrt{\hat p(1-\hat p)(1/n_t+1/n_c)} a közös becsült aránnyal. A becsült I. típusú arány például 0,052, 0,048 vagy 0,055 közeli érték lehet; a pontos érték a szimulátor megvalósításától függ.

16.1.8 Gyakori tévedés, visszautalás és önellenőrzés

A leggyakoribb tévedés: a p-érték nem a nullhipotézis igazságának valószínűsége. A gyakorisági keretben a nullhipotézis nem kap valószínűséget; a p-érték feltétele az, hogy a nullmodell igaz. Ha p=0,04p=0{,}04, nem mondható, hogy „4% eséllyel nincs hatás”. Helyesen: a nullmodell és az alkalmazott mintavételi/hozzárendelési eljárás feltételezése mellett a megfigyelttel legalább ennyire szélsőséges tesztstatisztika valószínűsége 4%.

Ehhez kapcsolódik a második csapda: a nem szignifikáns eredmény nem automatikus egyenértékűség. A kis példában tobs=1t_{\text{obs}}=1 nagy hatásnak látszik, mégis p=1/3p=1/3, mert a minta kicsi. A „nem találtunk különbséget” állítás itt téves lenne; csak annyi igaz, hogy ez a minta nem adott elég erős bizonyítékot a nullmodell ellen. A hatásméretet és a bizonytalanságot a p-érték mellett mindig jelenteni kell.

Visszautalás Paraméter, becslő és likelihood alfejezetre: a likelihood a paraméter függvényében nézte az adatot; itt ezzel szemben egy rögzített nullparaméter alatt nézzük a statisztika feltételes eloszlását. Mindkettő feltételes gondolkodás, csak az irány más. Visszautalás Predikciós, paraméter- és Monte Carlo intervallum alfejezetre: a Monte Carlo p-érték kvantilis-bizonytalansága külön becslési bizonytalanság, nem szabad a nullhipotézis bizonytalanságaként kezelni.

Önellenőrző kérdések:

Ha mindhárom kérdésre a feltételes valószínűség nyelvén tud válaszolni, akkor a nullmodell és a p-érték viszonya stabil. A következő alfejezet a tesztválasztást és a hatásméretet kapcsolja a p-értékhez, hogy a döntés ne csak szignifikanciáról, hanem gyakorlati jelentőségről is szóljon.

16.1.9 Rövid összefoglaló

A nullhipotézis a vizsgált állítás; lehet egyszerű vagy összetett, és a randomizációs teszt külön feltételeket igényel. a tesztstatisztika a minta előre definiált függvénye. A p-érték annak feltételes valószínűsége, hogy a nullmodell alatt legalább ilyen szélsőséges statisztikát kapunk. Az α\alpha küszöb előre rögzíti a maximális I. típusú hibát, míg a II. típusú hiba az erővel függ össze. A p-érték nem a nullhipotézis igazságának valószínűsége, a nem szignifikáns eredmény pedig nem egyenértékűség. A permutációs teszt a randomizált hozzárendelést használja nullmodellként, ügyfélszintű újracímkézéssel. A laboron ez a primer konverziós különbség kétoldali p-értékét adja, amelyet hatásmérettel és a Monte Carlo hiba nagyságrendjével együtt kell jelenteni.