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:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# Víz és glicerin keverékének sűrűsége. # E keverék például fagyálló folyadék előállítására használható. De alkalmazzák még többek között # a gyógyszerészetben, a házi növényápolásban és a kozmetikai iparban is. # A víz és glicerin sűrűsége. d_water = 998.2071 # kg/m3 @ 20C d_glycerine = 1261.3 # kg/m3 @ 20C # Az elegyíteni kívánt víz és glicerin térfogatai. vol_water = 0.7 # m3 vol_glycerine = 0.3 # m3 # A keverék sűrűsége a komponensek sűrűségének térfogatokkal súlyozott számtani átlaga. d_mixture = (vol_water * d_water + vol_glycerine * d_glycerine) / (vol_water + vol_glycerine) print(d_mixture) # 1077.13497 kg/m3 |
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.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
from math import sumprod from statistics import fmean # A víz és glicerin sűrűsége. d_water = 998.2071 # kg/m3 @ 20C d_glycerine = 1261.3 # kg/m3 @ 20C # Az elegyíteni kívánt víz és glicerin térfogatai. vol_water = 0.7 # m3 vol_glycerine = 0.3 # m3 densities = (d_water, d_glycerine) # Átlagolandó értékek. volumes = (vol_water, vol_glycerine) # Súlyok. # Súlyozott számtani átlag alternatív számítási módjai. d_mixture = sumprod(volumes, densities) / sum(volumes) # Python 3.12+ szükséges. print(d_mixture) # 1077.13497 kg/m3 d_mixture = fmean(densities, volumes) # Python 3.11+ szükséges. print(d_mixture) # 1077.13497 kg/m3 |
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.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
from math import prod from statistics import geometric_mean # Kezdeti befektetés. investment = 100 # Évente változó kamatlábak. interest_rates = [0.0575, 0.06, 0.0625, 0.065, 0.0675] # A kamatlábakból számolt növekedési tényezők. growth_factors = [(1 + r) for r in interest_rates] # A futamidő végén felvehető összeg. future_value = investment * prod(growth_factors) print(future_value) # 135.4 # Az adott futamidő változó kamatozásával egyenértékű fix kamatláb # számítása a növekedési tényezők mértani átlagából. print(pow(prod(growth_factors), 1 / len(growth_factors)) - 1) # 0.06249 print(geometric_mean(growth_factors) - 1) # 0.06249 |
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.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
from math import prod, exp, log from statistics import geometric_mean, fmean from typing import Iterable # Kezdeti befektetés. investment = 100 # Időszakonként állandó kamatlábak. interest_rates = [0.07, 0.07, 0.05, 0.05, 0.05, 0.03, 0.03, 0.03, 0.03, 0.03] # 1. módszer - Egyszerű mértani átlagként számolva. # A kamatlábakból számolt növekedési tényezők. growth_factors = [(1 + r) for r in interest_rates] # Az adott futamidőre vonatkozó egyenértékű fix kamatláb # számítása a növekedési tényezők egyszerű mértani átlagából. print(pow(prod(growth_factors), 1 / len(growth_factors)) - 1) # Eredmény: 0.0438 print(geometric_mean(growth_factors) - 1) # Eredmény: 0.0438 # 2. módszer - Súlyozott mértani átlagként számolva. def weighted_geometric_mean(data: Iterable, weights: Iterable | None = None): """A data argumentum által szolgáltatott értékek súlyozott mértani átlagát adja vissza. A súlyokat a weights paraméterrel lehet meghatározni. Ha ez nincs megadva, akkor minden súly 1 értékű lesz, vagyis a függvény egyszerű mértani átlagot számol. Az átlagolandó értékek száma és a súlyok száma meg kell, hogy egyezzen, különben hibajelezést kapunk. """ return exp(fmean(map(log, data), weights)) print(weighted_geometric_mean([1.07, 1.05, 1.03], [2, 3, 5]) - 1) # Eredmény: 0.0438 |
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.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
from typing import Iterable from statistics import fmean from math import log, exp def weighted_geometric_mean(data: Iterable, weights: Iterable | None = None): return exp(fmean(map(log, data), weights)) # Árfolyamok 2025-10-09 usdeur = 0.86 usdjpy = 152.74 usdgbp = 0.75 usdcad = 1.39 usdsek = 9.47 usdchf = 0.80 currency_rates = (usdeur, usdjpy, usdgbp, usdcad, usdsek, usdchf) currency_weights = [57.6, 13.6, 11.9, 9.1, 4.2, 3.6] dollarindex = 50.14348112 * weighted_geometric_mean(currency_rates, currency_weights) print(dollarindex) # Eredmény: 98.893 |
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:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
from collections import Counter from math import prod, log, exp, sumprod from statistics import mean, geometric_mean, fmean # Egész súlyok esetén a Counter objektummal való ábrázolás előnye, hogy # - könnyen beazonosítható, hogy melyik értékhez milyen súly tartozik. # - mind a súlyozott számtani, mind a súlyozott mértani átlagszámításhoz egyszerűen felhasználható. # - használhajuk a statistics modul mean() és geometric_mean() függvényeit is. data_weights = Counter({1.07: 2, 1.05: 3, 1.03: 5}) # Súlyozott számtani átlag. print(sumprod(data_weights, data_weights.values()) / data_weights.total()) # Eredmény: 1.044 print(fmean(data_weights, data_weights.values())) # Eredmény: 1.044 print(mean(data_weights.elements())) # Eredmény: 1.044 # Súlyozott mértani átlag. print(exp(fmean(map(log, data_weights), data_weights.values()))) # Eredmény: 1.04388 print(geometric_mean(data_weights.elements())) # Eredmény: 1.04388 |
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.