13.3 Eloszlás, kapcsolat és csoportkülönbség

13.3.1 Helyzet és cél

A Northstar orders.csv táblájában a megfigyelési egység egy rendelés. Ebben az alfejezetben nem predikciót építünk, hanem leíró kérdést teszünk fel: milyen alakú a kézbesítési idő eloszlása, milyen irányú a kapcsolat a távolság és a kézbesítési idő között, és mennyire térnek el a régiók? A bemenet a tiszta orders.csv, ebből a distance_km (float, km), a delivery_days (pozitív egész, nap) és a region kategória (north, central, south). Kimenetként három célzott ábrát és egy aggregált, illetve rétegzett korrelációs táblát készítünk. Az elvárt ellenőrzés: az ECDF az utolsó megfigyelt értéknél eléri az 1-et, minden korreláció a [−1,1][-1,1] intervallumban van, és a rétegzett korrelációk súlyozott átlaga általában nem egyezik az aggregált korrelációval.

Előzetes becslésem az, hogy a távolság és a kézbesítési idő között pozitív, de nem determinisztikus kapcsolat látszik, és a régió átlagos távolsága, illetve késési szintje között is lehet különbség. A delivery_days utólag ismert mező, ezért a leíró elemzésben használható, de prediktorba soha nem kerülhet, ha a kérdés a rendelés pillanatában elérhető becslés.

13.3.2 Alak, kapcsolat és csoportkülönbség ábrákon

13.3.2.1 Hisztogram és binválasztás

A hisztogram a numerikus változó értékkészletét intervallumokra, bin-ekre osztja. Ha az intervallumhatárok b0<b1<…<bkb_0 < b_1 < \dots < b_k, akkor a jj-edik intervallum gyakorisága

hj=∑i=1n𝟏(bj≤xi<bj+1),h_j=\sum_{i=1}^n \mathbf{1}(b_j \le x_i < b_{j+1}),

ahol 𝟏\mathbf{1} indikátor, azaz 1, ha a feltétel igaz, különben 0. A density=True normalizálás a gyakoriságot elosztja nn-nel és a binszélességgel, így az oszlopok összterülete 1 lesz, de a tengely már sűrűség, nem darabszám. A delivery_days egész szám, ezért a legátláthatóbb választás az egész értékekre központozott, 1 nap széles bin: a határok például 1.5,2.5,…1.5, 2.5, \dots alakban adják meg, hogy melyik nap hova esik.

A binválasztás nem semleges döntés. A túl széles bin elrejti a részleteket, a túl keskeny bin hamis hézagokat rajzol. Ha valaki „kétmódusú eloszlást” jelent 50 binből, miközben a 10 bines ábra egyetlen módot mutat, akkor a bin, nem az adat tulajdonságát láttatja. Ugyanezért az ábra alá odaírjuk a binszélességet.

13.3.2.2 ECDF, a binválasztástól független összegzés

Az empirikus eloszlásfüggvény (empirical cumulative distribution function, ECDF) minden xx értékhez a nála nem nagyobb megfigyelések arányát rendeli:

Fn(x)=1n∑i=1n𝟏(xi≤x).F_n(x)=\frac{1}{n}\sum_{i=1}^{n}\mathbf{1}(x_i \le x).

Ez lépcsős görbe: minden megfigyelt értéknél 1/n1/n-nel ugrik feljebb, a lépcső jobbról folytonos. A medián ott van, ahol a görbe eléri vagy átlépi a 0,50{,}5-öt; az alsó és felső kvartilis a 0,250{,}25 és 0,750{,}75 szintekhez tartozik. Az ECDF előnye, hogy nincs binválasztás, tehát a hisztogram ellenőrző párja lehet.

13.3.2.3 Scatter, a kapcsolat megfigyelési szintje

A scatter (szóráskép) minden megfigyelési egységet egy pontként ábrázol: az xx-tengely a distance_km, az yy-tengely a delivery_days az adott rendelésre. A pontok iránya, sávszélessége és hajlata mutatja a kapcsolatot. Az azonos koordinátájú pontok elfedhetik egymást, ezért alpha=0.4 átlátszóságot vagy egy kis jittert használunk. A scatter a nemlineáris kapcsolatot is láthatóvá teszi, míg egyetlen korrelációs szám csak a lineáris részt foglalja össze.

13.3.2.4 Boxplot és csoportméret

A boxplot a Közép, szóródás és robusztus összegzés alfejezetben megismert ötösszámú összegzést rajzolja meg: doboz a Q1Q_1 és Q3Q_3 kvartilisek között, belső vonal a medián, a whisker-ek tipikusan a doboztól 1,5⋅IQR1{,}5\cdot \mathrm{IQR} távolságig terjednek, az ezen kívüli pontok külön jelöltek. A boxplot ferdeséget és kiugrókat mutat, de nem mutatja a csoport méretét: egy három megfigyelésből álló csoport ugyanolyan széles dobozt kaphat, mint egy háromezres csoport. Ezért a csoportméreteket mindig ráírjuk az ábrára, és a kis csoportból levont következtetést külön megjelöljük.

13.3.2.5 Korreláció és kovariancia

Két numerikus változó lineáris kapcsolatát a kovariancia irányítja:

sxy=1n−1∑i=1n(xi−x‾)(yi−y‾),s_{xy}=\frac{1}{n-1}\sum_{i=1}^n (x_i-\bar{x})(y_i-\bar{y}),

ahol x‾\bar{x} és y‾\bar{y} a két mintaátlag. Ha xix_i átlag feletti és yiy_i is átlag feletti, a szorzat pozitív; ha ellentétes irányban térnek el, negatív. A mértékegysége viszont km és nap szorzata, ezért önmagában nem értelmezhető erősségként. A Pearson-korreláció a standardizált eltérések átlagos szorzata:

rxy=∑i=1n(xi−x‾)(yi−y‾)∑i=1n(xi−x‾)2∑i=1n(yi−y‾)2.r_{xy}=\frac{\sum_{i=1}^n (x_i-\bar{x})(y_i-\bar{y})} {\sqrt{\sum_{i=1}^n (x_i-\bar{x})^2}\sqrt{\sum_{i=1}^n (y_i-\bar{y})^2}}.

A számláló és a nevező ugyanazt a (km⋅nap)(\text{km}\cdot\text{nap}) dimenziót hordozza, ezért rxyr_{xy} dimenziómentes és [−1,1][-1,1]-be esik. Az r=1r=1 azt jelenti, hogy a pontok egy pozitív meredekségű egyenesen fekszenek; az r=−1r=-1 negatív egyenest jelent. Ha yy az xx-nek lineáris függvénye, y=ax+by=ax+b, akkor r=sign(a)r=\operatorname{sign}(a). A Pearson-korreláció csak lineáris kapcsolatot mér, és érzékeny a szélsőséges pontokra. Ha csak monotonitásra vagyunk kíváncsiak, a rangokon számolt Spearman-korreláció robusztusabb alternatíva, de ezt itt nem keverjük a Pearson-féle értelmezéssel.

13.3.2.6 Simpson-jelenség

Az aggregált korreláció és a csoporton belüli korrelációk eltérhetnek, ha a csoportképző változó mindkét vizsgált változót eltolja. Tegyük fel, hogy az A csoport adatai (x,y)(x,y) párokban (1,3),(2,2),(3,1)(1,3),(2,2),(3,1), a B csoporté (4,6),(5,5),(6,4)(4,6),(5,5),(6,4). Mindkét csoportban r=−1r=-1, mert a pontok tökéletesen csökkenő egyenesen vannak. A hat pont összevonva viszont emelkedő képet mutat, mert a B csoport x- és y-átlaga is magasabb, mint az A-é: az aggregált Pearson-korreláció +0,543+0{,}543. Ezt hívjuk Simpson-jelenségnek: a trend iránya megfordulhat, ha a rétegző változót figyelmen kívül hagyjuk.

A Northstar esetében az ilyen eltérés oka lehet, ha az egyik régió egyszerre nagyobb átlagos távolságú és nagyobb átlagos késésű, miközben a régión belül a távolság és késés kapcsolata gyenge. Ez nem ok-okozati bizonyíték; csak arra figyelmeztet, hogy a rétegzett elemzés más kérdésre válaszol, mint az aggregált.

13.3.3 Teljes minimális munkapélda

Először kézi ellenőrzést végzünk. Legyen öt rendelés distance_km értéke

x=(5,10,15,20,25)x=(5,10,15,20,25)

és a hozzájuk tartozó delivery_days

y=(2,3,3,4,5).y=(2,3,3,4,5).

A mintaátlagok x‾=15\bar{x}=15 km és y‾=3,4\bar{y}=3{,}4 nap. Az eltérések szorzatösszege 3535, az xx-eltérések négyzetösszege 250250, az yy-eltéréseké 5,25{,}2. Így

r=35250⋅5,2=0,9707.r=\frac{35}{\sqrt{250 \cdot 5{,}2}}=0{,}9707.

Ez erős pozitív lineáris kapcsolatot jelez ezen az öt ponton. Az ellenőrző tulajdonság, hogy rr a dimenziómentes standardizálás miatt nem változik, ha a távolságot mérföldre váltjuk, mert az xx-értékek közös pozitív számmal való szorzása a számlálót és a nevezőt ugyanazzal a konstanssal szorozza.

A laboradat három célzott ábráját az alábbi script készíti el. A kód a lab projekt gyökeréből futtatandó, ahol a pyproject.toml és az orders.csv található. A korábbi környezetfejezetekben beállított uv-projektet használjuk:

# a lab/ munkakönyvtárból, ahol a pyproject.toml és az orders.csv van
uv run python s051_eda.py
# s051_eda.py
# Leíró elemzés: eloszlás, kapcsolat, csoportkülönbség
import numpy as np
import pandas as pd
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
import seaborn as sns
from pathlib import Path

def pearson_manual(x, y):
    """Pearson-korreláció a képletből, explicit centírozással."""
    x = np.asarray(x, dtype=float)
    y = np.asarray(y, dtype=float)
    xd = x - x.mean()
    yd = y - y.mean()
    return float((xd * yd).sum() / np.sqrt((xd ** 2).sum() * (yd ** 2).sum()))

# --- Kézi kontroll, nincs szükség a laborfájlra ---
demo_x = np.array([5.0, 10.0, 15.0, 20.0, 25.0])
demo_y = np.array([2.0, 3.0, 3.0, 4.0, 5.0])
demo_r = pearson_manual(demo_x, demo_y)
print(f"Kezi Pearson r: {demo_r:.4f}")
assert np.isclose(demo_r, 0.9707, atol=0.0001)

# --- Northstar orders betöltése ---
orders = pd.read_csv(
    "orders.csv",
    parse_dates=["order_ts"],
    usecols=[
        "order_id", "order_ts", "distance_km", "delivery_days",
        "region", "priority_flag"
    ],
)
eda = orders.dropna(subset=["distance_km", "delivery_days"])
print("shape:", eda.shape)
print("dtypes:")
print(eda[["distance_km", "delivery_days", "region"]].dtypes)

out_dir = Path("figures_s051")
out_dir.mkdir(exist_ok=True)

# --- 1. ábra: hisztogram + ECDF ---
fig, (ax_hist, ax_ecdf) = plt.subplots(1, 2, figsize=(11, 4))
bins = np.arange(eda["delivery_days"].min() - 0.5,
                 eda["delivery_days"].max() + 1.5, 1.0)
ax_hist.hist(eda["delivery_days"], bins=bins, color="#4C72B0",
             edgecolor="white")
ax_hist.set_xlabel("delivery_days (nap)")
ax_hist.set_ylabel("darabszám")
ax_hist.set_title("Hisztogram, 1 napos bin")

sorted_days = np.sort(eda["delivery_days"].to_numpy())
ecdf_y = np.arange(1, len(sorted_days) + 1) / len(sorted_days)
ax_ecdf.step(np.r_[sorted_days[0] - 1, sorted_days],
             np.r_[0.0, ecdf_y], where="post", color="#C44E52")
ax_ecdf.axhline(0.5, color="gray", linewidth=0.6, linestyle="--")
ax_ecdf.set_xlabel("delivery_days (nap)")
ax_ecdf.set_ylabel("F_n(x)")
ax_ecdf.set_title("ECDF, binválasztástól független")
fig.tight_layout()
fig.savefig(out_dir / "delivery_days_distribution.png", dpi=150)
plt.close(fig)
assert np.isclose(ecdf_y[-1], 1.0)

# --- 2. ábra: scatter rétegző színnel ---
fig, ax = plt.subplots(figsize=(7, 5))
sns.scatterplot(data=eda, x="distance_km", y="delivery_days",
                hue="region", alpha=0.4, ax=ax)
ax.set_xlabel("distance_km (km)")
ax.set_ylabel("delivery_days (nap)")
ax.set_title("Kézbesítési idő a távolság függvényében, régiónként")
fig.tight_layout()
fig.savefig(out_dir / "distance_vs_delivery_scatter.png", dpi=150)
plt.close(fig)

# --- 3. ábra: boxplot + csoportméret ---
region_order = ["north", "central", "south"]
fig, ax = plt.subplots(figsize=(7, 5))
sns.boxplot(data=eda, x="region", y="delivery_days",
            order=region_order, color="#55A868", ax=ax)
counts = eda["region"].value_counts().reindex(region_order)
for i, region in enumerate(region_order):
    ax.text(i, ax.get_ylim()[1] * 0.98, f"n={counts[region]}",
            ha="center", va="top", fontsize=9)
ax.set_xlabel("region")
ax.set_ylabel("delivery_days (nap)")
ax.set_title("Kézbesítési idő csoportonként, csoportmérettel")
fig.tight_layout()
fig.savefig(out_dir / "delivery_days_by_region_boxplot.png", dpi=150)
plt.close(fig)

# --- Aggregált és rétegzett korreláció ---
r_all = pearson_manual(eda["distance_km"], eda["delivery_days"])
print(f"Aggregalt Pearson r: {r_all:+.3f}")
for region, d in eda.groupby("region"):
    r_group = pearson_manual(d["distance_km"], d["delivery_days"])
    print(f"{region:<8} n={len(d):4d}  atlag_tav={d['distance_km'].mean():6.2f} km "
          f" atlag_keses={d['delivery_days'].mean():5.2f} nap  r={r_group:+.3f}")

A csoportátlagok kiírása azért fontos, mert a Simpson-jelenséget nem a rétegzett rr-ek önmagukban, hanem a csoportok közötti átlageltolódásokkal együtt lehet értelmezni: ha az egyik régió átlagos távolsága és átlagos késése is magas, az aggregált rr a csoportok közötti eltolódást is tükrözi.

13.3.4 Eredmény értelmezése

A kézi kontroll r=0,9707r=0{,}9707 pontosan egyezik a levezetéssel. A labor futtatása során a script a figures_s051/ mappába írja a három PNG-t, és kiírja az aggregált, illetve régiós korrelációkat. A jelen tankönyvi generálás nem futtatja ezt a scriptet, ezért a Northstar-számokat itt nem nevezzük mértnek; a tanuló a saját futtatási jegyzékében rögzíti a tényleges értékeket. Az invariáns ellenőrzések a kódban futnak: az ECDF utolsó értéke 1, a csoportméretek összege a teljes sorok száma, és a Pearson-függvény minden hívása a [−1,1][-1,1] tartományban marad. A dropna utáni sorok számát is kiírjuk, hogy egy esetleges szándékosan sérült bemenet ne csendben torzítsa az ábrákat. Az ábrákat úgy érdemes olvasni, hogy a hisztogram módusza és ferdesége a tipikus késést, az ECDF pedig a kvantiliseket adja binfüggés nélkül; a scatter a régiók szerinti színnel a rétegzett kapcsolatot mutatja; a boxplot a mediánok és a szóródás összevetését adja a csoportméretek ismeretében.

A korreláció csoportonkénti és összesített értéke közötti eltérés lehet összetételhatás; a Pearson-korreláció aggregálása nem egyszerű súlyozott átlagolás. A Simpson-jelenség példájában válasszuk külön a csoporton belüli és a csoportok közötti összefüggést.

13.3.5 Feladatok

  1. Értelmezés. A scatter pozitív irányt mutat distance_km és delivery_days között. Fogalmazd meg, miért nem jelenti ez automatikusan azt, hogy a nagyobb távolság okozza a késést, és adj egy lehetséges alternatív magyarázatot a régiókkal kapcsolatban.

  2. Megvalósítás. A kézi ötelemű példából (x=(5,10,15,20,25), y=(2,3,3,4,5)) készíts ECDF-et. Add meg lépésenként a rendezett y-értékeket, a hozzájuk tartozó Fn(y)F_n(y) értékeket, és olvasd le a mediánt.

  3. Hibakeresés. Egy kolléga a region és delivery_days kapcsolatát sns.scatterplot(data=orders, x="region", y="delivery_days") parancssal ábrázolja. Mi a hiba? Melyik ábratípus alkalmasabb erre a változópárra, és mit veszítenénk, ha a boxploton a csoportméreteket nem tüntetjük fel?

  4. Megváltozott feltétel. Készíts másolatot az eda tábláról, amelyben a north régió minden delivery_days értékéhez hozzáadsz 3 napot. Számítsd ki újra az aggregált és a régiós Pearson-korrelációkat. Melyik értéknek kell a lebegőpontos tolerancián belül változatlannak maradnia, és miért?

13.3.6 Megoldások és indoklás

1. A korreláció együttmozgást mér, nem beavatkozást. A nagyobb távolság növelheti a késést, de a region mindkettővel összefügghet: ha például a north régió jellemzően nagyobb távolságú rendeléseket és nagyobb átlagos késést is tartalmaz, akkor a régió keverő változó lehet. Ekkor az aggregált pozitív rr részben a régiók közötti eltolódásból fakad, nem a távolság rendelésen belüli hatásából. A rétegzett scatter és a csoportonkénti rr segít elkülöníteni ezt a két kérdést. Oksági állításhoz randomizált kísérlet vagy explicit oksági azonosítás kell; a korrelációs ábra csak a következő vizsgálat kiindulópontja.

2. A rendezett y-értékek 2,3,3,4,52,3,3,4,5. Az ECDF a jobbról folytonos lépcsővel:

x F_n(x)
2 1/5 = 0.20
3 3/5 = 0.60
4 4/5 = 0.80
5 5/5 = 1.00

A medián az a legkisebb érték, ahol Fn(x)≥0,5F_n(x)\ge 0{,}5, tehát 3 nap. Ellenőrzés: a rendezett minta középső eleme a harmadik, ami 3.

3. A scatter két numerikus tengelyt vár, de a region kategória. A kategorikus értékeket a scatter önkényes sorrendben helyezné a vízszintes tengelyre, ami hamis folytonos kapcsolatot sugallna. Kategorikus csoportosítóhoz a boxplot vagy viola plot alkalmas. Ha a csoportméreteket nem írjuk ki, egy 3 elemű régió ugyanúgy néz ki, mint egy 900 elemű, ezért tévesen adhatunk azonos súlyt a kis mintájú csoport ingadozásának. A csoportméretet mindig fel kell tüntetni.

4. A north csoporton belüli Pearson-korrelációnak változatlannak kell maradnia, mert r(x,y+c)=r(x,y)r(x, y+c)=r(x,y): a konstans cc a centírozás során kiesik. Numerikusan np.isclose(r_north_old, r_north_new, atol=1e-12) ellenőrzést várunk. Az aggregált rr viszont változhat, mert a +3+3 napos eltolás csak az egyik keverékkomponenst mozgatja, így a régiók közötti eltolódás és a teljes mintabeli kovariancia szerkezete módosul. Ez a feladat éppen a standardizálás Várható érték és Monte Carlo közelítés alfejezetben látott invarianciáját és a keverék eloszlások érzékenységét köti össze.

13.3.7 Gyakori tévedés ellenpéldával

A leggyakoribb tévedés, hogy a korreláció ok-okozati hatásként jelenik meg. A fenti Simpson-példa az ellenpélda: az A és B csoportban r=−1r=-1, az összevont hat ponton r≈+0,543r\approx+0{,}543. Ugyanazokat a pontokat nézve a „hatás” iránya az összevonástól függ — ezért a korreláció predikciós együttmozgást ír le, nem beavatkozási hatást. A második gyakori tévedés a hisztogram alakjának túlértelmezése. Ugyanaz a delivery_days minta széles binnel egyetlen módust mutathat, keskeny binnel pedig több különálló csúcsot; a módusz és a „módok száma” nem adatjellemző, hanem binválasztás függvénye is. Az ECDF, a kvantilisek és a medián binfüggetlen kontrollt adnak. Önellenőrzés: meg tudnám-e mondani egy boxplotról, hogy a mögötte álló csoport 10 vagy 1000 elemű? Meg tudnám-e mondani, hogy egy aggregált rr mögött mennyi rétegen belüli, ellentétes irányú kapcsolat van? Ha a válasz nem, kiegészítő ábra vagy táblázat kell.

13.3.8 Rövid összefoglaló

A hisztogram a binválasztás függvényében mutatja az alakot, ezért az ECDF binfüggetlen kvantilisellenőrzést ad. A scatter megfigyelési egységenként ábrázolja két numerikus változó kapcsolatát, a boxplot kategorikus csoportok között veti össze a mediánt, kvartiliseket és kiugrókat, de a csoportméretet külön fel kell tüntetni. A Pearson-korreláció a standardizált eltérések átlagos szorzata, dimenziómentes, és csak lineáris kapcsolatot mér. A Simpson-jelenség azt mutatja, hogy az aggregált és a rétegzett korreláció iránya eltérhet, ha a rétegző változó mindkét tengelyt eltolja. A Northstar-labor három ábrája és a régiós korrelációs tábla ezt a megkülönböztetést gyakorolja. A következő Hiány és anomália mint vizsgálati kérdés a hiányzó értékek és anomáliák vizsgálatát kapcsolja ehhez a szemlélethez.