Súlyozott számtani és mértani átlag számítása és alkalmazása

Az egyszerű számtani átlagot az élet sok területén használjuk. Súlyozott számtani átlag számítására is számos esetben szükség lehet. Ezekhez képest az egyszerű és súlyozott mértani átlag – talán a matematikája miatt – kevésbé ismert annak ellenére, hogy ezekre is szükség van bizonyos helyzetekben. Ebben a bejegyzésben ezek alkalmazására mutatunk egy-egy gyakorlati példát, amelyeken keresztül ezen átlagok numerikus számítási alternatíváit is bemutatjuk példakódokkal.

Súlyozott számtani átlag számítása

Tegyük fel, hogy 1 m3 fagyálló folyadékot készítünk 0.7 m3 víz és 0.3 m3 glicerin felhasználásával. Ki akarjuk számítani a keverék sűrűségét, mert ebből tudunk majd következtetni a fagyáspontra. Hogyan kell kiszámítani az elegy sűrűségét 20 Celsius fokon, ha ismerjük a víz és a glicerin sűrűségét?

Az biztos, hogy a keverék tömege meg fog egyezni az összetevők tömegének összegével. Ezt ki tudjuk számolni, hiszen a víz tömege a térfogatának és sűrűségének szorzata. Hasonlóan határozható meg a glicerin tömege is.

A keverék tömege az össztérfogat és keresett sűrűség szorzata lesz. A fagyálló sűrűségét tehát úgy kapjuk meg, hogy vesszük az egyes összetevők térfogatának és sűrűségének szorzatait, azokat összegezzük, majd elosztjuk az összetevők térfogatainak összegével. Kódban ez így néz ki:

Vegyük észre, hogy a keverék sűrűsége az a szám, amelyet az összetevők sűrűsége helyére írva a tömeget kifejező összeg értéke ugyanaz lesz. Ezt nevezzük az összetevők sűrűségének térfogatokkal súlyozott számtani átlagának.

Általánosan matematikailag megfogalmazva a súlyozott számtani átlag az a szám, amellyel az átlagolandó értékeket helyettesítve azok súlyokkal vett szorzatainak összege változatlan marad.

Ez képletben kifejezve a következő ábrán látható. Ha a súlyok egyenlőek, akkor az egyszerű (súlyozatlan) számtani átlagot kapjuk.

Ha a súlyozott számtani átlagot nem két, hanem sok értékre akarjuk számolni, akkor a fenti kódban látható módszer nem lesz hatékony megoldás. E helyett az alább látható alternatív számítási módok sokkal kényelmesebbek és rugalmasabbak az összetevők számának változása szempontjából.

A szabványos könyvtár math moduljának sumprod() függvénye a Python 3.12-től áll rendelkezésre, a statistics modul fmean() függvénye pedig a Python 3.11 óta képes súlyozott számtani átlagot számolni azáltal, hogy opcionális argumentumként tudja fogadni a súlyokat. Megjegyzés: csak az fmean() képes súlyozott számtani átlag számítására, a statistics modul mean() függvénye nem.

Egyszerű és súlyozott mértani átlag számítása

Ha van megtakarításunk, akkor szeretnénk, ha az kamatozna egy adott időszak alatt. Ezért be akarjuk fektetni biztonságosnak ítélt értékpapírba, például államkötvénybe. Két kötvény közül akarunk választani.

Az egyik egy változó kamatozású, öt év futamidejű, amelynél a kamatlábak minden évben nőnek a következők szerint: 5.75%, 6.0%, 6.25%, 6.5%, 6.75%. A másik szintén öt éves futamidejű, de fix 6.5% kamatot fizet.

Az éves kamatokat egyik esetben sem vesszük fel, hanem befektetjük ugyanabba a kötvénybe. A kérdés, hogy melyiket válasszuk, melyik kötvénnyel járunk jobban.

A döntéshez a változó kamatozású kötvényhez kellene egy olyan állandó kamatlábat meghatározni, ami összevethető a fix 6.5%-kal. Ezt úgy tudjuk megtenni, ha kiszámoljuk az adott kamatokkal évente növelt összeget lejáratkor. Ez egyenlő kell, hogy legyen a keresett kamatlábbal számolt, öt éves kamatos kamat értékével. Vagyis

C*(1+0.0575)*(1+0.06)*(1+0.0625)*(1+0.065)*(1+0.0675) = C*(1+k)**5, ahol C a kezdeti befeketetés értéke.

Az egyenletből kiesik a kezdeti befektetés értéke, így a keresett növekedési tényezőt (1+keresett kamatláb) megkapjuk, ha a növekedési tényezők szorzatának 5. gyökét vesszük (vagyis 1/5 hatványra emeljük). Ebből 1-et levonva kapjuk a keresett kamatlábat. Az eredmény 6.249% lesz. Vagyis a fix kamatozású kötvény vásárlásával jobban járunk.

A módszer tetszőleges számú növekedési tényezőre általánosítható, vagyis ha n tényezőnk van, akkor a keresett érték a tényezők szorzatának n. gyöke lesz. Az így kapott értéket a tényezők egyszerű mértani átlagának nevezzük.

A mértani átlag az a szám, amellyel az átlagolandó értékeket helyettesítve azok szorzata változatlan marad.

A befektetési példa számítását láthatjuk az alábbi programkódban, ahol a keresett kamatlábat a növekedési tényezők mértani átlagából számítottuk két módon is. Az egyik esetben a math modul prod() függvényével képeztük a növekedési tényezők szorzatát és gyököt vontunk (a tényezők számának reciprokával hatványoztunk). A másik esetben a statistics modul geometric_mean() függvényével számoltunk, ami – ahogy a neve is utal rá – az argumentumban megadott sorozat mértani középértékét adja vissza.

Mi van akkor, ha van egy olyan kötvény, amely úgy változó kamatozású, hogy a futamidő alatt bizonyos években azonos kamatot fizet. Legyen egy 10 éves lejáratú kötvény, amely két évig 7%, három évig 5% és a maradék öt évben 3% kamatot fizet. Természetesen ilyenkor is felírhatjuk a 10 darab növekedési tényezőt és számolhatjuk az előbb látott módokon a mértani átlagukat.

Ha azonban sok tényező van, amelyek közül számos megegyezik, akkor előnyösebb, ha az azonos tényezőket hatvány alakban írjuk fel és így szorozzuk össze azokat. Ilyenkor a hatványkitevőket súlyoknak tekinthetjük, amelyek meghatározzák, hogy a szorzatban egy-egy tényező milyen jelentőséggel bír. Ennek alapján értelmezhetjük a nem azonos tényezők mértani átlagát, amit súlyozott mértani átlagnak nevezünk.

A súlyozott mértani átlag  az a szám, amellyel az átlagolandó értékeket helyettesítve azok súlyokkal vett hatványainak szorzata változatlan marad.

Az egyszerű (nem súlyozott) és súlyozott mértani átlagok képleteit a következő ábra foglalja össze.

Az ábra alján egy sajátos számítási mód is látható, ami az alapképletből levezethető. Ez több szempontból is figyelmet érdemel.

Egyrészt hasznos akkor, ha az átlagolandó sorozat elemei és a súlyok akkorák, hogy a hatványok és szorzatuk olyan nagy számot eredményezne, amely nem ábrázolható. Vegyük például az 1000, 2000, 3000 sorozatot, amely értékekhez tartozó súlyok rendre 100, 200 és 300. Ha a súlyozott mértani átlagot az alapképlet alapján akarnánk számolni a

pow((1000**100)*(2000**200)*(3000**300), 1/600)

utasítással, akkor OverflowError hibaüzenetet kapunk. Ha viszont a logaritmusos képlettel, akkor az eredmény 2182.24 lesz.

A másik ok, ami jelentőséget ad ennek a képletnek az, hogy mint látható, kapcsolatot teremt a súlyozott mértani és súlyozott számtani átlag között, hiszen a súlyozott mértani átlag logaritmusa az átlagolandó értékek logaritmusainak súlyozott számtani átlaga. Ez azért lényeges, mert a statistics modul geometric_mean() függvénye nem fogad súlyokat. Viszont, ahogy korábban láttuk, az fmean() függvénnyel tudunk súlyozott számtani átlagot számolni. Nem kell tehát mást tenni a súlyozott mértani átlag számításhoz, mint az átlagolandó értékek logaritmusait és a súlyokat megadni az fmean() függvénynek, majd az eredményt a logaritmus alapjára emelni.

Ha a természetes alapú logaritmust használjuk, akkor a math modulból beimportálva a log és exp függvényeket a súlyozott mértani átlag az exp(fmean(map(log, data), weights)) hívással számolható, ahol az átlagolandó értékeket a data, a súlyokat a weights iterálható objektumok szolgáltatják.

Az időszakonként állandó kamatozású kötvény példájára vonatkozó, egyszerű és súlyozott mértani átlaggal történő számításokat az alábbi kódsorok mutatják, ahol a súlyozott mértani átlag számítására az előbb említett elvek alapján működő függvényt definiáltunk weighted_geometric_mean névvel.

A súlyozott mértani átlagban a súlyok nem csak egész számok lehetnek. Ennek bemutatására gyakorlati példaként vegyük az USA dollár indexet  (US Dollar Index), amelynek jelölése DXY vagy USDX. Ez az index az amerikai dollár értékének mérésére szolgál az USA fő kereskedelmi partnereinek devizáját tartalmazó kosárral szemben. Az index egy súlyozott mértani átlag, amelyben az egyes devizák és súlyuk a következő: EUR 57.6%, JPY 13.6%, GBP 11.9%, CAD 9.1%, SEK 4.2%, CHF 3.6%. Az index számítását az alábbi programkód mutatja. A számításban szereplő konstans szorzó onnan ered, hogy az index 1973 márciusi beveztésekor ahhoz, hogy az induló érték 100 legyen ezzel a konstanssal kellett normalizálni.

Ha a számtani vagy mérteni átlagban a súlyok egész számok, akkor ez, ahogy korábban láttuk, az átlagolandó adatok egész számú ismétlődéseként is értelmezhető. Ha olyan sorozatunk van, amelyben az elemek ismétlődhetnek, akkor ennek kompakt tárolására a collections modul Counter konténere jól használható. Ugyanis ebben az esetben egyrészt könnyen beazonosítható, hogy melyik értékhez milyen súly tartozik, másrészt a Counter objektum mind a súlyozott számtani, mind a súlyozott mértani átlagszámításhoz egyszerűen felhasználható, valamint használhatjuk a statistics modul mean() és geometric_mean() függvényeit is annak ellenére, hogy ezeknek nem lehet megadni súlyokat. Mindezt a következő példakódban láthatjuk:

Ebben a bejegyzésben a statistics és math modul néhány függvényének, valamint a collections modul Counter objekumának alkalmazására láthattuk használati példákat. Ezekről a Python tudásépítés lépésről lépésre című e-könyvben a „Készétel fogyasztás – a szabványos könyvtár moduljainak használata” fejezeten belül a „Matematikai számítások támogatása” és a „Speciális konténer típusok” című alfejezetekben lehet részletesen olvasni.

Érdekel a Python tudásépítés lépésről lépésre az alapoktól az első asztali alkalmazásig című e-könyv.