Office Guru

Exceles átlagolás mindenféle irányból megközelítve + fejtörő elmélkedés

2016. október 31. - Office Guru

Nagyobb mennyiségű adat elemzésekor, főként ha ezen adatok forrása valamilyen manuális bevitel, elég gyakran előfordul, hogy azért torzul elemzésünk/diagramunk vagy kimutatásunk, mert a manuális bevitel során hiba történt, azaz mondjuk valaki eggyel több nullát írt a száma végére, vagy éppen ellenkezőleg, egy nullával felülírt egy korábban berögzített számot - igen, erre lehet azt mondani, hogy eliminálni kell ezeket a hibalehetőségeket, de előfordulhat olyan eset, amikor már csak hozott anyagból dolgozunk.

Mint például a következő kis mintatáblázat, amelynél tökéletesen látszik, hogy azért torzul az átlagunk, mert egyes cellákban nulla vagy éppen túlságosan nagy szám szerepel:

atlag1.jpgDe még nem is kell hibára gondolnunk, simán megtörténhet, hogy egyszerűen azokhoz a cellákhoz vagy nincs adatunk, vagy tényleg valamilyen különös okból kiugró eredményünk van - amit elemeznünk kell tovább, mindenesetre valóságosabb átlageredményt szeretnénk kimutatni.

Erre, ahogy az Excelben szinte mindenre, több megoldási lehetőségünk van, elsőként az annyira nem ismert TRIMMEAN függvény siethet segítségünkre, amely roppant egyszerű módon, az első paramétereként megadott tartományból a második paramétereként megadott százaléknyi adatpontot kiveszi az átlagszámításból.

Tehát mostani példatáblánkat nézve:

=TRIMMEAN(D3:D19,0.25)

Ez azt jelenti, hogy a 17 városhoz tartozó értékünk lesz a tömb, majd mielőtt az átlagot kiszámolná, a függény eltávolítja az adatok 25%-át, értelemszerűen arányos módon, azaz a legalacsonyabb és legmagasabb értékekből ugyanannyit.

Jelen esetünkben ez azt jelenti, hogy 17 darab érték van a D3:D19 tartományban, ha 17-nek vesszük a 25%-át, akkor 4.25-öt kapunk, majd ha ezt elosztjuk kettővel és kerekítünk, akkor látjuk is, hogy 2 értéket fog eliminálni fentről és lentről is, így kapjuk meg a valósághoz jóval közelebb álló átlagértékünket.

atlag2.jpgTehát van két igen fontos tudnivaló a TRIMMEAN-ről és ezen tudnivalók egyébként be is határolják alkalmazási lehetőségeit:

- mindig szimmetrikusan működik, azaz fentről és lentről is ugyanannyi értéket zár ki az átlagból
- mindig kerekít

De ami igazán megmutatja, hogy nagyjából semmi szükségünk a TRIMMEAN függvényre, az pont két másik formula, az AVERAGEIF és AVERAGEIFS, mert mindkettő meghatározott feltételek alapján képes átlagot számolni, az első értelemszerűen csak egy feltétel szerint, a második pedig akár több feltétel alapján is.

Ergó nincs szükségünk szimmetriára, egyszerűen határozzuk meg azon tartományt, amelyben helyes értékeink lehetnek és már meg is van az az átlag, amit igazán szerettük volna elérni.

Ahogy a képen látható is, AVERAGEIFS függvényt használva megadhatjuk, hogy egynél nagyobb, de tízezernél kisebb számainkból számoljunk átlagot:

=AVERAGEIFS(D3:D19,D3:D19,">1",D3:D19,"<10000")

atlag3.jpgAz első paraméter az a tartomány, ahol átlagolandó számaink szerepelnek, a második paraméter a kritérium tartománya, azaz itt akár már városaink nevére is írhatnánk feltételt, a harmadik kötelező paraméter pedig maga a kritérium - a többi pedig opcionális, feltételeink számától függően.

Persze azt ne felejtsük el, hogy VBA-ban is roppant egyszerűen végrehajtható műveletekről van szó, példának okáért az alábbi kód a G12 cellába fogja beírni a megadott tartományunk átlagértékét:

atlag4.jpg

Persze, a tartomány és az eredmény is lehetne dinamikus, de most nem ez a lényeg. Ahogy látható is, a WorksheetFunction.Average metódus a lelke a történetnek, amely az ugyanilyen névre hallgató formula VBA leképezése.

atlag5.jpgÉs hát nem kell se programozónak, se tapasztalt VBA ismerőnek lenni ahhoz, hogy a fenti alapján lássuk a TRIMMEAN VBA-verzióját:

atlag6.jpg

atlag7.jpgAzoknak persze, akik egész nap gyűrik a VBA-t és az Excelt, valószínűleg a fenti poszt minimális hozzáadott értékkel sem bír, de ha valakinek sikerült kicsit segíteni bármilyen feladatban vagy akár gondolatébresztőként volt segítség, már megérte.

think.jpg

És végül, ha van esetleg valakinek a fentiek után egy kicsit szórakozni az átlagolással, akkor álljon itt egy aprócska feladvány: hogy érjük el formulával (vagy akár VBA-val), hogy nagyság szerint csak minden második értékünk kerüljön be az átlagolandó populációba, majd abból számoljunk átlagot?

A bejegyzés trackback címe:

https://officeguru.blog.hu/api/trackback/id/tr1911917685

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

gigabursch 2016.11.01. 20:18:37

Hmmmm....

Ha már átlag:
Az erdészeti gyakorlatban egy erdőrészlet felvételezésánél az átlag fát úgy állapítják meg, hogy a mellmagassági átmérőket (D 1,3) (mondjuk cm-s vagy két cm-s osztályú tartományokban) felvételezik, majd az egyes átmérő osztályokban lévő elemszámokat szépen egymás mellé teszik, így kialakul az a kép, ami leginkább egy haranggörbéhez hasonlít. Na amost az átlag fa az a fa méret, ami a legkisebb átmérő és a legnagyobb átmérő között elem sorszámilag a 60%-os értéket éri el.
(Remélem érthető - egyébként az oka, hogy a vastagabb fák többet dobnak az átlagon, mint a vékonyabbak és a tapasztalat szerint ez így kezelhető könnyen, de alighanem a 60 % egyszerűbben kezelhetú mint a közel hasonló értékű aranymetszési % (~61%))
Szóval:
Van-e olyan függvény, ahol egy ilyen átlagot tudok megadni? Hogyan?

Előre is köszi.

2016.11.02. 10:27:20

@gigabursch: =percentilis(A1:An;0,6) ?

2016.11.02. 11:37:20

csak mert nincs kedvem dolgozni:
Function valami2(tart As Range)
Dim m, db As Long

For i = 1 To tart.Count Step 2
db = db + 1
m = m + Application.WorksheetFunction.Large(tart, i)
Next i

valami2 = m / db
End Function

(biztos lehet egyszerűbben is)

2016.11.02. 14:07:10

@toportyánféreg: vagy =kicsi(A1:A1000;600) = a 600. legkisebb elem az adatsorban

gigabursch 2016.11.02. 21:14:19

@toportyánféreg:
Köszi, de úgy érzem nem jól fogtam meg a probléma megfogalmazását.

Adottak az átmérők, mondjuk 2 cm-s ugrásokkal
34 cm-től 78 cm-ig.
Ebben vannak különböző elemszámok, akár még nullák is az egyes átmérő osztályokban
mondjuk:
34:1
36:2
38:0
40:4
42:6
44:3
46:0
48:8

(...)

72:0
74:4
76:0
78:1

összes elemszám mondjuk 164

és a kérdés az, hogy a 164 60%-ának megfelelő elemszám melyik átmérő osztályba tartozik.

Ez lefüggvényezhető-e egyszerűen?

2016.11.02. 21:44:44

@gigabursch: szerintem ugyanarról beszélünk, veszed a 164 sorba rendezett elem 60%-adik elemét
vagy esetedben már ez a hisztogramnak nevezhető (gyakoriság) tábla a kiinduló lista, ez a gond?
ebből kéne kibökni az elemszám 60%-hoz tartozót?

gigabursch 2016.11.04. 14:45:02

@toportyánféreg:
Ezt a =percx függvényt nem ismertem, tök jó.
Köszönöm.

A színezést mi állítja be?

gigabursch 2016.11.04. 14:47:12

Kimaradt a válasz.

Igen, erre a kérdésre szerettem volna megoldást és választ kapni.

2016.11.04. 19:23:10

@gigabursch: hát, mert én írtam :), ha nyomsz egy Bal-Alt + F11-et akkor láthatod a forrását.
De el tudom képzelni, hogy van erre beépített függvény is, csak nem találtam.
A színezés "Feltételes formázás"-sal van csinálva, a "KEZDŐLAP/Stílusok"-nál lehet beállítani.

2016.11.04. 22:11:37

@toportyánféreg: de ahogy látom, nem is teljesen jó (ezért nem szabad a munkahelyen komoly dolgot csinálni :), így pontosabb, ha épp annyi a kumulált összeg, mint a határérték:

Public Function percx(tart As Range, meddig As Double)
Dim osszeg, percsum As Double
Dim i As Integer

percsum = 0
i = 0
osszeg = Application.WorksheetFunction.Sum(tart.Columns(2))

Do
i = i + 1
percsum = percsum + tart.Cells(i, 2) / osszeg
Loop While percsum < meddig

percx = tart.Cells(i, 1)
End Function

2016.11.04. 23:57:32

+ egy kis "védelem" a Do elé, mert úgy tűnik bizonyos esetekben az 1<1 feltétel igaznak minősül

If meddig >= 1 Then meddig = 0.9999999999999
Do ...

gigabursch 2016.11.07. 12:07:06

Perverz vagy...
:-)

Köszi.

2016.11.07. 15:16:00

@gigabursch: remélem ez dícséret :)
süti beállítások módosítása