A honlap az általam alkalmazott adatelemzési munkafolyamatot, annak matematikai, programozási és módszertani alapjait mutatja be. Az egyes fejezetekben bemutatom, hogyan és milyen eszközökkel válhatnak a szervezet adatai a döntéseket támogató, értékteremtő erőforrássá a közös munkában.
A megoldandó feladat, az elemzési cél és az elvárt eredmény pontos meghatározása közös szakmai egyeztetésen.
A szakmai folyamat egyik első lépése az adatok és adatforrások feltárása, összegyűjtése, ellenőrzése és az elemzésre való előkészítése.
Az adatok rendezése, tisztítása és szükség szerinti kiegészítése, majd a bennük rejlő tulajdonságok, összefüggések és mintázatok vizualizálása. A cél az elemzéshez szükséges adatminőség biztosítása és a felismerések érthető bemutatása.
A szakmai kérdéshez és a helyes, értelmezhető válaszokhoz illeszkedő adatelemzési, modellezési és programozási módszerek alkalmazása.
Az eredmények szakmai és szervezeti bemutatása, közös értelmezése, a projekt lezárása és a lehetséges következő projektek meghatározása.
A mikroprojekt során egyeztetett módon a teljes elemzésről leírás készül a saját adatelemzési honlapra.
Kizárólag a mikroprojektekre érvényes lépés.
A lineáris algebra az adatelemzés és a gépi tanulás egyik matematikai alapja: vektorokkal, mátrixokkal, lineáris transzformációkkal és ezek geometriai jelentésével foglalkozunk.
A lineáris algebra az adatelemzés egyik fontos matematikai alapja: segítségével az adatokat vektorokkal és mátrixokkal írhatjuk le, a közöttük lévő távolságokat, irányokat és kapcsolatokat pedig matematikailag kezelhetjük. Ebben a részben megismerjük a vektor, mátrix, skalárszorzat, vektorhossz, norma, távolság, lineáris kombináció, ortogonalitás és mátrixműveletek fogalmait, valamint azt, hogyan kapcsolódnak ezek az adatelemzés gyakorlati feladataihoz.
A vektort tekinthetjük egy adatpont matematikai reprezentációjának. Egy n tulajdonságból álló megfigyelés például felírható így:
Két vektor skalárszorzata:
A skalárszorzat segítségével nemcsak vektorok műveleteit végezhetjük el, hanem az irányuk és hasonlóságuk is vizsgálható. A vektor hossza, vagyis euklideszi normája:
A két adatpont közötti euklideszi távolság:
Ezek az egyszerűnek tűnő matematikai fogalmak közvetlenül megjelennek a későbbi adatelemzési módszerekben. A KNN esetében például az adatpontok közötti távolság alapján keresünk hasonló megfigyeléseket, a K-means esetében pedig a klaszterközéppontokhoz viszonyított távolság határozza meg a csoportosítást. A részletes KNN- és K-means-módszertan később, a gépi tanulás, illetve a klaszterezés fejezetében jelenik meg.
Fontos fogalom a vektor normalizálása is. L2-normalizálás esetén például:
Így a vektor hossza 1 lesz, miközben az iránya nem változik. Ez különösen akkor lehet hasznos, amikor az adatok nagysága helyett inkább a mintázat vagy az irány hasonlósága érdekel bennünket; a változók skálázásának és standardizálásának részletes tárgyalása azonban később, az adat-előkészítésnél és a gépi tanulásnál kap helyet.
A mátrixok segítségével egy teljes adatállományt is egységes matematikai formában írhatunk le:
Ez az ábrázolás már közvetlen kapcsolatot teremt a lineáris algebra és a statisztikai modellezés között. A lineáris regresszió mátrixos alakja – ha az X mátrix tartalmazza a konstans tag oszlopát – például:
Teljes oszloprangú X mátrix esetén a legkisebb négyzetek módszerének klasszikus zárt alakú megoldása:
Megvizsgáljuk, hogyan mérhető két változó együttmozgása, és mit jelent a kovariancia, illetve a korreláció.
A korreláció és a kovariancia két változó együttmozgását írja le, és fontos eszköz annak vizsgálatára, hogy az egyik változó növekedése vagy csökkenése milyen kapcsolatban áll a másik változóval. A kovariancia az együttmozgás irányát és nagyságát a két változó mértékegységének szorzatában fejezi ki, míg a Pearson-korreláció ezt standardizálja, így az együttható −1 és +1 közé esik.
Két változó mintabeli kovarianciája:
A Pearson-féle korrelációs együttható:
Értelmezéskor az előjel az együttmozgás irányát, az abszolút érték pedig a lineáris kapcsolat erősségét jelzi. Az r = +1 vagy r = −1 érték tökéletes pozitív, illetve negatív lineáris kapcsolatot jelez; a 0-hoz közeli Pearson-korreláció gyenge lineáris kapcsolatot jelent, de ettől még fennállhat erős, nem lineáris összefüggés. A korreláció önmagában nem bizonyít ok-okozati kapcsolatot.
A korrelációs mátrix több változó páronkénti kapcsolatát egyetlen táblázatban foglalja össze. Az EDA során ezt a gondolkodást használjuk a változók kapcsolatainak feltárására, a részletes hipotézisvizsgálat és a statisztikai következtetés pedig a későbbi statisztikai elemzési részekhez kapcsolódik.
A regresszió segítségével egy vagy több változó alapján próbálunk megmagyarázni vagy becsülni egy célváltozót.
A lineáris regresszió egy célváltozó és egy vagy több magyarázó változó közötti kapcsolat matematikai modellje. Az egyszerű lineáris regresszió alapgondolata, hogy az adatpontokhoz olyan egyenest keresünk, amely a lehető legjobban közelíti a megfigyelt értékeket.
Az egyszerű lineáris regresszió egyenlete:
Itt β₀ a tengelymetszet, β₁ pedig azt mutatja meg, hogy x egy egységnyi változása átlagosan hogyan változtatja a becsült célváltozót. A maradék vagy reziduum:
A legkisebb négyzetek módszere azt az egyenest keresi, amely minimalizálja a négyzetes hibák összegét:
A modell hibáinak vizsgálatához reziduális diagramot is használhatunk; ez segít felismerni, hogy a maradékok véletlenszerűen oszlanak-e el, vagy valamilyen mintázat marad bennük.
Többváltozós esetben a modell mátrixos formában írható fel:
A regresszióhoz kapcsolódó modellillesztést, maradékelemzést, determinációs együtthatót és statisztikai feltételeket később részletesebben tárgyaljuk; itt a matematikai összefüggés és a modell logikája a lényeg.
Összekapcsoljuk a korábbi matematikai ismereteket a gépi tanulás alapfogalmaival: tanítóadat, célváltozó, tulajdonság, modell, paraméter és predikció.
A gépi tanulás matematikai alapjainál az eddig megismert vektoros, mátrixos és statisztikai gondolkodást kapcsoljuk össze a modell tanításának fogalmával. A modell a bemeneti adatok és a célváltozó közötti kapcsolatot próbálja megtanulni úgy, hogy egy választott veszteségfüggvényt csökkentsen.
Egy általános gépi tanulási modell felírható:
ahol θ a modell tanult paramétereinek együttese. A tanítás során egy veszteségfüggvényt minimalizálunk; regressziós példában a négyzetes hiba átlagos alakja:
A paraméterek módosításának egyik alapötlete a gradiens szerinti lépés:
ahol η a tanulási ráta, ∇L(θ) pedig a veszteségfüggvény gradiensvektora. Ez azt fejezi ki, hogy a modell a veszteség csökkenésének irányába változtatja a paramétereit.
A gépi tanulásban a matematika egyik kulcskérdése ezért az, hogyan reprezentáljuk az adatokat, hogyan mérjük a hibát, és hogyan módosítjuk a modell paramétereit. A konkrét KNN-, K-means-, osztályozási és egyéb algoritmusok részletes működését későbbi fejezetekben bontjuk ki; itt az ezek mögött álló közös matematikai logika a fontos.
Változók, adattípusok, vezérlési szerkezetek, függvények és adatszerkezetek használata.
Változóban adatokat tárolunk, amelyek értéke a program futása során megváltozhat.
vendegejszakak = 1250
Az adattípus meghatározza, hogy egy értéket milyen formában kezelünk, például számként, szövegként vagy logikai értékként.
telepules = "Siófok"
Az elágazások és ciklusok szabályozzák, hogy a program mely utasításokat és milyen sorrendben hajtsa végre.
vendegszam = 1250
if vendegszam > 1000:
print("Magas forgalom")
A függvény egy újrafelhasználható programegység, amely bemeneteket fogadhat és eredményt adhat vissza.
def atlag(lista):
return sum(lista) / len(lista)
Az eljárás olyan újra felhasználható programegység, amely elsősorban egy műveletet hajt végre, és nem feltétlenül ad vissza értéket.
def jelentest_ir():
print("Elemzés elkészült")
Az egyszerű adatszerkezetek egy-egy értéket, az összetettek pedig több kapcsolódó értéket kezelnek rendezett vagy kulcs-érték formában.
varosok = ["Siófok", "Keszthely"]
adat = {"év": 2025, "vendég": 1250}
Egy elemzési feladatot kisebb, programozható lépésekre bontunk.
Ebben a példában egy egyszerű adatelemzési feladatot bontunk fel logikai programozási lépésekre: modulok importálása, változók létrehozása, számítások elvégzése és az eredmények megjelenítése.
# A math modul egyik függvényét fogjuk használni.
import math
# Egy fiktív turisztikai helyszín adatait rögzítjük.
vendegek = 1250
vendegejszakak = 2875
napok = 365
# Kiszámítjuk az egy vendégre jutó átlagos vendégéjszakát.
atlag_vendegejszaka = vendegejszakak / vendegek
# Kiszámítunk egy egyszerű éves napi átlagot.
napi_atlag = vendegek / napok
# Az eredményeket jól olvasható formában jelenítjük meg.
print("Átlagos vendégéjszaka:", round(atlag_vendegejszaka, 2))
print("Napi átlagos vendégszám:", round(napi_atlag, 2))
Ez a szerkezet jól mutatja az adatelemzési programozási gondolkodás lényegét: a feladatot először részekre bontjuk, majd minden lépéshez külön, ellenőrizhető kódot és eredményt rendelünk. Jupyter Notebookban ugyanez a logika külön cellákban jelenik meg, így a magyarázat, a kód és a futási eredmény egymás mellett követhető.
Egy látványos, 3D-szerű pontdiagram segítségével több változó együttes kapcsolatát tesszük áttekinthetővé.
Pythonban ugyanazt a fiktív elemzési eredményt mutatjuk be, mint a másik programozási nyelv példájában, így a két eszköztár később közvetlenül összehasonlítható.
ax.scatter(x, y, z, s=meret, alpha=0.8)
Az R egy statisztikai és adatelemzési célokra széles körben használt programozási nyelv, amely különösen erős a statisztikai számításokban és az adatvizualizációban.
R-ben az értékadással változókat hozunk létre, amelyekben számokat, szövegeket vagy más adatokat tárolhatunk.
vendegejszakak <- 1250
Az R többek között numerikus, karakteres, logikai és faktor típusú adatokat kezel.
telepules <- "Siófok"
Az elágazások és ciklusok szabályozzák, hogy az R-program milyen feltételek mellett és hányszor hajtson végre egy utasítást.
vendegszam <- 1250
if (vendegszam > 1000) {
print("Magas forgalom")
}
Az R-ben függvényeket definiálhatunk, amelyek bemeneteket fogadnak és egy eredményt adnak vissza.
atlag <- function(x) {
mean(x)
}
R-ben önálló műveleteket végző függvényeket is használhatunk olyan esetekben, amikor elsődlegesen egy művelet végrehajtása a cél.
jelentest_ir <- function() {
print("Elemzés elkészült")
}
Az R vektorokat, listákat, mátrixokat, adatkereteket és egyéb összetett adatszerkezeteket kínál az adatok kezelésére.
varosok <- c("Siófok", "Keszthely")
adat <- list(év = 2025, vendeg = 1250)
Egy rövid, logikai lépésekre bontott R-program bemutatása az adatok beolvasásától a számításokon át az eredmények megjelenítéséig.
Ebben a példában egy egyszerű adatelemzési feladatot bontunk fel logikai R-programozási lépésekre: csomag betöltése, változók létrehozása, számítások elvégzése és az eredmények megjelenítése.
# A számításokhoz az alap R környezet eszközeit használjuk.
# Külső csomagra ebben az egyszerű példában nincs szükség.
library(stats)
# Egy fiktív turisztikai helyszín adatait rögzítjük.
vendegek <- 1250
vendegejszakak <- 2875
napok <- 365
# Kiszámítjuk az egy vendégre jutó átlagos vendégéjszakát.
atlag_vendegejszaka <- vendegejszakak / vendegek
# Kiszámítjuk az éves napi átlagos vendégszámot.
napi_atlag <- vendegek / napok
# Az eredményeket formázott szövegként jelenítjük meg.
cat("Átlagos vendégéjszaka:", round(atlag_vendegejszaka, 2), "\n")
cat("Napi átlagos vendégszám:", round(napi_atlag, 2), "\n")
Az R-ben is ugyanaz az alapvető elemzői gondolkodás jelenik meg: a feladatot logikai lépésekre bontjuk, minden lépéshez külön kódot rendelünk, majd ellenőrizzük és megjelenítjük az eredményt. Jupyter Notebook környezetben ez a folyamat cellákra bontható, miközben R Markdown vagy más R-alapú notebook-megoldás is használható hasonló célra.
Egy buborékdiagram segítségével több változó együttes kapcsolatát tesszük áttekinthetővé.
Az R példában egy színes buborékdiagramot mutatunk be. A szín a bemutatóhely típusát, a buborék mérete a látogatottság relatív nagyságát, a vízszintes tengely pedig a vendégéjszakák számát jelöli.
# Önállóan futtatható, fiktív példa a buborékdiagramhoz:
library(plotly)
adat_abra <- data.frame(
vendegejszaka = c(900, 1300, 2100, 2850, 3400),
latogato = c(600, 850, 1250, 1550, 1800),
tipus = c("Természeti", "Kulturális", "Aktív turizmus", "Vegyes profil", "Kulturális")
)
plot_ly(adat_abra, x = ~vendegejszaka, y = ~latogato,
size = ~latogato, color = ~tipus,
type = "scatter", mode = "markers")
A Pandas segítségével megtanuljuk az Excel-, CSV- és egyéb strukturált adatok beolvasását, tisztítását, átalakítását és elemzésre való előkészítését.
A Pandas a Python egyik legfontosabb adatelemzési könyvtára, amely táblázatos adatok kezelésére szolgál. Központi objektuma a DataFrame, amely sorokból és oszlopokból álló adatstruktúra, míg a Series egyetlen, indexelt adatsort reprezentál. A leggyakoribb műveletek közé tartozik az adatok beolvasása, kiválasztása, szűrése, rendezése, új változók képzése és a hiányzó értékek kezelése.
A Pandas különösen hasznos akkor, amikor Excel- vagy CSV-állományból szeretnénk elemzésre alkalmas adathalmazt létrehozni.
import pandas as pd
# Fiktív adatok létrehozása.
adat = pd.DataFrame({
"telepules": ["Siófok", "Keszthely", "Balatonfüred"],
"vendegek": [1250, 980, 1430]
})
# Csak az 1000 főnél több vendéggel rendelkező helyszíneket választjuk ki.
eredmeny = adat[adat["vendegek"] > 1000]
print(eredmeny)
A változók, adatszerkezet és az alapvető statisztikai jellemzők feltárása.
Az EDA első lépése az adatállomány szerkezetének és tartalmának megismerése. Megvizsgáljuk a sorok és oszlopok számát (shape), az oszlopneveket és adattípusokat (dtypes), az első néhány rekordot (head), valamint az alapvető leíró statisztikákat (describe).
Ezzel gyorsan kiderülhet például, hogy egy számnak szánt oszlop szövegként került-e beolvasásra, illetve hogy milyen tartományban mozognak az értékek.
import pandas as pd
adat = pd.DataFrame({
"ev": [2022, 2023, 2024],
"latogatottsag": [820, 940, 1110]
})
print(adat.shape)
print(adat.dtypes)
print(adat.describe())
Hiányzó, nulla, negatív vagy egyéb problémás értékek azonosítása és kezelése.
Az adatelemzés egyik leggyakoribb problémája a hiányzó érték, amelyet Pandasban többek között az isna() és notna() segítségével azonosíthatunk. A hibás értékek felismerésénél vizsgálhatjuk az érvénytelen tartományokat, a nullaértékeket és az olyan, szakmailag nem értelmezhető értékeket is, mint egy látogatószámban szereplő negatív szám.
A hiányzó vagy hibás adatok kezelése történhet például törléssel, pótlással vagy külön jelöléssel; a módszer megválasztása mindig az adat jelentésétől függ.
import pandas as pd
adat = pd.DataFrame({
"helyszin": ["A", "B", "C", "D"],
"latogato": [1200, None, -50, 980]
})
hianyzo = adat["latogato"].isna().sum()
negativ = (adat["latogato"] < 0).sum()
# A negatív értékeket hiányzóként kezeljük.
adat.loc[adat["latogato"] < 0, "latogato"] = None
print("Hiányzó értékek:", hianyzo)
print("Negatív értékek:", negativ)
print(adat)
Outlierek felismerése és értelmezése például IQR-alapú módszerrel.
A kiugró érték olyan megfigyelés, amely jelentősen eltér az adatok többségétől. Az egyik gyakori módszer az IQR (interkvartilis terjedelem) használata: az első és harmadik kvartilis különbsége adja az IQR-t, a tipikus határokat pedig a Q1 − 1,5×IQR és Q3 + 1,5×IQR képletek adják.
Fontos, hogy a kiugró érték nem automatikusan hibás adat: lehet adatbevitelből származó hiba, de lehet valós és szakmailag érdekes jelenség is.
import pandas as pd
adat = pd.Series([80, 95, 100, 105, 110, 115, 120, 130, 135, 400])
q1 = adat.quantile(0.25)
q3 = adat.quantile(0.75)
iqr = q3 - q1
also_hatar = q1 - 1.5 * iqr
felso_hatar = q3 + 1.5 * iqr
kiugro = adat[(adat < also_hatar) | (adat > felso_hatar)]
print("IQR:", iqr)
print("Kiugró értékek:", kiugro.tolist())
Változók közötti kapcsolatok keresése statisztikai és vizuális módszerekkel.
Az EDA során nemcsak az egyes változókat, hanem azok egymáshoz való viszonyát is vizsgáljuk. Két változó kapcsolatának gyors feltárására használható például a korrelációs együttható, amely megmutatja a lineáris együttjárás irányát és erősségét; a kapcsolat vizuálisan pontdiagrammal is ellenőrizhető.
Az összefüggés feltárása segít kérdéseket megfogalmazni a további statisztikai elemzéshez, de önmagában nem bizonyít ok-okozati kapcsolatot.
import pandas as pd
adat = pd.DataFrame({
"marketing": [10, 20, 30, 40, 50],
"latogatottsag": [420, 510, 620, 710, 830]
})
r = adat["marketing"].corr(adat["latogatottsag"])
print("Pearson-korreláció:", round(r, 2))
Az adatok csoportosítása, összesítése és csoportszintű mutatók készítése az EDA során.
A csoportosítás során egy kategóriaváltozó alapján részhalmazokra bontjuk az adatokat, majd az egyes csoportokra összesítő műveleteket végzünk. Pandasban ennek alapvető eszköze a groupby(), amelyhez olyan aggregáló függvények kapcsolhatók, mint a sum(), mean(), count(), min() és max().
Az aggregálás segítségével például régiónként, évenként vagy kategóriánként készíthetünk összesítéseket, amelyek már közvetlenül felhasználhatók összehasonlításra és további elemzésre.
import pandas as pd
adat = pd.DataFrame({
"regio": ["Észak", "Észak", "Dél", "Dél"],
"vendegek": [800, 1000, 1200, 1400]
})
eredmeny = adat.groupby("regio")["vendegek"].agg(
osszes_vendeg="sum",
atlag_vendeg="mean",
esetszam="count"
)
print(eredmeny)
Hisztogramok és egyéb diagramok segítségével vizsgáljuk az adatok eloszlását.
Az eloszlás azt mutatja meg, hogy egy változó értékei milyen gyakorisággal fordulnak elő és milyen tartományban helyezkednek el. Az EDA-ban gyakori eszköz a hisztogram, amely intervallumokra (bins) bontja az értékeket; mellette az átlag, medián, módusz és a szóródás segít az eloszlás alakjának értelmezésében.
A hisztogramon megfigyelhető lehet például a szimmetria, ferdeség, több csúcs vagy szélsőséges értékek jelenléte. A diagram célja nem pusztán a „szép megjelenítés”, hanem annak felismerése, milyen statisztikai sajátosságokra kell később figyelni.
import matplotlib.pyplot as plt
latogatok = [120, 145, 150, 155, 160, 175, 180, 185,
190, 195, 205, 210, 215, 220, 230, 245, 260, 410]
# Az értékeket 6 intervallumra bontjuk.
plt.hist(latogatok, bins=6)
plt.title("Látogatószám eloszlása")
plt.xlabel("Látogatók száma")
plt.ylabel("Gyakoriság")
plt.show()
Oszlop- és boxplotokkal mutatjuk be a csoportok közötti különbségeket.
Az összehasonlítás során arra keressük a választ, hogy két vagy több csoport értékei miben különböznek egymástól. A csoportosított oszlopdiagram különösen alkalmas arra, hogy azonos időszakok vagy azonos kategóriák mellett több csoport értékeit egymás mellett mutassa.
Az összehasonlító diagramoknál fontos a közös skála, a jól értelmezhető kategóriafelirat és a jelmagyarázat. A cél annak gyors felismerése, hogy mely csoportok térnek el egymástól, és hol látható tartós vagy időszakos különbség.
import matplotlib.pyplot as plt
import numpy as np
evek = np.array([2022, 2023, 2024])
bnpi = np.array([820, 940, 1110])
dinpi = np.array([760, 900, 980])
x = np.arange(len(evek))
szelesseg = 0.36
# A két csoportot egymás mellé rajzoljuk.
plt.bar(x - szelesseg/2, bnpi, width=szelesseg, label="BNPI")
plt.bar(x + szelesseg/2, dinpi, width=szelesseg, label="DINPI")
plt.xticks(x, evek)
plt.title("Látogatószám összehasonlítása")
plt.xlabel("Év")
plt.ylabel("Látogatók száma")
plt.legend()
plt.show()
Scatter plotokkal és más vizualizációkkal tárjuk fel a változók kapcsolatát.
Az összefüggések vizsgálatánál több változó együttes mozgását szeretnénk láthatóvá tenni. A buborékdiagram erre azért érdekes, mert egy pont vízszintes helye, függőleges helye és mérete egyszerre több információt is képes kódolni, míg a különböző jelölések további kategóriát hordozhatnak.
Ez a fajta vizualizáció jó eszköz az első feltáró lépésben, mert gyorsan megmutathatja, hogy van-e valamilyen irány, csoportosulás vagy szélsőséges megfigyelés. A vizuális kapcsolatot később statisztikai mutatókkal és megfelelő tesztekkel lehet tovább vizsgálni.
import matplotlib.pyplot as plt
vendeg = [600, 850, 1000, 1250, 1550, 1800]
ejszaka = [900, 1300, 1650, 2100, 2850, 3400]
online_index = [18, 25, 32, 48, 58, 74]
# A pont mérete a vendégek számát, a pozíció két másik változót jelez.
plt.scatter(ejszaka, online_index, s=vendeg, alpha=0.7)
plt.title("Vendégéjszakák és online láthatóság")
plt.xlabel("Vendégéjszakák")
plt.ylabel("Online láthatóság index")
plt.grid(alpha=0.2)
plt.show()
A megfelelő diagram kiválasztása és az eredmények korrekt kommunikációja.
Egy diagram értelmezése során nem elég azt látni, hogy „nő” vagy „csökken” valami: ellenőrizni kell a tengelyeket, skálát, mértékegységet, jelmagyarázatot, időszakot és a vizuális kódolást is. Egy rosszul megválasztott tengely vagy színtartomány akár ugyanazokat az adatokat is félrevezető módon jelenítheti meg.
A hőtérkép (heatmap) jó példa arra, hogyan lehet egy nagyobb táblázat sok értékét egyszerre áttekinthetővé tenni. Ilyenkor a cellák intenzitása jelzi az érték nagyságát, a sor- és oszlopfeliratok pedig megadják az összehasonlítás dimenzióit.
import pandas as pd
import matplotlib.pyplot as plt
adat = pd.DataFrame({
"vendegek": [800, 950, 1100, 1300, 1500],
"ejszakak": [1200, 1450, 1750, 2150, 2500],
"marketing": [10, 16, 21, 29, 35],
"online_index": [22, 29, 37, 48, 59]
})
korrelacio = adat.corr(numeric_only=True)
plt.imshow(korrelacio)
plt.xticks(range(4), korrelacio.columns, rotation=45, ha="right")
plt.yticks(range(4), korrelacio.columns)
plt.title("Korrelációs mátrix")
plt.colorbar(label="Korreláció")
plt.show()
Átlag, medián, szórás, kvartilisek és egyéb összefoglaló mutatók.
A leíró statisztika feladata, hogy az adatállományt néhány jól értelmezhető számmal és ábrával összefoglalja. A legfontosabb mutatók közé tartozik az átlag, medián, módusz, minimum, maximum, kvartilisek, terjedelem, variancia és szórás; ezek együtt írják le az adatok középértékét és szóródását.
Az átlag érzékenyebb a szélsőséges értékekre, a medián a rendezett adatok középső értéke, a kvartilisek pedig az eloszlás különböző részeit írják le. A szórás azt jelzi, hogy az adatok tipikusan mennyire térnek el az átlagtól.
import pandas as pd
latogatok = pd.Series([820, 900, 940, 980, 1020, 1110, 1180])
print("Átlag:", round(latogatok.mean(), 1))
print("Medián:", latogatok.median())
print("Szórás:", round(latogatok.std(), 1))
print("Q1:", latogatok.quantile(0.25))
print("Q3:", latogatok.quantile(0.75))
Statisztikai állítások vizsgálata formális tesztekkel.
A hipotézisvizsgálat segítségével egy mintából szeretnénk eldönteni, hogy az adataink mennyire egyeztethetők össze egy előre megfogalmazott állítással. A nullhipotézis (H₀) rendszerint a nincs különbség / nincs hatás állítást képviseli, az alternatív hipotézis (H₁) pedig a vizsgált eltérést.
A döntés egyik központi eleme a p-érték, amely azt fejezi ki, mennyire meglepő lenne a megfigyelt eredmény akkor, ha a nullhipotézis igaz lenne. A p-értéket mindig az előre rögzített szignifikanciaszinttel (α) együtt kell értelmezni; önmagában nem méri a hatás nagyságát.
from scipy.stats import ttest_ind
csoport_a = [820, 850, 900, 910, 940]
csoport_b = [980, 1010, 1030, 1060, 1090]
t, p = ttest_ind(csoport_a, csoport_b)
print("t-érték:", round(t, 2))
print("p-érték:", round(p, 4))
# Példánkban α = 0,05.
print("Döntés:", "szignifikáns eltérés" if p < 0.05
else "nincs elegendő bizonyíték eltérésre")
Például a Kruskal–Wallis-teszt használata megfelelő helyzetekben.
A nemparaméteres statisztikai módszerek olyan eljárások, amelyek kevésbé támaszkodnak egy adott eloszlás paraméteres feltételeire. Különösen hasznosak lehetnek kis minták, ordinális adatok, ferde eloszlások vagy erős kiugró értékek esetén.
A Mann–Whitney-próba két független csoport összehasonlítására, a Wilcoxon-próba páros mérésekre, a Kruskal–Wallis-próba pedig kettőnél több független csoport összevetésére használható. A rangokon alapuló eljárásoknál a medián és az eloszlások alakja fontosabb lehet, mint az átlag.
from scipy.stats import kruskal
a = [820, 850, 870, 910, 930]
b = [980, 1000, 1010, 1040, 1060]
c = [1150, 1160, 1180, 1210, 1240]
h, p = kruskal(a, b, c)
print("H-érték:", round(h, 2))
print("p-érték:", round(p, 4))
Hasonló megfigyelések automatikus csoportosítása előre meghatározott kategóriák nélkül.
A klaszterezés nem felügyelt tanulási módszer, amelynek célja a hasonló megfigyelések csoportokba rendezése. A K-means algoritmusban előre megadjuk a klaszterek számát (k), majd az algoritmus ismételten klaszterközéppontokat választ, pontokat rendel hozzájuk, és újraszámolja a középpontokat.
A csoportosításnál kulcsfontosságú a távolság fogalma, gyakori választás az euklideszi távolság. A klaszterezés eredménye akkor értelmezhető jól, ha a változók skálája és a klaszterek szakmai jelentése is megfelelően mérlegelve van.
from sklearn.cluster import KMeans
import pandas as pd
adat = pd.DataFrame({
"vendegek": [220, 250, 280, 700, 760, 800, 1450, 1520, 1600],
"ejszakak": [320, 360, 410, 980, 1050, 1120, 2100, 2250, 2400]
})
model = KMeans(n_clusters=3, random_state=42, n_init=10)
adat["klaszter"] = model.fit_predict(adat)
print(adat)
A létrejött csoportok jellemzőinek és szakmai jelentésének feltárása.
A klaszterezés eredménye önmagában még nem „kész válasz”: az egyes klasztereket profilozni és értelmezni kell. Megnézzük, hogy az egyes csoportokban milyen jellemző értékek, átlagok, mediánok és szélsőértékek jelennek meg, és ezek megfelelnek-e a szakmai várakozásoknak.
Fontos fogalom a klaszterközéppont, a klaszterek közötti eltérés, valamint a csoportokon belüli homogenitás. A jó értelmezés összekapcsolja a számított klasztert a valós folyamatokkal, ezért a klaszterezés után mindig szükséges egy szakmai validációs lépés.
profil = adat.groupby("klaszter")[["vendegek", "ejszakak"]].mean()
print(profil.round(0))
# A klaszterek közötti különbséget átlagértékekkel írjuk le.
for idx, sor in profil.iterrows():
print(idx, round(sor["vendegek"]), round(sor["ejszakak"]))
Hosszabb távú növekedési vagy csökkenési folyamatok felismerése.
Az idősor olyan megfigyelések sorozata, amelyeknél a megfigyelési időpontok sorrendje fontos információt hordoz. A trend a hosszabb távú irányt, az időszakos ingadozás a rövidebb távú eltéréseket írja le.
Trendvizsgálatkor azt keressük, hogy az értékek tartósan növekednek, csökkennek vagy nagyjából stabilak-e. A trend nem azonos minden egyes időpont változásával: egy növekvő hosszú távú folyamaton belül is lehetnek átmeneti visszaesések.
import pandas as pd
import matplotlib.pyplot as plt
df = pd.DataFrame({
"ev": [2019, 2020, 2021, 2022, 2023, 2024, 2025],
"vendegek": [920, 610, 760, 900, 1030, 1170, 1280]
})
# Az idősort vonaldiagramon jelenítjük meg.
plt.plot(df["ev"], df["vendegek"], marker="o")
plt.title("Éves vendégszám trendje")
plt.xlabel("Év")
plt.ylabel("Vendégek")
plt.show()
Időszakosan ismétlődő mintázatok azonosítása.
A szezonalitás rendszeresen ismétlődő időbeli mintázat, például egy havi vagy negyedéves ciklus. A ciklikusság hasonló hullámzást jelenthet, de az ismétlődés periódusa nem feltétlenül állandó vagy naptári jellegű.
Az idősorok elemzésében érdemes elkülöníteni a trend, a szezonális komponens és a véletlenszerű / szabálytalan komponens hatását. A szezonalitás felismerését segítheti a gördülő átlag, az időszakok összehasonlítása és a megfelelő vizualizáció.
import numpy as np
import matplotlib.pyplot as plt
honap = np.arange(1, 13)
forgalom = [55, 60, 72, 88, 110, 135, 150, 145, 118, 90, 68, 58]
# A havi ismétlődést vonaldiagrammal mutatjuk be.
plt.plot(honap, forgalom, marker="o")
plt.xticks(honap)
plt.title("Havi forgalom szezonális mintázata")
plt.xlabel("Hónap")
plt.ylabel("Forgalom index")
plt.show()
Szokatlan időpontok és események felismerése.
Az anomália olyan időpont vagy megfigyelés, amely jelentősen eltér az idősor megszokott mintázatától. Az anomáliadetektálásnál fontos különbséget tenni az adatminőségi hiba és a valódi, rendkívüli esemény között.
Az egyszerű módszerek között szerepelhet a gördülő átlaghoz vagy szóráshoz viszonyított eltérés, az IQR-alapú határ, illetve az idősor vizuális vizsgálata. Az anomália gyakran nem a végső válasz, hanem egy további szakmai vizsgálat kiindulópontja.
import pandas as pd
df = pd.DataFrame({
"honap": range(1, 13),
"ertek": [102, 98, 105, 110, 108, 112, 111, 109, 106, 104, 108, 190]
})
z = (df["ertek"] - df["ertek"].mean()) / df["ertek"].std()
df["anomalia"] = z.abs() > 2
print(df[df["anomalia"]])
A felügyelt tanulás olyan gépi tanulási megközelítés, amelyben a modell ismert célváltozóval rendelkező tanítóadatokból tanul.
Felügyelt tanulásnál minden tanító megfigyeléshez tartozik egy ismert célérték. A modell feladata, hogy a bemeneti tulajdonságokból megtanulja a kapcsolatot a célváltozóval, majd ezt a kapcsolatot új, korábban nem látott megfigyelésekre is alkalmazza.
Két alapvető feladattípust különböztetünk meg. Regressziónál számszerű célváltozót becsülünk, például vendégéjszakák számát; osztályozásnál kategóriát vagy osztályt próbálunk meghatározni, például azt, hogy egy helyszín magas vagy alacsony látogatottságú-e.
A tanítás során a modell a tanítóadatok alapján paramétereket tanul. A cél nem pusztán a tanítóadatok minél pontosabb leírása, hanem az, hogy a modell új adatokon is jól működjön. Ezért különösen fontos a túlilleszkedés elkerülése.
Itt X a bemeneti tulajdonságok, y a célváltozó, θ a tanult paraméterek, f pedig a modell.
from sklearn.linear_model import LinearRegression
X = [[10], [20], [30], [40], [50]]
y = [120, 190, 310, 390, 510]
modell = LinearRegression()
modell.fit(X, y)
uj = [[60]]
becsles = modell.predict(uj)
print(round(becsles[0], 1))
A nem felügyelt tanulás olyan módszerek összessége, amelyekben a modell célváltozó nélkül keres szerkezeteket, csoportokat vagy mintázatokat az adatokban.
Nem felügyelt tanulásnál nincs előre megadott helyes válasz vagy célváltozó. A modell az adatok belső szerkezetét próbálja feltárni. Ilyen feladat lehet a hasonló megfigyelések csoportosítása, a ritka vagy szokatlan pontok felismerése, illetve az adatok dimenziójának csökkentése.
A klaszterezés során hasonló adatpontokat közös csoportokba rendezünk. A korábban megismert K-means például távolságok és klaszterközéppontok alapján alakít ki csoportokat. Fontos, hogy a kapott klaszterek nem „készen adott” természetes kategóriák: szakmai értelmezésükhöz szükség van az adatok és a probléma ismeretére.
from sklearn.cluster import KMeans
X = [[10, 20], [12, 22], [11, 19],
[50, 70], [52, 72], [48, 68],
[85, 30], [88, 32], [82, 28]]
modell = KMeans(n_clusters=3, random_state=42, n_init=10)
modell.fit(X)
print(modell.labels_)
A modell a tanítóadatokból megtanult kapcsolatot alkalmazza arra, hogy új megfigyelésekhez becslést vagy osztályt rendeljen.
A modell egy olyan szabályrendszer vagy matematikai függvény, amely a bemeneti tulajdonságokból előállítja a kívánt kimenetet. A predikció ennek a modellnek az alkalmazása egy új megfigyelésre.
Fontos különbség van a modell tanítása és használata között. Tanításkor a modell a tanítóadatokból meghatározza a paramétereit; predikciókor ezeket a már megtanult paramétereket használjuk. A jó modell egyik legfontosabb jellemzője az általánosíthatóság: új adatokon is értelmezhető teljesítményt kell nyújtania.
uj_adat = [[60]]
from sklearn.linear_model import LinearRegression
X_tanito = [[10], [20], [30], [40], [50]]
y_tanito = [120, 190, 310, 390, 510]
modell = LinearRegression()
modell.fit(X_tanito, y_tanito)
uj_adat = [[60]]
becsles = modell.predict(uj_adat)
print("Becsült érték:", round(becsles[0], 1))
A predikció nem azonos a biztos jövőbeli értékkel. A modell a tanult adatok alapján becslést készít, ezért a bizonytalanság, a mérési hiba és a modell korlátai az eredmény értelmezésének részei.
A modellválasztás annak eldöntése, hogy az adott célhoz és adatszerkezethez melyik tanulási algoritmus illeszkedik.
Ugyanarra a problémára több különböző algoritmus is alkalmazható. A választásnál figyelembe vehetjük a célváltozó típusát, az adatok méretét, a változók jellegét, az értelmezhetőségi igényt, a számítási költséget és a várható általánosíthatóságot.
Tipikus regressziós modellek például a lineáris regresszió és a döntési fa regresszió, osztályozásnál pedig használhatunk logisztikus regressziót, döntési fát vagy más osztályozó algoritmust. Nem létezik minden problémára egyetlen univerzális modell.
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.tree import DecisionTreeRegressor
from sklearn.datasets import make_regression
X, y = make_regression(n_samples=100, n_features=4, noise=15, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42
)
modellek = {
"lineáris": LinearRegression(),
"döntési fa": DecisionTreeRegressor(max_depth=3, random_state=42)
}
for nev, modell in modellek.items():
modell.fit(X_train, y_train)
print(nev, modell.score(X_test, y_test))
A grafikon csak szemléltetés: valódi modellválasztásnál előre rögzített validációs eljárással és a problémához illeszkedő mérőszámmal kell összehasonlítani a modelleket.
A validáció azt vizsgálja, hogy a modell mennyire működik megbízhatóan olyan adatokon, amelyeken a tanítás során nem tanult.
A modell teljesítményének korrekt méréséhez az adatokat különböző szerepekre osztjuk. A tanítóadat a modell illesztésére, a validációs adat a beállítások és modellek összehasonlítására, a tesztadat pedig a végső teljesítmény becslésére szolgál.
Ha ugyanazt az adatot használjuk a modell tanítására és értékelésére, könnyen túlbecsülhetjük a modell teljesítményét. Kisebb adathalmazoknál a keresztvalidáció segíthet abban, hogy több adatfelosztáson is megvizsgáljuk a modell működését.
from sklearn.model_selection import train_test_split
from sklearn.datasets import make_regression
from sklearn.linear_model import LinearRegression
X, y = make_regression(n_samples=100, n_features=4, noise=15, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42
)
modell = LinearRegression()
modell.fit(X_train, y_train)
print(modell.score(X_test, y_test))
A gépi tanulási modellek előtt a hiányzó értékeket és a szöveges kategóriákat olyan formára kell hozni, amelyet az adott algoritmus kezelni tud.
A hiányzó értékek kezelése nem pusztán technikai feladat: először meg kell érteni, miért hiányzik az adat, majd az elemzési célhoz illeszkedő stratégiát kell választani. Gyakori megoldás lehet az egyszerű pótlás, de bizonyos helyzetekben a hiányzás ténye önmagában is információt hordozhat.
A kategorikus változókat – például régió vagy turisztikai típus – a modellhez illeszkedő módon kell kódolni. Az egyik gyakori megoldás az one-hot encoding, amely külön bináris változót hoz létre az egyes kategóriákhoz.
from sklearn.compose import ColumnTransformer
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import OneHotEncoder
num = SimpleImputer(strategy="median")
cat = OneHotEncoder(handle_unknown="ignore")
preprocess = ColumnTransformer([
("num", num, ["latogato"]),
("cat", cat, ["regio"])
])
A feldolgozási lépéseknek ugyanúgy a tanítóadatokból kell megtanulniuk a szükséges paramétereket, mint magának a modellnek; ezzel elkerülhető, hogy a tesztadat információi visszaszivárogjanak a tanításba.
Az új tulajdonságok létrehozása a nyers adatokból olyan változókat képez, amelyek jobban kifejezhetik a modellezési szempontból fontos információkat.
A nyers adatállomány gyakran nem tartalmazza közvetlenül azt a változót, amely a modell számára a leginformatívabb. Új tulajdonság lehet például egy arány, egy összeg, egy időbeli különbség vagy egy kategóriákból képzett mutató.
Például turisztikai adatoknál a vendégéjszakák és a vendégek számából képezhető az egy vendégre jutó átlagos vendégéjszaka. Ez nem új adatforrásból származik, hanem a meglévő adatokból képzett, értelmezhető változó.
df["atlagos_vendegejszaka"] = (
df["vendegejszaka"] / df["vendegek"]
)
print(df[["vendegek", "vendegejszaka",
"atlagos_vendegejszaka"]].head())
A tulajdonság-transzformáció a változók olyan átalakítása, amely javíthatja a modellezhetőséget vagy biztosítja az algoritmus számára szükséges adatformátumot.
A transzformáció célja lehet a változók skálájának összehangolása, az eloszlás alakjának módosítása vagy kategorikus értékek numerikus reprezentációja. Különösen fontos lehet olyan algoritmusoknál, amelyek érzékenyek a változók nagyságrendjére vagy a távolságokra.
Gyakori módszer a standardizálás, amely egy változót úgy alakít át, hogy átlaga 0, szórása pedig 1 legyen. Más esetekben logaritmikus transzformáció, bináris kódolás vagy kategóriák one-hot kódolása lehet indokolt.
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
print(X_scaled[:3])
A tulajdonságkiválasztás a modell szempontjából releváns változók megtartását és a kevésbé hasznos változók elhagyását jelenti.
A túl sok tulajdonság növelheti a modell összetettségét, a számítási igényt és bizonyos esetekben a túlilleszkedés kockázatát is. A tulajdonságkiválasztás célja ezért nem egyszerűen az, hogy minél kevesebb változó maradjon, hanem hogy a feladathoz szükséges információt lehetőleg megőrizzük.
A kiválasztás történhet szakmai ismeretek alapján, statisztikai szempontokkal vagy algoritmikus módszerekkel. Fontos, hogy a kiválasztásnál se használjuk fel jogtalanul a tesztadat információit, mert az torzíthatja a modell teljesítményének becslését.
valasztott = [
"vendegek",
"vendegejszaka",
"atlagos_vendegejszaka"
]
X_modell = df[valasztott]
print(X_modell.columns.tolist())
A kiválasztott változók halmaza legyen szakmailag indokolható és a modell validációjában is ellenőrizhető. A kevesebb változó önmagában nem jelent jobb modellt; a cél az informatív és megbízható bemeneti készlet kialakítása.
A szakmai vagy üzleti probléma, a cél és a siker feltételeinek pontos meghatározása az adatbányászati projekt kiindulópontja.
Definíció: A Business Understanding a szakmai vagy üzleti cél olyan pontos megfogalmazása, amelyből később konkrét adatelemzési feladat és mérhető eredmény vezethető le.
Fogalmi háttér
Az adatbányászati projekt nem az algoritmussal kezdődik, hanem annak tisztázásával, hogy milyen kérdésre szeretnénk választ kapni, kinek lesz hasznos az eredmény, és milyen döntést szeretnénk támogatni. Fontos elkülöníteni a szakmai célt az alkalmazott technikától: például a „klaszterezés alkalmazása” nem üzleti cél, hanem egy lehetséges módszer.
A célhoz érdemes sikerkritériumot rendelni. Ez lehet például a hibaarány csökkentése, egy célcsoport pontosabb azonosítása, egy folyamat eltérésének korábbi felismerése vagy a döntéstámogatás javítása.
Rövid példaprogram
cel = "A visszatérő vendégek azonosítása"
celvaltozo = "visszatero"
siker = "legalább 80% pontosság"
Az eredmény értelmezése: A példában már nem általánosan „adatot elemzünk”, hanem meghatároztuk a problémát, a célváltozót és egy mérhető sikerkritériumot.
Az adatok forrásainak, szerkezetének, tartalmának, minőségének és korlátainak feltárása a megfelelő modellezés alapja.
Definíció: A Data Understanding az adatforrások és az adatállományok részletes megismerésének folyamata, amely feltárja az adatok jelentését, szerkezetét, minőségét és korlátait.
Fogalmi háttér
Ebben a szakaszban azt vizsgáljuk, hogy milyen adataink vannak, honnan származnak, mit jelentenek az egyes változók, mennyire teljesek és milyen hibákat tartalmazhatnak. Fontos a változók típusának, eloszlásának, hiányzó értékeinek és szélsőségeinek áttekintése.
A Data Understanding szorosan kapcsolódik a korábbi EDA-fejezethez. Az adatbányászati projektben azonban különösen fontos annak dokumentálása is, hogy az adat mit jelent szakmailag, milyen időszakot fed le, és milyen korlátok mellett használható.
Rövid példaprogram
print(df.shape)
print(df.dtypes)
print(df.isna().sum())
print(df.describe(include="all"))
Az eredmény értelmezése: A négy vizsgálat gyors képet ad az adatállomány méretéről, változótípusairól, hiányzó értékeiről és alapvető statisztikai jellemzőiről.
A kiválasztott módszerrel felépített modellek teljesítményének mérése és szakmai ellenőrzése annak megállapítása, hogy az eredmény használható-e.
Definíció: A Modeling és Evaluation során az adatból modellt vagy mintázatot építünk, majd mérőszámokkal és szakmai szempontokkal ellenőrizzük annak használhatóságát.
Fogalmi háttér
A modellezésnél a problémához illeszkedő módszert választjuk, majd a tanítóadatokon létrehozzuk a modellt. Az értékelés célja nem pusztán egyetlen szám előállítása, hanem annak megállapítása, hogy a modell új adatokon is megfelelően működik-e.
Regressziónál például használhatunk MAE vagy MSE mérőszámot, osztályozásnál pontosságot, precisiont, recallt vagy F1-mutatót. Az értékelést mindig a szakmai célhoz kell kapcsolni.
Rövid példaprogram
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_absolute_error
from sklearn.datasets import make_regression
from sklearn.linear_model import LinearRegression
X, y = make_regression(n_samples=100, n_features=4, noise=15, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42
)
modell = LinearRegression()
modell.fit(X_train, y_train)
pred = modell.predict(X_test)
print("MAE:", mean_absolute_error(y_test, pred))
Az eredmény értelmezése: A tesztadaton számított MAE azt mutatja meg, átlagosan mekkora eltérés van a tényleges és a becsült értékek között. Minél kisebb az érték, annál kisebb a modell átlagos hibája az adott mérési skálán.
Az adatokban rendszeresen együtt megjelenő események, termékek vagy tulajdonságok felismerése rejtett kapcsolatok feltárására szolgál.
Definíció: Az együttes előfordulások elemzése olyan gyakori kombinációkat keres, amelyek a megfigyelésekben a véletlenszerűnél gyakrabban jelennek meg együtt.
Fogalmi háttér
Az asszociációs elemzés klasszikus példája a kosáranalízis: azt vizsgáljuk, hogy egy vásárlásban mely termékek jelennek meg gyakran együtt. A módszer azonban nemcsak kereskedelmi adatokra használható; események, szolgáltatások, látogatási célok vagy más kategorikus jellemzők kombinációi is vizsgálhatók.
Fontos fogalom a support, amely megmutatja, hogy egy kombináció milyen gyakran fordul elő az adatállományban.
Rövid példaprogram
tranzakciok = [
{"kave", "tej"},
{"kave", "kenyer"},
{"kave", "tej", "kenyer"},
{"tea", "tej"}
]
minta = {"kave", "tej"}
support = sum(minta.issubset(t) for t in tranzakciok) / len(tranzakciok)
print("Support:", support)
Az eredmény értelmezése: A support azt fejezi ki, hogy a kiválasztott termékpár a tranzakciók mekkora részében fordul elő együtt.
Az együttjárások szabályok formájában írhatók le, például úgy, hogy egy adott elem jelenléte milyen gyakran kapcsolódik egy másik elemhez.
Definíció: Az asszociációs szabály egy „ha–akkor” jellegű kapcsolat, amely két vagy több elem együttes előfordulásának gyakoriságát és megbízhatóságát írja le.
Fogalmi háttér
A szabály tipikus formája A → B, vagyis ha A megjelenik, akkor B is gyakran megjelenik. A szabály értékeléséhez több mérőszám használható.
A confidence azt mutatja meg, hogy az A-t tartalmazó esetek mekkora részében szerepel B is. A lift azt vizsgálja, hogy A és B együttjárása mennyivel gyakoribb annál, mint amit B önálló előfordulási gyakorisága alapján várnánk.
Rövid példaprogram
support_ab = 0.30
support_a = 0.50
support_b = 0.40
confidence = support_ab / support_a
lift = confidence / support_b
print("Confidence:", confidence)
print("Lift:", lift)
Az eredmény értelmezése: A példában a confidence azt mutatja, milyen arányban követi B az A-t, a lift pedig azt, hogy az együttjárás mennyivel erősebb az önálló B-előforduláshoz képest.
Az adatállomány általános mintázatába nem illeszkedő megfigyelések felismerése és elkülönítése.
Definíció: Az anomália olyan megfigyelés, amely a vizsgált adatok többségéhez képest szokatlan értéket vagy mintázatot mutat.
Fogalmi háttér
Az anomália nem feltétlenül hibás adat. Lehet mérési hiba, adatbeviteli probléma, ritka esemény vagy éppen egy olyan fontos változás, amelyet érdemes külön megvizsgálni.
Az anomáliadetektálás történhet egyszerű statisztikai szabályokkal, például IQR- vagy z-score-alapon, illetve összetettebb gépi tanulási módszerekkel, például Isolation Forest segítségével.
Rövid példaprogram
z = (ertek - sorozat.mean()) / sorozat.std()
anomalia = z.abs() > 3
print(sorozat[anomalia])
Az eredmény értelmezése: A példában azokat a megfigyeléseket jelöljük meg, amelyek abszolút z-score értéke 3-nál nagyobb, vagyis jelentősen eltérnek az átlagtól a szóráshoz képest.
A hibás, gyanús vagy szabálytalan adatértékek felismerése annak eldöntésére, hogy adatminőségi problémáról van-e szó.
Definíció: Adatminőségi anomáliáról beszélünk, amikor egy érték vagy rekord az adatmodell, a szakmai szabályok vagy a várható értéktartomány alapján hibásnak vagy gyanúsnak tekinthető.
Fogalmi háttér
Tipikus példák a negatív létszám, a 100%-nál nagyobb arány, érvénytelen dátum, azonosító nélküli rekord vagy olyan kategória, amely nem szerepel az engedélyezett értékek között. Ezeket célszerű validációs szabályokkal is ellenőrizni.
Az anomália kezelése előtt mindig meg kell vizsgálni a forrásrendszert és a szakmai jelentést. Egy matematikailag ritka érték lehet teljesen helyes, míg egy gyakori érték is lehet hibás.
Rövid példaprogram
hibas = df[
(df["letszam"] < 0) |
(df["arany"] > 1)
]
print(hibas)
Az eredmény értelmezése: A program olyan rekordokat gyűjt ki, amelyek megsértik a két előre meghatározott szakmai adatminőségi szabály valamelyikét.
A kiugró vagy szokatlan értékek mögött álló tényleges események elkülönítése az adatminőségi hibáktól.
Definíció: Valós eseményről akkor beszélünk, ha egy anomális érték mögött ténylegesen bekövetkezett, szakmailag értelmezhető változás áll.
Fogalmi háttér
Ez az anomáliadetektálás egyik legfontosabb értelmezési lépése. Egy hirtelen forgalomnövekedés például jelezhet adatbeviteli hibát, de egy rendezvény, kampány vagy rendkívüli esemény miatt is bekövetkezhet.
Ezért az automatikusan megjelölt anomáliát nem célszerű automatikusan törölni. Az adatot össze kell vetni más forrásokkal, időpontokkal és szakmai információkkal.
Rövid példaprogram
anomaliak = df[df["latogato"] > kuszob]
for _, sor in anomaliak.iterrows():
print(sor["datum"], sor["latogato"], sor["esemeny"])
Az eredmény értelmezése: A program az anomális értékekhez hozzárendelt eseményinformációt is megjeleníti, így a kiugrás szakmai háttere külön ellenőrizhető.