Geospatial analytics met Python

Je bent nooit uitgeleerd in de wereld van data science toepassingen. Zo heb ik mij onlangs gestort op een interessant vraagstuk waar grote hoeveelheden geo-data en geografische afhankelijkheid van variabelen een belangrijke rol speelden. Nu heb ik in het verleden wel vaker gewerkt met geavanceerde geografische analyse pakketten, hoewel de licentie kosten hiervan behoorlijk hoog zijn en ze geen statistische modellen bevatten. Daarom ben ik eens gaan studeren op de mogelijkheden in Python en deze hebben mij wederom blij verrast. In deze blog neem ik jullie mee in de wondere wereld van geospatial analytics in Python met nadruk op de mogelijkheden van de geopandas package. Hiervoor maak ik gebruik van geografische open data van Nederland.

Allereerst importeren we de benodigde packages:

  • geopandas: uitbreiding van pandas data types om spatial operations toe te passen op geometrische types
  • descartes: uitbreiding op matplotlib voor de toepassing van geometrische objecten
  • shapely: uitvoering van geometrische bewerkingen
  • folium: interactieve visualisatie van geografische data gebaseerd op de leaflet.js library
  • crs: dit is natuurlijk geen package, maar stelt het Coordinate Reference System voor dat we gebruiken voor onze geo-data (Thijs van Ulden vertelt hier meer over in zijn blog over geo-data)

In ons voorbeeld gaan we demografische gegevens en supermarkt locaties in Nederlands analyseren. We beginnen hiervoor met het importeren van de gemeente polygonen van Nederland. Dit kan, zoals we gewend zijn met pandas, met één regel code. We negeren hier de waterlichamen, omdat we niet verwachten dat hier mensen wonen of supermarkten staan.

Demografische gegevens per gemeente zijn openbaar te vinden op de website van het CBS. Om het overzichtelijk te houden, heb ik de mannelijke populatie, vrouwelijke populatie en populatiedichtheid (aantal inwoners/km2) van 2018 ontsloten. Ik creëer een normale distributie van de variabelen en zie direct dat bijna de helft van de gemeenten geen demografische data bevat. Waarschijnlijk bevat de CBS-data van een aantal jaren geleden meer volledige data.

Toevallig heb ik niet zo lang geleden nog alle geo locaties van alle Nederlandse supermarkten op openingstijden.nl gescraped m.b.v. de beautiful soup package in Python. Gert-Jan Potuijt heeft dezelfde exercitie uitgevoerd in R, waarover hij deze blog heeft geschreven. De uitkomst hiervan lees ik in als .csv file en ik transformeer de latitude en longitude per supermarkt naar een geometrisch punt met shapefile.Point. Vervolgens combineer ik deze data in een geopandas dataframe.

We kunnen nu alle supermarkten in Nederland simpelweg plotten als punt op de polygonen kaart.

Om te bepalen hoeveel supermarkten iedere gemeente bevat, maken we gebruik van de geospatial join methode van geopandas. In deze methode vindt een intersectie plaats van punten binnen een polygoon.

We kunnen nu het aantal supermarkten per gemeente tellen.

Om gecombineerde inzichten vanuit diverse databronnen te kunnen analyseren voegen we de beschikbare data op gemeenteniveau samen tot één dataframe. Nu kunnen we bijvoorbeeld het aantal supermarkten per inwoner berekenen en visualiseren. In het voorbeeld hieronder laat ik links de 2 grootste supermarktketens (in aantallen supermarkten) en rechts de supermarkt dichtheid per gemeente zien.

Tijdens het bestuderen van resultaten tijdens een dergelijke analyse kan een interactieve vorm van geografische kaarten vaak enorm helpen. De folium package biedt hierin eindeloze mogelijkheden. Hieronder worden het aantal supermarkten per gemeente gevisualiseerd.

Met deze basismethoden kun je alle kanten op en de prestaties op grote hoeveelheden data transformaties zijn bijzonder hoog. Naast deze geometrische technieken zijn er ook veel mogelijkheden voor de toepassing van statistische modellen op geografische data. Deze volgende stap in de wereld van geospatial data science met Python is voer voor een volgende blog. De Python code en datasets zijn hieronder te downloaden als .zip file.

Geef een reactie

Gelieve met een van deze methodes in te loggen om je reactie te plaatsen:

WordPress.com logo

Je reageert onder je WordPress.com account. Log uit /  Bijwerken )

Google photo

Je reageert onder je Google account. Log uit /  Bijwerken )

Twitter-afbeelding

Je reageert onder je Twitter account. Log uit /  Bijwerken )

Facebook foto

Je reageert onder je Facebook account. Log uit /  Bijwerken )

Verbinden met %s