Det är alltid en bra idé att undersöka data innan vi börjar plotta. Vi kan läsa in data i ett pandas dataframe och visa de första 10 raderna:

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

Flygets ankomstförseningar är i minuter och negativa värden betyder att flyget var tidigt (det visar sig att flygningar ofta tenderar att anlända tidigt, bara aldrig när vi är på dem!). Det finns över 300 000 flygningar med en minsta försening på -60 minuter och en största försening på 120 minuter. Den andra kolumnen i dataframe är namnet på flygbolaget som vi kan använda för jämförelser.

Ett bra sätt att börja utforska en enskild variabel är med histogrammet. Ett histogram delar in variabeln i bin, räknar datapunkterna i varje bin och visar bins på x-axeln och antalen på y-axeln. I vårt fall kommer bins att vara ett tidsintervall som representerar förseningen av flygningarna och räkningen kommer att vara antalet flygningar som faller inom det intervallet. Binwidth är den viktigaste parametern för ett histogram och vi bör alltid prova några olika värden för binwidth för att välja det bästa för våra data.

För att göra ett grundläggande histogram i Python kan vi använda antingen matplotlib eller seaborn. Koden nedan visar funktionsanrop i båda biblioteken som skapar likvärdiga figurer. För plot-anropen anger vi binwidth med antalet bins. För den här plotten kommer jag att använda bins som är 5 minuter långa, vilket innebär att antalet bins kommer att vara intervallet för data (från -60 till 120 minuter) dividerat med binwidth, 5 minuter ( bins = int(180/5)).

Histogram (motsvarande siffra produceras av både matplotlib och seaborn)

För de mest grundläggande histogrammen, Jag skulle välja matplotlib-koden eftersom den är enklare, men vi kommer att använda seaborn distplot-funktionen senare för att skapa olika fördelningar och det är bra att känna till de olika alternativen.

Hur kom jag fram till 5 minuter för binwidth? Det enda sättet att komma fram till en optimal binbredd är att prova flera värden! Nedan finns kod för att göra samma figur i matplotlib med en rad olika binvidder. I slutändan finns det inget rätt eller fel svar på binbredden, men jag väljer 5 minuter eftersom jag tror att det representerar fördelningen bäst.

Histogram med olika binbredder

Valet av binbredd påverkar den resulterande grafen avsevärt. Mindre binvidder kan göra diagrammet rörigt, men större binvidder kan dölja nyanser i data. Matplotlib väljer automatiskt en rimlig binbredd åt dig, men jag gillar att själv ange binbredden efter att ha provat flera värden. Det finns inget riktigt rätt eller fel svar, så prova några alternativ och se vilket som fungerar bäst för just dina data.

När histogram misslyckas

Histogram är ett utmärkt sätt att börja utforska en enda variabel som dras från en kategori. Men när vi vill jämföra fördelningarna av en variabel över flera kategorier har histogrammen problem med läsbarheten. Om vi till exempel vill jämföra fördelningen av ankomstförseningar mellan flygbolag är ett tillvägagångssätt som inte fungerar bra att skapa histogram för varje flygbolag på samma diagram:

Överlappande histogram med flera flygbolag

(Observera att y-axeln har normaliserats för att ta hänsyn till att antalet flygningar varierar mellan flygbolagen. För att göra detta, skicka in argumentet norm_hist = True till sns.distplot-funktionsanropet.)

Denna plott är inte särskilt hjälpsam! Alla överlappande staplar gör det nästan omöjligt att göra jämförelser mellan flygbolagen. Låt oss titta på några möjliga lösningar på detta vanliga problem.

Lösning nr 1: Histogram sida vid sida

Istället för att överlappa flygbolagens histogram kan vi placera dem sida vid sida. För att göra detta skapar vi en lista med ankomstförseningar för varje flygbolag och skickar sedan in den i plt.hist-funktionsanropet som en lista med listor. Vi måste ange olika färger som ska användas för varje flygbolag och en etikett så att vi kan skilja dem åt. Koden, inklusive skapandet av listorna för varje flygbolag, finns nedan:

Som standard kommer matplotlib att placera staplarna sida vid sida om vi skickar in en lista av listor. Här har jag ändrat binwidth till 15 minuter eftersom plotten annars blir för rörig, men även med denna ändring är detta inte en effektiv figur. Det är för mycket information att bearbeta på en gång, staplarna ligger inte i linje med etiketterna och det är fortfarande svårt att jämföra fördelningarna mellan flygbolagen. När vi gör en graf vill vi att den ska vara så lätt att förstå för betraktaren som möjligt, och den här figuren misslyckas med det kriteriet! Låt oss titta på en andra möjlig lösning.

Lösning nr 2: Staplade staplar

Istället för att plotta staplarna för varje flygbolag sida vid sida kan vi stapla dem genom att skicka in parametern stacked = True till histogramanropet:

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

Ja, det är definitivt inte bättre! Här representeras varje flygbolag som en del av helheten för varje bin, men det är nästan omöjligt att göra jämförelser. Till exempel, vid en försening på -15 till 0 minuter, har United Air Lines eller JetBlue Airlines en större storlek på staplarna? Jag kan inte avgöra det och tittarna kommer inte heller att kunna avgöra det. Jag är i allmänhet ingen förespråkare av staplade staplar eftersom de kan vara svåra att tolka (även om det finns användningsområden, t.ex. vid visualisering av proportioner). Båda de lösningar som vi försökte med histogram inte lyckades och därför är det dags att gå över till täthetsplotten.

Täthetsplotter

För det första, vad är en täthetsplott? En täthetsplott är en utjämnad, kontinuerlig version av ett histogram som uppskattas från data. Den vanligaste formen av skattning är känd som kärndensitetsskattning. I denna metod ritas en kontinuerlig kurva (kärnan) vid varje enskild datapunkt och alla dessa kurvor adderas sedan för att skapa en enda slät densitetsskattning. Den kärna som oftast används är en gaussisk (som ger en gaussisk klockkurva vid varje datapunkt). Om du som jag tycker att den beskrivningen är lite förvirrande kan du ta en titt på följande plot:

Kernel Density Estimation (Source)

Här representerar varje liten svart vertikal linje på x-axeln en datapunkt. De enskilda kärnorna (Gaussianer i det här exemplet) visas som streckade röda linjer ovanför varje punkt. Den heldragna blå kurvan skapas genom att summera de enskilda gaussarna och bildar den övergripande täthetsdiagrammet.

X-axeln är värdet av variabeln precis som i ett histogram, men vad exakt representerar y-axeln? Y-axeln i en densitetsdiagram är sannolikhetstäthetsfunktionen för kärndensitetsskattningen. Vi måste dock vara noga med att ange att detta är en sannolikhetstäthet och inte en sannolikhet. Skillnaden är att sannolikhetstätheten är sannolikheten per enhet på x-axeln. För att konvertera till en faktisk sannolikhet måste vi hitta arean under kurvan för ett visst intervall på x-axeln. Eftersom detta är en sannolikhetstäthet och inte en sannolikhet kan y-axeln, vilket är något förvirrande, anta värden som är större än ett. Det enda kravet för täthetsdiagrammet är att den totala arean under kurvan integreras till ett. Jag brukar i allmänhet tänka på y-axeln på en densitetsplott som ett värde endast för relativa jämförelser mellan olika kategorier.

Densitetsplottar i Seaborn

För att göra densitetsplottar i Seaborn kan vi använda antingen funktionen distplot eller kdeplot. Jag kommer att fortsätta att använda distplot-funktionen eftersom den låter oss göra flera fördelningar med ett enda funktionsanrop. Vi kan till exempel göra en densitetsplott som visar alla ankomstförseningar ovanpå motsvarande histogram:

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

Densitetsplott och histogram med hjälp av seaborn

Kurvan visar densitetsplottet, som i huvudsak är en slät version av histogrammet. Y-axeln är i termer av densitet och histogrammet är normaliserat som standard så att det har samma y-skala som densitetsplotten.

Analogt med binwidth i ett histogram har en densitetsplott en parameter som kallas bandbredd som ändrar de enskilda kärnorna och påverkar slutresultatet av plotten avsevärt. Plottingbiblioteket väljer ett rimligt värde på bandbredden åt oss (som standard använder vi ”scott”-skattningen), och till skillnad från binwidth i ett histogram brukar jag använda standardbandbredden. Vi kan dock titta på att använda olika bandbredder för att se om det finns ett bättre val. I plotten är ’scott’ standardalternativet, vilket ser ut att vara det bästa alternativet.

Densitetsplott som visar olika bandbredder

Bemärk att en bredare bandbredd leder till att fördelningen jämnas ut mer. Vi ser också att även om vi begränsade våra data till -60-120 minuter så sträcker sig täthetsplotten utanför dessa gränser. Detta är ett potentiellt problem med en täthetsplott: eftersom den beräknar en fördelning vid varje datapunkt kan den generera data som faller utanför gränserna för de ursprungliga uppgifterna. Detta kan innebära att vi får omöjliga värden på x-axeln som aldrig fanns i de ursprungliga uppgifterna! Som en notering kan vi också ändra kärnan, vilket ändrar den fördelning som dras vid varje datapunkt och därmed den totala fördelningen. För de flesta tillämpningar fungerar dock standardkärnan, Gaussian, och standardbandbreddsuppskattningen mycket bra.

Lösning #3 Density Plot

Nu när vi har förstått hur en densitetsplott görs och vad den representerar, ska vi se hur den kan lösa vårt problem med att visualisera ankomstförseningarna för flera flygbolag. För att visa fördelningarna på samma plott kan vi iterera genom flygbolagen och varje gång anropa distplot med kärndensitetsskattningen inställd på True och histogrammet inställt på False. Koden för att rita densitetsplotten med flera flygbolag är nedan:

Densitetsplott med flera flygbolag

Äntligen har vi kommit fram till en effektiv lösning! Med täthetsdiagrammet kan vi enkelt göra jämförelser mellan flygbolag eftersom diagrammet är mindre rörigt. Nu när vi äntligen har den plott vi vill ha kommer vi fram till att alla dessa flygbolag har nästan identiska fördelningar av ankomstförseningar! Det finns dock andra flygbolag i datasetet, och vi kan plotta ett som är lite annorlunda för att illustrera en annan valfri parameter för täthetsplottar, nämligen skuggning av grafen.

Skuggning av täthetsplottar

Uppfyllning av täthetsplotten kan hjälpa oss att skilja mellan överlappande fördelningar. Även om detta inte alltid är ett bra tillvägagångssätt kan det hjälpa till att betona skillnaden mellan fördelningar. För att skugga densitetsplottarna skickar vi in shade = True till kde_kws-argumentet i distplot-anropet.

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

Shaded Density Plot

Om man ska skugga plottet eller inte är, liksom andra plottningsalternativ, en fråga som beror på problemet! För den här grafen tycker jag att det är vettigt eftersom skuggningen hjälper oss att skilja plotterna åt i de områden där de överlappar varandra. Nu har vi äntligen fått användbar information: Alaska Airlines flygningar tenderar att vara tidigare oftare än United Airlines. Nästa gång du har möjlighet att välja vet du vilket flygbolag du ska välja!

Rug Plots

Om du vill visa varje värde i en fördelning och inte bara den utjämnade densiteten kan du lägga till en rug plot. Detta visar varje enskild datapunkt på x-axeln, vilket gör att vi kan visualisera alla faktiska värden. Fördelen med att använda seaborns distplot är att vi kan lägga till rug plot med ett enda parameteranrop av rug = True (med viss formatering också).

Densitetsplott med mattaplott för Alaska Airlines

Med många datapunkter kan mattaplottet bli överfullt, men för vissa datamängder kan det vara till hjälp att visa varje datapunkt. Med rug plot kan vi också se hur täthetsplotten ”skapar” data där det inte finns några, eftersom den skapar en kärnfördelning vid varje datapunkt. Dessa fördelningar kan läcka över de ursprungliga uppgifternas område och ge intryck av att Alaska Airlines har förseningar som är både kortare och längre än vad som faktiskt registrerats. Vi måste vara försiktiga med denna artefakt hos densitetsplottar och påpeka den för tittarna!

Slutsatser

Detta inlägg har förhoppningsvis gett dig en rad olika alternativ för att visualisera en enda variabel från en eller flera kategorier. Det finns ännu fler univariata (enskilda variabler) plottar som vi kan göra, t.ex. empiriska kumulativa täthetsplottar och kvantil-kvantilplottar, men för tillfället kommer vi att stanna vid histogram och täthetsplottar (och mattplottar också!). Oroa dig inte om alternativen verkar överväldigande: med lite övning blir det lättare att göra ett bra val, och du kan alltid be om hjälp om du behöver. Dessutom finns det ofta inget optimalt val och det ”rätta” beslutet beror på preferenser och visualiseringens mål. Det som är bra är att oavsett vilken plott du vill göra kommer det att finnas ett sätt att göra det i Python! Visualiseringar är ett effektivt sätt att kommunicera resultat, och om vi känner till alla tillgängliga alternativ kan vi välja rätt figur för våra data.

Jag välkomnar feedback och konstruktiv kritik och kan nås på Twitter @koehrsen_will.

.

admin

Lämna ett svar

Din e-postadress kommer inte publiceras.

lg