Kursus
Saat bekerja dengan data dunia nyata, Anda tidak bisa begitu saja berasumsi bahwa dataset memuat semua informasi penting untuk menyelesaikan proyek data science Anda. Sebagian besar waktu, Anda hanya memiliki informasi parsial dan harus memperkaya data dengan fitur tambahan.
Bisa saja dataset berisi alamat, tetapi pada saat yang sama, lintang dan bujur tidak tersedia. Dalam kasus tersebut, langkah pertama untuk memperkaya data adalah menambahkan sepasang koordinat ini. Proses mengonversi alamat menjadi lintang dan bujur ini disebut geocoding.
Geocoding sangat penting di banyak bidang, seperti real estat, keuangan, dan logistik. Tanpa teknik ini, Anda tidak dapat menganalisis dan memvisualisasikan data ke dalam peta. Dalam tutorial ini, kita akan melakukan geocoding di Python berkat sebuah library penyelamat bernama Geopy. Mari mulai!
Apa itu Geocoding?
Geocoding adalah proses mengonversi alamat (seperti "1600 Amphitheatre Parkway, Mountain View, CA") menjadi koordinat geografis (seperti lintang 37.423021 dan bujur -122.083739), yang dapat Anda gunakan untuk menempatkan penanda pada peta atau menentukan posisi peta. Sederhananya, ini adalah proses komputasional mengubah deskripsi alamat fisik menjadi lokasi di permukaan Bumi.
Proses geocoding sering kali melibatkan interpolasi lokasi spasial, seperti jalan atau bidang tanah, dalam cakupan geografis suatu peta. Lokasi yang dihasilkan dikeluarkan sebagai koordinat numerik, cocok untuk digunakan dalam analisis spasial atau visualisasi peta.
Geocoding menggunakan berbagai sumber data untuk mengonversi alamat menjadi lokasi geografis. Sumber utamanya adalah basis data referensi jalan yang berisi nama jalan dan rentang alamat dalam suatu county atau area tertentu. Sumber lain mencakup basis data kode pos, nama kota, dan basis data tempat penting (seperti taman atau tengara).
Geocoding tidak hanya tentang mendapatkan koordinat untuk suatu alamat. Ini juga digunakan dalam analisis spasial, penambangan data, dan pembersihan data. Misalnya, bisnis menggunakan geocoding untuk menganalisis informasi demografis guna mendorong kampanye pemasaran terarah atau mengoptimalkan rute pengantaran. Dalam ranah keselamatan publik, geocoding digunakan untuk memetakan lokasi kejadian darurat agar dapat mengerahkan layanan darurat terdekat dengan cepat.
Dalam konteks data science, geocoding adalah langkah krusial dalam pembuatan visualisasi geospasial dan dapat digunakan dalam berbagai aplikasi, seperti prediksi harga real estat, optimasi rute pengiriman, dan perencanaan respons bencana.
Apa itu Geopy?

Geopy adalah library Python sumber terbuka yang khusus menambahkan lokasi ke data melalui beragam layanan geocoding, seperti Google Maps, Open StreeMap, dan ArcGIS.
Anda mungkin bertanya mengapa tidak langsung menggunakan layanan geocode alih-alih library Python. Keunggulan Geopy adalah Anda dapat memanfaatkan layanan geocoding ini hanya dengan beberapa baris kode. Memang, Geopy telah mengimplementasikan kelas untuk masing-masing layanan tersebut, dan Anda bisa dengan mudah beralih dari satu API layanan ke layanan lainnya.
Contoh Proyek Geocoding Praktis
Dalam artikel ini, kita akan menganalisis dataset Canada Museum dari Kaggle. Dataset ini menyediakan informasi tentang museum yang berlokasi di Kanada. Kumpulan museum ini bisa berguna untuk memprediksi harga akomodasi Airbnb di Toronto; misalnya Anda mungkin memperhatikan bahwa harga sewa suatu listing meningkat semakin dekat lokasinya ke titik-titik menarik, seperti museum, restoran, kafe, dan sebagainya.
Mari kita lihat datasetnya:
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()

Dari gambaran ini, kita dapat melihat beberapa kolom memuat informasi alamat, seperti nama museum, alamat jalan, kota, provinsi, dan kode pos.
Untuk langkah selanjutnya, kita memerlukan satu kolom unik yang menggabungkan semua informasi dari kolom-kolom tersebut. Bagaimana caranya? Cara paling efisien untuk menggabungkan lebih dari dua kolom adalah menggunakan pandas.series.str.cat(), yang memungkinkan kita menentukan pemisah yang diinginkan antar kolom:
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()

Kita dapat membuat variabel string ‘address1’ yang memuat alamat unik pada baris pertama:
address1 = df['unique_address'].iloc[0]
print(address1)
# Bizune Event Gallery,452 Richmond St W,Toronto,ON,M5V 1Y1,Canada
Kita akan menggunakannya pada langkah berikutnya untuk mencoba berbagai layanan geocoding pada satu alamat. Setelah jelas bagaimana Geopy mengekstrak lokasi, teknik ini bisa diperluas ke seluruh kolom pada dataframe pandas. Kita akan mencoba penyedia utama berikut:
- Google Maps
- OpenStreetMap
- ArcGIS
Geocoding dengan Google Maps API
Metode paling populer untuk mengonversi alamat menjadi koordinat adalah menggunakan Google Maps API.
Meskipun Google Maps menyediakan layanan berbayar, Anda mendapatkan kredit gratis $200 saat pertama kali membuat akun.
Untuk mendapatkan akses ke layanan, Anda perlu membuat akun baru di Google Maps Platform. Tersedia tutorial yang bagus untuk membantu Anda membuat kunci API.
GM_API_KEY = 'your_api_key'
from geopy.geocoders import GoogleV3
geolocator = GoogleV3(api_key=GM_API_KEY)
GoogleV3 adalah kelas yang diimplementasikan untuk menggunakan Google Maps v3 API. Pertama, kita bisa mencoba mengekstrak lokasi dari satu alamat:
location = geolocator.geocode(address1)
print('Latitude: '+str(location.latitude)+', Longitude: '+str(location.longitude))

Setelah itu kita bisa mencoba memperluas operasi ini ke field unique_address yang telah kita buat sebelumnya.
def service_geocode(g_locator, address):
location = g_locator.geocode(address)
if location!=None:
return (location.latitude, location.longitude)
else:
return np.NaN
Kita dapat menggunakan apply() untuk menerapkan fungsi tersebut ke semua baris unique_address:
df['LAT_LON'] = df['unique_address'].apply(lambda x:service_geocode(geolocator,x))
df[['unique_address','LAT_LON']].head()

Geocoding dengan OpenStreetMap API
Karena OpenStreetMap adalah basis data dan proyek geografis gratis terbesar yang dapat disunting, API-nya tidak dikenai biaya. Untuk melakukan geolokasi satu alamat, Anda hanya perlu memberikan email akun OSM Anda sebagai input ke kelas Nominatim, alih-alih kunci API:
from geopy.geocoders import Nominatim
geolocator = Nominatim(user_agent="your_email")
location = geolocator.geocode(address1)
print(location)
# None
Sayangnya, lokasi yang dikembalikan oleh OpenStreetMap API adalah None karena tidak mengenali alamat tersebut.
Memang, API ini kesulitan menemukan sebagian besar alamat jalan dalam dataset karena tidak memiliki cakupan alamat yang baik di semua area.
Karena itu, kita perlu membuat field lain unique_address_osm dengan informasi yang lebih sedikit:
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]
Setelah itu, kita teruskan alamat baru dan coba lagi mengekstrak lintang dan bujur dari alamat jalan:
address1_osm = df['unique_address_osm'].iloc[0]
location = geolocator.geocode(address1_osm)
print('Latitude: '+str(location.latitude)+', Longitude: '+str(location.longitude))

Seperti sebelumnya, kita menerapkan fungsi service_geocode() ke seluruh 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()

Meskipun kita tidak menyertakan nama museum, OpenStreetMap mengembalikan koordinat yang sangat mirip dengan GoogleMapsAPI.
Geocoding dengan ArcGIS API
ArcGIS adalah perangkat lunak yang memungkinkan analisis dan visualisasi data geospasial. ArcGIS juga menyediakan layanan lokasi seperti Google Maps dan OpenStreetMap.
from geopy.geocoders import ArcGIS
geolocator_arcgis = ArcGIS()
location = geolocator_arcgis.geocode(address1)
print('Latitude: '+str(location.latitude)+', Longitude: '+str(location.longitude))

Kali ini tidak ada masalah dalam memperoleh sepasang koordinat. Kita bisa melanjutkan dengan memperluas operasi ini ke semua alamat:
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()

Melihat baris-baris pertama dataset, kita dapat melihat pasangan koordinat yang diperoleh dengan ArcGIS mirip dengan yang diperoleh sebelumnya, hanya ada sedikit perbedaan.
Mengukur jarak antar dua tempat
Fungsionalitas lain dari Geopy adalah memungkinkan kita menghitung jarak antara dua titik. Ini dimungkinkan menggunakan jarak geodesik yang diperoleh dari dua pasangan (lintang, bujur).
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))

Jarak antara dua museum ini kira-kira 2 kilometer.
Pemikiran Akhir
Selesai! Anda telah mempelajari tiga cara berbeda untuk mengonversi alamat menjadi lintang dan bujur menggunakan Geopy. Ini adalah titik awal untuk analisis data geospasial yang lebih kompleks dan lanjutan.
Jika Anda tertarik memulai analisis geospasial tanpa kode, cara terbaik adalah melihat tutorial DataCamp Bekerja dengan Data Geospasial: Panduan Analisis di Power BI.
Untuk membangun visualisasi dan perhitungan yang lebih canggih, Tableau bisa menjadi alat yang tepat bagi Anda. Kursus DataCamp Introduction to Tableau ini akan memungkinkan Anda membuat visualisasi data dinamis dan menyelesaikan berbagai masalah analitis.
Jika Anda penggemar bahasa R, kursus hebat ini akan membantu membuat peta interaktif dengan leaflet. Jika Anda setia pada Python, pertimbangkan untuk mengambil Visualizing geospatial data in Python, yang membantu Anda membuat visualisasi yang menarik menggunakan geopandas dan folium.

