14.2 Véletlen változó és gyakori eloszlásmodellek

Az Esemény, feltételes valószínűség és Bayes alfejezetben eseményekkel dolgoztunk: minden egyes megfigyelés vagy bekövetkezett, vagy nem. Most egy lépéssel általánosabbra lépünk: az esemény kimenetét egy véletlen változó (random variable) értékeként kezeljük. A véletlen változó nem „változó” a Python-értelemben, hanem egy leképezés: minden lehetséges eseményhez egy számot rendel. Ha a kimenet maga is szám, például egy megadott időablakban beérkező rendelések darabszáma, akkor közvetlenül kapunk véletlen változót; ha a kimenet kategória, például consumer vagy business, akkor a hozzárendelés mesterséges, például 0/1 kód.

A véletlen változó eloszlása (distribution) azt határozza meg, mekkora valószínűség tartozik az értékeinek halmazaihoz. Diszkrét esetben az egyes értékek valószínűségét tömegfüggvény, folytonos esetben az intervallumok valószínűségét a sűrűség integrálja adhatja meg. A gyakorlatban az eloszlást két dolgon keresztül használjuk: a paramétereken (parameters) keresztül, amelyek az eloszlás alakját meghatározó számok, és a szimuláción keresztül, amellyel mesterséges mintákat állítunk elő a modellből.

14.2.0.1 1. Cél és konkrét helyzet

A kezdőlabor orders.csv adata rendelésenként tartalmazza a priority_flag oszlopot, amely 0 vagy 1. A kérdés: hány prioritásos rendelés várható 100 egymástól függetlennek tekintett rendelésből, ha a prioritásos rendelések aránya 0,22? Az elemzési egység: egy rendelés; a cél egy darabszám előrejelzése és annak bizonytalansága. A binomiális példában külön modellfeltevés, hogy minden rendelés azonos p=0,22p=0{,}22 valószínűséggel és egymástól függetlenül prioritásos. Valós rendeléseknél ezt ügyfél- és időbeli függőség sértheti; ekkor a binomiális variancia nem alkalmazható automatikusan.

Az előzetes becslés: ha egy rendelésnél a prioritásos valószínűsége p=0,22p=0{,}22, akkor 100 rendelésből átlagosan 100⋅0,22=22100 \cdot 0{,}22 = 22 prioritást várunk. Azt azonban még nem tudjuk, mennyire megbízható ez a 22-es szám, vagy milyen gyakran kapnánk ennél többet. Ezt az alfejezetben pontosítjuk.

14.2.0.2 2. Fogalmi magyarázat

14.2.0.2.1 Bernoulli-eloszlás

A legkisebb véletlen változó, egyetlen 0/1 kimenetű kísérletet ír le. Legyen XX a kimenet. A Bernoulli-eloszlás (Bernoulli distribution) egyetlen paramétere a „siker” valószínűsége, jelölése:

p∈(0,1)p \in (0, 1)

Ekkor:

P(X=1)=p,P(X=0)=1−pP(X = 1) = p, \quad P(X = 0) = 1 - p

A változó értékkészlete {0,1}\{0, 1\}, a várható érték E[X]=pE[X] = p, a variancia pedig Var(X)=p(1−p)\operatorname{Var}(X) = p(1-p). A mértékegység: a valószínűség dimenziótlan, az XX értékei pedig darabszámok (0 vagy 1).

Kézi kis példa: p=0,3p = 0{,}3 esetén a várható érték 0,30{,}3, a variancia 0,3⋅0,7=0,210{,}3 \cdot 0{,}7 = 0{,}21, a szórás 0,21≈0,458\sqrt{0{,}21} \approx 0{,}458. Ha nem tudjuk, hogy a folyamat Bernoulli, hanem csak a 0/1 kimenetet látjuk, akkor a megfigyelt arány a paraméter becslése, de ez már a becslés témaköréhez tartozik.

14.2.0.2.2 Binomiális eloszlás

Ha nn független Bernoulli-kísérletet végzünk ugyanazzal a pp valószínűséggel, és az XX véletlen változó a sikerek darabszáma, akkor binomiális eloszlású (binomial distribution) nn és pp paraméterekkel:

X∼Binomial(n,p)X \sim \mathrm{Binomial}(n, p)

A lehetséges értékek 0,1,…,n0, 1, \ldots, n, a várható érték és variancia:

E[X]=np,Var(X)=np(1−p)E[X] = np, \quad \operatorname{Var}(X) = np(1-p)

A momentumokból látszik, hogy a binomiális az egyedi Bernoulli-kísérletek összegzéséből adódik: nn darab független Bernoulli-kísérlet összege. A pontos valószínűségek kiszámításához a valószínűségi tömegfüggvényt (probability mass function, PMF) használjuk:

P(X=k)=(nk)pk(1−p)n−k,k=0,1,…,nP(X = k) = \binom{n}{k}p^k(1-p)^{n-k}, \quad k = 0, 1, \ldots, n

Itt (nk)=n!k!(n−k)!\binom{n}{k} = \frac{n!}{k!(n-k)!} az „nn alatt kk” binomiális együttható, amely megadja, hányféleképpen választható ki kk siker nn kísérletből.

Kézi kontroll a n=2n=2, p=0,3p=0{,}3 esetben: P(X=0)=0,72=0,49P(X=0) = 0{,}7^2 = 0{,}49, P(X=1)=2⋅0,3⋅0,7=0,42P(X=1) = 2 \cdot 0{,}3 \cdot 0{,}7 = 0{,}42, P(X=2)=0,32=0,09P(X=2) = 0{,}3^2 = 0{,}09. Az összegnek 1-nek kell lennie: 0,49+0,42+0,09=10{,}49 + 0{,}42 + 0{,}09 = 1.

14.2.0.2.3 Poisson-eloszlás

A binomiális folyamat azt feltételezi, hogy a kísérletek száma nn rögzített, és a siker valószínűsége pp ismert. Sok valós folyamatban azonban az események időben folytonosan érkeznek, és nincs természetes „kísérletszám”. Ilyenkor a Poisson-eloszlás (Poisson distribution) használható, amely egyetlen paraméterrel, a várható eseményszámmal rendelkezik:

X∼Poisson(λ),λ>0X \sim \mathrm{Poisson}(\lambda), \quad \lambda > 0

A paraméter λ\lambda (lambda) az adott időablakban várható események száma; homogén, állandó intenzitású Poisson-folyamatnál az időablak hosszával arányosan változik. Időben változó intenzitásnál az adott ablak paramétere az intenzitás idő szerinti integrálja. A várható érték és variancia egyaránt:

E[X]=λ,Var(X)=λE[X] = \lambda, \quad \operatorname{Var}(X) = \lambda

Ez a Poisson-kritikus tulajdonság: a variancia egyenlő a várhatóval, ezért az eseményszám szórása λ\sqrt{\lambda}. A PMF:

P(X=k)=λke−λk!,k=0,1,2,…P(X = k) = \frac{\lambda^k e^{-\lambda}}{k!}, \quad k = 0, 1, 2, \ldots

A nevezőben k!k! a faktoriális, e=2,71828…e = 2{,}71828\ldots az exponenciális függvény alapja. Homogén Poisson-folyamat esetén diszjunkt időintervallumok eseményszámai függetlenek, és az intenzitás állandó. Nem homogén Poisson-folyamatban az intenzitás változhat, miközben az adott intervallum darabszáma továbbra is Poisson-eloszlású, paramétere az intenzitás intervallum feletti integrálja. A csomósodás, függőség és túlszóródás miatt viszont a Poisson-modell alkalmatlan lehet; ilyenkor például negatív binomiális modell vagy más pontfolyamat szükséges.

Kézi kontrol: λ=2\lambda = 2 esetén P(X=0)=e−2=0,1353P(X=0) = e^{-2} = 0{,}1353, P(X=1)=2e−2=0,2707P(X=1) = 2e^{-2} = 0{,}2707, P(X=2)=42e−2=0,2707P(X=2) = \frac{4}{2}e^{-2} = 0{,}2707. Az összeg az összes kk-ra pontosan 1, mert a Taylor-sor: ∑k=0∞λkk!=eλ\sum_{k=0}^{\infty} \frac{\lambda^k}{k!} = e^{\lambda}.

14.2.0.2.4 Normális eloszlás

A normális eloszlás (normal distribution, gyakran Gauss-görbe) folytonos eloszlás, tehát a lehetséges értékek egy valós intervallumot fednek le, és a valószínűséget sűrűségfüggvénnyel (probability density function, PDF) adjuk meg. Két paramétere van: a várható érték μ\mu és a szórás σ>0\sigma > 0:

X∼Normal(μ,σ)X \sim \mathrm{Normal}(\mu, \sigma)

A PDF:

f(x)=1σ2πexp(−(x−μ)22σ2)f(x) = \frac{1}{\sigma\sqrt{2\pi}} \exp\left(-\frac{(x-\mu)^2}{2\sigma^2}\right)

A PDF használata a folytonos esetben eltér a PMF-től: a sűrűség nem közvetlen valószínűség, hanem a terület az intervallum alatt adja a valószínűséget. A Terület, összeg és numerikus integrál alfejezetben már láttuk a terület-összeget; itt a normalizáló konstans 1/(σ2π)1/(\sigma\sqrt{2\pi}) biztosítja, hogy a teljes terület 1 legyen. A paraméterek jelentése: μ\mu az eloszlás „közepe”, σ\sigma a szórás, tehát az eloszlás skáláját (nem az adatok teljes terjedelmét) adja meg. A normális eloszlás szimmetrikus, ami azt jelenti, hogy a medián egyenlő a várhatóval.

Kézi ellenőrzés a standard esetben: μ=0\mu=0, σ=1\sigma=1 esetén a PDF a 0 pontban f(0)=1/2π≈0,399f(0) = 1/\sqrt{2\pi} \approx 0{,}399, 1-nél f(1)=1/2π⋅e−1/2≈0,242f(1) = 1/\sqrt{2\pi} \cdot e^{-1/2} \approx 0{,}242. A szimmetria nem számítható közvetlenül, de a PDF páros függvény.

A CDF (cumulative distribution function) a valószínűséget adja, hogy a változó legfeljebb xx:

F(x)=P(X≤x)=∫−∞xf(t)dtF(x) = P(X \le x) = \int_{-\infty}^x f(t)\,dt

Ez az integrál nem zárható egyszerű formulával, ezért numerikusan vagy táblázatból határozzuk meg. A scipy.stats.norm.cdf végzi ezt.

14.2.0.2.5 Lognormális eloszlás

Sok mennyiség, például a rendelés értéke, pozitív és erősen jobbra ferde, tehát a nagy értékek ritkák, de nagyon nagyok is lehetnek. Ha a mennyiség logaritmusa normális, akkor magát a változót lognormális eloszlásúnak (lognormal distribution) nevezzük. Paraméterként leggyakrabban a log-skálán értelmezett várható értéket, μl\mu_l, és szórást, σl>0\sigma_l > 0 adjuk meg:

ln(X)∼Normal(μl,σl)⇔X∼Lognormal(μl,σl)\ln(X) \sim \mathrm{Normal}(\mu_l, \sigma_l) \iff X \sim \mathrm{Lognormal}(\mu_l, \sigma_l)

A várható érték és variancia az eredeti skálán:

E[X]=exp(μl+12σl2),Var(X)=(eσl2−1)e2μl+σl2E[X] = \exp\!\bigl(\mu_l + \tfrac{1}{2}\sigma_l^2\bigr), \quad \operatorname{Var}(X) = \bigl(e^{\sigma_l^2} - 1\bigr)e^{2\mu_l + \sigma_l^2}

Figyeljük meg, hogy a várható érték nagyobb, mint eμle^{\mu_l}, mert a logaritmikus szimmetriát az exponenciális torzítja. A lognormális modellezésnél a paraméterek mindig log-skálán értendők, nem az eredeti skálán.

Kézi példa: μl=0\mu_l = 0, σl=1\sigma_l = 1 esetén E[X]=e0,5≈1,65E[X] = e^{0{,}5} \approx 1{,}65, Var(X)=(e−1)e≈4,67\operatorname{Var}(X) = (e - 1)e \approx 4{,}67. Ez jól mutatja, hogy a ferdeség miatt a várható nagyobb, mint a tipikus középpont.

14.2.0.2.6 Paraméterek általában

A paraméter (parameter) az eloszláscsalád azonosítására szolgáló szám. A Bernoulli-nak egy paramétere van (pp), a binomiálisnak kettő (nn, pp), a Poissonnak egy (λ\lambda), a normálisnak kettő (μ\mu, σ\sigma), a lognormálisnak kettő (μl\mu_l, σl\sigma_l). A paraméterek rögzítésével az eloszlás teljesen meghatározott. Fontos különválasztani a paramétert és annak becslését: a paraméter a valódi, általában ismeretlen szám, a becslés (estimate) a mintából számított érték. Ez a különbség a Paraméter, becslő és likelihood központi témája lesz.

14.2.0.3 3. Teljes minimális munkapélda

A laborban szimulálunk három folyamatot: (1) egyetlen kattintásos konverziót p=0,22p=0{,}22 valószínűséggel; (2) kattintások számát egy óra alatt Poisson-paraméterrel λ=12\lambda=12; (3) kosárértéket lognormális eloszlással, log-skálán μl=3,5\mu_l=3{,}5, σl=0,7\sigma_l=0{,}7. A NumPy Generator osztályát használjuk az új, ajánlott véletlenszám-keretrendszerből; a scipy.stats modul pedig az eloszlások objektumait adja. A seed beállítása a reprodukálhatóságot szolgálja.

A kód az s054 munkavégzési helyébe helyezhető; lab/pyproject.toml alapkörnyezetben fut. A teljes útmutatót a numpy és scipy importálásával kezdjük.

# s054_demo.py
import numpy as np
from scipy import stats

rng = np.random.default_rng(20261020)

# 1. Bernoulli szimuláció: 100 független kattintás, p=0,22
p = 0.22
n = 100
bernoulli_draws = rng.binomial(n=1, p=p, size=n)  # mindegyik Bernoulli
priority_count = bernoulli_draws.sum()

# 2. Binomiális PMF kontrol: P(X=20)
pmf_20 = stats.binom.pmf(20, n=100, p=p)

# 3. Poisson szimuláció: egy óra kattintás, λ=12
lambda_per_hour = 12
poisson_draw = rng.poisson(lambda_per_hour)

# 4. Lognormális szimuláció: 1000 kosárérték
mu_l, sigma_l = 3.5, 0.7
basket_values = rng.lognormal(mean=mu_l, sigma=sigma_l, size=1000)

# 5. Elméleti összehasonlítások
expected_binom = n * p
sd_binom = np.sqrt(n * p * (1 - p))
expected_poisson = lambda_per_hour
sd_poisson = np.sqrt(lambda_per_hour)
expected_lognormal = np.exp(mu_l + sigma_l**2 / 2)
sd_lognormal = np.sqrt((np.exp(sigma_l**2) - 1) * np.exp(2*mu_l + sigma_l**2))

print("Priority count szimulált:", priority_count,
      "| várt:", expected_binom, "| sd:", sd_binom)
print("PMF P(X=20):", pmf_20)
print("Poisson óra szimulált:", poisson_draw,
      "| várt:", expected_poisson, "| sd:", sd_poisson)
print("Lognormális: átlag:", basket_values.mean(),
      "| várt:", expected_lognormal)
print("Lognormális: szórás:", basket_values.std(ddof=1),
      "| várt:", sd_lognormal)

A kimenet seedtől függ; a 20261020 seeddel várható értékek a fent számolt momentumok körül lesznek, de nem pontosan, mert véletlen mintáról van szó. a priority_count például a várható 22 körüli, mintegy egy szórásnyi 18–26-os sávban is lehet, a Poisson 7 és 17 között, a lognormális mintaátlag pedig az elméleti 42,31 körül. A futás után ne csak a számokat nézzük: a szórás-képletek ellenőrzik, hogy a szimulált átlag konzisztens az elméleti paraméterrel.

14.2.0.4 4. Eredmény értelmezése

A fenti kód a véletlen változókat szimulálja, de a legfontosabb az, hogy a szimulált értékeket elméleti momentumokkal hasonlítjuk. A binomiális esetben a várható darabszám np=22n p = 22, a szórás np(1−p)≈4,14\sqrt{n p(1-p)} \approx 4{,}14. Ez azt jelenti, hogy a 100-as mintában a prioritások száma leggyakrabban 22 körül lesz, és egy szórásnyi (körülbelül 18–26 közötti) sávba is gyakran eshet, de ez nem 90–95%-os lefedettségű intervallum. A PMF adott kk-ra megadja a pontos valószínűséget; a stats.binom.pmf(20, n, p) példa kézzel is számolható: (10020)0,22200,7880\binom{100}{20}0{,}22^{20}0{,}78^{80}. Ez a szám pozitív; a diszkrét változónál egy adott értékhez is rendelhető pozitív valószínűség, szemben a folytonos eloszlások pontvalószínűségével.

A Poisson-eloszlásnál λ=12\lambda=12 esetén a szimulált óra kattintásszáma átlagosan 12, szórása is 12≈3,46\sqrt{12} \approx 3{,}46. A lognormális eloszlásnál az elméleti átlag e3,5+0,72/2≈42,31e^{3{,}5+0{,}7^2/2}\approx42{,}31, az elméleti szórás pedig ≈33,64\approx33{,}64. Az 1000 elemű mintából számított átlag és szórás ezektől véletlenszerűen eltérhet; ez jól mutatja a pozitív ferdeséget. A kódban a ddof=1 a mintavariancia torzítatlan becsléséhez kell, amint azt a Közép, szóródás és robusztus összegzés is tárgyalta.

Invariant ellenőrzés: a Poisson-szimuláció kk értékére P(X=k)=λke−λ/k!P(X=k) = \lambda^k e^{-\lambda}/k! teljesül, és a szimulált átlag közelíti λ\lambda-t, ha a minta nagy. A binomiális összeg a Bernoulli-darabok összege, ezért a darabszám bernoulli_draws.sum() összhangban van a rng.binomial(n, p) hívással; a kettő ugyanazt a modellt testesíti meg.

14.2.0.5 5. Feladatok

  1. Értelmezés: a kezdőlabor szerződése szerint a delivery_days pozitív egész. Miért nem helyes azt feltételezni, hogy a delivery_days Poisson-eloszlású? Adjon meg egy olyan folyamatot, amelyre a Poisson-modell természetesebb lenne, és egy feltevést, amelyet ellenőrizni kell.

  2. Megvalósítás: írjon függvényt, amely n és p bemenettel kiszámítja a binomiális eloszlás PMF-jét kk-ra a képlet alapján NumPy nélkül, majd hasonlítsa össze a stats.binom.pmf(k, n, p) értékkel. A relatív hiba 1e-10 alatt legyen. Miért nem célszerű ezt a képletet nagy nn-re számolni?

  3. Hibadiagnózis: a scipy.stats.lognorm osztály s, scale paraméterei nem közvetlenül μl\mu_l és σl\sigma_l; ha valaki stats.lognorm.pdf(x, mu_l, sigma_l)-nek nevezi, hibás eredményt kap. Hogyan kell a paramétereket megfeleltetni, hogy az pdf a fenti μl,σl\mu_l, \sigma_l-nek feleljen meg? Adjon explicit kódot, amely a PDF értékét kiszámítja x=1x=1 esetén.

  4. Átvitel megváltozott feltételre: a webshop forgalma este a nappali háromszorosa. Ha napközben a kattintások száma Poisson-eloszlású λ=10\lambda=10, akkor mi a helyes eloszlásmodell estére, ha az időablak fele a nappalinak? Milyen Poisson-feltevés sérülhet a valóságban, és miért? Vezesse le a várható értéket.

14.2.0.6 6. Megoldások és indoklás

  1. A delivery_days napokban mért mennyiség nem eseménydarab, hanem időtartam; a Poisson eloszlás feltételezi, hogy az esemény bekövetkezése független és állandó intenzitással érkezik, ami egy szállítási határidőnél nem áll fenn, mert a kézbesítés egy folyamat, nem véletlen események diszkrét száma. A Poisson természetesebb lenne például a naponta beérkező rendelések számára. A feltevés: a rendelések egymástól függetlenül, konstans arányban érkeznek; ezt ellenőrizhetjük az időbeli ábrázolással és az érkezési idők exponenciális eloszlásával.

  2. A PMF kézzel:

import math

def binom_pmf(k, n, p):
    coef = math.comb(n, k)
    return coef * (p ** k) * ((1 - p) ** (n - k))

from scipy.stats import binom
# Ellenőrzés
rel_err = abs(binom_pmf(20, 100, 0.22) - binom.pmf(20, 100, 0.22)) / binom.pmf(20, 100, 0.22)
print(rel_err)  # kicsi, de nem feltétlenül pontosan 0 a lebegőpontos számítás miatt
assert rel_err < 1e-10

Nagy nn-re a faktoriális túlcsordul vagy numerikusan instabil, mert n!n! és a hatványok óriásiak lesznek, és a szorzatukat hibatűrő módon nehéz kiszámítani; a SciPy belsőleg stabil algoritmust használ.

  1. A scipy.stats.lognorm a s (shape) paramétert a log-skálán értelmezett szórásként, a scale paramétert pedig eμle^{\mu_l}-ként definiálja. Helyes hívás x=1 esetén:
import numpy as np
from scipy import stats

mu_l, sigma_l = 3.5, 0.7
s = sigma_l
scale = np.exp(mu_l)
pdf_1 = stats.lognorm.pdf(1, s=s, scale=scale)
print(pdf_1)  # szemléltető, elméletileg: (1/(1*sigma_l*sqrt(2π)))*exp(-(ln1-mu_l)^2/(2σ^2))

A hiba oka: ha stats.lognorm.pdf(1, mu_l, sigma_l)-t hívnánk, az a mu_l-t tekintené az ss paraméternek és sigma_l-t a scale-nek, ami teljesen más eloszlást ad.

  1. Nappali Poisson λday=10\lambda_{\text{day}}=10 az eredeti időablakban. Az esti kattintási ráta ennek háromszorosa, az esti megfigyelési ablak pedig fele olyan hosszú, ezért a várható eseményszám λevening=10⋅3⋅(1/2)=15\lambda_{\text{evening}}=10\cdot3\cdot(1/2)=15. Az esti darabszám modellje Poisson(15)\mathrm{Poisson}(15), várható értéke 15. A Poisson-feltevés sérülhet, ha az esti kattintások korrelálnak, például azonos kampány vagy hír miatt. Ilyenkor az események nem függetlenek; ez túlszóródáshoz (overdispersion) vezet, amit a variancia nagyobb, mint a várható. A variancia ellenőrzése a Közép, szóródás és robusztus összegzés alfejezetből ismert módon elvégezhető a mintából.

14.2.0.7 7. Gyakori tévedés és ellenpélda

A leggyakoribb hiba az, hogy a minta hisztogramjára ránézve azt mondjuk: „ez normális”. Például a szállítási napok hisztogramja hasonló lehet egy haranggörbéhez, de ettől még a folyamat nem folytonos, és a normális modell negatív értékeket is megenged. A delivery_days pozitív egész, ezért a normális modell semmiképpen sem helyes; legfeljebb közelítő. Hasonlóképpen, ha a kosárértékre lognormálist illesztünk, a modell neve nem bizonyítja, hogy az adat tényleg lognormális: a paraméterek becslése és a diagnosztikai ellenőrzés szükséges. Az eloszlásválasztás ezért ellenőrizendő modellfeltevés, nem pusztán a hisztogram alakjából leolvasható tény.

Másik ellenpélda: a binomiális és a Poisson összekeverése. Ha nn rögzített, például 100 rendelés, és a prioritás aránya pp, akkor binomiálist kell használni; ha az események száma maga a megfigyelt eredmény, például a percenkénti hívások, akkor a Poisson a kiinduló modell. A binomiális nn paraméterét nem szabad a Poisson λ\lambda-jával felcserélni.

14.2.0.8 8. Rövid összefoglaló

A véletlen változó leképezés az eseménytérről a számokra; eloszlása a valószínűségek teljes leírása. A Bernoulli egyetlen 0/1 kimenetet modellez, a binomiális ennek független összegzése nn kísérletből, a Poisson az időben ritka független események darabszámát adja, a normális a folytonos szimmetrikus, a lognormális a pozitív ferde mennyiségeket. A paraméterek rögzítik az eloszlást, de becslésük mintából már a statisztikai következtetés témája. A szimuláció megmutatja az eloszlás alakját, a momentumok pedig ellenőrző invariánsok. A következő alfejezet a függetlenség és kovariancia fogalmát viszi tovább, amely nélkül a binomiális és Poisson-feltevések érvényessége sem dönthető el.

A Poisson-modellben a variancia és a várható érték egyenlő; túlszóródás esetén negatív binomiális vagy más modell lehet megfelelőbb. Az eloszlás paramétereit mindig a konkrét megfigyelési időablakkal együtt adjuk meg.