Mindig jó ötlet megvizsgálni az adatainkat, mielőtt elkezdjük az ábrázolást. Beolvashatjuk az adatokat egy pandas adatkeretbe, és megjeleníthetjük az első 10 sort:

import pandas as pd# Read in data and examine first 10 rows
flights = pd.read_csv('data/formatted_flights.csv')
flights.head(10)
Adatkeret eleje

A járatok érkezési késése percben van megadva, és a negatív értékek azt jelentik, hogy a járat korábban érkezett (kiderült, hogy a járatok gyakran hajlamosak korábban érkezni, csak soha nem akkor, amikor mi vagyunk rajta!). Több mint 300 000 járat van, amelyek minimális késése -60 perc, maximális késése pedig 120 perc. Az adatkeret másik oszlopa a légitársaság neve, amelyet összehasonlításokhoz használhatunk.

A hisztogram segítségével remekül el lehet kezdeni egyetlen változó vizsgálatát. A hisztogram a változót tárolókra osztja, minden tárolóban megszámolja az adatpontokat, és a tárolókat az x-tengelyen, a számokat pedig az y-tengelyen mutatja. A mi esetünkben a rekeszek a járatok késését jelképező időintervallumot jelentik, a számlálás pedig az adott intervallumba eső járatok számát. A binszélesség a hisztogram legfontosabb paramétere, és mindig ki kell próbálnunk néhány különböző binszélesség-értéket, hogy kiválaszthassuk az adatainkhoz legmegfelelőbbet.

Az alapvető hisztogram elkészítéséhez Pythonban használhatjuk a matplotlib vagy a seaborn programot. Az alábbi kód mindkét könyvtárban olyan függvényhívásokat mutat, amelyek egyenértékű ábrákat hoznak létre. A plot hívásoknál a binwidth-et a binsek számával adjuk meg. Ehhez a plothoz 5 perces binereket fogok használni, ami azt jelenti, hogy a binerek száma az adatok tartománya (-60 és 120 perc között) osztva a binwidth-tel, 5 perccel ( bins = int(180/5)).

Hisztogram (matplotlib és seaborn által előállított egyenértékű ábrák)

A legtöbb alapvető hisztogramhoz, Én a matplotlib kódot választanám, mert az egyszerűbb, de a későbbiekben a seaborn distplot függvényt fogjuk használni különböző eloszlások létrehozására, és jó, ha ismerjük a különböző lehetőségeket.

Hogyan jöttem rá, hogy 5 perc a binwidth? Az egyetlen módja az optimális binwidth kitalálásának, ha több értéket is kipróbálsz! Az alábbiakban egy kódot találsz ugyanennek az ábrának a matplotlib-ben történő elkészítéséhez különböző binszélességekkel. Végső soron nincs helyes vagy helytelen válasz a binwidth-re, de én 5 percet választottam, mert szerintem ez reprezentálja legjobban az eloszlást.

Hisztogramok különböző binwidth-ekkel

A binwidth megválasztása jelentősen befolyásolja a kapott ábrát. A kisebb binszélességek rendezetlenné tehetik a grafikont, a nagyobb binszélességek viszont elfedhetik az adatok árnyalatait. A Matplotlib automatikusan kiválaszt egy ésszerű binwidth-et az Ön számára, de én magam szeretem megadni a binwidth-et, miután több értéket kipróbáltam. Nincs igazán jó vagy rossz válasz, próbáljon ki néhány lehetőséget, és nézze meg, melyik működik a legjobban az adott adataihoz.

Mikor a hisztogramok kudarcot vallanak

A hisztogramok nagyszerű módja annak, hogy elkezdjük egy egyetlen kategóriából vett változó feltárását. Amikor azonban egy változó több kategóriára vonatkozó eloszlásait szeretnénk összehasonlítani, a hisztogramoknak olvashatósági problémái vannak. Ha például össze akarjuk hasonlítani az érkezési késések eloszlásait a légitársaságok között, nem működik jól az a megközelítés, hogy minden egyes légitársaság számára hisztogramokat készítünk ugyanazon a diagramon:

Hisztogramok átfedése több légitársasággal

(Vegyük észre, hogy az y-tengelyt normalizáltuk, hogy figyelembe vegyük a légitársaságok közötti eltérő járatszámot. Ehhez adja meg a norm_hist = True argumentumot a sns.distplot függvényhíváshoz.)

Ez a diagram nem túl hasznos! A sok átfedő sáv szinte lehetetlenné teszi a légitársaságok közötti összehasonlítást. Nézzünk meg néhány lehetséges megoldást erre a gyakori problémára.

Megoldás #1: egymás melletti hisztogramok

A légitársaságok hisztogramjainak átfedése helyett egymás mellé helyezhetjük őket. Ehhez létrehozzuk az egyes légitársaságok érkezési késéseinek listáját, majd ezt listák listájaként átadjuk a plt.hist függvényhívásba. Meg kell adnunk, hogy az egyes légitársaságokhoz különböző színeket használjunk, és egy címkét, hogy meg tudjuk őket különböztetni egymástól. A kód, beleértve az egyes légitársaságok listáinak létrehozását, az alábbiakban található:

Alapértelmezés szerint, ha listák listáját adjuk át, a matplotlib egymás mellé helyezi a sávokat. Itt a binwidth-et 15 percre módosítottam, mert különben túlságosan zsúfolt lesz a grafikon, de még ezzel a módosítással sem hatékony az ábra. Túl sok információt kell egyszerre feldolgozni, a sávok nem igazodnak a címkékhez, és még mindig nehéz összehasonlítani a légitársaságok közötti eloszlásokat. Amikor egy ábrát készítünk, azt akarjuk, hogy a néző számára a lehető legkönnyebben érthető legyen, és ez az ábra nem felel meg ennek a kritériumnak! Nézzünk meg egy második lehetséges megoldást.

Megoldás #2: Halmozott sávok

Ahelyett, hogy az egyes légitársaságok sávjait egymás mellett ábrázolnánk, halmozhatjuk őket, ha a stacked = True paramétert átadjuk a hisztogramhívásnak:

# Stacked histogram with multiple airlines
plt.hist(, bins = int(180/15), stacked=True,
normed=True, color = colors, label=names)

Nos, ez biztosan nem jobb! Itt minden egyes légitársaságot az egésznek egy-egy részeként ábrázolnak az egyes tárolók esetében, de így szinte lehetetlen összehasonlításokat végezni. Például egy -15-0 perces késésnél a United Air Lines vagy a JetBlue Airlines rendelkezik nagyobb méretű sávval? Nem tudom megmondani, és a nézők sem fogják tudni. Általában nem vagyok az egymásra helyezett sávok híve, mert nehezen értelmezhetőek (bár vannak olyan felhasználási esetek, mint például az arányok vizualizálása). A hisztogramokkal próbált mindkét megoldás nem volt sikeres, ezért ideje áttérni a sűrűségdiagramra.

Sűrűségdiagramok

Először is, mi az a sűrűségdiagram? A sűrűségdiagram az adatokból becsült hisztogram simított, folytonos változata. A becslés legelterjedtebb formája az úgynevezett kernel sűrűségbecslés. Ennél a módszernél minden egyes adatpontra egy folytonos görbét (a kernelt) rajzolnak, majd ezeket a görbéket összeadják, hogy egyetlen sima sűrűségbecslést kapjanak. A leggyakrabban használt kernel a Gauss (amely minden egyes adatpontban egy Gauss-féle haranggörbét eredményez). Ha hozzám hasonlóan ön is kissé zavarosnak találja ezt a leírást, nézze meg a következő ábrát:

Kernel sűrűségbecslés (forrás)

Itt minden egyes kis fekete függőleges vonal az x tengelyen egy adatpontot jelöl. Az egyes kernelek (ebben a példában Gaussok) minden egyes pont fölött szaggatott piros vonalakkal rajzolva láthatók. A tömör kék görbe az egyes Gaussok összegzésével jön létre, és alkotja a teljes sűrűségi ábrát.

Az x-tengely a változó értéke, akárcsak a hisztogramban, de mit ábrázol pontosan az y-tengely? A sűrűségdiagram y-tengelye a kernel sűrűségbecslés valószínűségi sűrűségfüggvénye. Azonban ügyelnünk kell arra, hogy ez egy valószínűségi sűrűség és nem valószínűség. A különbség az, hogy a valószínűségi sűrűség az egységnyi valószínűség az x-tengelyen. Ahhoz, hogy tényleges valószínűséggé alakítsuk át, meg kell találnunk a görbe alatti területet az x-tengely egy adott intervallumára. Kissé zavaró módon, mivel ez egy valószínűségi sűrűség és nem valószínűség, az y-tengely egynél nagyobb értékeket is felvehet. A sűrűség ábrázolásának egyetlen követelménye, hogy a görbe alatti teljes terület eggyé integrálódjon. Általában hajlamos vagyok a sűrűségdiagram y-tengelyére csak a különböző kategóriák közötti relatív összehasonlításhoz használt értékként gondolni.

Sűrűségdiagramok Seabornban

A sűrűségdiagramok elkészítéséhez Seabornban a distplot vagy a kdeplot függvényt használhatjuk. Én továbbra is a distplot függvényt fogom használni, mert ezzel több eloszlást is készíthetünk egyetlen függvényhívással. Például készíthetünk egy sűrűségábrát, amely az összes érkezési késést mutatja a megfelelő hisztogram tetején:

# Density Plot and Histogram of all arrival delays
sns.distplot(flights, hist=True, kde=True,
bins=int(180/5), color = 'darkblue',
hist_kws={'edgecolor':'black'},
kde_kws={'linewidth': 4})

Density Plot and Histogram using seaborn

A görbe a sűrűségábrát mutatja, amely lényegében a hisztogram sima változata. Az y-tengely a sűrűségre vonatkozik, és a hisztogram alapértelmezés szerint normalizálva van, így az y-skála megegyezik a sűrűségdiagraméval.

A hisztogram binszélességével analóg módon a sűrűségdiagramnak van egy sávszélességnek nevezett paramétere, amely megváltoztatja az egyes magokat, és jelentősen befolyásolja a diagram végeredményét. A sávszélesség ésszerű értékét a plotkönyvtár választja ki számunkra (alapértelmezés szerint a ‘scott’ becslést használja), és a hisztogram binszélességével ellentétben én általában az alapértelmezett sávszélességet használom. Megnézhetjük azonban, hogy különböző sávszélességeket használunk-e, hátha van jobb választás. A grafikonon a ‘scott’ az alapértelmezett, ami a legjobb választásnak tűnik.

Density Plot Showing different Bandwidths

Megfigyelhető, hogy a nagyobb sávszélesség az eloszlás nagyobb simítását eredményezi. Azt is látjuk, hogy bár adatainkat -60 és 120 perc közé korlátoztuk, a sűrűségdiagram mégis túlnyúlik ezeken a határokon. Ez a sűrűségdiagram egyik lehetséges problémája: mivel minden egyes adatpontban eloszlást számol, olyan adatokat generálhat, amelyek kívül esnek az eredeti adatok határain. Ez azt jelentheti, hogy olyan lehetetlen értékeket kapunk az x-tengelyen, amelyek soha nem voltak jelen az eredeti adatokban! Megjegyzésként megjegyezzük, hogy a kernelt is megváltoztathatjuk, ami megváltoztatja az egyes adatpontokban rajzolt eloszlást és így a teljes eloszlást is. A legtöbb alkalmazáshoz azonban az alapértelmezett kernel, a Gauss és az alapértelmezett sávszélesség-becslés nagyon jól működik.

Megoldás #3 Sűrűségdiagram

Most, hogy megértettük, hogyan készül egy sűrűségdiagram és mit ábrázol, nézzük meg, hogyan oldhatjuk meg vele a több légitársaság érkezési késéseinek megjelenítésével kapcsolatos problémánkat. Ahhoz, hogy az eloszlásokat ugyanazon a grafikonon jelenítsük meg, végigjárhatjuk a légitársaságokat, minden egyes alkalommal úgy hívva a distplot-t, hogy a kernel sűrűségbecslést True-ra, a hisztogramot pedig False-ra állítjuk. A több légitársasággal készített sűrűségdiagram rajzolásához szükséges kód az alábbi:

Sűrűségdiagram több légitársasággal

Egy hatékony megoldáshoz jutottunk végre! A sűrűségdiagram segítségével könnyebben tudunk összehasonlításokat végezni a légitársaságok között, mert a diagram kevésbé zsúfolt. Most, hogy végre megvan a kívánt plot, arra a következtetésre jutunk, hogy az összes légitársaság közel azonos érkezési késéseloszlással rendelkezik! Vannak azonban más légitársaságok is az adathalmazban, és ábrázolhatunk egyet, amely egy kicsit más, hogy szemléltessük a sűrűségdiagramok egy másik választható paraméterét, a grafikon árnyékolását.

Árnyékolt sűrűségdiagramok

A sűrűségdiagram kitöltése segíthet nekünk megkülönböztetni az egymást átfedő eloszlásokat. Bár ez nem mindig jó megközelítés, segíthet hangsúlyozni az eloszlások közötti különbséget. A sűrűségábrák árnyékolásához a distplot hívás shade = True argumentumához kde_kws adjuk át.

sns.distplot(subset, hist = False, kde = True,
kde_kws = {'shade': True, 'linewidth': 3},
label = airline)

Shaded Density Plot

Az, hogy árnyékoljuk-e a plotot vagy sem, a többi ábrázolási lehetőséghez hasonlóan a problémától függő kérdés! Ennél a grafikonnál szerintem van értelme, mert az árnyékolás segít megkülönböztetni a plotokat azokban a régiókban, ahol átfedésben vannak. Most végre van néhány hasznos információnk: Az Alaska Airlines járatai gyakrabban érkeznek korábban, mint a United Airlines járatai. Legközelebb, amikor lehetőséged lesz rá, már tudod, melyik légitársaságot válaszd!”

Rug plot

Ha egy eloszlás minden értékét meg akarod mutatni, nem csak a simított sűrűséget, akkor egy rug plotot is hozzáadhatsz. Ez minden egyes adatpontot megjelenít az x-tengelyen, így az összes tényleges értéket megjeleníthetjük. A seaborn distplot használatának előnye, hogy egyetlen rug = True paraméterhívással (némi formázással is) hozzáadhatjuk a rug plotot.

Density Plot with Rug Plot for Alaska Airlines

Sok adatpont esetén a rug plot túlzsúfolt lehet, de egyes adathalmazok esetében hasznos lehet minden adatpont megtekintése. A rug plot segítségével azt is láthatjuk, hogy a sűrűségdiagram hogyan “hoz létre” adatokat ott, ahol nincsenek, mivel minden egyes adatpontban kerneleloszlást készít. Ezek az eloszlások átszivároghatnak az eredeti adatok tartományán, és azt a benyomást kelthetik, hogy az Alaska Airlines késései rövidebbek és hosszabbak is lehetnek a ténylegesen rögzítettnél. Óvatosnak kell lennünk a sűrűségábráknak ezzel a műtárgyával, és fel kell hívnunk rá a nézők figyelmét!

Következtetések

Ez a bejegyzés remélhetőleg számos lehetőséget adott egy vagy több kategória egyetlen változójának megjelenítésére. Vannak még további egyváltozós (egyetlen változót ábrázoló) ábrák, amelyeket készíthetünk, mint például empirikus kumulatív sűrűségábrák és kvantilis-kvantilis ábrák, de egyelőre maradjunk a hisztogramoknál és a sűrűségábráknál (és a szőnyegábráknál is!). Ne aggódjon, ha a lehetőségek nyomasztónak tűnnek: a gyakorlással könnyebbé válik a helyes választás, és bármikor kérhet segítséget, ha szükséges. Ráadásul gyakran nincs optimális választás, és a “helyes” döntés a preferenciáktól és a vizualizáció céljaitól függ. A jó dolog az, hogy mindegy, milyen ábrázolást szeretnél készíteni, Pythonban biztosan lesz rá mód! A vizualizációk hatékony eszközei az eredmények közlésének, és az összes rendelkezésre álló lehetőség ismerete lehetővé teszi számunkra, hogy az adatainkhoz a megfelelő ábrát válasszuk.

Szívesen fogadom a visszajelzéseket és az építő kritikát, és a Twitteren @koehrsen_will.

érhető el.

admin

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.

lg