A Numpy rendkívül fontos eszköz mind az adatelemzésben, mind pedig az AI világában. Rengeteg alapvető statisztikai eszközt tartalmaz, amiért érdemes használni és, mivel egy programozási nyelven belül alkalmazzuk, ezért tetszőleges algoritmusokat írhatunk segítségével. A következő statisztikai mutatókat és megoldásokat fogjuk megnézni ebben a cikkben:
- minimum és maximum érték
- átlag
- módusz
- medián
- kvartilisek
- interkvartilis terjedelem
- szórás
- relatív szórás
- outlierek kiszűrése
- korreláció
- kovariancia
Ha nem vagy tisztában ezekkel a fogalmakkal, akkor az alábbi két blogbejegyzést érdemes elolvasnod, amelyek több információt tartalmaznak, mint amire a címekből lehet következtetni.
A könyvtárak telepítése
Blogbejegyzésemben feltételezem, hogy fel van már nálad telepítve a Python megfelelő verziója és ismered a Python alapokat. Ha nem, akkor millió kiváló forrás létezik a Python programozási nyelv alapjainak elsajátítására. A könyvtár telepítéséhez Windowson nyisd meg a CMD-t, Linuxon pedig a terminált. (Ha Linuxon esetleg nem működne, a terminál hibaüzenetére rákeresve biztosan találsz megoldást, ez disztribúciónként eltérhet.)
pip install numpy
Amire még szükségünk lesz, az a scipy könyvtár. Telepítése ugyancsak nem túl bonyolult.
pip install scipy
A legalapvetőbb mutatók
import numpy as np
from scipy import stats
#numpy array létrehozása
x = np.array([1, 2, 3, 4, 7, 7, 7, 9, 13, 15])
#minimum és maximum (gondolom ezt kitaláltad)
minimum = np.min(x)
maximum = np.max(x)
#módusz és medián és átlag
mode = stats.mode(x).mode
median = np.median(x)
mean = np.mean(x)
#kvartilisek (alsó és felső)
"""
Itt az első paraméter nyilván a tömb, míg a másodiknál a 25-ös érték
az adatok 25%-ra utal. Vigyázz, nem 0.25!!!
"""
q1 = np.percentile(x, 25)
q3 = np.percentile(x, 75)
"""
Az interkvartilis terjedelem a harmadik és az első kvartilis különbsége.
Igen, ennyire egyszerű.
"""
iqr = q3 - q1
#populációs szórás
std = np.std(x)
#szórás minta alapján
std2 = np.std(x, ddof=1)
#ha nem tudnád a relatív szórás a szórás osztva az átlaggal
rstd = std/mean
Az outlierek (kiugró értékek) szűrése
A statisztikában a kiugró értékek torzíthatják a mutatókat, hiszen egy-egy rendkívül kicsi, vagy rendkívül nagy érték még nem feltétlenül szignifikáns, sokkal inkább csak egy kis valószínűségű esemény bekövetkezte. Szűrésük viszont szerencsére nem bonyolult. Kiszámoljuk az alsó és felső kvartilist, az interkvartilis terjedelmet, és a többi már gyerekjáték.
q1=alsó kvartilis
q3=felső kvartilis
iqr=q3-q1
alsó küszöb = q1 - 1,5*iqr
felső küszöb = q3 + 1,5*iqr
Nézzük ezt meg kód szinten!
import numpy as np
x = np.array([1, 60, 65, 70, 75, 80, 85, 400])
q1 = np.percentile(x, 25)
q3 = np.percentile(x, 75)
iqr = q3 - q1
Most jön a lényeg! Semmiféle if-re, vagy ciklusra nincs szükséged. A szűrést megoldhatod a következőképpen:
lower = q1 - 1.5 * iqr
upper = q3 + 1.5 * iqr
no_outliers = x[(x > lower) & (x < upper)]
Semmi más nem történik pusztán annyi, hogy az x változóban csak azok az értékek maradhatnak bent, amelyek nagyobbak, mint az alsó határ (lower) és kisebbek, mint a felső határ (upper). Ez a Numpy egyik leghatékonyabb funkciója, az úgynevezett vektoralapú szűrés vagy maszkolás.
Kovariancia és korreláció
Mint ismeretes, mind a korreláció, mind pedig a kovariancia két változó együttmozgására ad mérőszámot. A különbség a kettő között, hogy a korreláció standardizált, tehát egy és mínusz egy között lehet az eredmény. Így több korrelációs együtthatót viszonyítani egymáshoz pontosabb, mint több kovariancia értéket.
A skálázhatóság kedvéért amit visszakapunk, nem pusztán a két változó közötti kovariancia és korreláció, hanem kovariancia és korrelációs mátrixok. Ez azért logikus így, mert a statisztikában gyakran fordul elő, hogy nem kettő, hanem akár sok száz paraméter között húzódó kapcsolatot szeretnénk feltárni. Ami létrejön, az a következő:
Kovariancia mátrix
| x | y | |
|---|---|---|
| x | cov(x, x) | cov(x, y) |
| y | cov(y, x) | cov(y, y) |
Korrelációs mátrix
| x | y | |
|---|---|---|
| x | corr(x, x) | corr(x, y) |
| y | corr(y, x) | corr(y, y) |
Ami itt fura, hogy így megjelenik x vagy y önmagával vett kovarianciája és korrelációja is. Egy változó önmagával vett kovarianciája nem más, mint a variancia (szórásnégyzet).
import numpy as np
x = np.array([10, 12, 13, 14, 15, 16, 18])
y = np.array([20, 24, 27, 30, 32, 35, 40])
# Kovariancia mátrix
cov_matrix = np.cov(x, y)
# Ha csak a két változó közötti kovariancia kell:
covariance = cov_matrix[0, 1]
print(f"Kovariancia mátrix:\n{cov_matrix}")
print(f"Kovariancia: {covariance}")
# Korrelációs mátrix
corr_matrix = np.corrcoef(x, y)
# Ha csak a korrelációs együttható kell:
correlation = corr_matrix[0, 1]
print(f"Korrelációs mátrix:\n{corr_matrix}")
print(f"Korrelációs együttható: {correlation}")
Amit még érdemes lenne tisztáznom, az az alábbi sor. Mivel egy mátrixot kapunk vissza ezért, ha csak az adott két változó közötti kapcsolat erőssége szükséges, akkor elég a nulladik sor első oszlopa. Ne feledd, nullától indexelünk, tehát ez az első sor második oszlopnak felel meg matematikai szempontból! Ezt adja vissza az alábbi sor:
covariance = cov_matrix[0, 1]
Top comments (0)