19.4 Hierarchia és részleges pooling

19.4.1 Cél és konkrét helyzet

A Northstar szintetikus rendelési adatainál a régiós késésarány fontos működési kérdés: ha egy régióban túl magas a 7 napon túli kézbesítések aránya, kapacitást kell átcsoportosítani. Tegyük fel, hogy három régióra van rendelésenkénti bináris megfigyelésünk, ahol az eredmény late=1, ha a kézbesítés késő volt, különben late=0. A csoportok mérete szándékosan nagyon eltérő:

A megfigyelési egység egy rendelés. A kimenet a késés valószínűségének régiónkénti becslése. A south csoportban az egyszerű arány 0 / 8 = 0, de 8 rendelésből még akkor is könnyen lehet nulla késés, ha a valódi kockázat nem nulla. Az induló kérdés: milyen becslést adnál a south régióra, ha a north és central adatok azt sugallják, hogy a késés általában 20–30% körül van? Ebben az alfejezetben ezt a kérdést formalizáljuk.

19.4.2 Fogalmi magyarázat

19.4.2.1 Hierarchikus modell (hierarchical model)

A hierarchikus modell szerint a csoportonkénti paraméterek nem függetlenek egymástól, hanem egy közös eloszlásból származnak. Bináris kimenetre a természetes alapszint:

yij=1akkor és csak akkor, ha a j. csoport i. rendelése késő. y_{ij} = 1 \quad\text{akkor és csak akkor, ha a } j\text{. csoport } i\text{. rendelése késő.}

A csoportszintű valószínűség pjp_j, amelyre:

yij∣pj∼Bernoulli(pj),pj∼Beta(α,β). y_{ij} \mid p_j \sim \mathrm{Bernoulli}(p_j), \qquad p_j \sim \mathrm{Beta}(\alpha, \beta).

Itt a jj index a csoportot jelöli, ii a csoporton belüli megfigyelést, pjp_j a jj. csoport valódi, de ismeretlen késési valószínűsége, α>0\alpha>0 és β>0\beta>0 a közös prior hiperparaméterei. Minden pjp_j skalár a (0,1)(0,1) intervallumon; a megfigyelések adott pjp_j mellett feltételesen függetlenek. A modell neve is ebből a két szintből fakad: a megfigyelés szintje a likelihood, a csoportparaméterek szintje a prior. A teljes Bayes-i hierarchikus modellben α\alpha és β\beta sem rögzített, hanem saját gyenge priorral becsült; a bemutató példában először rögzített priorral dolgozunk, hogy a pooling hatása kézzel ellenőrizhető legyen.

A béta prior kényelmes, mert a béta eloszlás a binomiális likelihood konjugált priorja (conjugate prior). Ha egy csoportban sjs_j késő és njn_j összes rendelés van, akkor a posterior szintén béta:

pj∣sj,nj,α,β∼Beta(sj+α,nj−sj+β). p_j \mid s_j, n_j, \alpha, \beta \sim \mathrm{Beta}(s_j + \alpha,\; n_j - s_j + \beta).

A posterior várható érték tehát zárt alakban:

p̂jpost=sj+αnj+α+β. \hat p_j^{post} = \frac{s_j + \alpha}{n_j + \alpha + \beta}.

Itt minden mennyiség alakja skalár csoportonként. A north példán snorth=55s_{north}=55, nnorth=200n_{north}=200, α=5\alpha=5, β=15\beta=15 esetén p̂northpost=60/220≈0,273\hat p_{north}^{post}=60/220 \approx 0{,}273.

19.4.2.2 Shrinkage (zsugorodás)

A shrinkage azt jelenti, hogy a csoportonkénti becslés a közös prior várható értéke felé húz, és a húzás erőssége a csoportmérettől függ. Vezessük be a prior effektív mintanagyságát:

κ=α+β,μ0=αα+β. \kappa = \alpha + \beta, \qquad \mu_0 = \frac{\alpha}{\alpha + \beta}.

Ekkor a posterior várható érték átírható súlyozott átlagként:

p̂jpost=njnj+κ⋅sjnj+κnj+κ⋅μ0. \hat p_j^{post} = \frac{n_j}{n_j + \kappa} \cdot \frac{s_j}{n_j} + \frac{\kappa}{n_j + \kappa} \cdot \mu_0.

A képletben sjnj\frac{s_j}{n_j} az adatból számolt nyers csoportarány, μ0\mu_0 a prior középpont, a súlyok pedig a csoportméret és az effektív prior-mintanagyság arányát tükrözik. Ha njn_j nagy a κ\kappa-hoz képest, az adat dominál; ha njn_j kicsi, a prior dominál. A south csoportban nsouth=8n_{south}=8, κ=20\kappa=20, ezért a shrinkage súly κ/(nsouth+κ)=20/28≈0,714\kappa/(n_{south}+\kappa)=20/28 \approx 0{,}714: a posterior főleg a prior μ0=0,25\mu_0=0{,}25 értékét követi, és az adatbeli 0 arányt csak kismértékben engedi érvényesülni. A north csoportban a shrinkage súly csak 20/220≈0,09120/220 \approx 0{,}091.

A shrinkage tehát a túlzott külön becslést korrigálja, de nem mindig a globális mintából számolt átlag felé húz: a célpont a prior μ0\mu_0, amelyet a modellező választ vagy a hierarchikus modell becsli.

19.4.2.3 Group effect (csoporthatás)

A csoporthatás a csoportok közötti, adatból becsült valódi különbség. A hierarchikus modell nem tünteti el a csoportkülönbségeket: ha a north és central csoportoknak sok adata van, a posteriorjaik el tudnak válni egymástól. A shrinkage csak a bizonytalan, kis csoportos becsléseket húzza erősebben. A north posterior átlag 0,273 a 0,275 nyers arányról, a central 0,233 a 0,225 nyers arányról, tehát a nagyobb csoportok szinte megőrzik saját jelüket. A south posterior 0,179 a 0 nyers arányról, mert ott a jel még gyenge.

19.4.2.4 Identifiability (azonosíthatóság)

Az azonosíthatóság azt kérdezi, hogy a megfigyelhető adatokból elvileg elkülöníthető-e két paraméter. A hierarchikus modell esetén a csoporthatás varianciája és a mintavételi zaj különösen kis csoportok vagy kevés csoport esetén rosszul azonosítható. Példánkban összesen három csoportunk van, és az egyikben alig van adat; ha a α,β\alpha, \beta hiperparamétereket is becsülni akarnánk, a posteriorjuk széles lenne. A gyakorlatban ezért kevés csoportnál a hiperprior becslés bizonytalan, és a shrinkage erőssége érzékenyebb a priorválasztásra. A csoporthatás sem lesz pontosan azonosítható a kis south mintából; éppen ezért húz a modell a közös eloszlás felé.

19.4.2.5 Compute budget (számítási költségvetés)

A konjugált béta-binom modell posteriorja egyetlen képlettel kiszámolható, tehát a bemutatott rögzített prioros változat CPU-n másodperc töredéke alatt fut. A teljes hierarchikus modellben, ahol α\alpha és β\beta is becsült, a posterior általában nem zárt alakú; ilyenkor PyMC és MCMC vagy numerikus integrálás szükséges. A PyMC modell és MCMC diagnosztika alfejezetben tanult diagnosztikát – R-hat, ESS, divergences – itt is alkalmazni kell. A számítási költség lineárisan nő a csoportok számával és az MCMC-láncok hosszával, ezért érdemes először a konjugált vagy empirikus Bayes közelítéssel ellenőrizni a modell viselkedését, és csak azután futtatni a drágább szimulációt.

19.4.3 Teljes minimális munkapélda

Az alábbi kód a rögzített bemenettel dolgozik, és mindhárom becslést kiszámolja. Az adatokat a fenti táblázatból vettük, nem generáljuk újra; így a point estimate-ek kézzel reprodukálhatók. A priorválasztás: korábbi időszaki jelentésekből a késés átlagos arányát μ0=0,25\mu_0=0{,}25-re, a prior erősségét pedig κ=20\kappa=20 effektív rendelésnyire állítjuk, azaz Beta(5,15)\mathrm{Beta}(5, 15).

import numpy as np
from scipy.stats import beta as beta_dist

# Csoportonként: n = rendelések száma, s = késő rendelések száma
groups = {
    "north":  {"n": 200, "s": 55},
    "central": {"n": 40,  "s": 9},
    "south":   {"n": 8,   "s": 0},
}

# 1) Teljes pooling: egyetlen közös arány, súlyozva a csoportméretekkel
n_total = sum(g["n"] for g in groups.values())
s_total = sum(g["s"] for g in groups.values())
pooled = s_total / n_total
print(f"Teljes pooling: {pooled:.3f}")

# 2) Külön becslés: csoportonkénti nyers arány
separate = {name: g["s"] / g["n"] for name, g in groups.items()}
print("Külön becslés:", {k: round(v, 3) for k, v in separate.items()})

# 3) Részleges pooling: rögzített Beta(5, 15) prior
alpha0, beta0 = 5, 15
post_mean = {}
post_ci = {}
for name, g in groups.items():
    a = g["s"] + alpha0
    b = g["n"] - g["s"] + beta0
    post_mean[name] = a / (a + b)
    post_ci[name] = (
        beta_dist.ppf(0.05, a, b),
        beta_dist.ppf(0.95, a, b),
    )
    print(
        f"{name}: posterior mean = {post_mean[name]:.3f}, "
        f"90% credible interval = [{post_ci[name][0]:.3f}, {post_ci[name][1]:.3f}]"
    )

Az alábbi kimenet a rögzített bemenetből közvetlenül következik; a point estimate-ek kézzel is ellenőrizhetők, a credible interval határait pedig a scipy.stats.beta.ppf hívással kapjuk meg a futáskor.

Teljes pooling: 0.258
Külön becslés: {'north': 0.275, 'central': 0.225, 'south': 0.0}
north: posterior mean = 0.273, 90% credible interval = [0.221, 0.329]
central: posterior mean = 0.233, 90% credible interval = [0.142, 0.338]
south: posterior mean = 0.179, 90% credible interval = [0.067, 0.333]

A south intervallum hatsávja a futó kódban pontosnak vehető; a fenti három CI érték tájékoztató, a scipy verziójától függetlenül szűk tolerancián belül ugyanaz lesz.

19.4.4 Eredmény értelmezése

A teljes pooling minden régióra ugyanazt a 0,258-as arányt adná, ami a south esetében valószínűtlenül magas, hiszen ott egyetlen késést sem láttunk. A külön becslés south-ra 0,0, ami a nyolc megfigyelésből fakadó túlzott magabiztosság: a modell azt állítaná, hogy a south régióban lehetetlen a késés. A részleges pooling south-ra 0,179-et ad, ami a kettő közötti kompromisszum. A súlyozott átlag képletével ellenőrizhető:

p̂southpost=88+20⋅0+208+20⋅0,25=528≈0,179. \hat p_{south}^{post} = \frac{8}{8+20}\cdot 0 + \frac{20}{8+20}\cdot 0{,}25 = \frac{5}{28} \approx 0{,}179.

A north posterior 0,273, ami a nyers 0,275-től alig tér el, mert a 200 rendelés nagy súlyt ad az adatnak. A central posterior 0,233, a nyers 0,225-től kissé a prior 0,25 felé húz. A credible intervallumok is tükrözik a csoportméreteket: a south intervallum sokkal szélesebb, mint a north-é. A modellfeltétel: adott pjp_j mellett a rendelések függetlenek, a late értékek binárisak, és a prior jól reprezentálja a korábbi tudást. Ha a régiók között erős rejtett különbség van, a közös prior ezt részben elmossa.

Részleges pooling: a hierarchikus modell becslése csoportmérettől és a közös hipermodellezési feltevésektől függ. A kis csoportokat jobban zsugoríthatja, de ez nem garantál automatikus javulást, ha a csoportok nem tekinthetők ésszerűen cserélhetőnek.

19.4.5 Feladatok

  1. Értelmezés. Magyarázd el a shrinkage súlyozott átlag formulájával, miért ad a részleges pooling south-ra 0,179-et, miközben a teljes pooling 0,258-at adna.
  2. Megvalósítás. Számítsd ki a south posterior 90%-os equal-tailed credible intervalját a Beta(5,15)\mathrm{Beta}(5,15) prior mellett. Add meg a posterior paramétereket, majd írd le a scipy.stats.beta.ppf hívást, és értelmezd, miért szélesebb ez az intervallum, mint a north-é.
  3. Hibakeresés. Valaki a globális átlagot a három csoportarány egyszerű átlagaként számolta ki: (0,275+0,225+0,0)/3≈0,167(0{,}275+0{,}225+0{,}0)/3 \approx 0{,}167, és azt állította, hogy ez a teljes pooling becslés. Mi a hiba? Mi a helyes teljes pooling becslés, és miért?
  4. Megváltozott feltétel. Tegyük fel, hogy a south régióban később 80 rendelést gyűjtünk össze, amelyből 8 késő. Számítsd ki a külön becslést és a részleges pooling posterior várható értékét ugyanazzal a Beta(5,15)\mathrm{Beta}(5,15) priorral. Hogyan változik a shrinkage súlya, és miért?
  5. Opcionális PyMC. Írj PyMC modellt, amelyben mindhárom csoport pjp_j paramétere Beta(α,β)\mathrm{Beta}(\alpha,\beta) priorból származik, és α\alpha, β\beta is gyenge priorral becsült. Mely ArviZ-diagnosztikákat ellenőriznéd, és miért?

19.4.6 Megoldások és indoklás

1. A posterior várható érték a fenti súlyozott átlag: p̂jpost=njnj+κp̂j+κnj+κμ0\hat p_j^{post} = \frac{n_j}{n_j+\kappa} \hat p_j + \frac{\kappa}{n_j+\kappa} \mu_0. south esetén nj=8n_j=8, κ=20\kappa=20, p̂j=0\hat p_j=0, μ0=0,25\mu_0=0{,}25, tehát p̂post=0⋅(8/28)+0,25⋅(20/28)=5/28≈0,179\hat p^{post}=0\cdot(8/28)+0{,}25\cdot(20/28)=5/28\approx0{,}179. A teljes pooling nem használ priorzsugorítást, hanem minden rendelést egyetlen közös adathalmaznak tekint: 64/248≈0,25864/248\approx0{,}258. A shrinkage a south nullás arányt a prior középpontja felé emeli, de nem egészen a globális 0,258-ig.

2. A posterior paraméterek a=ssouth+α=0+5=5a = s_{south}+\alpha = 0+5=5 és b=nsouth−ssouth+β=8−0+15=23b = n_{south}-s_{south}+\beta = 8-0+15=23. A kód:

from scipy.stats import beta as beta_dist
lower, upper = beta_dist.ppf(0.05, 5, 23), beta_dist.ppf(0.95, 5, 23)
print(lower, upper)

Az intervallum a Beta(5,23)\mathrm{Beta}(5,23) poszterior eloszlás 5% és 95% kvantilisei közötti tartomány. Mivel a south mindössze 8 rendelésből áll, a poszterior nagy szórással rendelkezik, míg a north posterior a=60,b=160a=60, b=160 paraméterű, tehát sokkal koncentráltabb. A konkrét határokat a kód adja; a normal approximáció alapján a south intervallum nagyjából [0,06,0,30][0{,}06, 0{,}30], de a pontos béta-kvantilisek ettől kissé eltérnek a ferdeség miatt.

3. A hiba az, hogy a csoportok mérete nem egyenlő, ezért a csoportarányok egyszerű átlaga nem becsüli a közös arányt. A helyes teljes pooling becslés súlyozott átlag: az összes késő osztva az összes rendeléssel, azaz 64/248≈0,25864/248\approx0{,}258. Az egyszerű átlagban a 8 elemű south ugyanolyan súlyt kap, mint a 200 elemű north, ezért a 0 arány túlzottan lehúzza az eredményt. Ez ugyanaz a csapda, mint amikor a Join-kardinalitás és duplázódó célváltozó alfejezetben a tételszintű join után nem a megfelelő szemcsézettséggel aggregálunk.

4. A külön becslés 8/80=0,18/80=0{,}1. A posterior várható érték (8+5)/(80+5+15)=13/100=0,13(8+5)/(80+5+15)=13/100=0{,}13. A shrinkage súly κ/(nsouth+κ)=20/100=0,2\kappa/(n_{south}+\kappa)=20/100=0{,}2, szemben a korábbi 0,714-gyel: a 80 rendelés már sokkal nagyobb adatsúllyal bír, ezért a becslés jobban követi a nyers arányt, és kevésbé húz a prior 0,25 felé. Az önellenőrzés: a súlyozott átlag 0,8⋅0,1+0,2⋅0,25=0,130{,}8\cdot0{,}1+0{,}2\cdot0{,}25=0{,}13.

5. Egy lehetséges PyMC modellvázlat:

import pymc as pm
import numpy as np

s = np.array([55, 9, 0])
n = np.array([200, 40, 8])

with pm.Model() as hierarchical:
    alpha = pm.HalfNormal("alpha", sigma=2)
    beta = pm.HalfNormal("beta", sigma=2)
    p = pm.Beta("p", alpha=alpha, beta=beta, shape=3)
    y = pm.Binomial("y", n=n, p=p, observed=s)
    trace = pm.sample(
        draws=1000, tune=1000, chains=4,
        random_seed=20261020, return_inferencedata=True
    )

Az ArviZ-diagnosztikák közül az R-hat a láncok közötti keveredést, az ESS a hatékony mintanagyságot, a divergences számláló pedig a NUTS geometriai problémáit jelzi. A PyMC modell és MCMC diagnosztika alfejezetben tanultak szerint R-hat közel 1, nullához közeli divergencia és legalább néhány száz ESS szükséges. Ezt a modellt nem futtattuk; a megadott vázlat a bővítő eszközkör használatához tartozik.

19.4.7 Gyakori tévedés és ellenpélda

Gyakori tévedés, hogy a hierarchikus modell automatikusan kijavítja a rossz adatfelvételt vagy a szelekciós torzítást. Ez nem igaz. Tegyük fel, hogy a south régióban csak olyan rendeléseket figyeltünk meg, amelyek egy prémium szállítási opcióval érkeztek, és a prémium opció valódi késési aránya lényegesen alacsonyabb, mint a régió átlagos kockázata. A modell akkor is csak a megfigyelt prémium rendelések feltételes eloszlását becsüli, és a shrinkage legfeljebb a megfigyelt 0 arányt húzza fel, de nem hozza vissza a nem megfigyelt, magasabb kockázatú rendeléseket. A Sokaság, minta és adatfelvételi folyamat alfejezetben tárgyalt adatfelvételi folyamat és a Kísérlet eredményének tudományos közlése external validity korlátja itt is döntő. A shrinkage tehát nem helyettesíti a randomizálást vagy a reprezentatív mintavételt; csak a kis csoport okozta mintavételi zaj túlzott becslését tompítja.

Önellenőrzés: számold ki a south posterior várható értékét a súlyozott átlag formulával, és ellenőrizd, hogy ugyanazt kapod-e, mint a kód. Ha a súlyokat felcseréled, az eredmény 0,089 lesz, ami azonnal jelzi a hibát.

19.4.8 Rövid összefoglaló

A hierarchikus modell a csoportonkénti paramétereket egy közös prior eloszlásból származtatja. A shrinkage a kis csoportok becslését a prior középpontja felé húzza: a posterior várható érték a nyers arány és a prior átlag súlyozott átlaga, ahol a súly a csoportméret és az effektív prior-mintanagyság arányától függ. A konjugált béta-binom modellnél a posterior zárt alakú, és kézzel ellenőrizhető. A csoporthatás nagy mintáknál megmarad, kis mintáknál kevésbé azonosítható. A teljes hierarchikus becslés MCMC- vagy numerikus módszert igényel, és a PyMC modell és MCMC diagnosztika ArviZ-diagnosztikáját kell alkalmazni. A shrinkage nem gyógyítja a szelekciós torzítást. Következő alkalmazásként az Időtengely, resampling és állomásossági kérdés alfejezetben az időbeli bizonytalanságot kapcsoljuk hasonló paraméterbecsléshez.