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)
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)
).
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.
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:
(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:
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})
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.
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:
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)
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).
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.