Als je met data uit de echte wereld werkt, kun je er niet zomaar van uitgaan dat de dataset alle onmisbare informatie bevat om je data science-project op te lossen. Meestal heb je slechts gedeeltelijke informatie en moet je de data verrijken met extra kenmerken.
Het kan voorkomen dat de dataset een adres bevat, maar dat tegelijkertijd de breedte- en lengtegraad ontbreken. In dat geval is de eerste stap in de verrijking het toevoegen van dit coördinatenpaar. We noemen dit proces, waarbij een adres wordt omgezet naar breedte- en lengtegraad, geocoding.
Geocoding is erg belangrijk in veel domeinen, zoals vastgoed, financiën en logistiek. Zonder deze techniek kun je de data niet analyseren en visualiseren op een kaart. In deze tutorial gaan we geocoding uitvoeren in Python met behulp van een levensreddende bibliotheek genaamd Geopy. Laten we beginnen!
Wat is geocoding?
Geocoding is een proces waarbij adressen (zoals "1600 Amphitheatre Parkway, Mountain View, CA") worden omgezet in geografische coördinaten (zoals breedtegraad 37.423021 en lengtegraad -122.083739), die je kunt gebruiken om markeringen op een kaart te plaatsen of de kaart te positioneren. Simpeler gezegd: het is het computationele proces waarbij een fysieke adresbeschrijving wordt omgezet naar een locatie op het aardoppervlak.
Het geocodingproces omvat vaak het interpoleren van ruimtelijke locaties, zoals straten of percelen, binnen de geografische grenzen van een kaart. De resulterende locaties worden uitgegeven als numerieke coördinaten, geschikt voor gebruik in ruimtelijke analyses of kaartvisualisaties.
Geocoding gebruikt verschillende databronnen om een adres om te zetten naar een geografische locatie. De primaire bron is een straatreferentiedatabase met straatnamen en adresreeksen binnen een specifieke gemeente of regio. Andere bronnen zijn onder meer databases met postcodes, stadsnamen en belangrijke plaatsen (zoals parken of bezienswaardigheden).
Geocoding draait niet alleen om het verkrijgen van coördinaten voor een bepaald adres. Het wordt ook gebruikt in ruimtelijke analyse, datamining en datacleaning. Bedrijven gebruiken geocoding bijvoorbeeld om demografische informatie te analyseren voor gerichte marketingcampagnes of om bezorgroutes te optimaliseren. In de sfeer van openbare veiligheid wordt geocoding gebruikt om de locaties van noodincidenten in kaart te brengen en zo snel mogelijk de dichtstbijzijnde hulpdiensten uit te sturen.
In de context van data science is geocoding een cruciale stap bij het maken van geospatiale visualisaties en kan het worden gebruikt in uiteenlopende toepassingen, zoals prijsvoorspelling voor vastgoed, route-optimalisatie voor bezorging en rampenresponsplanning.
Wat is Geopy?
Geopy is een open-source Python-bibliotheek die gespecialiseerd is in het toevoegen van locatie-informatie aan data via een grote verscheidenheid aan geocodingservices, zoals Google Maps, Open StreeMap en ArcGIS.
Je vraagt je misschien af waarom je niet rechtstreeks de geocodeservice zou gebruiken in plaats van de Python-bibliotheek. Het mooie aan Geopy is dat je deze geocodingservices met slechts een paar regels code kunt benutten. Geopy heeft namelijk voor elk van deze services een klasse geïmplementeerd, waardoor je eenvoudig kunt wisselen van de API van de ene service naar die van een andere.
Praktisch geocoding-projectvoorbeeld
In dit artikel analyseren we de Canada Museum-dataset van Kaggle. Deze bevat informatie over musea in Canada. Deze verzameling musea kan bijvoorbeeld nuttig zijn bij het voorspellen van de prijs van Airbnb-accommodaties in Toronto; je hebt misschien gemerkt dat de huurprijs van een listing stijgt naarmate deze dichter bij bezienswaardigheden ligt, zoals musea, restaurants, cafés, enzovoort.
Laten we een kijkje nemen naar de dataset:
import pandas as pd
import geopy
l_cols=['Name','Street Address','City','State','Zipcode']
df = pd.read_csv('/kaggle/input/canada-museums/museums list CAN.csv', encoding ="ISO-8859-1",usecols=l_cols)
df = df[df.City=='Toronto']
df.head()Mogelijk gemaakt door
Uit dit overzicht zien we dat verschillende kolommen adresinformatie bevatten, zoals de naam van het museum, het straatadres, de stad, de staat en de postcode.
Voor de volgende stappen hebben we één kolom nodig die alle informatie uit deze kolommen samenvoegt. Hoe doen we dat? De meest efficiënte manier om meer dan twee kolommen te concatenaten is met pandas.series.str.cat(), waarmee we de scheidingsteken kunnen opgeven die we tussen de kolommen willen:
df['Country']='Canada'
l_cols_concat =['Street Address','City','State','Zipcode','Country']
df['unique_address']= df['Name'].str.cat(others=df[l_cols_concat], sep=',',na_rep='')
df.head()Mogelijk gemaakt door
We kunnen een stringvariabele ‘address1’ maken die het unieke adres van de eerste rij bevat:
address1 = df['unique_address'].iloc[0]print(address1)# Bizune Event Gallery,452 Richmond St W,Toronto,ON,M5V 1Y1,CanadaMogelijk gemaakt door
Die gebruiken we in de volgende stappen om met verschillende geocodingservices te experimenteren op één adres. Zodra duidelijk is hoe Geopy de locatie extraheert, kun je dit uitbreiden naar een hele kolom in een pandas-dataframe. We proberen de volgende grote aanbieders:
Google Maps
OpenStreetMap
ArcGIS
Geocoding met de Google Maps API
De meest populaire methode om adressen naar coördinaten om te zetten is met de Google Maps API.
Hoewel Google Maps betaalde services aanbiedt, krijg je $200 aan gratis tegoed wanneer je voor het eerst een account aanmaakt.
GM_API_KEY ='your_api_key'from geopy.geocoders import GoogleV3
geolocator = GoogleV3(api_key=GM_API_KEY)Mogelijk gemaakt door
GoogleV3 is de klasse die is geïmplementeerd om de Google Maps v3 API te gebruiken. Eerst kunnen we proberen de locatie uit één adres te halen:
location = geolocator.geocode(address1)print('Latitude: '+str(location.latitude)+', Longitude: '+str(location.longitude))Mogelijk gemaakt door
Daarna kunnen we deze bewerking uitbreiden naar het veld unique_address dat we eerder hebben aangemaakt.
defservice_geocode(g_locator, address):
location = g_locator.geocode(address)if location!=None:return(location.latitude, location.longitude)else:return np.NaNMogelijk gemaakt door
We kunnen apply() gebruiken om de functie toe te passen op alle rijen van unique_address:
df['LAT_LON']= df['unique_address'].apply(lambda x:service_geocode(geolocator,x))
df[['unique_address','LAT_LON']].head()Mogelijk gemaakt door
Geocoding met de OpenStreetMap API
Omdat OpenStreetMap de grootste en bewerkbare gratis geografische database en -project is, is de API kosteloos. Om één adres te geolokaliseren, hoef je alleen het e-mailadres van je OSM-account op te geven aan de Nominatim-klasse, in plaats van een API-sleutel:
from geopy.geocoders import Nominatim
geolocator = Nominatim(user_agent="your_email")
location = geolocator.geocode(address1)print(location)# NoneMogelijk gemaakt door
Helaas is de door de OpenStreetMap API geretourneerde locatie None, omdat het adres niet wordt herkend.
Deze API heeft inderdaad moeite om het merendeel van de straatadressen in de dataset te lokaliseren, omdat de adresdekking niet in alle gebieden even goed is.
Daarom moeten we een ander veld unique_address_osm maken met minder informatie:
l_cols_concat =['City','State','Country']
df['unique_address_osm']= df['Street Address'].str.cat(others=df[l_cols_concat], sep=',',na_rep='')
address1_osm = df['unique_address_osm'].iloc[0]Mogelijk gemaakt door
Vervolgens geven we het nieuwe adres door en proberen we opnieuw de breedte- en lengtegraad uit het straatadres te halen:
address1_osm = df['unique_address_osm'].iloc[0]
location = geolocator.geocode(address1_osm)print('Latitude: '+str(location.latitude)+', Longitude: '+str(location.longitude))Mogelijk gemaakt door
Net als hiervoor passen we de functie service_geocode() toe op de hele kolom unique_address_osm:
df['LAT_LON_osm']= df['unique_address_osm'].apply(lambda x: service_geocode(geolocator,x))
df[['unique_address_osm','LAT_LON','LAT_LON_osm']].head()Mogelijk gemaakt door
Hoewel we de naam van het museum niet hebben gespecificeerd, retourneert OpenStreetMap zeer vergelijkbare coördinaten als de GoogleMapsAPI.
Geocoding met de ArcGIS API
ArcGIS is software waarmee je geospatiale data kunt analyseren en visualiseren. Het biedt ook locatiediensten zoals Google Maps en OpenStreetMap.
from geopy.geocoders import ArcGIS
geolocator_arcgis = ArcGIS()
location = geolocator_arcgis.geocode(address1)print('Latitude: '+str(location.latitude)+', Longitude: '+str(location.longitude))Mogelijk gemaakt door
Dit keer is er geen probleem om het coördinatenpaar te verkrijgen. We kunnen deze bewerking vervolgens uitbreiden naar alle adressen:
df['LAT_LON_arcgis']= df['unique_address'].apply(lambda x: service_geocode(geolocator_arcgis,x))
df[['unique_address','LAT_LON','LAT_LON_osm','LAT_LON_arcgis']].head()Mogelijk gemaakt door
Als we naar de eerste rijen van de dataset kijken, zien we dat de coördinatenparen verkregen met ArcGIS lijken op die van eerder; er is slechts een klein verschil.
Afstand tussen twee plaatsen meten
Een andere functionaliteit van Geopy is dat je de afstand tussen twee punten kunt berekenen. Dit is mogelijk met behulp van de geodetische afstand tussen twee paren (breedtegraad, lengtegraad).
from geopy.distance import geodesic
point1 = df.LAT_LON_arcgis.iloc[0]
point2 = df.LAT_LON_arcgis.iloc[1]
distance = geodesic(point1, point2)print('The distance between {} and {} is {} meters'.format(df.Name.iloc[0],df.Name.iloc[1],distance.meters))Mogelijk gemaakt door
De afstand tussen deze twee musea bedraagt ongeveer 2 kilometer.
Tot slot
Dat was het! Je hebt drie verschillende manieren geleerd om een adres om te zetten naar breedte- en lengtegraad met Geopy. Dit is een startpunt voor complexere en meer geavanceerde geospatiale data-analyse.
Voor het bouwen van geavanceerdere visualisaties en berekeningen kan Tableau het perfecte hulpmiddel voor je zijn. In deze DataCamp-cursus Introductie tot Tableau leer je dynamische datavisualisaties maken en elk analytisch probleem oplossen.
Leer hoe je impactvolle rapporten bouwt met Power BI’s Exploratory Data Analysis (EDA) om sneller inzichten te ontdekken en bedrijfswaarde te vergroten.
Als je met data uit de echte wereld werkt, kun je er niet zomaar van uitgaan dat de dataset alle onmisbare informatie bevat om je data science-project op te lossen. Meestal heb je slechts gedeeltelijke informatie en moet je de data verrijken met extra kenmerken.
Het kan voorkomen dat de dataset een adres bevat, maar dat tegelijkertijd de breedte- en lengtegraad ontbreken. In dat geval is de eerste stap in de verrijking het toevoegen van dit coördinatenpaar. We noemen dit proces, waarbij een adres wordt omgezet naar breedte- en lengtegraad, geocoding.
Geocoding is erg belangrijk in veel domeinen, zoals vastgoed, financiën en logistiek. Zonder deze techniek kun je de data niet analyseren en visualiseren op een kaart. In deze tutorial gaan we geocoding uitvoeren in Python met behulp van een levensreddende bibliotheek genaamd Geopy. Laten we beginnen!
Wat is geocoding?
Geocoding is een proces waarbij adressen (zoals "1600 Amphitheatre Parkway, Mountain View, CA") worden omgezet in geografische coördinaten (zoals breedtegraad 37.423021 en lengtegraad -122.083739), die je kunt gebruiken om markeringen op een kaart te plaatsen of de kaart te positioneren. Simpeler gezegd: het is het computationele proces waarbij een fysieke adresbeschrijving wordt omgezet naar een locatie op het aardoppervlak.
Het geocodingproces omvat vaak het interpoleren van ruimtelijke locaties, zoals straten of percelen, binnen de geografische grenzen van een kaart. De resulterende locaties worden uitgegeven als numerieke coördinaten, geschikt voor gebruik in ruimtelijke analyses of kaartvisualisaties.
Geocoding gebruikt verschillende databronnen om een adres om te zetten naar een geografische locatie. De primaire bron is een straatreferentiedatabase met straatnamen en adresreeksen binnen een specifieke gemeente of regio. Andere bronnen zijn onder meer databases met postcodes, stadsnamen en belangrijke plaatsen (zoals parken of bezienswaardigheden).
Geocoding draait niet alleen om het verkrijgen van coördinaten voor een bepaald adres. Het wordt ook gebruikt in ruimtelijke analyse, datamining en datacleaning. Bedrijven gebruiken geocoding bijvoorbeeld om demografische informatie te analyseren voor gerichte marketingcampagnes of om bezorgroutes te optimaliseren. In de sfeer van openbare veiligheid wordt geocoding gebruikt om de locaties van noodincidenten in kaart te brengen en zo snel mogelijk de dichtstbijzijnde hulpdiensten uit te sturen.
In de context van data science is geocoding een cruciale stap bij het maken van geospatiale visualisaties en kan het worden gebruikt in uiteenlopende toepassingen, zoals prijsvoorspelling voor vastgoed, route-optimalisatie voor bezorging en rampenresponsplanning.
Wat is Geopy?
Geopy is een open-source Python-bibliotheek die gespecialiseerd is in het toevoegen van locatie-informatie aan data via een grote verscheidenheid aan geocodingservices, zoals Google Maps, Open StreeMap en ArcGIS.
Je vraagt je misschien af waarom je niet rechtstreeks de geocodeservice zou gebruiken in plaats van de Python-bibliotheek. Het mooie aan Geopy is dat je deze geocodingservices met slechts een paar regels code kunt benutten. Geopy heeft namelijk voor elk van deze services een klasse geïmplementeerd, waardoor je eenvoudig kunt wisselen van de API van de ene service naar die van een andere.
Praktisch geocoding-projectvoorbeeld
In dit artikel analyseren we de Canada Museum-dataset van Kaggle. Deze bevat informatie over musea in Canada. Deze verzameling musea kan bijvoorbeeld nuttig zijn bij het voorspellen van de prijs van Airbnb-accommodaties in Toronto; je hebt misschien gemerkt dat de huurprijs van een listing stijgt naarmate deze dichter bij bezienswaardigheden ligt, zoals musea, restaurants, cafés, enzovoort.
Laten we een kijkje nemen naar de dataset:
Uit dit overzicht zien we dat verschillende kolommen adresinformatie bevatten, zoals de naam van het museum, het straatadres, de stad, de staat en de postcode.
Voor de volgende stappen hebben we één kolom nodig die alle informatie uit deze kolommen samenvoegt. Hoe doen we dat? De meest efficiënte manier om meer dan twee kolommen te concatenaten is met
pandas.series.str.cat(), waarmee we de scheidingsteken kunnen opgeven die we tussen de kolommen willen:We kunnen een stringvariabele ‘address1’ maken die het unieke adres van de eerste rij bevat:
Die gebruiken we in de volgende stappen om met verschillende geocodingservices te experimenteren op één adres. Zodra duidelijk is hoe Geopy de locatie extraheert, kun je dit uitbreiden naar een hele kolom in een pandas-dataframe. We proberen de volgende grote aanbieders:
Geocoding met de Google Maps API
De meest populaire methode om adressen naar coördinaten om te zetten is met de Google Maps API.
Hoewel Google Maps betaalde services aanbiedt, krijg je $200 aan gratis tegoed wanneer je voor het eerst een account aanmaakt.
Om toegang te krijgen tot de service moet je een nieuw account aanmaken op het Google Maps Platform. Er is een uitstekende tutorial die je helpt bij het genereren van de API-sleutel.
GoogleV3is de klasse die is geïmplementeerd om de Google Maps v3 API te gebruiken. Eerst kunnen we proberen de locatie uit één adres te halen:Daarna kunnen we deze bewerking uitbreiden naar het veld unique_address dat we eerder hebben aangemaakt.
We kunnen
apply()gebruiken om de functie toe te passen op alle rijen van unique_address:Geocoding met de OpenStreetMap API
Omdat OpenStreetMap de grootste en bewerkbare gratis geografische database en -project is, is de API kosteloos. Om één adres te geolokaliseren, hoef je alleen het e-mailadres van je OSM-account op te geven aan de
Nominatim-klasse, in plaats van een API-sleutel:Helaas is de door de OpenStreetMap API geretourneerde locatie None, omdat het adres niet wordt herkend.
Deze API heeft inderdaad moeite om het merendeel van de straatadressen in de dataset te lokaliseren, omdat de adresdekking niet in alle gebieden even goed is.
Daarom moeten we een ander veld unique_address_osm maken met minder informatie:
Vervolgens geven we het nieuwe adres door en proberen we opnieuw de breedte- en lengtegraad uit het straatadres te halen:
Net als hiervoor passen we de functie
service_geocode()toe op de hele kolom unique_address_osm:Hoewel we de naam van het museum niet hebben gespecificeerd, retourneert OpenStreetMap zeer vergelijkbare coördinaten als de GoogleMapsAPI.
Geocoding met de ArcGIS API
ArcGIS is software waarmee je geospatiale data kunt analyseren en visualiseren. Het biedt ook locatiediensten zoals Google Maps en OpenStreetMap.
Dit keer is er geen probleem om het coördinatenpaar te verkrijgen. We kunnen deze bewerking vervolgens uitbreiden naar alle adressen:
Als we naar de eerste rijen van de dataset kijken, zien we dat de coördinatenparen verkregen met ArcGIS lijken op die van eerder; er is slechts een klein verschil.
Afstand tussen twee plaatsen meten
Een andere functionaliteit van Geopy is dat je de afstand tussen twee punten kunt berekenen. Dit is mogelijk met behulp van de geodetische afstand tussen twee paren (breedtegraad, lengtegraad).
De afstand tussen deze twee musea bedraagt ongeveer 2 kilometer.
Tot slot
Dat was het! Je hebt drie verschillende manieren geleerd om een adres om te zetten naar breedte- en lengtegraad met Geopy. Dit is een startpunt voor complexere en meer geavanceerde geospatiale data-analyse.
Ben je geïnteresseerd om zonder code te beginnen met geospatiale analyse? Kijk dan eens naar DataCamp’s tutorial Werken met geospatiale data: een gids voor analyse in Power BI.
Voor het bouwen van geavanceerdere visualisaties en berekeningen kan Tableau het perfecte hulpmiddel voor je zijn. In deze DataCamp-cursus Introductie tot Tableau leer je dynamische datavisualisaties maken en elk analytisch probleem oplossen.
Ben je fan van de R-taal, volg dan deze geweldige cursus om interactieve kaarten te maken met leaflet. Ben je trouw aan Python, overweeg dan Geospatiale data visualiseren in Python, waarmee je geweldige visualisaties maakt met geopandas en folium.