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.
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
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 , akkor 100 rendelésből átlagosan 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.
A legkisebb véletlen változó, egyetlen 0/1 kimenetű kísérletet ír le. Legyen a kimenet. A Bernoulli-eloszlás (Bernoulli distribution) egyetlen paramétere a „siker” valószínűsége, jelölése:
Ekkor:
A változó értékkészlete , a várható érték , a variancia pedig . A mértékegység: a valószínűség dimenziótlan, az értékei pedig darabszámok (0 vagy 1).
Kézi kis példa: esetén a várható érték , a variancia , a szórás . 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.
Ha független Bernoulli-kísérletet végzünk ugyanazzal a valószínűséggel, és az véletlen változó a sikerek darabszáma, akkor binomiális eloszlású (binomial distribution) és paraméterekkel:
A lehetséges értékek , a várható érték és variancia:
A momentumokból látszik, hogy a binomiális az egyedi Bernoulli-kísérletek összegzéséből adódik: 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:
Itt az „ alatt ” binomiális együttható, amely megadja, hányféleképpen választható ki siker kísérletből.
Kézi kontroll a , esetben: , , . Az összegnek 1-nek kell lennie: .
A binomiális folyamat azt feltételezi, hogy a kísérletek száma rögzített, és a siker valószínűsége 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:
A paraméter (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:
Ez a Poisson-kritikus tulajdonság: a variancia egyenlő a várhatóval, ezért az eseményszám szórása . A PMF:
A nevezőben a faktoriális, 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: esetén , , . Az összeg az összes -ra pontosan 1, mert a Taylor-sor: .
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 és a szórás :
A PDF:
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 biztosítja, hogy a teljes terület 1 legyen. A paraméterek jelentése: az eloszlás „közepe”, 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: , esetén a PDF a 0 pontban , 1-nél . 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 :
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.
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, , és szórást, adjuk meg:
A várható érték és variancia az eredeti skálán:
Figyeljük meg, hogy a várható érték nagyobb, mint , 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: , esetén , . Ez jól mutatja, hogy a ferdeség miatt a várható nagyobb, mint a tipikus középpont.
A paraméter (parameter) az eloszláscsalád azonosítására szolgáló szám. A Bernoulli-nak egy paramétere van (), a binomiálisnak kettő (, ), a Poissonnak egy (), a normálisnak kettő (, ), a lognormálisnak kettő (, ). 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.
A laborban szimulálunk három folyamatot: (1) egyetlen kattintásos
konverziót
valószínűséggel; (2) kattintások számát egy óra alatt
Poisson-paraméterrel
;
(3) kosárértéket lognormális eloszlással, log-skálán
,
.
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.
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
,
a szórás
.
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
-ra
megadja a pontos valószínűséget; a
stats.binom.pmf(20, n, p) példa kézzel is számolható:
.
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
esetén a szimulált óra kattintásszáma átlagosan 12, szórása is
.
A lognormális eloszlásnál az elméleti átlag
,
az elméleti szórás pedig
.
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ó
értékére
teljesül, és a szimulált átlag közelíti
-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.
É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.
Megvalósítás: írjon függvényt, amely
n és p bemenettel kiszámítja a binomiális
eloszlás PMF-jét
-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
-re
számolni?
Hibadiagnózis: a
scipy.stats.lognorm osztály s,
scale paraméterei nem közvetlenül
és
;
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
-nek
feleljen meg? Adjon explicit kódot, amely a PDF értékét kiszámítja
esetén.
Átvitel megváltozott feltételre: a webshop forgalma este a nappali háromszorosa. Ha napközben a kattintások száma Poisson-eloszlású , 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.
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.
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-10Nagy -re a faktoriális túlcsordul vagy numerikusan instabil, mert é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.
scipy.stats.lognorm a s (shape)
paramétert a log-skálán értelmezett szórásként, a scale
paramétert pedig
-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
paraméternek és sigma_l-t a scale-nek, ami
teljesen más eloszlást ad.
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 rögzített, például 100 rendelés, és a prioritás aránya , 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 paraméterét nem szabad a Poisson -jával felcserélni.
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 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.