14.1 Esemény, feltételes valószínűség és Bayes

14.1.1 Cél és konkrét helyzet

Egy logisztikai elemzőcsoport automatikus késésriasztó szabályt értékel. A megfigyelési egység egy leadott rendelés; a vizsgált 10 000 rendelés mindegyike pontosan egyszer szerepel. A döntéshozó a rendelés pillanatában látja a riasztást, a tényleges késés azonban csak később derül ki. Ezért a riasztó jele a predikció pillanatában ismert bemenet, a tényleges késés pedig a Kérdés, célváltozó és döntési helyzet alfejezetben megtanult értelemben utólag megfigyelt célváltozó. A bemeneti adat itt két bináris változó rendelésenként:

Az alábbi értékeléshez a valós késés alaparánya (base rate) 1%, tehát a 10 000 rendelésből várhatóan 100 késik. A riasztó érzékenysége (sensitivity) 90%: a valóban késő rendelések 90%-án jelez. A specificitása (specificity) 95%: a nem késő rendelések 95%-án nem jelez, tehát 5%-án tévesen riaszt. A kérdés: ha a rendszer pozitívan riaszt, mekkora annak a feltételes valószínűsége, hogy a rendelés tényleg késni fog? Előzetes becslésként sokan a 90%-ra tippelnek, mert a riasztó érzékenysége 90%. A kézi táblázatból látni fogjuk, hogy a helyes válasz ennél sokkal kisebb. A példa darabszámai tankönyvi paraméterek, nem a lab/orders.csv fájlból számított mért statisztika.

14.1.2 Fogalmi magyarázat: eseménytér, együttes, feltételes, függetlenség, alapgyakoriság, Bayes

Eseménytér (sample space). Egy kísérlet összes lehetséges kimenetének halmaza. Egy szabályos kockadobásnál ez {1,2,3,4,5,6}\{1,2,3,4,5,6\}. A rendeléses példában minden rendelés négy elemi kimenet egyikébe esik:

Az eseménytér teljes: minden rendelés pontosan egy cellában van.

Együttes valószínűség (joint probability). Két esemény együttes bekövetkezésének valószínűsége: P(L∩+)P(L \cap +). Darabszámokból:

P(L∩+)=N(L∩+)N,P(L \cap +) = \frac{N(L \cap +)}{N},

ahol N(L∩+)N(L \cap +) a metszetbe eső rendelések száma, NN az összes rendelés száma. A jelölések mindvégig: NN pozitív egész darabszám, a valószínűségek dimenziótlan számok 0 és 1 között. A példánk várható cellái:

Cell LL ¬L\neg L Sorösszeg
++ 90 495 585
¬+\neg + 10 9405 9415
Oszlopösszeg 100 9900 10 000

A darabszámok onnan jönnek: a 100 késés 90%-a, azaz 90 kap riasztást; a 9900 nem késés 5%-a, azaz 495 kap téves riasztást. Így az együttes gyakoriságok: P(L∩+)=90/10000=0,009P(L \cap +)=90/10000=0{,}009; P(¬L∩+)=495/10000=0,0495P(\neg L \cap +)=495/10000=0{,}0495.

Feltételes valószínűség (conditional probability). Az AA esemény valószínűségét egy másik, BB eseményre szűkített részsokaságon nézzük:

P(A∣B)=P(A∩B)P(B)=N(A∩B)N(B),P(A \mid B) = \frac{P(A \cap B)}{P(B)} = \frac{N(A \cap B)}{N(B)},

feltéve, hogy P(B)>0P(B)>0. A függőleges vonal mögötti esemény a feltétel: ez határozza meg a nevezőt. A példában P(+∣L)=90/100=0,90P(+\mid L)=90/100=0{,}90, ez az érzékenység. A kérdésünk viszont a másik irány: P(L∣+)=90/585≈0,1538P(L \mid +)=90/585 \approx 0{,}1538. Ugyanaz a metszet, de más a feltétel, ezért más a nevező.

Függetlenség (independence). Az AA és BB események akkor függetlenek, ha

P(A∩B)=P(A)P(B),P(A \cap B) = P(A)\,P(B),

vagy ha P(B)>0P(B)>0, akkor ekvivalensen P(A∣B)=P(A)P(A \mid B)=P(A). Tehát a BB-re szűkítés nem változtatja AA esélyét. Ellenpélda egy szabályos kockánál: legyen AA = páros dobás, BB = 6-nál kisebb dobás. Ekkor P(A)=3/6=1/2P(A)=3/6=1/2, P(B)=5/6P(B)=5/6, de P(A∩B)=P({2,4})=2/6=1/3P(A \cap B)=P(\{2,4\})=2/6=1/3, míg P(A)P(B)=5/12≠1/3P(A)P(B)=5/12 \neq 1/3, tehát a két esemény nem független. A riasztó példánkban LL és ++ szándékosan nem függetlenek: a szabály éppen azért létezik, hogy a ++ jel megváltoztassa a késésre vonatkozó bizonytalanságunkat.

Alapgyakoriság (base rate). Ez a feltétel nélküli, előzetes valószínűség: P(L)=0,01P(L)=0{,}01. A ritka eseményeknél ez a nevezőben megbúvó domináns tényező. A Hiány és anomália mint vizsgálati kérdés alfejezetben a feltételes hiányzási arányok hasonló logikával működtek: a feltétel megválasztása mindig a nevezőt jelöli ki.

Bayes-formula. A két irányú feltételes valószínűséget köti össze. Darabszámokból levezethető. Induljunk a definíciókból:

P(L∣+)=N(L∩+)N(+)=N(L)P(+∣L)N(+)=P(+∣L)P(L)P(+).P(L \mid +) = \frac{N(L \cap +)}{N(+)} = \frac{N(L)\,P(+\mid L)}{N(+)} = \frac{P(+\mid L)\,P(L)}{P(+)}.

A nevező a teljes eseménytér felbontásából áll elő, mert minden pozitív riasztás vagy késő, vagy nem késő rendelésre esik:

P(+)=P(+∣L)P(L)+P(+∣¬L)P(¬L).P(+) = P(+\mid L)\,P(L) + P(+\mid \neg L)\,P(\neg L).

Behelyettesítve:

P(L∣+)=P(+∣L)P(L)P(+∣L)P(L)+P(+∣¬L)P(¬L)=0,90⋅0,010,90⋅0,01+0,05⋅0,99=0,0090,0585=213≈0,1538.P(L \mid +) = \frac{P(+\mid L)\,P(L)} {P(+\mid L)\,P(L)+P(+\mid \neg L)\,P(\neg L)} = \frac{0{,}90 \cdot 0{,}01}{0{,}90 \cdot 0{,}01 + 0{,}05 \cdot 0{,}99} = \frac{0{,}009}{0{,}0585} = \frac{2}{13} \approx 0{,}1538.

Az utolsó lépés kézi törtekkel is követhető: 0,009=9/10000{,}009 = 9/1000, 0,0585=585/100000{,}0585 = 585/10000, a hányados 90/58590/585, egyszerűsítve 2/132/13. A táblázat ugyanezt adja darabszámokból.

Pozitív riasztások összetétele 10 000 rendelésnél - Számított várható darabszámok: 0 = valódi késés, 1 = hamis riasztás. Nem mért adat.

14.1.3 Teljes minimális munkapélda

A példát a projektgyökérből futtatjuk, a scripts/s053_bayes_screen.py fájlból. A kód a NumPy 2.x default_rng interfészét használja; a scipy.stats csomagot itt még nem hívjuk, mert a Véletlen változó és gyakori eloszlásmodellek alfejezettől kezdjük majd az eloszlásmodelleket használni, most elegendő a generátor és a darabszámos összegzés. A generálás rögzített seeddel reprodukálható ugyanazon a NumPy-verzión; a PCG64 seed azonban nem garantál bitazonosságot minden platformon és verziókombinációban.

# scripts/s053_bayes_screen.py
import numpy as np

rng = np.random.default_rng(20261020)
n = 10_000
prevalence = 0.01
sensitivity = 0.90
specificity = 0.95

# A valós késés bináris tömbje, shape (n,), dtype bool.
actual_late = rng.random(n) < prevalence

# A riasztó döntése: késés esetén sensitivity eséllyel,
# nem késés esetén (1 - specificity) eséllyel lesz pozitív.
positive_alert = np.where(
    actual_late,
    rng.random(n) < sensitivity,
    rng.random(n) < (1.0 - specificity),
)

tp = int(np.sum(actual_late & positive_alert))
fn = int(np.sum(actual_late & ~positive_alert))
fp = int(np.sum(~actual_late & positive_alert))
tn = int(np.sum(~actual_late & ~positive_alert))

print(f"TP={tp} FN={fn} FP={fp} TN={tn}")
print(f"P(alert)={ (tp + fp) / n:.5f}")
print(f"P(late given alert)={tp / (tp + fp):.5f}")

# Elméletileg várt darabszámok:
# TP=0.01*0.90*10000=90, FN=10, FP=0.99*0.05*10000=495, TN=9405
# Elméleti posterior: 90/(90+495)=2/13 ≈ 0.1538

A futtatási parancs Linux/macOS terminálban vagy Windows PowerShellben, munkakönyvtárnak a projektgyökeret választva:

uv run python scripts/s053_bayes_screen.py

A kód automatikusan még nem ellenőrzött, ezért pontos futási kimenetet nem közlünk. A kommentben szereplő értékek a paraméterekből levezetett elméletileg várt darabszámok. A tényleges szimuláció ettől néhány tucatnyi eltérést mutat, mert a seed véletlen mintát húz.

14.1.4 Eredmény értelmezése

Az értelmezéshez a várható táblázatot használjuk, mert az nem függ a szimulációs zajtól. A kérdéses mennyiség:

P(L∣+)=90585=213≈0,1538.P(L \mid +) = \frac{90}{585} = \frac{2}{13} \approx 0{,}1538.

A riasztásoknak tehát várhatóan csak mintegy 15,4%-a valódi késés; a maradék 84,6% téves riasztás. Ez nem mond ellent annak, hogy az érzékenység 90%. Az érzékenység a késő rendelésekre mint feltételre vonatkozik, a kérdésünk viszont a riasztásra mint feltételre. A két feltételes valószínűség iránya különbözik.

Az elméleti táblázat invariáns ellenőrzései:

A szimuláció tényleges becslése csak közelíti a 2/132/13-ot. Az eltérés oka a binomiális mintavételi zaj; ennek formális standard errorját a Nagy számok és centrális határeloszlás és Bootstrap a megfelelő mintavételi egységgel tárgyalja. A mostani példában a pontos konfidenciaintervallum helyett annyit mondunk ki: a fenti seeddel és paraméterekkel a posterior tipikusan 0,14 és 0,17 között mozog, de ez nem elméleti garantált intervallum. Ha a tanuló lokálisan lefuttatja, a saját mért száma a gép, a NumPy-verzió és a seed ismeretében írható ellenőrzött mérésként; a fenti kommentbeli érték nem ilyen.

A példa a Northstar predikciós szerződésével is összhangban áll: a riasztás a rendelés pillanatában ismert, a tényleges LL pedig a kézbesítés után. Az itt használt teljes 10 000 soros kiértékelés utólagos, retrospektív elemzés; éles használat előtt időbeli splitet és label-availability szűrést kell végezni az Adatéletciklus és a predikció pillanata és későbbi fejezetek szerint.

A pozitív prediktív érték a prevalenciától függ: a teszt szenzitivitását és specificitását változatlanul hagyva más populációban más posterior valószínűséget kapunk. A riasztási küszöböt a hibák költségeivel együtt kell értelmezni.

14.1.5 Feladatok

  1. Értelmezés: magasabb alapgyakoriság. Ugyanaz a riasztó szabály egy sűrűbb időszakra kerül, ahol a késés alaparánya 5% a 10 000 rendelésen belül. Az érzékenység továbbra is 90%, a specificitás 95%. Töltse ki a négycellás táblázat várható darabszámait, és számítsa ki P(L∣+)P(L \mid +) értékét. Hasonlítsa össze az 1%-os alapgyakoriságú eredménnyel, és magyarázza el, miért változott.

  2. Implementálás: függvény a táblázatból. Írjon posterior_from_counts(tp, fn, fp, tn) függvényt, amely a négy cella abszolút darabszámából visszaadja P(L∣+)P(L \mid +) értékét. Ha a pozitív riasztások száma nulla, a függvény float("nan") értéket adjon. Tesztelje az elvárt táblázattal: posterior_from_counts(90, 10, 495, 9405) értéke 2/132/13 legyen, és tesztelje az 1. feladat táblázatával is. Mit kell a tesztben elfogadható lebegőpontos toleranciának tekinteni?

  3. Hibakeresés. Egy notebook cellában a következő kód szerepel:

p_wrong = np.sum(actual_late) / np.sum(positive_alert)
print(p_wrong)

A szerző azt állítja, hogy ez P(L∣+)P(L \mid +) becslése. Nevezze meg, mit számol valójában ez a hányados, és adja meg a helyes kódot. A várható táblázat alapján miért nem egyenlő a kettő?

  1. Megváltozott feltétel: jobb specificitás. A fejlesztőcsapat javítja a szabályt, így a specificitás 95%-ról 99%-ra nő, az érzékenység 90%, az alapgyakoriság marad 1%. Számítsa ki a várható TP, FN, FP, TN cellákat 10 000 rendelésre, és adja meg az új P(L∣+)P(L \mid +) értéket. Mennyivel csökkent a hamis riasztások aránya a pozitív jelzéseken belül? Értelmezze, miért van ekkora hatása a specificitás javításának.

14.1.6 Megoldások és indoklás

1. feladat. A 10 000 rendelésből 500 késik, 9500 nem. A késők 90%-a, azaz 450 kap riasztást: TP=450TP=450, FN=50FN=50. A nem késők 5%-a kap téves riasztást: FP=9500⋅0,05=475FP=9500 \cdot 0{,}05=475, TN=9025TN=9025. A pozitív riasztások száma 450+475=925450+475=925, tehát

P(L∣+)=450925=1837≈0,4865.P(L \mid +)=\frac{450}{925}=\frac{18}{37}\approx 0{,}4865.

Ellenőrzés a sor- és oszlopösszegekkel: 450+50=500450+50=500, 475+9025=9500475+9025=9500, 450+475=925450+475=925, 50+9025=907550+9025=9075, az összeg 10 000. Az 1%-os esethez képest a posterior 15,4%-ról 48,6%-ra nőtt, mert az alapgyakoriság ötszörösére emelésével a valódi pozitívok aránya a riasztásokon belül megnőtt: 90-ről 450-re, míg a hamis pozitívok csak kicsit csökkentek 495-ről 475-re. A ritka esemény kevésbé ritka lett, ezért a teszt pozitív eredménye erősebb bizonyítéknak bizonyult.

2. feladat. Egy lehetséges megoldás:

def posterior_from_counts(tp, fn, fp, tn):
    positive_count = tp + fp
    if positive_count == 0:
        return float("nan")
    return tp / positive_count

A teszt:

assert abs(posterior_from_counts(90, 10, 495, 9405) - 2/13) < 1e-12
assert abs(posterior_from_counts(450, 50, 475, 9025) - 18/37) < 1e-12

A tolerancia 10−1210^{-12} elegendő, mert a hányados két Python-egész osztása, a lebegőpontos kerekítés abszolút hibája ennél nagyságrendekkel kisebb; a 2/13 és a 18/37 is ugyanabban a float-reprezentációban áll elő, mint a cellák hányadosa. Az ellenőrző invariant: a négy bemenet nemnegatív egész, és a positive_count = tp + fp kell hogy legyen a pozitív sor összege; a függvény a tp / (tp + fp) arányt adja vissza. A fn és tn paraméterekre nincs szükség, de a szignatúrában hagyjuk őket, mert a teljes táblázat explicit kontroll, és a jövőben a negatív prediktív értéket is ugyanebből számítjuk.

3. feladat. A hibás kód a ∑L\sum L és ∑+\sum + arányát számolja, ami a várható táblázatban 100/585≈0,171100/585 \approx 0{,}171. Ez nem P(L∣+)P(L \mid +), mert a számláló az összes késő rendelést tartalmazza, nem csak azokat, amelyekre a riasztó is jelzett. A P(L∣+)P(L \mid +) képletében a számláló N(L∩+)N(L \cap +), a nevező N(+)N(+). A helyes kód:

p_right = (
    np.sum(actual_late & positive_alert)
    / np.sum(positive_alert)
)

A különbség forrása a 10 hamis negatív: azok a rendelések késnek, de a riasztó nem jelzett. A hibás számlálóban benne vannak, a nevezőben viszont a pozitív riasztások szerepelnek, így a kettő hányadosa nem feltételes arányt, hanem két különböző partíció méretének arányát adja. Ha a pozitív riasztások száma nulla lenne, a helyes függvény nan-t adna, a hibás változat pedig nullával osztana.

4. feladat. Az új specificitás mellett a hamis pozitív arány 1−0,99=0,011-0{,}99=0{,}01. A késők száma 100, ebből TP=90TP=90, FN=10FN=10. A nem késők száma 9900, ebből FP=99FP=99, TN=9801TN=9801. A pozitív riasztások száma 90+99=18990+99=189, így

P(L∣+)=90189=1021≈0,4762.P(L \mid +)=\frac{90}{189}=\frac{10}{21}\approx 0{,}4762.

A korábbi 15,4%-ról 47,6%-ra nőtt a posterior. A hamis riasztások aránya a pozitív jelzéseken belül korábban 495/585≈84,6%495/585 \approx 84{,}6\%, most 99/189≈52,4%99/189 \approx 52{,}4\%. A javulás mechanizmusa: a nagy létszámú nem késő csoportban a téves riasztási arány 5%-ról 1%-ra csökkent, ezért a hamis pozitívok darabszáma 495-ről 99-re esett. Mivel a valódi pozitívok száma 90, a specificitás javításával a hamis pozitívok még mindig kissé többen vannak, de a riasztás már csaknem minden másodszor igaz. A ritka eseménynél a hamis pozitív csökkentése gyakran nagyobb hatással van a posteriorra, mint az érzékenység további növelése.

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

A leggyakoribb hiba a feltétel irányának megfordítása: aki a 90%-os érzékenységből kiindulva azt mondja, hogy pozitív riasztás esetén 90% a késés esélye, az P(+∣L)P(+\mid L) értékét P(L∣+)P(L \mid +)-ként olvassa. A táblázat ellenpéldája: a 585 pozitív riasztásból csak 90 igaz, azaz P(L∣+)=15,4%P(L \mid +)=15{,}4\%, miközben P(+∣L)=90%P(+\mid L)=90\%. Az irány felcserélése a feltétel nevezőjének felcserélését jelenti. Még erősebb ellenpélda: ha a riasztó mindig pozitívan jelezne, akkor P(+∣L)=1P(+\mid L)=1, de P(L∣+)P(L \mid +) egyszerűen az alapgyakoriság, 1% lenne.

A korábbi fejezetekkel a kapcsolat közvetlen. A Hiány és anomália mint vizsgálati kérdés alfejezetben a hiányzásjelző feltételes arányai ugyanilyen metszet/nevező logikával készültek: az R=1R=1 feltétel jelölte ki a nevezőt. A Sokaság, minta és adatfelvételi folyamat alfejezetben a szelekciós torzítás is feltételes arányként írható le: a megfigyelt almintára vonatkozó eloszlás nem azonos a sokaság eloszlásával, ha a bekerülés mechanizmusa összefügg a vizsgált változóval. A Fájlok, útvonalak és projektgyökér projektgyökér-konvenciója miatt a fenti script a projektgyökérből futtatható, a relatív útvonalakat így egy helyen rögzítjük.

Önellenőrző kérdések:

  1. Mi a nevező a P(L∣+)P(L \mid +) definíciójában, és hány rendelés van benne a példában?
  2. Mit jelent a P(+∣¬L)P(+\mid \neg L) érték, és mi a kapcsolata a specificitással?
  3. Ha két esemény független, mit tudunk P(A∣B)P(A \mid B) és P(A)P(A) viszonyáról?
  4. Miért nem mondhatjuk, hogy a negatív riasztás esetén a késés esélye 10%?

A negatív riasztásra a példában P(L∣¬+)=10/9415≈0,00106P(L \mid \neg +)=10/9415 \approx 0{,}00106, tehát 0,1%, nem 10%. Ez is a feltétel irányának és a nagy, nem késő csoportnak a következménye.

14.1.8 Rövid összefoglaló

Az eseménytér a lehetséges kimenetek partíciója; az együttes gyakoriság a metszetbe eső darabszám osztva a teljes elemszámmal. A feltételes valószínűség ugyanezt a metszetet szűkebb nevezőre vetíti, ezért P(A∣B)P(A \mid B) és P(B∣A)P(B \mid A) általában különbözik. Bayes formulája a két irányt köti össze, és a nevezőt a feltétel szerinti teljes felbontásból állítja elő. A ritka késés példájában a 90%-os érzékenység ellenére a pozitív riasztás után csak 15,4% a valódi késés esélye, mert a nagy nem késő csoporton keletkező hamis pozitívok uralják a riasztásokat. A következő Véletlen változó és gyakori eloszlásmodellek ezeket az eseményeket véletlen változókká alakítja, és formálisan bevezeti a Bernoulli- meg binomiális eloszlást, amellyel a mostani szimuláció szórása is pontosan leírható.