A Northstar szintetikus rendelési adatában a distance_km
oszlop a szállítási távolságot tartalmazza kilométerben. Tegyük fel,
hogy a csapat a szállítási távolságot vizsgálja, és két egyszerű modellt
vet fel:
A kérdés: mennyi annak a valószínűsége, hogy egy rendelés szállítási távolsága 35 és 65 km közé esik, azaz ?
Előzetes becslés. Az egyenletes eloszlásnál a 35–65 km sáv az 5–95 km tartomány egyharmada, tehát a várt valószínűség . A normálisnál a 35–65 sáv éppen az átlagtól mért szórásnyi környezet; haranggörbénél ennek ismert közelítő területe . Ebben az alfejezetben a pontos értéket integrállal és szimulációval is ellenőrizzük.
A megfigyelési egység egy rendelés; a megfigyelt változó a
distance_km, folytonosnak modellezett valószínűségi
változó. A becslés célja nem a távolság megjóslása, hanem egy döntéshez
használható intervallumvalószínűség megadása.
Egy folytonos valószínűségi változó sűrűségfüggvénye (probability density function, PDF) nem valószínűség, hanem valószínűség-sűrűség: ahogy az anyagsűrűséget is térfogattal kell szorozni, a PDF-et intervallumhosszal kell szorozni, hogy valószínűséget kapjunk.
Az intervallumba esés valószínűsége a sűrűséggörbe alatti terület:
Ha a változó mértékegysége km, akkor mértékegysége 1/km, az integrál szorzata pedig dimenzió nélküli valószínűség. Ez a Terület, összeg és numerikus integrál területfogalmán alapul: a valószínűség a görbe alatti terület, amelyet véges összeggel közelíthetünk.
A eloszlásfüggvény (cumulative distribution function, CDF) a PDF balról felhalmozott területe:
A CDF értéke mindig 0 és 1 közötti, monoton nem csökkenő, és , ha , illetve , ha . Fontos kapcsolat a Parciális derivált és gradiens alfejezetben tanult egyváltozós deriválttal: a CDF meredeksége a PDF, azaz ott, ahol folytonos.
Intervallumvalószínűséget CDF-különbséggel is számíthatunk:
Ez azért hasznos, mert a CDF értékeit gyakran táblázatból vagy
könyvtárfüggvényből kapjuk; nem kell minden alkalommal numerikusan
integrálni. A DuckDB: helyi analitikus SQL szerver
nélkül alfejezetben megismert explicit függvényhívás-elv itt is
érvényes: cdf(b) - cdf(a) egyértelmű definíciót ad, szemben
egy „varázslatos” kerekített konstanssal.
A normalizálás (normalization) azt jelenti, hogy a teljes tartomány alatti terület pontosan 1:
Hisztogramnál a normalizálás azt követeli meg, hogy ne az oszlopmagasságok összege legyen 1, hanem az oszlopok területének összege: . A sűrűség értéke ebből következően lehet 1-nél nagyobb is — erre a gyakori tévedésnél térünk vissza.
A kvantilis (quantile) az az érték,
amelynél a CDF egy előírt
szintet ér el:
.
A medián a
kvantilis. A kvantilisfüggvény a CDF inverze, jelölése
vagy
;
a SciPy-ban ppf (percent point function).
Kézi kontroll az egyenletes modellen:
Ellenőrzés: , , , tehát a medián éppen 50 km. A normális modellnél a medián , a kvantilis pedig km.
Egy folytonos eloszlásnál az egyes pont valószínűsége nulla:
mert a sűrűséggörbe alatt egyetlen pont fölött nulla szélességű terület van. Ebből következik, hogy : a végpontok hozzávétele nem változtat a területen. Ez a tulajdonság csak folytonos modellben igaz; diszkrét eloszlásnál egy pontnak lehet pozitív valószínűsége.
Az alábbi kód az előző alfejezetben használt NumPy/SciPy környezetet
használja. A quad adaptív numerikus integrál, a szimuláció
pedig ugyanazt az arányt becsli véletlen minta relatív gyakoriságaként.
A seed rögzíti a szimulációs véletlent; numerikus
reprodukálhatóságot ad, de nem feltétlenül bitazonos eredményt minden
gépen.
import numpy as np
from scipy import integrate, stats
# Egyenletes U(5, 95)
a, b = 5.0, 95.0
def uniform_pdf(x):
return np.where((x >= a) & (x <= b), 1.0 / (b - a), 0.0)
# Normális N(50, 15)
mu, sigma = 50.0, 15.0
normal_pdf = lambda x: stats.norm.pdf(x, loc=mu, scale=sigma)
# 1) Elméleti érték CDF-különbségből
p_unif_theory = (65.0 - 35.0) / (b - a)
p_norm_theory = stats.norm.cdf(65.0, mu, sigma) - stats.norm.cdf(35.0, mu, sigma)
# 2) Numerikus integrál
p_unif_quad, err_unif = integrate.quad(uniform_pdf, 35.0, 65.0)
p_norm_quad, err_norm = integrate.quad(normal_pdf, 35.0, 65.0)
# 3) Szimuláció seeddel
rng = np.random.default_rng(20261020)
n = 100_000
sample_unif = rng.uniform(a, b, n)
sample_norm = rng.normal(mu, sigma, n)
p_unif_sim = np.mean((sample_unif >= 35.0) & (sample_unif <= 65.0))
p_norm_sim = np.mean((sample_norm >= 35.0) & (sample_norm <= 65.0))
print("egyenletes: elmélet, quad, szimuláció")
print(p_unif_theory, p_unif_quad, p_unif_sim)
print("normális: elmélet, quad, szimuláció")
print(p_norm_theory, p_norm_quad, p_norm_sim)A kimenet szemléltető — a kapcsolódó példaprojektben még nem ellenőriztük, de elméletileg várt:
egyenletes: elmélet, quad, szimuláció
0.3333333333333333 0.3333333333333333 0.33377
normális: elmélet, quad, szimuláció
0.6826894921370859 0.6826894921370859 0.68118
A szimulációs értékek a seedelt rng mellett is véletlenszerű eltérést mutathatnak; a elemű minta mellett a bináris arány standard hibája körülbelül , tehát a harmadik tizedesjegy körüli eltérés normális. A laborban a pontos értékeket a saját futtatás adja.
Az ábra a normális sűrűséget és a 35–65 km közötti kitöltött területet mutatja:
import matplotlib.pyplot as plt
x = np.linspace(0, 100, 400)
y = normal_pdf(x)
fig, ax = plt.subplots(figsize=(8, 4))
ax.plot(x, y, label="N(50, 15) sűrűség")
mask = (x >= 35) & (x <= 65)
ax.fill_between(x[mask], y[mask], alpha=0.35, label="P(35<D<65)")
ax.set_xlabel("szállítási távolság (km)")
ax.set_ylabel("sűrűség (1/km)")
ax.set_title("Sűrűségfüggvény és intervallum alatti terület")
ax.legend()
plt.show()A fill_between a görbe alatti területet színezi; annak
nagysága a keresett valószínűség.
A három számítási út ugyanazt a definíciót ellenőrzi:
quad ugyanezt adja, mert a konstans integrandus
triviálisan integrálható. A szimuláció
-hoz
közeli értéket adna, a mintavételi hiba határain belül.quad
hibabecslése az
nagyságrendbe esik. A szimuláció
mintán
körüli értéket ad
standard hibával.Ellenőrző invariáns. A normalizálás teljesülése: az
egyenletes PDF integrálja 5-től 95-ig pontosan 1, a normális PDF
integrálja a teljes valós tengelyen numerikusan is 1-et ad. A CDF
monotonitása:
,
és a különbség 0 és 1 közötti. A kvantilis inverz ellenőrzése:
stats.norm.ppf(stats.norm.cdf(65,50,15),50,15) visszaadja
65-öt.
A modellválasztás fontos üzenete: ugyanaz a kérdés a két modellben egészen más valószínűséget ad ( és ). A sűrűség alakja tehát nem pusztán matematikai dísz, hanem az intervallumvalószínűségeken keresztül közvetlenül befolyásolja a döntési becsléseket.
Folytonos változónál egyetlen pont valószínűsége nulla, de a sűrűségérték akár 1-nél nagyobb is lehet, mivel nem valószínűség. A CDF mindenhol nemcsökkenő, jobbról folytonos és 0-ról 1-re tart.
Értelmezés. Az egyenletes modellben km⁻¹. Miért nem annak a valószínűsége ez az érték, hogy a távolság pontosan 50 km? Mennyi lenne annak a valószínűsége, hogy a távolság 49,5 és 50,5 km közé esik?
Implementálás. Írj egy
interval_prob(f, a, b, x_left, x_right, h) függvényt, amely
a Terület, összeg és numerikus integrál
alfejezetben tanult trapézszabállyal közelíti
-et
a megadott
lépésközzel. Ellenőrizd
-nel
a
modellen 35 és 65 között; hasonlítsd össze a pontos
értékkel.
Hibadiagnózis. Egy kolléga azt mondja: „A normális sűrűség értéke 50-nél , tehát körülbelül 2,7% annak a valószínűsége, hogy a távolság pontosan 50 km.” Mi a hiba az állításban? Milyen intervallumhossz mellett lenne a sűrűséggel becsült valószínűség körülbelül ?
Megváltoztatott feltétel. Változtasd a normális modell szórását km-re, a várható értéket hagyd 50 km-en. Előre becsüld meg: nőni vagy csökkenni fog? Számold ki a pontos értéket, és magyarázd meg az irányt a sűrűséggörbe alakjával.
Kvantilis. Mennyi az egyenletes
modell 90%-os kvantilise? Mennyi a normális
modell középső 90%-os intervallumának két határa? Ellenőrizd SciPy
ppf-fel, és magyarázd el, miért nem a 90%-os kvantilis
jelenti a középső 90% felső határát.
A sűrűség értéke nem valószínűség, mert a valószínűség területet, nem magasságot jelent. Pontosan 50 km valószínűsége , mert egy pont fölött nulla szélességű terület van. A 49,5–50,5 km intervallum hossza 1 km, tehát a valószínűség a konstans sűrűséggel:
Általában kis intervallumra .
def interval_prob(f, x_left, x_right, h):
xs = np.arange(x_left, x_right + h/2, h)
ys = f(xs)
return np.trapezoid(ys, xs)
# Ellenőrzés
f_uniform = lambda x: np.ones_like(x) / 90.0
approx = interval_prob(f_uniform, 35.0, 65.0, 0.001)
print(approx, approx - 1/3)A trapézszabály konstans függvényre pontos minden
-ra,
mert a trapézok nem közelítik, hanem egzakt módon fedik a téglalapot.
Így a várt kimenet 0.3333333333333333 és a hiba
0.0 — a lebegőpontos kerekítésből legfeljebb
nagyságrendű eltérés lehet. Ez a Terület, összeg és
numerikus integrál alfejezetből ismert tulajdonság: konstans
integrandusra a hiba nulla.
A kolléga a magasságot területtel téveszti össze. A érték sűrűség, mértékegysége 1/km. Ahhoz, hogy valószínűséget kapjunk, meg kell szorozni egy intervallum hosszával. Ha 1 km széles intervallumot veszünk, akkor
Ez viszont már valószínűség: körülbelül 2,7%. Pontosan 50 km-re a valószínűség nulla, nem a sűrűség értéke.
km mellett az intervallum az átlagtól mért szórásnyi környezet:
A standard normális CDF-ből , így a valószínűség . A korábbi -hez képest csökken, mert a szórás növelésével a sűrűséggörbe ellaposodik: a tömeg nagyobb része kerül a 35–65 sávon kívülre. Ez jól mutatja, hogy a szélesebb bizonytalanság nem a „középső” tartomány valószínűségét növeli, hanem a szélsőségekét.
Ellenőrzés:
stats.norm.cdf(65, 50, 25) - stats.norm.cdf(35, 50, 25) a
fenti értéket adja.
Egyenletes : km.
Normális : a középső 90%-os intervallum határai a és kvantilisek. A standard kvantilissel:
SciPy-ellenőrzés: stats.norm.ppf([0.05, 0.95], 50, 15).
A 90%-os kvantilis
km nem a középső 90% felső határa, mert a 90%-os
kvantilis alatt a valószínűség 90%-a balról helyezkedik el; a középső
90% intervallum viszont az alsó 5%-ot és a felső 5%-ot egyaránt
kihagyja, ezért a két határa a
és
kvantilis.
Gyakori tévedés: „A sűrűség értéke valószínűség, ezért legfeljebb 1 lehet.” Ez hamis. Vegyük az eloszlást: a sűrűség km⁻¹, tehát a görbe magassága 10, és semmi sem sérti a valószínűségi axiómákat. A valószínűség a terület: például . Ugyanígy egy pont valószínűsége mindig nulla, bármilyen magas is a sűrűség az adott pontban.
Visszautalás Terület, összeg és numerikus
integrál alfejezetre: a sűrűség alatti terület ugyanaz a
Riemann-féle területfogalom, amelyet a
integráljánál kézzel közelítettünk. A trapézszabály most is konstans
függvényre egzakt numerikus eszköz; az adaptív quad pedig
finomabb rácson pontosabb eredményt ad.
Visszautalás Parciális derivált és gradiens alfejezetre: a CDF deriváltja a PDF . Ez az egyik legegyszerűbb példa arra, hogy a derivált egy felhalmozott mennyiség változási rátája. Ugyanaz az intuíció, mint a parciális deriváltnál: ha a CDF meredek, ott a valószínűségi tömeg sűrűn helyezkedik el.
Visszautalás DuckDB: helyi analitikus SQL
szerver nélkül alfejezetre: ha a Northstar
orders táblából a 35–65 km közötti rendelések arányát
számoljuk
COUNT(*) FILTER (WHERE distance_km BETWEEN 35 AND 65) / COUNT(*)
kifejezéssel DuckDB-ben, akkor az empirikus gyakoriság a valószínűség
becslése. Ez nem a sűrűség értéke; a sűrűséget külön
kell becsülni hisztogrammal vagy kernelsimítással, és az értéke a
választott sávszélességtől függ.
Önellenőrzés. 1) Integrál-e a PDF a teljes
tartományon 1-et? 2) Monoton nem csökkenő-e a CDF? 3) A
CDF-differencia-e a
?
4) A könyvtárból kapott ppf tényleg a CDF inverzét adja-e?
Ha bármelyik nem teljesül, ne a statisztikai következtetést hibáztasd
először: ellenőrizd magát a modellfüggvényt.
A sűrűségfüggvény (PDF) valószínűségi magasság, nem valószínűség;
intervallummal szorozva területet, azaz valószínűséget ad. Az
eloszlásfüggvény (CDF) a balfelé felhalmozott terület, így
.
A normalizálás a teljes terület egységnyi volta. A kvantilis a CDF
inverze, ppf a SciPy-ban. Folytonos eloszlásnál minden pont
valószínűsége nulla. Az egyenletes
példában
,
a normális
példában
;
integrál és szimuláció konzisztensen ellenőrzi ezt. A következő Várható érték és Monte Carlo közelítés ezt a
területfogalmat a várható értékre és a Monte Carlo-közelítésre viszi
át.