Ana içeriğe geç

Veri Bilimciler için Jeokodlama: Örneklerle Bir Giriş

Bu eğitimde, bir adresi Geopy kullanarak enlem ve boylama dönüştürmenin üç farklı yolunu öğreneceksiniz.
· 9 dk. oku

Yapay Zeka ile Keşfedin

Gerçek dünya verileriyle çalışırken, veri kümesinin veri bilimi projenizi çözmek için gerekli tüm bilgileri içerdiğini varsayamazsınız. Çoğu zaman elinizde kısmi bilgi olur ve veriyi ek özelliklerle zenginleştirmeniz gerekir.

Veri kümesi bir adres içerebilir, ancak aynı zamanda enlem ve boylam eksik olabilir. Bu durumda zenginleştirmenin ilk adımı bu koordinat çiftini eklemektir. Bir adresi enlem ve boylama dönüştürme sürecine jeokodlama diyoruz.

Jeokodlama, emlak, finans ve lojistik gibi birçok alanda çok önemlidir. Bu teknik olmadan veriyi bir harita üzerinde analiz etmeniz ve görselleştirmeniz mümkün olmaz. Bu eğitimde Python'da hayat kurtaran Geopy adlı bir kütüphane sayesinde jeokodlama yapacağız. Hadi başlayalım!

Jeokodlama nedir?

Jeokodlama, adresleri ("1600 Amphitheatre Parkway, Mountain View, CA" gibi) coğrafi koordinatlara (enlem 37.423021 ve boylam -122.083739 gibi) dönüştürmeyi içeren bir süreçtir; bu koordinatları haritada işaretleyiciler yerleştirmek veya haritayı konumlandırmak için kullanabilirsiniz. Daha basit bir ifadeyle, fiziksel bir adres tanımını Dünya yüzeyindeki bir konuma dönüştüren hesaplamalı bir süreçtir.

Jeokodlama süreci genellikle bir haritanın coğrafi sınırları içinde sokaklar veya parseller gibi mekansal konumların enterpolasyonunu içerir. Ortaya çıkan konumlar, mekansal analiz veya harita görselleştirmesinde kullanıma uygun sayısal koordinatlar olarak çıktılanır.

Jeokodlama, bir adresi coğrafi bir konuma dönüştürmek için çeşitli veri kaynakları kullanır. Birincil kaynak, belirli bir ilçe veya alan içindeki sokak adlarını ve adres aralıklarını içeren bir sokak referans veritabanıdır. Diğer kaynaklar arasında posta kodu veritabanları, şehir adı veritabanları ve önemli yerlerin (parklar veya simge yapılar gibi) veritabanları bulunur.

Jeokodlama sadece verilen bir adres için koordinat elde etmekle ilgili değildir. Mekansal analiz, veri madenciliği ve veri temizleme için de kullanılır. Örneğin işletmeler, hedefli pazarlama kampanyalarını yönlendirmek veya teslimat rotalarını optimize etmek için demografik bilgileri analiz etmek üzere jeokodlamadan yararlanır. Kamu güvenliği alanında ise, en yakın acil servislerin hızlı bir şekilde yönlendirilmesi için acil durum olaylarının konumlarını haritalamak amacıyla jeokodlama kullanılır.

Veri bilimi bağlamında jeokodlama, coğrafi görselleştirmeler oluşturma sürecinde kritik bir adımdır ve gayrimenkul fiyat tahmini, teslimat rotası optimizasyonu ve afet müdahale planlaması gibi çeşitli uygulamalarda kullanılabilir.

Geopy nedir?

Yazarın İllüstrasyonu

Geopy, Google Maps, Open StreeMap ve ArcGIS gibi çok çeşitli jeokodlama servisleri aracılığıyla verilere konum bilgisi ekleme konusunda uzmanlaşmış, açık kaynaklı bir Python kütüphanesidir.

Python kütüphanesi yerine neden doğrudan jeokodlama servisini kullanamayacağınızı düşünebilirsiniz. Geopy'nin güzelliği, bu jeokodlama servislerinden sadece birkaç satır kodla yararlanabilmenizdir. Nitekim Geopy, bu servislerin her biri için bir sınıf uygular ve bir servisin API'sinden diğerine kolayca geçiş yapabilirsiniz.

Uygulamalı Jeokodlama Projesi Örneği

Bu yazıda, Kaggle'daki Canada Museum veri setini inceleyeceğiz. Kanada'da bulunan müzeler hakkında bilgi sağlar. Bu müze koleksiyonu, örneğin Toronto'daki Airbnb konaklama fiyatını tahmin etmekte yararlı olabilir; ilgi noktalarına (müzeler, restoranlar, kafeler vb.) yaklaştıkça bir ilan kiralarının arttığını fark etmiş olabilirsiniz.

Veri setine bir göz atalım:

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()

veri kümesi

Bu genel bakıştan, müzenin adı, sokak adresi, şehir, eyalet ve posta kodu gibi adres bilgilerini içeren farklı sütunlar olduğunu görebiliriz.

Sonraki adımlar için bu sütunlardaki tüm bilgileri birleştiren tekil bir sütuna ihtiyacımız var. Bunu nasıl yapabiliriz? İkiden fazla sütunu birleştirmenin en verimli yolu, araya istediğimiz ayırıcıyı belirlememize olanak tanıyan pandas.series.str.cat() fonksiyonunu kullanmaktır:

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()

tekil adresli veri kümesi

İlk satırın tekil adresini içeren 'address1' adlı bir string değişken oluşturabiliriz:

address1 = df['unique_address'].iloc[0]
print(address1)
# Bizune Event Gallery,452 Richmond St W,Toronto,ON,M5V 1Y1,Canada

Bir sonraki adımlarda, tek bir adreste farklı jeokodlama servislerini denemek için bunu kullanacağız. Geopy'nin konumu nasıl çıkardığı netleştikten sonra, bu işlem bir pandas veri çerçevesinin tüm bir sütununa genişletilebilir. Aşağıdaki başlıca sağlayıcıları deneyeceğiz:

  • Google Maps
  • OpenStreetMap
  • ArcGIS

Google Maps API ile Jeokodlama

Adresleri koordinatlara dönüştürmenin en popüler yöntemi Google Maps API'yi kullanmaktır.

Google Maps ücretli hizmetler sunsa da, hesabı ilk oluşturduğunuzda size 200 $ ücretsiz kredi verir.

Hizmete erişmek için Google Maps Platform'da yeni bir hesap oluşturmanız gerekir. API anahtarını oluşturmanıza yardımcı olan harika bir eğitim mevcut.

GM_API_KEY = 'your_api_key'
from geopy.geocoders import GoogleV3
geolocator = GoogleV3(api_key=GM_API_KEY)

GoogleV3, Google Maps v3 API'yi kullanmak için uygulanmış sınıftır. Önce tek bir adresten konumu çıkarmayı deneyebiliriz:

location = geolocator.geocode(address1)
print('Latitude: '+str(location.latitude)+', Longitude: '+str(location.longitude))

image5.png

Ardından, bu işlemi daha önce oluşturduğumuz unique_address alanına genişletmeyi deneyebiliriz.

def service_geocode(g_locator, address):
    location = g_locator.geocode(address)
    if location!=None:
      return (location.latitude, location.longitude)
    else:
      return np.NaN

apply() fonksiyonunu, unique_address'ın tüm satırlarına fonksiyonu uygulamak için kullanabiliriz:

df['LAT_LON'] = df['unique_address'].apply(lambda x:service_geocode(geolocator,x))
df[['unique_address','LAT_LON']].head()

image3.png

OpenStreetMap API ile Jeokodlama

OpenStreetMap en büyük ve düzenlenebilir ücretsiz coğrafi veritabanı ve proje olduğundan, API'si ücretsizdir. Tek bir adresi jeolokasyonlamak için, API anahtarı yerine OSM hesabınızın e-postasını Nominatim sınıfına girdi olarak vermeniz yeterlidir:

from geopy.geocoders import Nominatim
geolocator = Nominatim(user_agent="your_email")
location = geolocator.geocode(address1)
print(location)
# None

Ne yazık ki, OpenStreetMap API tarafından döndürülen konum None, çünkü adresi tanımıyor.

Nitekim bu API, tüm bölgelerde iyi adres kapsamına sahip olmadığı için veri setindeki sokak adreslerinin çoğunu bulmakta zorlanır.

Bu nedenle, daha az bilgi içeren unique_address_osm adlı başka bir alan oluşturmamız gerekir:

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]

Sonrasında yeni adresi verip, sokak adresinden enlem ve boylamı tekrar çıkarmayı deneriz:

address1_osm = df['unique_address_osm'].iloc[0]
location = geolocator.geocode(address1_osm)
print('Latitude: '+str(location.latitude)+', Longitude: '+str(location.longitude))

image8.png

Daha önce olduğu gibi, service_geocode() fonksiyonunu unique_address_osm sütununun tamamına uygularız:

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()

image11.png

Müzenin adını belirtmemiş olsak da OpenStreetMap, GoogleMapsAPI ile oldukça benzer koordinatlar döndürüyor.

ArcGIS API ile Jeokodlama

ArcGIS, coğrafi verileri analiz etmeyi ve görselleştirmeyi sağlayan bir yazılımdır. Google Maps ve OpenStreetMap gibi konum hizmetleri de sağlar.

from geopy.geocoders import ArcGIS
geolocator_arcgis = ArcGIS()
location = geolocator_arcgis.geocode(address1)
print('Latitude: '+str(location.latitude)+', Longitude: '+str(location.longitude))

image2.png

Bu kez koordinat çiftini elde etmede bir sorun yok. Bu işlemi tüm adreslere genişletmeye devam edebiliriz:

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()

image6.png

Veri setinin ilk satırlarına bakıldığında, ArcGIS ile elde edilen koordinat çiftlerinin öncekilere benzer olduğunu, yalnızca küçük bir fark bulunduğunu görebiliriz.

İki yer arasındaki mesafeyi ölçme

Geopy'nin bir diğer işlevi de iki nokta arasındaki mesafeyi hesaplamamıza olanak tanımasıdır. Bu, iki (enlem, boylam) çifti arasında elde edilen jeodezik mesafe kullanılarak mümkündür.

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

image1.png

Bu iki müze arasındaki mesafe yaklaşık 2 kilometredir.

Son Düşünceler

Hepsi bu! Geopy kullanarak bir adresi enlem ve boylama dönüştürmenin üç farklı yolunu öğrendiniz. Bu, daha karmaşık ve ileri düzey coğrafi veri analizleri için bir başlangıç noktasıdır.

Kod yazmadan coğrafi analizle başlamayla ilgileniyorsanız, en iyi yol DataCamp'in Geospatial Verilerle Çalışma: Power BI'da Analize Giriş eğitimine göz atmaktır.

Daha gelişmiş görselleştirmeler ve hesaplamalar oluşturmak için Tableau sizin için mükemmel bir araç olabilir. DataCamp'in Tableau'ya Giriş kursu, dinamik veri görselleştirmeleri oluşturmanıza ve her türlü analitik sorunu çözmenize olanak tanır.

R dilinin hayranıysanız, leaflet ile etkileşimli haritalar oluşturma üzerine bu harika kursa bakın. Python'a bağlıysanız, geopandas ve folium kullanarak etkileyici görselleştirmeler yapmanıza yardımcı olan Python'da coğrafi verileri görselleştirme kursunu düşünün.

Eugenia Anello

Yazar

Eugenia Anello

Veri Bilimci - CRIF

Konular

İlgili