On aina hyvä tutkia dataa ennen kuin aloitamme piirtämisen. Voimme lukea datan pandas-datakehykseen ja näyttää ensimmäiset 10 riviä:

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

Lentojen saapumisviiveet on ilmoitettu minuutteina, ja negatiiviset arvot tarkoittavat, että lento saapui etuajassa (kävi ilmi, että lennot saapuvat usein etuajassa, eivät vain koskaan silloin, kun me olemme niissä!). On yli 300 000 lentoa, joiden pienin myöhästyminen on -60 minuuttia ja suurin 120 minuuttia. Tietokehyksen toinen sarake on lentoyhtiön nimi, jota voimme käyttää vertailuun.

Hyvä tapa aloittaa yksittäisen muuttujan tutkiminen on käyttää histogrammia. Histogrammi jakaa muuttujan bineihin, laskee datapisteet kussakin binissä ja näyttää binit x-akselilla ja lukumäärät y-akselilla. Meidän tapauksessamme bini on aikaväli, joka edustaa lentojen myöhästymistä, ja laskenta on kyseiselle aikavälille osuvien lentojen lukumäärä. Binwidth on histogrammin tärkein parametri, ja meidän tulisi aina kokeilla muutamia eri binwidth-arvoja valitaksemme parhaan datamme kannalta.

Tehdäksemme perus-histogrammin Pythonissa voimme käyttää joko matplotlibiä tai seabornia. Alla olevassa koodissa on esitetty molempien kirjastojen funktiokutsut, jotka luovat vastaavia kuvioita. Plot-kutsuja varten määrittelemme binwidthin binien lukumäärän. Tässä kuvaajassa käytän 5 minuutin pituisia binejä, mikä tarkoittaa, että binien lukumäärä on datan vaihteluväli (-60-120 minuuttia) jaettuna binwidthillä eli 5 minuutilla ( bins = int(180/5)).

Histogrammi (vastaava kuvio, jonka tuottavat sekä matplotlib että seaborn)

Yleisimpiä perus histogrammeja varten, Valitsisin matplotlib-koodin, koska se on yksinkertaisempi, mutta tulemme myöhemmin käyttämään seaborn distplot-funktiota erilaisten jakaumien luomiseen ja on hyvä tuntea eri vaihtoehdot.

Miten keksin binwidthiksi 5 minuuttia? Ainoa tapa selvittää optimaalinen binwidth on kokeilla useita arvoja! Alla on koodia saman kuvion tekemiseen matplotlibissa eri binwidth-arvoilla. Loppujen lopuksi binwidthiin ei ole oikeaa tai väärää vastausta, mutta valitsin 5 minuuttia, koska se kuvaa mielestäni parhaiten jakaumaa.

Histogrammit erilaisilla binwidth-arvoilla

Binwidthin valinnalla on merkittävä vaikutus lopputuloksena saatavaan kuvaajaan. Pienemmät binäärinleveydet voivat tehdä kuvaajasta sekavan, mutta suuremmat binäärinleveydet voivat peittää aineiston vivahteet. Matplotlib valitsee automaattisesti kohtuullisen binwidthin puolestasi, mutta haluan määrittää binwidthin itse kokeiltuani useita arvoja. Oikeaa oikeaa tai väärää vastausta ei ole, joten kokeile muutamaa vaihtoehtoa ja katso, mikä toimii parhaiten juuri sinun aineistollesi.

Kun histogrammit epäonnistuvat

Histogrammit ovat hyvä tapa aloittaa yhdestä luokasta poimitun yksittäisen muuttujan tutkiminen. Kun haluamme kuitenkin verrata yhden muuttujan jakaumia useiden luokkien välillä, histogrammeilla on ongelmia luettavuuden kanssa. Jos esimerkiksi haluamme vertailla saapumisviiveiden jakaumia lentoyhtiöiden välillä, lähestymistapa, joka ei toimi hyvin, on luoda histogrammit kullekin lentoyhtiölle samaan kuvaajaan:

Yllekkäiset histogrammit usean lentoyhtiön kanssa

(Huomaa, että y-akseli on normalisoitu lentoyhtiöiden erilaisten lentojen lukumäärän huomioon ottamiseksi. Tämä tehdään siirtämällä sns.distplot-funktiokutsuun argumentti norm_hist = True.)

Tämä kuvaaja ei ole kovin hyödyllinen! Kaikki päällekkäiset palkit tekevät lentoyhtiöiden välisten vertailujen tekemisen lähes mahdottomaksi. Katsotaanpa muutamia mahdollisia ratkaisuja tähän yleiseen ongelmaan.

Ratkaisu #1: Histogrammit vierekkäin

Lentoyhtiöiden histogrammien päällekkäisyyden sijasta voimme sijoittaa ne vierekkäin. Tätä varten luomme luettelon kunkin lentoyhtiön saapumisviiveistä ja annamme sen sitten plt.hist-funktiokutsuun listana listoista. Meidän on määritettävä kullekin lentoyhtiölle eri värit ja merkintä, jotta voimme erottaa ne toisistaan. Koodi, mukaan lukien listojen luominen kullekin lentoyhtiölle, on alla:

Oletusarvoisesti, jos välitämme listan listoja, matplotlib laittaa palkit vierekkäin. Tässä olen muuttanut binwidthin 15 minuutiksi, koska muuten kuvaaja on liian sotkuinen, mutta edes tällä muutoksella tämä ei ole tehokas kuvaaja. Kerralla käsiteltävää tietoa on liikaa, pylväät eivät ole samassa linjassa merkintöjen kanssa, ja lentoyhtiöiden välisiä jakaumia on edelleen vaikea verrata. Kun teemme kaavion, haluamme sen olevan mahdollisimman helppotajuinen katsojalle, ja tämä kuvio ei täytä näitä kriteerejä! Tarkastellaan toista mahdollista ratkaisua.

Ratkaisu nro 2: Pinotut pylväät

Sen sijaan, että piirtelisimme kunkin lentoyhtiön pylväät vierekkäin, voimme pinota ne välittämällä histogrammikutsulle parametrin stacked = True:

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

Noh, eihän tuo todellakaan ole yhtään parempi! Tässä kukin lentoyhtiö on esitetty kunkin binin kohdalla osuutena kokonaisuudesta, mutta vertailun tekeminen on lähes mahdotonta. Esimerkiksi viiveellä -15-0 minuuttia, onko United Air Linesilla vai JetBlue Airlinesilla suurempi palkin koko? En osaa sanoa, eivätkä katsojatkaan pysty. En yleensä kannata pinottuja palkkeja, koska niitä voi olla vaikea tulkita (vaikka on olemassa käyttötapauksia, kuten mittasuhteiden visualisointi). Molemmat ratkaisut, joita kokeilimme histogrammien avulla, eivät onnistuneet, joten on aika siirtyä tiheysdiagrammiin.

Tiheysdiagrammit

Aluksi, mikä on tiheysdiagrammi? Tiheysdiagrammi on tasoitettu, jatkuva versio datasta estimoidusta histogrammista. Yleisin estimointimuoto tunnetaan nimellä kernelin tiheysestimointi. Tässä menetelmässä jokaisessa yksittäisessä datapisteessä piirretään jatkuva käyrä (ydin), ja kaikki nämä käyrät lasketaan sitten yhteen, jotta saadaan yksi tasainen tiheysestimaatti. Useimmiten käytetty ydin on Gaussin ydin (joka tuottaa Gaussin kellokäyrän jokaisessa datapisteessä). Jos tämä kuvaus on sinusta, kuten minustakin, hieman hämmentävä, katso seuraavaa kuvaajaa:

Kernel Density Estimation (Lähde)

Tässä kukin x-akselilla oleva pieni musta pystysuora viiva edustaa datapistettä. Yksittäiset ytimet (tässä esimerkissä Gaussit) on piirretty katkoviivoin punaisina viivoina kunkin pisteen yläpuolelle. Yhtenäinen sininen käyrä syntyy laskemalla yksittäiset Gaussit yhteen, ja se muodostaa yleisen tiheysdiagrammin.

X-akseli on muuttujan arvo aivan kuten histogrammissa, mutta mitä y-akseli tarkalleen ottaen edustaa? Tiheysdiagrammin y-akseli on todennäköisyystiheysfunktio kernelin tiheysestimointia varten. Meidän on kuitenkin oltava varovaisia täsmentäessämme, että kyseessä on todennäköisyystiheys eikä todennäköisyys. Ero on siinä, että todennäköisyystiheys on todennäköisyys yksikköä kohti x-akselilla. Todelliseksi todennäköisyydeksi muuntamiseksi meidän on löydettävä käyrän alle jäävä pinta-ala tietylle x-akselilla olevalle aikavälille. Hieman hämmentävää on, että koska kyseessä on todennäköisyystiheys eikä todennäköisyys, y-akseli voi saada arvoja, jotka ovat suurempia kuin yksi. Tiheysdiagrammin ainoa vaatimus on, että käyrän alle jäävä kokonaispinta-ala integroituu yhteen. Minulla on yleensä tapana ajatella tiheysdiagrammin y-akselia arvona vain eri luokkien välisiä suhteellisia vertailuja varten.

Tiheysdiagrammit Seabornissa

Tiheysdiagrammien tekemiseen Seabornissa voimme käyttää joko distplot– tai kdeplot-funktiota. Käytän jatkossakin distplot-funktiota, koska sen avulla voimme tehdä useita jakaumia yhdellä funktiokutsulla. Voimme esimerkiksi tehdä tiheysdiagrammin, jossa kaikki saapumisviiveet näkyvät vastaavan histogrammin päällä:

# 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})

Tiheysdiagrammi ja histogrammi seabornia käyttäen

Käyrästö näyttää tiheysdiagrammin, joka on pohjimmiltaan sileä versio histogrammista. Y-akseli on tiheyden suhteen, ja histogrammi on oletusarvoisesti normalisoitu niin, että sillä on sama y-asteikko kuin tiheysplotilla.

Analogisesti histogrammin binwidthin nähden tiheysplotissa on parametri nimeltä bandwidth, joka muuttaa yksittäisiä ytimiä ja vaikuttaa merkittävästi plotin lopputulokseen. Piirtokirjasto valitsee meille kohtuullisen kaistanleveyden arvon (oletusarvoisesti käyttäen ’scott’-estimaattia), ja toisin kuin histogrammin binwidth, käytän yleensä oletusarvoista kaistanleveyttä. Voimme kuitenkin tarkastella eri kaistanleveyksien käyttöä ja katsoa, olisiko parempaa vaihtoehtoa. Kuvaajassa ’scott’ on oletusarvo, joka näyttää parhaalta vaihtoehdolta.

Tiheysdiagrammi, jossa näkyvät erilaiset kaistanleveydet

Huomaa, että leveämpi kaistanleveys saa aikaan suuremman tasoittumisen jakaumalle. Huomaamme myös, että vaikka rajasimme aineistomme -60-120 minuuttiin, tiheysdiagrammi ulottuu näiden rajojen ulkopuolelle. Tämä on yksi mahdollinen ongelma tiheysdiagrammissa: koska se laskee jakauman jokaisessa datapisteessä, se voi tuottaa dataa, joka jää alkuperäisen datan rajojen ulkopuolelle. Tämä saattaa tarkoittaa sitä, että x-akselille saadaan mahdottomia arvoja, joita ei koskaan ollut alkuperäisissä tiedoissa! Huomattakoon, että voimme myös muuttaa ydintä, mikä muuttaa kussakin datapisteessä piirrettyä jakaumaa ja siten kokonaisjakaumaa. Useimmissa sovelluksissa oletuskernel, Gaussin, ja oletusarvoinen kaistanleveyden estimointi toimivat kuitenkin erittäin hyvin.

Ratkaisu #3 Tiheysdiagrammi

Nyt kun ymmärrämme, miten tiheysdiagrammi tehdään ja mitä se edustaa, katsotaanpa, miten sillä voidaan ratkaista ongelmamme visualisoida useiden lentoyhtiöiden saapumisviiveet. Näyttääksemme jakaumat samassa kuvaajassa voimme käydä läpi lentoyhtiöt ja kutsua joka kerta distplot, kun kernelin tiheysestimaatin arvoksi on asetettu True ja histogrammin arvoksi False. Koodi tiheysdiagrammin piirtämiseen useilla lentoyhtiöillä on alla:

Tiheysdiagrammi useilla lentoyhtiöillä

Viimein olemme päässeet tehokkaaseen ratkaisuun! Tiheysplotin avulla voimme helposti tehdä vertailuja lentoyhtiöiden välillä, koska plotti on vähemmän sotkuinen. Nyt kun meillä on vihdoin haluamamme kuvaaja, tulemme siihen tulokseen, että kaikilla näillä lentoyhtiöillä on lähes identtiset saapumisviivejakaumat! Tietoaineistossa on kuitenkin muitakin lentoyhtiöitä, ja voimme piirtää yhden, joka on hieman erilainen havainnollistamaan toista tiheysdiagrammien valinnaista parametria, kuvaajan varjostamista.

Tummennetut tiheysdiagrammit

Tiheysdiagrammin täyttäminen voi auttaa meitä erottamaan päällekkäiset jakaumat. Vaikka tämä ei ole aina hyvä lähestymistapa, se voi auttaa korostamaan jakaumien välistä eroa. Tiheysdiagrammien varjostamiseksi välitämme shade = True distplot-kutsun kde_kws-argumenttiin shade = True.

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

Tummennettu tiheysdiagrammi

Tummennetaanko piirtoaluetta vai ei, on muiden piirtoaluevaihtoehtojen tapaan ongelmasta riippuva kysymys! Tämän kuvaajan kohdalla se on mielestäni järkevää, koska varjostus auttaa meitä erottamaan kuvaajat niillä alueilla, joilla ne ovat päällekkäisiä. Nyt meillä on vihdoin hyödyllistä tietoa: Alaska Airlinesin lennot ovat yleensä aikaisemmin kuin United Airlinesin. Seuraavan kerran, kun sinulla on mahdollisuus valita, tiedät, kumpi lentoyhtiö kannattaa valita!

Rug Plots

Jos haluat näyttää jakauman jokaisen arvon etkä vain tasoitettua tiheyttä, voit lisätä rug plotin. Tämä näyttää jokaisen yksittäisen datapisteen x-akselilla, jolloin voimme visualisoida kaikki todelliset arvot. Seabornin distplot käyttämisen etuna on, että voimme lisätä rug plotin yhdellä parametrikutsulla rug = True (jossa on myös joitakin muotoiluja).

Density Plot with Rug Plot for Alaska Airlines

Monien datapisteiden ollessa kyseessä maton kuvaaja voi tulla ylikuormitetuksi, mutta joidenkin tietokokonaisuuksien osalta voi olla hyödyllistä tarkastella jokaista dataa. Rug plotin avulla voidaan myös nähdä, miten tiheysdiagrammi ”luo” dataa sinne, missä sitä ei ole, koska se muodostaa ydinjakauman jokaiseen datapisteeseen. Nämä jakaumat voivat vuotaa yli alkuperäisten tietojen alueen ja antaa vaikutelman, että Alaska Airlinesin myöhästymiset ovat sekä lyhyempiä että pidempiä kuin todellisuudessa on kirjattu. Meidän on oltava varovaisia tämän tiheysplottien artefaktin suhteen ja huomautettava siitä katsojille!

Johtopäätökset

Tässä postauksessa on toivottavasti annettu sinulle erilaisia vaihtoehtoja yhden muuttujan visualisointiin yhdestä tai useammasta luokasta. On vielä enemmän univariaattisia (yhden muuttujan) kuvaajia, joita voimme tehdä, kuten empiiriset kumulatiiviset tiheysplotit ja kvantiili-kvanttiili-diagrammit, mutta toistaiseksi jäämme histogrammeihin ja tiheysplotteihin (ja myös mattoplotteihin!). Älä huoli, jos vaihtoehdot tuntuvat ylivoimaisilta: harjoittelun myötä hyvän valinnan tekeminen helpottuu, ja voit aina pyytää apua, jos tarvitset. Lisäksi usein ei ole olemassa optimaalista vaihtoehtoa, ja ”oikea” päätös riippuu mieltymyksistä ja visualisoinnin tavoitteista. Hyvä asia on se, että riippumatta siitä, minkälaisen piirroksen haluat tehdä, siihen löytyy varmasti tapa tehdä se Pythonilla! Visualisoinnit ovat tehokas keino tulosten välittämiseen, ja kun tiedämme kaikki käytettävissä olevat vaihtoehdot, voimme valita oikean kuvion aineistoomme.

Olen tyytyväinen palautteeseen ja rakentavaan kritiikkiin, ja minut tavoittaa Twitterissä @koehrsen_will.

admin

Vastaa

Sähköpostiosoitettasi ei julkaista.

lg