Cursusfragment: Intermediate Python for Data Science - Matplotlib
Hieronder vind je een fragment — video en transcript — uit het eerste hoofdstuk van de cursus Intermediate Python for Data Science. Hier staat het volledige hoofdstuk, inclusief interactieve oefeningen.
Basisplots met matplotlib
Hoi, ik ben Filip, en ik ben data scientist bij DataCamp. In deze intermediate Python-cursus verbeter je je Python-vaardigheden voor data science verder. Je leert hoe je data visualiseert en data opslaat in nieuwe datastructuren. Onderweg beheers je ook control flow, die je nodig hebt om de flow van je scripts en algoritmes aan te passen. We sluiten dit hoofdstuk af met een casestudy, waarin je alles wat je hebt geleerd combineert om een cool probleem op te lossen.
Dit eerste hoofdstuk gaat over datavisualisatie, een heel belangrijk onderdeel van data-analyse. Je gebruikt het om je dataset continu te verkennen. Hoe beter je je data begrijpt, hoe beter je inzichten kunt halen. En zodra je die inzichten hebt gevonden, heb je visualisatie opnieuw nodig om je waardevolle inzichten met anderen te delen. Kijk als voorbeeld eens naar deze prachtige plot.
Hij is gemaakt door de Zweedse professor Hans Rosling. Zijn talks over mondiale ontwikkeling zijn miljoenen keren bekeken. Wat ze zo intrigerend maakt, is dat hij met prachtige grafieken de data hun eigen verhaal laat vertellen. Hier zie je een bubble chart, waarbij elke bubbel een land voorstelt. Hoe groter de bubbel, hoe groter de bevolkingsomvang; de twee grootste bubbels hier zijn dus China en India.
Er zijn twee assen. De horizontale as toont het bbp per hoofd van de bevolking, in Amerikaanse dollars. De verticale as toont de levensverwachting. We zien duidelijk dat mensen langer leven in landen met een hoger bbp per hoofd. Toch is er een groot verschil in levensverwachting tussen landen met hetzelfde inkomensniveau.
Waarom vertel ik je dit allemaal? Omdat je aan het einde van dit hoofdstuk deze prachtige plot zelf kunt bouwen.
Er zijn veel visualisatiepakketten in Python, maar de moeder van allemaal is matplotlib. Je hebt de submodule pyplot nodig. Deze submodule wordt conventioneel geïmporteerd als plt, zo.
Voor ons eerste voorbeeld proberen we inzicht te krijgen in de evolutie van de wereldbevolking. Ik heb hier een lijst met jaren, year, en een lijst met bijbehorende bevolkingsaantallen, uitgedrukt in miljarden, pop. In het jaar 1970 leefden er bijvoorbeeld 3,7 miljard mensen op aarde.
Om deze data als een lijngrafiek te plotten, roepen we plt.plot() aan en gebruiken we onze twee lijsten als argumenten. Het eerste argument komt overeen met de horizontale as, en het tweede met de verticale as. Je zou denken dat er nu meteen een plot verschijnt, maar Python is best lui. Het wacht op de functie show() om de plot daadwerkelijk te tonen. Dat komt omdat je misschien nog extra elementen aan je plot wilt toevoegen voordat je hem laat zien, zoals titels en labelaanpassingen. Daar kom ik later nog op terug. Onthoud dit: de functie plot() zegt Python wát en hoe er geplot moet worden. show() toont de plot daadwerkelijk.
Als we naar onze plot kijken, zien we dat de jaren inderdaad op de horizontale as staan en de bevolkingsaantallen op de verticale as. Er zijn vier datapunten en Python tekent er een lijn tussen. In 1950 was de wereldbevolking ongeveer 2,5 miljard. In 2010 was dat rond de 7 miljard. De wereldbevolking is in zestig jaar dus bijna verdrievoudigd, best eng. Wat als de bevolking zo blijft groeien? Raakt de wereld overbevolkt? Je ontdekt het in de oefeningen.
Ik stel je eerst een ander type plot voor: de scatterplot. Om die te maken, kunnen we starten vanuit de code van daarnet. Deze keer verander je de plot-functie echter in scatter. De resulterende scatterplot tekent simpelweg alle individuele datapunten; Python verbindt de punten niet met een lijn. Voor veel toepassingen is de scatterplot een betere keuze dan de lijngrafiek, dus onthoud deze scatter-functie goed. Je zou ook kunnen zeggen dat dit een eerlijkere manier is om je data te plotten, omdat je duidelijk ziet dat de plot is gebaseerd op slechts vier datapunten.
Nu we de basis van matplotlib hebben behandeld, is het jouw beurt om toffe plots te maken!
# define a simple function
import matplotlib.pyplot as plt
year = [1950, 1970, 1990, 2010]
pop = [2.519, 3.692, 5.263, 6.972]
plt.plot(year, pop)
plt.show()
import matplotlib.pyplot as plt
year = [1950, 1970, 1990, 2010]
pop = [2.519, 3.692, 5.263, 6.972]
plt.scatter(year, pop)
plt.show()
Het histogram
In deze video introduceer ik het histogram. Het histogram is een visualisatievorm die heel handig is om je data te verkennen. Het helpt je een idee te krijgen van de verdeling van je variabelen. Om te zien hoe het werkt, stel je 12 waarden tussen 0 en 6 voor. Ik heb ze hier op een getallenlijn gezet. Om een histogram voor deze waarden te bouwen, kun je de lijn opdelen in gelijke stukken, zogenaamde bins. Stel dat je kiest voor 3 bins met elk een breedte van 2. Vervolgens tel je hoeveel datapunten in elke bin vallen. Er zitten 4 datapunten in de eerste bin, 6 in de tweede en 2 in de derde. Ten slotte teken je voor elke bin een staaf. De hoogte van de staaf komt overeen met het aantal datapunten dat in die bin valt. Het resultaat is een histogram, dat ons een mooi overzicht geeft van hoe de 12 waarden zijn verdeeld. De meeste waarden zitten in het midden, maar er zijn meer waarden onder de 2 dan boven de 4.
Natuurlijk kan ook matplotlib histograms maken. Zoals eerder begin je met het importeren van het pakket pyplot dat in matplotlib zit. Vervolgens kun je de functie hist() gebruiken. Laten we de documentatie openen. Er zijn allerlei argumenten die je kunt opgeven, maar de eerste twee hier zijn de belangrijkste. x moet een lijst zijn met waarden waarvoor je een histogram wilt maken. Met het tweede argument, bins, kun je Python vertellen in hoeveel bins de data moet worden verdeeld. Op basis van dit aantal bepaalt hist() automatisch geschikte grenzen voor alle bins en berekent het hoeveel waarden er in elke bin zitten. Als je het argument bins niet opgeeft, is de standaard 10.
Om het histogram te genereren dat je net zag, beginnen we met het maken van een lijst met de 12 waarden. Daarna roep je simpelweg hist() aan en geef je deze lijst door als input, zodat deze wordt gekoppeld aan het argument x. Ik heb het argument bins ook ingesteld op 3, zodat de waarden in drie bins worden verdeeld. Als je uiteindelijk de show-functie aanroept, verschijnt er een mooi histogram. Histograms zijn erg handig om het grotere geheel te laten zien. Kijk bijvoorbeeld naar deze zogenaamde bevolkingspiramide. De leeftijdsverdeling wordt getoond, voor zowel mannen als vrouwen, in de Europese Unie. Merk op dat de histograms 90 graden zijn gedraaid; de bins zijn nu horizontaal. De bins zijn het grootst voor de leeftijden 40 tot 44, waar er 20 miljoen mannen en 20 miljoen vrouwen zijn. Dat zijn de zogeheten babyboomers.
Dit zijn cijfers uit het jaar 2010. Wat denk je dat er in 2050 zal zijn veranderd? Laten we kijken. De verdeling is vlakker, en de babyboomgeneratie is ouder geworden. Met één oogopslag zie je hoe de demografie in de loop van de tijd verandert. Dat is de echte kracht van histograms! Ga nu naar de oefeningen om zelf met histograms te experimenteren!
values = [0,0.6,1.4,1.6,2.2,2.5,2.6,3.2,3.5,3.9,4.2,6]
import matplotlib.pyplot as plt
plt.hist(values,bins=3)
plt.show()
Aanpassen
Een plot maken is één ding. De juiste plot maken, die de boodschap heel duidelijk overbrengt, is de echte uitdaging. Voor elke visualisatie heb je veel opties. Allereerst zijn er verschillende plottypen. En voor elke plot kun je een eindeloos aantal aanpassingen doen. Je kunt kleuren, vormen, labels, assen enzovoort veranderen. De keuze hangt af van, één, de data, en twee, het verhaal dat je met die data wilt vertellen. Omdat er zo veel mogelijke aanpassingen zijn, is de beste manier om dit te leren: met voorbeelden.
Laten we beginnen met de code in dit script om een eenvoudige lijngrafiek te maken. Het lijkt op de lijngrafiek die we in de eerste video hebben gemaakt, maar dit keer bevatten de lijsten year en pop meer data, inclusief projecties tot het jaar 2100, voorspeld door de Verenigde Naties. Als we dit script draaien, krijgen we al een behoorlijk mooie plot: hij laat zien dat de bevolkingsgroei die nu gaande is, tegen het einde van de eeuw zal zijn afgezwakt.
Maar er zijn dingen die beter kunnen. Ten eerste moet duidelijker worden welke data we tonen, vooral voor mensen die de grafiek voor het eerst zien. En ten tweede moet de plot echt de aandacht vestigen op de bevolkingsgroei. Het eerste wat je altijd moet doen, is je assen labelen. Laten we dit doen door de functies xlabel() en ylabel() toe te voegen. Als input geven we strings mee die naast de assen moeten worden geplaatst. Zorg dat je deze functies aanroept vóór de methode show(), anders worden je aanpassingen niet getoond. Als we het script opnieuw draaien, zijn de assen deze keer geannoteerd. We voegen ook een titel toe aan onze plot, met de functie title. We geven de daadwerkelijke titel, 'World Population Projections', als argument door. En daar is de titel!
Met xlabel, ylabel en title kunnen we de lezer dus meer informatie geven over de data in de plot: nu kunnen ze tenminste zien waar de plot over gaat. Om de bevolkingsgroei in perspectief te plaatsen, wil ik dat de y-as vanaf nul begint. Dat kan met de functie . De eerste input is een lijst, in dit voorbeeld met de getallen nul tot en met tien, met intervallen van 2. Als we dit draaien, verandert de plot: de curve verschuift omhoog. Nu is duidelijk dat er in 1950 al zo'n 2,5 miljard mensen op deze planeet waren.yticks()
Vervolgens kunnen we, om duidelijk te maken dat het om miljarden gaat, een tweede argument toevoegen aan de functie yticks(), namelijk een lijst met de weergavenamen van de ticks. Deze lijst moet even lang zijn als de eerste lijst. De tick 0 krijgt de naam 0, de tick 2 krijgt de naam 2B, de tick 4 krijgt de naam 4B, enzovoort. B staat hier trouwens voor Billions (miljarden). Als we deze versie van het script draaien, veranderen de labels overeenkomstig, mooi.
Tot slot voegen we wat meer historische data toe om de bevolkingsgroei in de laatste 60 jaar te accentueren. Op Wikipedia vond ik de wereldbevolkingsdata voor de jaren 1800, 1850 en 1900. Ik kan ze in lijstvorm schrijven en met het plusteken toevoegen aan de lijsten pop en year. Als ik het script nu nog eens draai, worden er drie datapunten aan de grafiek toegevoegd, wat een completer beeld geeft. Zo maak je van een gemiddelde lijngrafiek een visual met een helder verhaal! Nu ben jij aan de beurt. Ga naar de oefeningen, pas de grafiek over de wereldontwikkeling stap voor stap aan en word de volgende Hans Rosling!
import matplotlib.pyplot as plt
import pandas as pd
year = list(range(1950, 2101))
pop = [2.53,2.57,2.62,2.67,2.71,2.76,2.81,2.86,2.92,2.97,3.03,3.08,3.14,3.2,3.26,3.33,3.4,3.47,3.54,3.62,3.69,3.77,3.84,3.92,4.,4.07,4.15,4.22,4.3,4.37,4.45,4.53,4.61,4.69,4.78,4.86,4.95,5.05,5.14,5.23,5.32,5.41,5.49,5.58,5.66,5.74,5.82,5.9,5.98,6.05,6.13,6.2,6.28,6.36,6.44,6.51,6.59,6.67,6.75,6.83,6.92,7.,7.08,7.16,7.24,7.32,7.4,7.48,7.56,7.64,7.72,7.79,7.87,7.94,8.01,8.08,8.15,8.22,8.29,8.36,8.42,8.49,8.56,8.62,8.68,8.74,8.8,8.86,8.92,8.98,9.04,9.09,9.15,9.2,9.26,9.31,9.36,9.41,9.46,9.5,9.55,9.6,9.64,9.68,9.73,9.77,9.81,9.85,9.88,9.92,9.96,9.99,10.03,10.06,10.09,10.13,10.16,10.19,10.22,10.25,10.28,10.31,10.33,10.36,10.38,10.41,10.43,10.46,10.48,10.5,10.52,10.55,10.57,10.59,10.61,10.63,10.65,10.66,10.68,10.7,10.72,10.73,10.75,10.77,10.78,10.79,10.81,10.82,10.83,10.84,10.85]
pop = [1,1.262,1.650] + pop
year = [1800,1850,1900] + year
plt.plot(year, pop)
plt.xlabel('Year')
plt.ylabel('Population')
plt.title('World Population Projections')
plt.yticks([0,2,4,6,8,10],['0','2B','4B','6B','8B','10B'])
plt.show()
