Identifikasi Pola Curah Hujan di Indonesia Menggunakan Time-Filtering Python
Curah hujan merupakan salah satu parameter cuaca yang sangat penting. Kondisi curah hujan dapat mempengaruhi berbagai sektor kehidupan manusia mulai dari sektor pertanian (Mis padi, jagung), perkebunan (Mis. kelapa sawit), sektor pertambangan (Mis. hasil tambang batubara jika terkena hujan akan membutuhkan cost lebih untuk pengeringannya), hingga sektor kebencanaan (longsor, banjir, kekeringan, kebakaran hutan).
Pola curah hujan di Indonesia sendiri cukup kompleks dan berbeda-beda tiap wilayahnya. Misalnya saja pola curah hujan di wilayah Sumatra utara berbeda dengan curah hujan di wilayah Jawa, berbeda pula dengan curah hujan di wilayah Maluku, Papua. Mengapa terjadi demikian? dan bagaimana sebenarnya pola curah hujan masing-masing wilayah di Indonesia?
Nah, pada artikel ini kita akan membahas lebih dalam mengenai pola curah hujan di Indonesia menggunakan metode time-filtering dengan tools python.
Sekilas Teori
Negara Indonesia merupakan negara kepulauan yang terletak di wilayah tropis. Hal tersebut membuat Indonesia memiliki keistimewaan tersendiri dibandingkan dengan negara-negara lainnya. Salah satu keistimewaanya adalah pola curah hujan. Pola curah hujan di wilayah satu dengan yang lainnya memiliki perbedaan dan karakteristiknya masing-masing. Mengapa demikian ? Berikut adalah beberapa alasannya :
Pertama, pengaruh letak geografis Indonesia. Pada bagian utara dan selatan, Indonesia diapit oleh dua benua yaitu benua Asia dan Australia yang menyebabkan cuaca di Indonesia dipengaruhi oleh Monsoon Asia dan Monsoon Australia. Sedangkan pada bagian barat dan timur, wilayah Indonesia berbatasan langsung dengan Samudra Hindia dan Samudra Pasific yang menyebabkan cuaca Indonesia juga dipengaruhi oleh fenomena IOD (Indian Oscean Dipole) dan fenomena ENSO (El-Nino Southern Oscillation). Fenomena-fenomena tersebut memberikan kontribusi cukup besar dalam membentuk pola curah hujan di Indonesia
Kedua, Indonesia terletak di equator tepatnya pada 6° LU — 11° LS dan 95° BT — 141° BT. Kita tau bahwa wilayah equator memiliki keistimewaan yaitu mendapatkan supply radiasi matahari sepanjang tahun. Peran matahari ini adalah sebagai sumber energi bagi lautan dan daratan untuk membentuk dinamika atmosfer dan cuaca.
Ketiga, wilayah Indonesia berbentuk kepulauan (maritime-continent) yang artinya bukan hanya terdiri dari daratan saja atau lautan saja, melainkan kombinasi dari keduanya. Dengan adanya kombinasi darat dan laut ini menyebabkan cuaca Indonesia memiliki dinamika tersendiri yang berbeda jika dibandingkan dengan negara lain. Ditambah dengan topografi yang beragam, membuat efek lokal cukup dominan di beberapa wilayah Indonesia.
Menurut penelitian yang dilakukan oleh Aldrian dan Susanto (2003) pola curah hujan di Indonesia dibagi menjadi 3 pola, yakni pola monsunal, pola equatorial dan pola lokal. Pola monsunal (Region A) ini memiliki karakteristik pola curah hujan berbentuk huruf U, meliputi wilayah Jawa, Bali, Sumatra bagian selatan, Kalimantan bagian selatan. Sedangkan pola equatorial (Region B) memiliki karakteristik pola curah hujan berbentuk seperti huruf M (tengah), meliputi wilayah Sumatra bagian Utara dan tengah, Kalimantan bagian utara, Sulawesi bagian utara. Pola lokal (Regional C) memiliki karakteristik seperti huruf U namun terbalik, meliputi wilayah Maluku, dan sekitarnya.
Region A merupakan wilayah yang didominasi oleh pola monsunal, ditandai dengan garis tebal berwarna biru. Region B didominasi pola equatorial yang ditandai dengan garis putus-putus warna biru sedangkan Region C dipengaruhi pola lokal yang ditandai dengan garis putus-putus warna merah. Garis merah pada plot pola tahunan merupakan curah hujan dalam satuan milimeter sedangkan garis hitam merupakan deviasinya.
Kali ini kita akan coba membuktikan pola tersebut menggunakan data dan metode time-filtering. Data yang digunakan adalah data GPCC reanalisis curah hujan bulanan dari tahun 1983 hingga 2013 yang diperoleh dari NOAA (https://psl.noaa.gov/data/gridded/data.gpcc.html) dengan resolusi spasial 0.5 x 0.5 derajat.
Dari data tersebut kita ambil 3 titik yang mewakili ketiga pola curah hujan tersebut. Titik A adalah di kota Semarang, Jawa Tengah, Titik B di kota Meulaboh, Aceh dan Titik C di wilayah Ambon, Maluku.
Algoritma Python
Pertama, kita import modul python yang dibutuhkan dalam pengolahan data. Dalam hal ini kita gunakan modul pandas, numpy, fft, scipy dan plotting menggunakan modul matplotlib.
#Import module that we needed
import pandas as pd
import numpy as np
from numpy.fft import fft, fftfreq, ifft
from scipy.fftpack import *
import matplotlib.pyplot as plt
Kedua, kita baca data sekaligus kenali data terlebih dahulu (dimensi, type, dan komponen statistika dasarnya)
#Read data
#Excel (Csv, xlsx )
dt = pd.read_excel(‘data.xlsx’)
dt = pd.DataFrame(dt)
dt.describe()
Berdasarkan tabel tersebut terlihat data terdiri dari 5 kolom dan 360 baris. Perlu diingat bahwa peng-index-an dalam python itu mulai dari 0. Jadi kolom 0 berisi tahun, kolom 1 berisi bulan, kolom 2 berisi nilai curah hujan bulanan Semarang, kolom ke 3 curah hujan Meulaboh dan kolom ke 4 curah hujan Ambon. Data curah hujan tersebut merupakan rata-rata bulanan selama 30 tahun (12 x 30).
Terlihat nilai rata-rata curah hujan bulanan selama 30 tahun (1983–2013) di Meulaboh tertinggi jika dibandingkan dengan yang lainnya. Sedangkan untuk wilayah Ambon terlihat nilai curah hujan maksimumnya tertinggi dan nilai standar deviasinya tertinggi. Hal ini menunjukkan bahwa curah hujan di Ambon cukup berfluktuasi dengan curah hujan maksimumnya bisa mencapai 1636.37 mm/month (masuk dalam kategori curah hujan sangat tinggi).
Ketiga, kita coba plot time-series ketiga lokasi tersebut.
#Mengambil data pada kolom tertentu
#Cara 1 (Mengetahui nama kolom)
ch_sem = dt[‘Semarang’]
ch_meul = dt[‘Meulaboh’]
ch_amb = dt[‘Ambon’]
# Melakukan moving aerage untuk menghilangkan noise (smoothing)
mov_sem = ch_sem.rolling(12).mean()
mov_meul = ch_meul.rolling(6).mean()
mov_amb = ch_amb.rolling(12).mean()
#Plotting time series
plt.figure(figsize=(12,7))
plt.plot(dt.index, ch_sem)
plt.plot(dt.index, mov_sem)
plt.xticks(dt.index[::24])
plt.yticks([0, 100, 200, 300, 400, 500, 600, 700, 800, 900])
plt.xlabel(‘Bulan ke — ‘)
plt.ylabel(‘Curah Hujan (mm/month)’)
plt.title(‘Curah Hujan Bulanan di Semarang Selama 1983–2013’, fontsize=15)
plt.show()
Garis berwarna biru menggambarkan time-series dari data curah hujan bulanan selama 30 tahun. Kita masih belum melihat dengan jelas pola dari data tersebut dikarenakan terdapat noise. Untuk itu, kita perlu menghilangkan noise dari data, kita gunakan metode sederhana moving average. Moving average dilakukan dengan merata-ratakan data hingga periode tertentu sehingga efek fluktuasi yang tajam dapat dihilangkan(smoothing). Hasil moving average ditunjukkan oleh garis warna jingga (orange).
Terlihat sudah mulai terlihat pola gelombang di masing-masing wilayah. Namun belum bisa kita tentukan berapa frekuensi atau periodenya (frequensi : banyaknya gelombang dalam satu periode tertentu sedangkan periode adalah waktu yang dibutuhkan untuk mencapai satu gelombang). Untuk menentukan frekuensi dan periode dari pola data curah hujan tersebut kita akan menggunakan metode Fast Fourier Transform (FFT)
Keempat, melakukan time-filtering menggunakan metode Fast Fourier Transform (FFT) untuk melihat sinyal-sinyal kuat pada periode/frekuensi tertentu.
# Normalisasi data curah hujan
ysem=np.nanmean(sem)
stds_sem=np.nanstd(sem)
sem=(sem-ysem)/stds_sem
ymeul=np.nanmean(meul)
stds_meul=np.nanstd(meul)
meul=(meul-ymeul)/stds_meul
yamb=np.nanmean(amb)
stds_amb=np.nanstd(amb)
amb=(amb-yamb)/stds_amb
# Time Filtering untuk melihat sinyal kuat pada periode tertentu
# Set up domain
# amount of sampel
n = 360
# Distance of sampel in month
Lx = 360
x = np.linspace(0,Lx,n)
# Preparation step
## Creates all the necessery frequencies
freqs = fftfreq(n)
# Hanya mengambil sinyal yang positif
mask = freqs > 0
## FFT and Power spectra calculation
fft_vals = fft(sem)
fft_vals2 = fft(meul)
fft_vals3 = fft(amb)
# True Teoritical FFT
fft_teo = 2.0 * np.abs(fft_vals/n)
fft_teo2 = 2.0 * np.abs(fft_vals2/n)
fft_teo3 = 2.0 * np.abs(fft_vals3/n)
#Plot Periodogram FFT Curah Hujan Masing-masing Lokasi
fig = plt.figure()
ax = fig.add_axes([0, 0, 2, 0.8])
axfch = fig.add_axes([0, 1, 2, 0.8])
axfchk = fig.add_axes([1.43,1.43,0.5,0.3])
axfch2k = fig.add_axes([1.43,0.43,0.5,0.3])
# Frequensi
axfch.plot(freqs[mask], fft_teo[mask])
axfch.set_xlabel(‘Frekuensi’)
axfch.set_ylabel(‘Magnitude’)
axfch.set_title(‘Periodogram FFT Curah Hujan Semarang’)
axfch.axis(‘tight’)
axfch.set_xticks([0, 0.05, 0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5])
axfchk.plot(freqs[mask], fft_teo[mask], ‘r’)
axfchk.set_xlabel(‘Frekuensi’)
axfchk.set_ylabel(‘Magnitude’)
axfchk.set_title(‘Frequensi Curah Hujan Semarang’)
axfchk.axis(‘tight’)
axfchk.set_xticks([0.05, 0.1, 0.15, 0.2])
axfchk.set_xlim([0.05, 0.2])
# Periode
ax.plot(1/freqs[mask], fft_teo[mask], ‘g’)
ax.set_xlabel(‘Periode’)
ax.set_ylabel(‘Magnitude’)
ax.set_title(‘Periodogram FFT Curah Hujan Semarang’)
ax.axis(‘tight’)
ax.set_xlim([0, 360])
axfch2k.plot(1/freqs[mask], fft_teo[mask], ‘r’)
axfch2k.set_xlabel(‘Periode’)
axfch2k.set_ylabel(‘Magnitude’)
axfch2k.set_title(‘Periode Curah Hujan Semarang’)
axfch2k.set_xticks([0, 3, 6, 9, 12, 15])
axfch2k.axis(‘tight’)
axfch2k.set_xlim([3,16])
Gambar diatas menampilkan hasil FFT curah hujan bulanan Semarang 1983–2013 dalam domain frekuensi(a) dan domain periode(b). Secara garis besar terlihat adanya dua power frekuensi dominan di kota Semarang yaitu pada frequensi 0.083 dan 0.166 atau jika dikonversi ke domain periode (b), power tersebut terkuat pada periode 12 bulanan dan kedua pada periode 6 bulanan. Kita tau bahwa fenomena meteorologi yang memiliki periode ulang 12 bulan adalah Monsoon, sedangkan untuk periode 6 bulanan adalah fenomena SAO (Semi-Annual Oscillation). Periode ulang 12 bulan memiliki arti bahwa dalam satu gelombang (1 puncak dan 1 bukit) membutuhkan waktu 12 bulan.
Fenomena monsoon ini disebabkan oleh adanya gerak semu tahunan matahari di belahan bumi utara dan belahan bumi selatan. Selain itu, monsoon juga terjadi karena adanya perbedaan kapasitas panas antara benua dan samudra. Pada bulan DJF posisi matahari berada di belahan bumi selatan (BBS), sehingga tekanan udara di BBS pun rendah sedangkan di BBU mengalami musim dingin (tekanan udara tinggi). Hal tersebut menyebabkan udara bergerak dari tekanan tinggi di belahan bumi utara (Asia), menuju tekanan rendah Australia. Udara tersebut bersifat lembab dan mengandung banyak uap air karena melewati lautan yang luas di Asia.
Sebaliknya pada bulan JJA, posisi matahari berada di BBU, BBU mengalami musim panas (tekanan rendah), sedangkan Australia (BBS) mengalami musim dingin (tekanan tinggi). Hal tersebut menyebabkan udara berhembus dari Australia menuju Asia. Udara tersebut memiliki sifat yang dingin dan kering karena melewati daratan Australia yang kering.
Gambar diatas memperlihatkan hasil FFT curah hujan bulanan di kota Meulaboh, Aceh selama 1983–2013 Terlihat puncak power frekuensi dominan ada di frekuensi 0.166, selanjutnya power yg kedua ada di frekuensi 0.083 atau jika dikonversi dalam periode, periode yang paling kuat ada di 6 bulanan, selanjutnya baru 12 bulanan. Hal ini menunjukkan bahwa curah hujan Meulaboh, Aceh didominasi fenomena SAO, kemudian baru monsoon.
Pada gambar diatas, terlihat hasil FFT Curah hujan bulanan di kota Ambon memiliki frekuensi paling kuat di frekuensi 0.083 dan kedua di frekuensi 0.166 atau jika dikonversi dalam periode yaitu 12 bulanan dan 6 bulanan. Hal ini sama dengan hasil FFT curah hujan di Semarang.
Namun kekurangan dari FFT ini kita tidak bisa melihat perbedaan fasanya. apakah gelombang tersebut dimulai dari amplitudo 0 atau 1, atau mengalami puncak pada waktu kapan ? Nah untuk melihat hal tersebut kita perlu visualisasikan komposit curah hujan bulanannya selama 30 tahun di ketiga wilayah Indonesia.
Kelima, melakukan komposite data yaitu mengambil rata-rata setiap bulan (Januari, Februari, dan seterusnya) dari tahun 1983 hingga 2013 sehingga didapatkan data curah hujan rata-rata bulan Januari, Februari, dan seterusnya selama periode 1983–2013.
# Convert data from DataFrame to array numpy supaya lebih mudah diolah
ch = dt.to_numpy()
sem = ch[:,2]
meul = ch[:,3]
amb = ch[:,4]
bln = ch[:,1]
# Melakukan reshape untuk mendapatkan kolom berisi bulan januari, februari dst selama 1983–2013
# 30 x 12 artinya direshape menjadi array berdimesi 30 x 12 (baris 30, kolom 12)
komp_sem = np.reshape(sem,(30,12),’C’)
komp_meul = np.reshape(meul,(30,12),’C’)
komp_amb = np.reshape(amb,(30,12),’C’)
index = np.reshape(bln,(30,12),’C’)
# Melakukan komposit rata-rata masing-masing bulan selama 30 tahun
# axis = 0 artinya merata-ratakan kolom, axis = 1 artinya merata-ratakan baris
komp_sem = np.mean(komp_sem,axis=0)
komp_meul = np.mean(komp_meul,axis=0)
komp_amb = np.mean(komp_amb,axis=0)
index = np.mean(index,axis=0)
#Plotting
fig = plt.figure(figsize=(8,5))
ax = fig.add_axes([0,0,1,1])
ax.bar(index, komp_sem, color = ‘b’, width = 0.5)
plt.plot(index, komp_sem, ‘b.-’)
plt.xticks(index)
plt.yticks([0, 100, 200, 300, 400, 500])
plt.xlabel(‘Bulan ke — ‘)
plt.ylabel(‘Curah Hujan (mm/month)’)
plt.title(‘Komposit Curah Hujan Bulanan di Semarang Selama 1983–2013’, fontsize = 15)
Berdasarkan hasil komposit curah hujan bulanan selama 30 tahun, terlihat adanya perbedaan pola curah hujan di masing-masing wilayah. Wilayah Semarang memiliki pola curah hujan berbentuk U dengan puncak curah hujan terjadi pada bulan Desember, Januari dan Februari (DJF) atau biasa disebut sebagai musim penghujan. Sedangkan bulan Juni, Juli, dan Agustus (JJA) curah hujan di Semarang memiliki nilai yang minimum. Pada bulan JJA biasa dikategorikan sebagai musim kemarau. Polah curah hujan di wilayah Semarang ini dinamakan Pola Monsunal yang berarti bahwa wilayah tersebut sangat dipengaruhi angin monsoon baik dari Asia maupun Australia.
Sementara untuk wilayah Meulaboh, terlihat curah hujan memiliki dua puncak yaitu pada bulan Maret April Mei (MAM) dan bulan Oktober, November, Desember (OND). Hal ini menunjukan bahwa pola curah hujan di wilayah Meulaboh, Aceh identik dengan Pola Equatorial. Pola Equatorial dicirikan dengan dua puncak pada bulan Maret dan Oktober bersamaan dengan terjadinya equinoks. Wilayah yang didominasi oleh pola equatorial antara lain Sumatra bagian Utara dan tengah, Kalimantan bagian utara, Sulawesi bagian utara.
Disisi lain, wilayah Ambon terlihat memiliki pola berbentuk huruf U namun terbalik, dengan puncak curah hujan terjadi pada bulan Juni, Juli, Agustus (JJA). Hal ini berkebalikan dengan pola monsoonal. Pola lokal sangat dipengaruhi oleh fenomena lokal di daerah tersebut dan juga dipengaruhi oleh kondisi geografi dan topografi setempat.
Demikian gambaran secara garis besar mengenai ketiga pola curah hujan di Indonesia. Namun tidak menutup kemungkinan adanya curah hujan yang ekstrem pada bulan-bulan yang dianggap musim peralihan atau bahkan kemarau. Hal ini sangat mungkin terjadi dikarenakan adanya variabilitas iklim.