Este întotdeauna o idee bună să ne examinăm datele înainte de a începe să le reprezentăm grafic. Putem citi datele într-un dataframe pandas și să afișăm primele 10 rânduri:

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

Târzierile de sosire a zborurilor sunt exprimate în minute, iar valorile negative înseamnă că zborul a sosit mai devreme (se pare că zborurile tind adesea să sosească mai devreme, doar că niciodată atunci când ne aflăm în ele!). Există peste 300.000 de zboruri cu o întârziere minimă de -60 de minute și o întârziere maximă de 120 de minute. Cealaltă coloană din dataframe este numele companiei aeriene, pe care o putem folosi pentru comparații.

O modalitate excelentă de a începe explorarea unei singure variabile este histograma. O histogramă împarte variabila în bini, numără punctele de date din fiecare bini și arată bini pe axa x și numărătorile pe axa y. În cazul nostru, bins va fi un interval de timp care reprezintă întârzierea zborurilor, iar numărătoarea va fi numărul de zboruri care se încadrează în intervalul respectiv. Lățimea bin este cel mai important parametru pentru o histogramă și ar trebui să încercăm întotdeauna câteva valori diferite ale lățimii bin pentru a o selecta pe cea mai bună pentru datele noastre.

Pentru a realiza o histogramă de bază în Python, putem folosi fie matplotlib, fie seaborn. Codul de mai jos prezintă apelurile de funcții din ambele biblioteci care creează cifre echivalente. Pentru apelurile pentru plot, specificăm lățimea binwidth prin numărul de bins. Pentru acest grafic, voi utiliza bins care au o lungime de 5 minute, ceea ce înseamnă că numărul de bins va fi intervalul datelor (de la -60 la 120 de minute) împărțit la lățimea binwidth, 5 minute ( bins = int(180/5)).

Histogramă (figură echivalentă produsă atât de matplotlib cât și de seaborn)

Pentru cele mai multe histograme de bază, Aș alege codul matplotlib pentru că este mai simplu, dar vom folosi mai târziu funcția seaborn distplot pentru a crea diferite distribuții și este bine să fim familiarizați cu diferitele opțiuni.

Cum am ajuns la 5 minute pentru binwidth? Singura modalitate de a-ți da seama de o lățime de bin optimă este să încerci mai multe valori! Mai jos este codul pentru a realiza aceeași figură în matplotlib cu o gamă de lățimi de bin. În cele din urmă, nu există un răspuns corect sau greșit pentru lățimea de bin, dar eu am ales 5 minute deoarece cred că reprezintă cel mai bine distribuția.

Histograme cu diferite lățimi de bin

Alegerea lățimii de bin afectează semnificativ graficul rezultat. Lățimile de bin mai mici pot face ca graficul să fie aglomerat, dar lățimile de bin mai mari pot ascunde nuanțele din date. Matplotlib va alege automat o lățime de bin rezonabilă pentru dvs., dar mie îmi place să specific eu însumi lățimea de bin după ce încerc mai multe valori. Nu există un răspuns corect sau greșit adevărat, așa că încercați câteva opțiuni și vedeți care funcționează cel mai bine pentru datele dvs. particulare.

Când histogramele eșuează

Histogramele sunt o modalitate excelentă de a începe să explorați o singură variabilă extrasă dintr-o singură categorie. Cu toate acestea, atunci când dorim să comparăm distribuțiile unei variabile în mai multe categorii, histogramele au probleme de lizibilitate. De exemplu, dacă dorim să comparăm distribuțiile întârzierilor la sosire între companiile aeriene, o abordare care nu funcționează bine este aceea de a crea histograme pentru fiecare companie aeriană pe același grafic:

Histograme suprapuse cu mai multe companii aeriene

(Observați că axa y a fost normalizată pentru a ține cont de numărul diferit de zboruri între companiile aeriene. Pentru a face acest lucru, treceți argumentul norm_hist = True la apelul funcției sns.distplot.)

Acest grafic nu este foarte util! Toate barele care se suprapun fac aproape imposibilă efectuarea de comparații între companiile aeriene. Să ne uităm la câteva soluții posibile la această problemă comună.

Soluția #1: Histograme alăturate

În loc să suprapunem histogramele companiilor aeriene, le putem plasa una lângă alta. Pentru a face acest lucru, creăm o listă cu întârzierile de sosire pentru fiecare companie aeriană și apoi o trecem în apelul funcției plt.hist ca o listă de liste. Trebuie să specificăm culori diferite de utilizat pentru fiecare companie aeriană și o etichetă pentru a le putea distinge. Codul, inclusiv crearea listelor pentru fiecare companie aeriană este mai jos:

În mod implicit, dacă trecem o listă de liste, matplotlib va pune barele una lângă alta. Aici, am modificat lățimea binwidth la 15 minute, deoarece altfel graficul este prea aglomerat, dar chiar și cu această modificare, nu este o figură eficientă. Sunt prea multe informații de procesat deodată, barele nu se aliniază cu etichetele și este încă greu de comparat distribuțiile între companiile aeriene. Atunci când realizăm un grafic, dorim ca acesta să fie cât mai ușor de înțeles pentru privitor, iar această figură nu îndeplinește acest criteriu! Să ne uităm la o a doua soluție potențială.

Soluția nr. 2: Bare suprapuse

În loc să trasăm barele pentru fiecare companie aeriană una lângă alta, le putem suprapune trecând parametrul stacked = True la apelul histogramei:

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

Ei bine, asta cu siguranță nu este mai bine! Aici, fiecare companie aeriană este reprezentată ca o secțiune a întregului pentru fiecare coș de gunoi, dar este aproape imposibil să se facă comparații. De exemplu, la o întârziere de la -15 la 0 minute, United Air Lines sau JetBlue Airlines are o dimensiune mai mare a barei? Eu nu pot spune și nici telespectatorii nu vor putea. În general, nu sunt un susținător al barelor suprapuse, deoarece acestea pot fi dificil de interpretat (deși există cazuri de utilizare, cum ar fi atunci când se vizualizează proporțiile). Ambele soluții pe care am încercat să le folosim folosind histograme nu au avut succes, așa că este timpul să trecem la graficul de densitate.

Placi de densitate

În primul rând, ce este un grafic de densitate? Un grafic de densitate este o versiune netezită și continuă a unei histograme estimate din date. Cea mai comună formă de estimare este cunoscută sub numele de estimare a densității kernel. În această metodă, o curbă continuă (nucleul) este trasată la fiecare punct de date individual și toate aceste curbe sunt apoi adăugate împreună pentru a realiza o singură estimare netezită a densității. Kernelul cel mai des utilizat este o gaussiană (care produce o curbă în formă de clopot gaussian la fiecare punct de date). Dacă, la fel ca mine, această descriere vi se pare puțin confuză, aruncați o privire la următorul grafic:

Kernel Density Estimation (Source)

Aici, fiecare linie verticală neagră mică de pe axa x reprezintă un punct de date. Kernelurile individuale (Gaussians în acest exemplu) sunt prezentate desenate în linii roșii punctate deasupra fiecărui punct. Curba albastră solidă este creată prin însumarea Gaussienilor individuali și formează graficul densității generale.

Axa x reprezintă valoarea variabilei, la fel ca într-o histogramă, dar ce reprezintă mai exact axa y? Axa y într-un grafic de densitate este funcția de densitate de probabilitate pentru estimarea densității kernelului. Cu toate acestea, trebuie să avem grijă să specificăm că este vorba de o densitate de probabilitate și nu de o probabilitate. Diferența constă în faptul că densitatea de probabilitate reprezintă probabilitatea pe unitatea de pe axa x. Pentru a converti la o probabilitate reală, trebuie să găsim aria de sub curbă pentru un anumit interval pe axa x. În mod oarecum confuz, deoarece aceasta este o densitate de probabilitate și nu o probabilitate, axa y poate lua valori mai mari de unu. Singura cerință a graficului de densitate este ca aria totală sub curbă să se integreze la unu. În general, tind să mă gândesc la axa y pe un grafic de densitate ca la o valoare doar pentru comparații relative între diferite categorii.

Density Plots in Seaborn

Pentru a realiza grafice de densitate în seaborn, putem folosi fie funcția distplot, fie kdeplot. Voi continua să folosesc funcția distplot pentru că ne permite să facem mai multe distribuții cu un singur apel de funcție. De exemplu, putem realiza un grafic de densitate care arată toate întârzierile de sosire deasupra histogramei corespunzătoare:

# 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

Curba arată graficul de densitate care este, în esență, o versiune netedă a histogramei. Axa y este în termeni de densitate, iar histograma este normalizată în mod implicit astfel încât să aibă aceeași scală y ca și graficul de densitate.

Analogic cu lățimea de bin a unei histograme, un grafic de densitate are un parametru numit lățime de bandă care modifică nucleele individuale și afectează semnificativ rezultatul final al graficului. Biblioteca de reprezentare grafică va alege pentru noi o valoare rezonabilă a lățimii de bandă (în mod implicit, folosind estimarea „scott”) și, spre deosebire de lățimea de bin a unei histograme, eu folosesc de obicei lățimea de bandă implicită. Cu toate acestea, putem încerca să folosim diferite lățimi de bandă pentru a vedea dacă există o alegere mai bună. În grafic, ‘scott’ este valoarea implicită, care pare a fi cea mai bună opțiune.

Density Plot Showing different Bandwidths

Observați că o lățime de bandă mai mare duce la o mai mare netezire a distribuției. De asemenea, observăm că, deși am limitat datele noastre la -60 până la 120 de minute, diagrama de densitate se extinde dincolo de aceste limite. Aceasta este o problemă potențială cu un grafic de densitate: deoarece calculează o distribuție la fiecare punct de date, poate genera date care se află în afara limitelor datelor originale. Acest lucru ar putea însemna că ne trezim cu valori imposibile pe axa x care nu au fost niciodată prezente în datele originale! Ca o observație, putem, de asemenea, să modificăm nucleul, ceea ce schimbă distribuția trasată la fiecare punct de date și, prin urmare, distribuția generală. Cu toate acestea, pentru majoritatea aplicațiilor, nucleul implicit, Gaussian, și estimarea implicită a lățimii de bandă funcționează foarte bine.

Soluția #3 Density Plot

Acum că am înțeles cum se realizează un grafic de densitate și ce reprezintă acesta, să vedem cum poate rezolva problema noastră de vizualizare a întârzierilor de sosire ale mai multor companii aeriene. Pentru a afișa distribuțiile pe același grafic, putem itera prin companiile aeriene, apelând de fiecare dată distplot cu estimarea densității kernelului setată la True și histograma setată la False. Codul pentru a desena graficul de densitate cu mai multe companii aeriene este mai jos:

Density Plot with Multiple Airlines

În sfârșit, am ajuns la o soluție eficientă! Cu ajutorul graficului de densitate, putem face cu ușurință comparații între companiile aeriene, deoarece graficul este mai puțin aglomerat. Acum că avem în sfârșit graficul dorit, ajungem la concluzia că toate aceste companii aeriene au distribuții ale întârzierilor la sosire aproape identice! Cu toate acestea, mai există și alte companii aeriene în setul de date și putem trasa una care este puțin diferită pentru a ilustra un alt parametru opțional pentru diagramele de densitate, umbrirea graficului.

Shaded Density Plots

Completarea graficului de densitate ne poate ajuta să distingem între distribuțiile care se suprapun. Deși aceasta nu este întotdeauna o abordare bună, poate ajuta la evidențierea diferenței dintre distribuții. Pentru a umbri graficele de densitate, trecem shade = True la argumentul kde_kws din apelul distplot.

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

Shaded Density Plot

Să umbrim sau nu graficul este, ca și alte opțiuni de trasare, o întrebare care depinde de problemă! Pentru acest grafic, cred că are sens, deoarece umbrirea ne ajută să distingem parcelele în regiunile în care se suprapun. Acum, avem în sfârșit câteva informații utile: Zborurile Alaska Airlines tind să fie mai devreme mai des decât cele ale United Airlines. Data viitoare când veți avea această opțiune, știți ce companie aeriană să alegeți!

Rug Plots

Dacă doriți să arătați fiecare valoare dintr-o distribuție și nu doar densitatea netezită, puteți adăuga un rug plot. Acesta arată fiecare punct de date pe axa x, permițându-ne să vizualizăm toate valorile reale. Avantajul utilizării distplot de la seaborn este că putem adăuga graficul rug plot cu un singur apel de parametru rug = True (cu o anumită formatare, de asemenea).

Density Plot with Rug Plot for Alaska Airlines

Cu multe puncte de date, rug plot poate deveni supraaglomerat, dar pentru unele seturi de date, poate fi util să vizualizăm fiecare punct de date. Graficul rug plot ne permite, de asemenea, să vedem cum graficul de densitate „creează” date acolo unde nu există, deoarece realizează o distribuție kernel la fiecare punct de date. Aceste distribuții se pot scurge în intervalul datelor originale și pot da impresia că Alaska Airlines are întârzieri care sunt atât mai scurte, cât și mai lungi decât cele înregistrate în realitate. Trebuie să fim atenți la acest artefact al graficelor de densitate și să îl semnalăm privitorilor!

Concluzii

Sperăm că această postare v-a oferit o gamă de opțiuni pentru vizualizarea unei singure variabile din una sau mai multe categorii. Există chiar și mai multe diagrame univariate (cu o singură variabilă) pe care le putem realiza, cum ar fi diagramele empirice de densitate cumulativă și diagramele cuantile-quantile, dar deocamdată ne vom limita la histograme și diagrame de densitate (și diagrame de covor!). Nu vă faceți griji dacă opțiunile vi se par copleșitoare: cu ajutorul practicii, va deveni mai ușor să faceți o alegere bună și, la nevoie, puteți oricând să cereți ajutor. În plus, de multe ori nu există o alegere optimă, iar decizia „corectă” se va reduce la preferințe și la obiectivele vizualizării. Partea bună este că, indiferent de complotul pe care doriți să îl realizați, va exista o modalitate de a o face în Python! Vizualizările sunt un mijloc eficient de comunicare a rezultatelor, iar cunoașterea tuturor opțiunilor disponibile ne permite să alegem figura potrivită pentru datele noastre.

Sunt binevenite reacțiile și criticile constructive și pot fi contactate pe Twitter @koehrsen_will.

.

admin

Lasă un răspuns

Adresa ta de email nu va fi publicată.

lg