Kursus

Dalam tutorial ini, Anda akan mengenal dua paket yang populer untuk bekerja dengan data geospasial: geopandas dan Shapely. Lalu, Anda akan menerapkan kedua paket ini untuk membaca data geospasial menggunakan Python dan memplot jejak Badai Florence dari 30 Agustus hingga 18 September.
Apa itu Data Geospasial?
Data spasial, data geospasial, data GIS atau geodata, adalah sebutan untuk data numerik yang mengidentifikasi lokasi geografis suatu objek fisik seperti bangunan, jalan, kota kecil, kota besar, negara, dan sebagainya berdasarkan sistem koordinat geografis. Dari data spasial, Anda tidak hanya dapat mengetahui lokasi tetapi juga panjang, ukuran, luas, atau bentuk suatu objek. Contoh jenis data spasial yang bisa Anda peroleh adalah: koordinat suatu objek seperti lintang, bujur, dan elevasi. Sistem Informasi Geografis (GIS) atau aplikasi perangkat lunak khusus lainnya dapat digunakan untuk mengakses, memvisualisasikan, memanipulasi, dan menganalisis data geospasial.
Mengapa Data Geospasial?
Data geospasial memiliki banyak sekali aplikasi dalam kehidupan sehari-hari. Salah satunya adalah aplikasi Peta yang Anda gunakan untuk bernavigasi dari satu lokasi ke lokasi lain. Contoh lain yang mungkin Anda lihat setiap hari adalah di kanal cuaca.

Ya, data geospasial digunakan untuk merepresentasikan informasi posisi sesuatu terhadap hal-hal lain di sekitarnya: rumah Anda di peta kota, badai di peta dunia, dan sebagainya. Jadi dalam tutorial ini, Anda akan melihat badai Florence yang destruktif dan melacak lokasinya.
Persyaratan paket
Jangan lompat ke depan. Ini bagian penting. Jika Anda tidak yakin sudah memenuhi persyaratan, silakan periksa lagi. Pertama dan terutama, Anda perlu memasang semua paket di bawah ini.
- Pandas: menyediakan struktur data dan alat analisis data
- Numpy: paket fundamental untuk komputasi ilmiah dengan Python
- SciPy:(diucapkan “Sai Pai”) adalah ekosistem perangkat lunak open-source berbasis Python untuk matematika, sains, dan rekayasa
- RTree: pembungkus Python ctypes untuk libspatialindex yang menyediakan sejumlah fitur pengindeksan spasial tingkat lanjut
- GDAL: pustaka penerjemah untuk format data geospasial raster dan vektor
- Fiona: Fiona membaca dan menulis berkas data spasial
- Shapely: Objek geometris, predikat, dan operasi
- GeoPandas: memperluas tipe data yang digunakan oleh pandas untuk memungkinkan operasi spasial pada tipe geometris.
- PySAL: pustaka fungsi analisis spasial yang ditulis dalam Python untuk mendukung pengembangan aplikasi tingkat tinggi.
- Matplotlib: pustaka plotting 2D untuk Python
- Missingno: modul visualisasi data hilang untuk Python
Pasang semua paket mengikuti urutan di atas agar semuanya berfungsi. Beberapa paket merupakan prasyarat bagi yang lain, misalnya: untuk memasang GeoPandas, diperlukan Shapely, dan untuk memasang Shapely; RTree, GDAL, dan Fiona harus sudah terpasang. Cara termudah memasang paket adalah: pip install PACKAGE_NAME
Jika Anda menggunakan Windows dan tidak dapat memasang paket dengan cara tersebut, cek situs web ini untuk mengunduh paket terkait dan lakukan pip install PATH_TO_PACKAGE.
Tentang data
Seperti yang mungkin Anda ketahui, badai Florence yang mengerikan baru saja melintasi sebagian Pantai Timur Amerika Serikat, meninggalkan perkiraan kerusakan sebesar 17 miliar USD. Tutorial ini akan membantu Anda mengetahui dari mana asalnya, kapan dan di mana ia menguat, serta memahami lebih jauh bencana alam ini dan menganalisisnya di Python. Ada banyak situs web yang menyediakan informasi tentang badai ini. Misalnya, situs web ini menyediakan data untuk beberapa badai dan topan di Amerika Serikat dari 1902 hingga 2018, jadi ada banyak sekali data yang bisa Anda gunakan nanti. Untuk tutorial ini, Anda hanya akan menggunakan data Badai Florence
Anda juga akan menggunakan data geospasial peta AS dari internet. Postingan blog oleh Eric Celeste memiliki berbagai berkas data batas untuk county dan state di AS. Data yang digunakan dalam tutorial ini adalah berkas GeoJSON US States, 5m.
# Load all importance packages
import geopandas
import numpy as np
import pandas as pd
from shapely.geometry import Point
import missingno as msn
import seaborn as sns
import matplotlib.pyplot as plt
% matplotlib inline
Pertama, mari lihat geospatial dataframe pertama: US States Geodata
# Getting to know GEOJSON file:
country = geopandas.read_file("data/gz_2010_us_040_00_5m.json")
country.head()

Dengan memeriksa tipe dataframe yang baru saja Anda muat, Anda dapat melihat bahwa ini adalah Geo Data Frame, yang memiliki semua karakteristik reguler dari Pandas DataFrame.
type(country)
geopandas.geodataframe.GeoDataFrame
Memeriksa tipe data kolom yang berisi koordinat: ini adalah GeoSeries.
type(country.geometry)
geopandas.geoseries.GeoSeries
Setiap nilai dalam GeoSeries adalah Objek Shapely. Bisa berupa:
- Point
- Line
- Polygon
- MultiPolygon
Setiap objek dapat digunakan untuk jenis objek fisik yang berbeda, seperti: Point untuk bangunan, Line untuk jalan, Polygon untuk kota, dan MultiPolygon untuk negara dengan banyak kota di dalamnya. Untuk informasi lebih lanjut tentang tiap objek Geometrik, baca artikel ini: https://shapely.readthedocs.io/en/stable/manual.html#geometric-objects
type(country.geometry[0])
shapely.geometry.multipolygon.MultiPolygon
Mirip dengan Pandas DataFrame, GeoDataFrame juga memiliki atribut plot, yang memanfaatkan karakter geometrinya dalam dataframe untuk memplot peta:
country.plot()
<matplotlib.axes._subplots.AxesSubplot at 0x1cfe68c1358>

Seperti yang Anda lihat, peta AS relatif kecil dibandingkan dengan bingkai. Ini karena informasinya mencakup Alaska, Hawaii, dan Puerto Riko, yang tersebar. Untuk tujuan tutorial ini, Anda dapat mengecualikan Alaska dan Hawaii karena badai tidak mendekati kedua negara bagian tersebut. Anda juga dapat menambahkan ukuran figur dan warna untuk menyesuaikan plot Anda sendiri:
# Exclude Alaska and Hawaii for now
country[country['NAME'].isin(['Alaska','Hawaii']) == False].plot(figsize=(30,20), color='#3B3C6E');

Tidak terlalu sulit, bukan! Sekarang Anda sudah memiliki peta AS, mari muat data badai:
florence = pd.read_csv('data/florence.csv')
florence.head()

Analisis Data Eksploratif
Ini selalu hal pertama yang Anda lakukan saat memuat dataset apa pun:
- Memeriksa informasi, tipe data
- Adanya nilai hilang
- Data statistik
florence.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 105 entries, 0 to 104
Data columns (total 11 columns):
AdvisoryNumber 105 non-null object
Date 105 non-null object
Lat 105 non-null float64
Long 105 non-null float64
Wind 105 non-null int64
Pres 105 non-null int64
Movement 105 non-null object
Type 105 non-null object
Name 105 non-null object
Received 105 non-null object
Forecaster 104 non-null object
dtypes: float64(2), int64(2), object(7)
memory usage: 9.1+ KB
Memeriksa nilai hilang menggunakan paket missingno. Ini paket yang berguna dengan visualisasi untuk menunjukkan data hilang. Seperti yang Anda lihat di bawah, hanya ada satu nilai hilang di kolom "Forecaster" yang tidak Anda perlukan untuk tutorial ini. Jadi Anda dapat mengabaikannya untuk saat ini.
# Notice you can always adjust the color of the visualization
msn.bar(florence, color='darkolivegreen');

Lihat beberapa informasi statistik; beberapa bisa sangat berguna seperti kecepatan angin rata-rata, kecepatan angin maksimum dan minimum dari badai ini, dan sebagainya.
# Statistical information
florence.describe()
| Lat | Long | Wind | Pres | |
|---|---|---|---|---|
| count | 105.000000 | 105.000000 | 105.000000 | 105.000000 |
| mean | 25.931429 | 56.938095 | 74.428571 | 981.571429 |
| std | 7.975917 | 20.878865 | 36.560765 | 22.780667 |
| min | 12.900000 | 18.400000 | 25.000000 | 939.000000 |
| 25% | 18.900000 | 41.000000 | 40.000000 | 956.000000 |
| 50% | 25.100000 | 60.000000 | 70.000000 | 989.000000 |
| 75% | 33.600000 | 76.400000 | 105.000000 | 1002.000000 |
| max | 42.600000 | 82.900000 | 140.000000 | 1008.000000 |
Untuk sebagian besar data, Anda perlu membersihkan dan mengambil hanya yang Anda butuhkan untuk dikerjakan. Di sini, Anda hanya memerlukan waktu, koordinat: lintang dan bujur, kecepatan angin, tekanan, dan Nama. Movement dan Type bersifat opsional, tetapi sisanya bisa dihapus.
# dropping all unused features:
florence = florence.drop(['AdvisoryNumber', 'Forecaster', 'Received'], axis=1)
florence.head()

Biasanya, jika Anda memplot data itu sendiri, tidak perlu memberi perhatian ekstra pada koordinat. Namun, jika Anda ingin tampilannya mirip dengan peta, penting untuk memeriksa bujur dan lintang. Di sini bujur berada di barat, Anda perlu menambahkan tanda "-" di depan angkanya agar data terplot dengan benar:
# Add "-" in front of the number to correctly plot the data:
florence['Long'] = 0 - florence['Long']
florence.head()

Lalu Anda dapat mengombinasikan Lintang dan Bujur untuk membuat koordinat badai, yang selanjutnya akan diubah menjadi GeoPoint untuk tujuan visualisasi.
# Combining Lattitude and Longitude to create hurricane coordinates:
florence['coordinates'] = florence[['Long', 'Lat']].values.tolist()
florence.head()

# Change the coordinates to a geoPoint
florence['coordinates'] = florence['coordinates'].apply(Point)
florence.head()

Memeriksa tipe dataframe florence dan kolom coordinates dari data florence. Ini adalah pandas DataFrame dan pandas Series.
type(florence)
pandas.core.frame.DataFrame
type(florence['coordinates'])
pandas.core.series.Series
Setelah mengonversi data menjadi data geospasial, kita akan memeriksa kembali tipe dataframe florence dan kolom coordinates dari data Florence. Sekarang menjadi Geo DataFrame dan GeoSeries.
# Convert the count df to geodf
florence = geopandas.GeoDataFrame(florence, geometry='coordinates')
florence.head()

type(florence)
geopandas.geodataframe.GeoDataFrame
type(florence['coordinates'])
geopandas.geoseries.GeoSeries
Perhatikan bahwa meskipun sekarang menjadi Geo DataFrame dan Geo Series, ia tetap berperilaku seperti DataFrame dan Series biasa. Artinya Anda masih dapat melakukan penyaringan, groupby untuk dataframe atau mengekstrak nilai min, maks, atau rata-rata dari kolom.
# Filtering from before the hurricane was named.
florence[florence['Name']=='Six']

# Groupping by name to see how many names it has in the data set:
florence.groupby('Name').Type.count()
Name
FLORENCE 6
Florence 85
SIX 4
Six 10
Name: Type, dtype: int64
Mencari kecepatan angin rata-rata dari badai Florence:
print("Mean wind speed of Hurricane Florence is {} mph and it can go up to {} mph maximum".format(round(florence.Wind.mean(),4),
florence.Wind.max()))
Mean wind speed of Hurricane Florence is 74.4286 mph and it can go up to 140 mph maximum
Jadi kecepatan angin rata-rata badai Florence adalah 74,43 mil per jam (119,78 km per jam) dan maksimumnya 140 mil per jam (225,308 km per jam). Untuk membayangkan betapa menakutkannya kecepatan angin ini, situs web Skala Angin Beaufort, yang dikembangkan oleh Angkatan Laut Kerajaan Inggris, menunjukkan tampilan efek angin di air dan di darat. Dengan kecepatan 48 hingga 55 mil per jam, angin sudah dapat mematahkan dan mencabut pohon, serta menyebabkan "kerusakan struktural yang cukup besar".

Anda tidak ingin berada di sana pada saat itu.
Visualisasi
Serupa dengan pandas DataFrame, GeoDataFrame juga memiliki atribut .plot. Namun, atribut ini memanfaatkan koordinat di dalam GeoDataFrame untuk memetakkannya. Mari kita lihat:
florence.plot(figsize=(20,10));

Apa yang terjadi? Yang Anda lihat hanyalah sekumpulan titik tanpa navigasi. Apakah ada yang salah?
Tidak, semuanya baik-baik saja. Karena dataframe ini hanya memiliki informasi koordinat (lokasi) badai Florence pada setiap titik waktu, kita hanya bisa memplot posisinya pada peta kosong.
Jadi, langkah berikutnya adalah memplot posisi badai pada peta AS untuk melihat di mana ia menghantam dan seberapa kuat saat itu. Untuk melakukannya, Anda akan menggunakan koordinat peta AS (data yang kita muat di awal) sebagai dasar dan memplot posisi badai Florence di atasnya.
# Plotting to see the hurricane overlay the US map:
fig, ax = plt.subplots(1, figsize=(30,20))
base = country[country['NAME'].isin(['Alaska','Hawaii']) == False].plot(ax=ax, color='#3B3C6E')
# plotting the hurricane position on top with red color to stand out:
florence.plot(ax=base, color='darkred', marker="*", markersize=10);

Terlihat bagus! Sekarang, kita akan menyelesaikannya dengan lebih banyak detail seperti:
- Menambahkan judul
- Mewarnai posisi badai berdasarkan kecepatan angin untuk melihat seberapa kuat badai saat menghantam tiap kota.
- Menghapus sumbu
- Menambahkan legenda
- Menyimpan hasil ke berkas gambar untuk digunakan nanti
fig, ax = plt.subplots(1, figsize=(20,20))
base = country[country['NAME'].isin(['Alaska','Hawaii']) == False].plot(ax=ax, color='#3B3C6E')
florence.plot(ax=base, column='Wind', marker="<", markersize=10, cmap='cool', label="Wind speed(mph)")
_ = ax.axis('off')
plt.legend()
ax.set_title("Hurricane Florence in US Map", fontsize=25)
plt.savefig('Hurricane_footage.png',bbox_inches='tight');

Jadi badai berada pada titik terkuat ketika masih di lepas pantai dekat pesisir timur. Saat mendekati daratan, badai mulai kehilangan kekuatannya, tetapi pada kecepatan angin kisaran 60 hingga 77 mil per jam, dampaknya tetap bisa sangat buruk.
Kesimpulan
Pekerjaan yang bagus! Anda telah mempelajari beberapa langkah yang diperlukan untuk bekerja dengan data geospasial di Python. Anda juga belajar cara memplot data geospasial dan menyesuaikan bentuk, warna, dan overlay plot untuk menceritakan sebuah kisah. Jika Anda ingin melatih keterampilan, ada banyak data geospasial yang tersedia online untuk Anda coba. Salah satunya adalah situs cuaca yang saya cantumkan di atas.
Untuk referensi, silakan lihat buku: “Python Geospatial Development Essentials” oleh Karim Bahgat (2015) untuk panduan yang lebih mendalam.
Jika Anda ingin menghubungi saya, Anda dapat mengirim email ke dqvu.ubc@gmail.com atau terhubung melalui LinkedIn. Selamat belajar dan tetap jaga keselamatan!
Jika Anda ingin mempelajari lebih lanjut tentang data geospasial di Python, ikuti kursus Visualizing Geospatial Data in Python dari DataCamp.
Di bawah ini adalah data yang digunakan dalam tutorial ini:
