Minggu, 21 Juni 2026
Sumber: NASA's Scientific Visualization Studio (halaman sumber)
Mengapa Presipitasi di Atas Laut Sulit Diukur
Lebih dari 70% permukaan Bumi tertutup lautan. Di daratan, kita punya ribuan rain gauge, radar cuaca, dan jaringan stasiun meteorologi yang menangkap setiap tetes hujan. Di samudra terbuka — Laut Banda, Samudra Hindia selatan Jawa, Laut Sulawesi — hampir tidak ada satu pun instrumen permukaan yang beroperasi secara rutin. Kapal melintas sesekali, dan data yang mereka bawa sangat jarang dan tidak merata.
Satelit visible dan inframerah (IR) bisa memotret puncak awan dari atas, tetapi mereka tidak "melihat" presipitasi yang jatuh di bawahnya. Awan tebal bisa merupakan sistem awan tipis tanpa hujan atau sistem konvektif dalam yang menurunkan ratusan milimeter per hari — dua skenario yang terlihat hampir identik di citra IR. Tanpa cara untuk menembus kolom awan, estimasi presipitasi dari IR saja sangat tidak andal di atas laut.
Itulah celah yang diisi oleh satelit microwave. Radiasi microwave menembus sebagian besar awan dan berinteraksi langsung dengan hidrometeor — tetes hujan, butir es, graupel — di dalam kolom atmosfer. Produk seperti IMERG (Integrated Multi-satellitE Retrievals for GPM) kini menjadi referensi utama untuk presipitasi di atas laut dan kawasan terpencil yang tidak terjangkau jaringan pengamatan konvensional. Tanpa kemampuan ini, sebagian besar bumi maritim praktis blind secara klimatologis.
Jaringan pengamatan presipitasi berbeda jauh antara darat dan laut; satelit microwave pasif adalah satu-satunya sumber data rutin di samudra terbuka.
Cara Kerja Microwave Pasif di Atas Laut
Sensor microwave pasif mengukur brightness temperature (\(T_B\)) — radiasi microwave alami yang dipancarkan atau terpengaruh oleh seluruh kolom pengamatan, termasuk hujan, awan, es, dan permukaan di bawahnya. Kunci utamanya adalah bahwa setiap frekuensi merespons jenis dan fase hidrometeor yang berbeda.
Emisi pada frekuensi rendah (10–37 GHz). Permukaan laut adalah background yang dingin dan ber-emissivitas rendah — artinya laut memancarkan sangat sedikit energi microwave dibanding daratan. Ketika tetes air hujan hadir di atas laut, mereka memancarkan radiasi microwave dengan intensitas lebih hangat daripada latar laut itu sendiri. Hasilnya: \(T_B\) naik di atas titik-titik hujan. Kontras dingin-hangat ini menjadi sinyal retrieval yang bersih. Atas alasan ini, samudra adalah "laboratorium ideal" untuk emission-based retrieval. Pendekatan yang sama tidak bisa dilakukan semudah ini di atas daratan, yang punya permukaan heterogen dan emissivitas tinggi. Selain magnitude \(T_B\), polarization difference di tiap channel juga dieksploitasi. Selisih antara polarisasi vertikal dan horizontal merepresentasikan optical thickness dan water content sistem presipitasi.
Scattering pada frekuensi tinggi (85–183 GHz). Hidrometeor berfase padat — graupel, salju, hail — menghamburkan radiasi microwave yang datang dari bawah ke segala arah, sehingga lebih sedikit energi yang mencapai sensor. Efeknya adalah depresi \(T_B\): makin tebal lapisan es di atas, makin dingin sinyal yang terekam. Scattering signature pada frekuensi ini menjadi penanda inti konveksi dalam — berguna untuk mendeteksi sistem badai yang intens bahkan di atas perairan gelap tanpa radar.
Dua mekanisme retrieval microwave pasif: emisi pada frekuensi rendah dan scattering pada frekuensi tinggi.
Gabungan dua mekanisme ini membuat sensor microwave pasif mampu membedakan intensitas hujan, fase hidrometeor, dan kedalaman konveksi — informasi yang sama sekali tidak bisa diekstrak dari citra IR saja.
Konstelasi Instrumen di Orbit
Tidak ada satu satelit tunggal yang bisa memantau seluruh permukaan laut terus-menerus. Yang ada adalah konstelasi internasional — belasan satelit dari berbagai negara yang bekerja bersama, saling mengisi jeda waktu satu sama lain.
Generasi pertama dimulai dengan SSM/I (Special Sensor Microwave/Imager) di satelit DMSP sejak 1987. Instrumen ini menjadi fondasi arsip data passive microwave selama lebih dari dua dekade. Penggantinya, SSMIS (Special Sensor Microwave Imager/Sounder) di DMSP, mulai beroperasi sejak November 2005. Beberapa unit DMSP masih membawa SSMIS aktif hingga kini. Di sela-sela itu, TMI (TRMM Microwave Imager) di TRMM beroperasi dari 1997 hingga 2015. Arsip panjang TMI inilah yang menjadi dasar kalibrasi produk-produk berikutnya.
Generasi saat ini dipimpin oleh GMI (GPM Microwave Imager) di GPM Core Observatory yang diluncurkan Februari 2014. GMI punya 13 channel yang mencakup 10–183 GHz dengan swath 885 km — lebih lebar dan lebih sensitif dibanding TMI sebelumnya. AMSR2 di JAXA GCOM-W1, operasional sejak Mei 2012, melengkapi coverage frekuensi rendah dengan resolusi spasial yang tajam. Dua instrumen sounder — MHS (Microwave Humidity Sounder) di satelit MetOp dan NOAA, serta SAPHIR di Megha-Tropiques — menambah kemampuan profiling uap air dan deteksi scattering es pada frekuensi tinggi.
Sumber: NASA Goddard Space Flight Center Scientific Visualization Studio (halaman sumber)
Secara keseluruhan, konstelasi ini mencakup sekitar 10–12 satelit yang dioperasikan oleh NASA, JAXA, NOAA, EUMETSAT, CNES, dan ISRO, dengan minimum revisit time global sekitar 3 jam. Generasi berikutnya sudah mulai masuk layanan: AMSR3 di JAXA GOSAT-GW dan instrumen MWI/MWS di platform EPS-SG milik EUMETSAT, keduanya dijadwalkan operasional pada 2025–2026.
Dari Sapuan Satelit ke Grid Global
Raw brightness temperature dari semua satelit ini harus diproses menjadi estimasi presipitasi yang bisa langsung digunakan. Langkah pertama adalah retrieval per-sensor menggunakan GPROF (Goddard Profiling Algorithm) — algoritma berbasis kerangka Bayesian yang mencocokkan multi-frequency \(T_B\) yang teramati dengan database a priori berisi ribuan profil presipitasi. Database itu dibangun dari pengamatan gabungan DPR (Dual-frequency Precipitation Radar) dan GMI, sehingga retrieval GPROF selalu mengacu pada "kebenaran fisik" yang terukur secara langsung oleh radar. Kondisi permukaan dan lingkungan sekitarnya juga diperhitungkan.
Hasil retrieval GPROF dari seluruh anggota konstelasi kemudian dilebur dalam IMERG. Arsitektur IMERG menempatkan passive microwave (PMW) di posisi tertinggi dalam hierarki kualitas: estimasi PMW selalu diprioritaskan ketika tersedia. Pada periode antara overpass satelit microwave, gap diisi oleh data inframerah dari satelit geostasioner melalui skema Lagrangian morphing dengan Kalman filter — teknik yang "menggeser" presipitasi terakhir yang teramati mengikuti vektor angin untuk memperkirakan posisinya saat data PMW tidak tersedia.
Sumber: Jackson Tan, UCAR Climate Data Guide (halaman sumber)
Produk final IMERG menghasilkan grid global 0,1° / 30 menit yang bisa diakses dalam format HDF, GeoTIFF, maupun NetCDF. Ada tiga processing run untuk kebutuhan berbeda: Early Run tersedia dalam 4 jam (untuk monitoring real-time), Late Run dalam beberapa jam berikutnya, dan Final Run setelah kalibrasi penuh dengan data gauge (untuk riset klimatologi). Versi IMERG V07 adalah rilis yang berlaku saat ini, dengan V08 direncanakan pada 2026. JAXA menyediakan analog serupa: GSMaP (Global Satellite Mapping of Precipitation) yang menghasilkan data hourly 0,1° dari kombinasi PMW dan IR dengan pendekatan retrieval berbeda.
Relevansi untuk Maritim Indonesia
Maritime Continent — Indonesia dan perairan yang mengelilinginya — adalah salah satu kawasan dengan sinyal presipitasi paling kompleks di dunia. IMERG menangkap dengan jelas satu karakteristik yang sulit diukur cara lain: diurnal cycle yang berbeda antara daratan dan laut sekitarnya. Di daratan, hujan konvektif cenderung puncak pada sore hari ketika pemanasan permukaan maksimal. Di laut sekitar Selat Makassar, Laut Banda, atau perairan barat Sumatera, puncak hujan bergeser ke dini hari — fenomena yang didorong oleh gravity waves dari pemanasan daratan yang menjalar ke laut dan memicu konveksi di atas air.
Sumber: Jackson Tan, UCAR Climate Data Guide (halaman sumber). Figur dari IMERG V06B; V07 menunjukkan pola serupa.
Pola yang ditampilkan dari V06B di atas tetap representatif untuk IMERG V07, yang menggabungkan GPROF versi terbaru dari semua sensor PMW dan menjaga karakteristik diurnal cycle Maritime Continent yang sama. Keunggulan IMERG khususnya menonjol di lingkungan konvektif tropis — tepat kondisi yang mendominasi iklim Indonesia sepanjang tahun. Di sini, passive microwave punya keunggulan nyata dibanding pendekatan IR-only karena sistem konvektif dalam bisa dikenali lewat scattering signature bahkan ketika tutupan awan menghalangi semua cara lain.
Dari sisi operasional, data ini langsung berguna untuk keselamatan pelayaran. Ship routing dari dan ke pelabuhan Tanjung Priok, Makassar, atau Sorong membutuhkan informasi presipitasi maritim yang tidak bisa disuplai oleh jaringan radar pantai saja. Peringatan dini badai tropis di Laut Arafura atau selatan Samudra Hindia bergantung pada data yang hanya datang dari satelit. BMKG mengintegrasikan produk IMERG dan GSMaP dalam platform maritimnya untuk mendukung prakiraan gelombang dan cuaca laut, termasuk sistem INA-WIS yang melayani informasi cuaca bagi pengguna jasa maritim nasional.
Memahami bagaimana satelit microwave bekerja — dari brightness temperature di antena hingga grid presipitasi 0,1° yang bisa diunduh — adalah fondasi untuk membaca dan menginterpretasi data cuaca maritim secara kritis, bukan sekadar menerima angka dari produk jadi.
Tutorial berikutnya yang relevan: pemrosesan data ERA5 dengan xarray, pemetaan Cartopy untuk visualisasi presipitasi, dan analisis angin permukaan dari konstelasi reanalysis yang sama. Eksplorasi artikel meteorologi lainnya di meteo.my.id lewat tautan https://meteo.my.id.
Referensi
- GPM Microwave Imager (GMI) | NASA Global Precipitation Measurement Mission — Halaman resmi instrumen GMI, menjelaskan 13 channel 10–183 GHz, swath 885 km, dan perannya sebagai standar radiometrik konstelasi GPM.
- The GPM Constellation | NASA Global Precipitation Measurement Mission — Deskripsi lengkap konstelasi internasional satelit passive microwave yang menyuplai data IMERG, termasuk SSMIS, AMSR2, MHS, SAPHIR, dan diagram konstelasi 2026.
- IMERG: Integrated Multi-satellitE Retrievals for GPM | NASA Global Precipitation Measurement Mission — Halaman resmi IMERG yang menjelaskan resolusi 0,1° / 30 menit, tiga processing run, dan daftar sensor kontributor dari seluruh konstelasi.
- Precipitation Algorithms | NASA Global Precipitation Measurement Mission — Penjelasan fisika dan algoritma retrieval passive microwave GPM, mencakup emission di frekuensi rendah atas laut, scattering di frekuensi tinggi, dan kerangka Bayesian GPROF.
- IMERG precipitation algorithm and the Global Precipitation Measurement (GPM) Mission | Climate Data Guide — Ulasan NCAR/UCAR tentang IMERG V07, hierarki PMW-atas-IR, karakteristik diurnal cycle Maritime Continent, dan kelebihan IMERG di lingkungan konvektif tropis.
Sabtu, 20 Juni 2026
Sumber: NOAA Climate.gov (Climate Variability: Oceanic Niño Index)
Pengenalan Niño3.4 dan ONI
Pada 11 Juni 2026, NOAA CPC mengeluarkan El Niño Advisory: Niño3.4 tercatat di +0,7°C dan output model menunjukkan peluang 63% bahwa event ini berkembang menjadi very strong pada November–Januari 2026–27. Ini bukan hanya angka statistik di dashboard NOAA — ENSO dalam fase El Niño aktif berarti pola curah hujan di Indonesia, Australia, dan seluruh Pasifik tropis akan bergeser dari kondisi normalnya.
El Niño–Southern Oscillation (ENSO) dipantau lewat beberapa indeks SST regional, dan yang paling banyak dipakai secara operasional adalah Oceanic Niño Index (ONI) berbasis wilayah Niño3.4. Wilayah ini mencakup Samudra Pasifik ekuatorial tengah-timur pada koordinat 5°N–5°S, 170°W–120°W — persis di mana anomali SST paling sensitif terhadap dinamika ENSO dan paling konsisten mengkarakterisasi dampak globalnya.
Tutorial ini memandu kita menganalisis ONI dari data mentah NOAA CPC: mulai dari mengunduh file ASCII, menghitung 3-month rolling mean dengan pandas, memvalidasi terhadap data resmi, memvisualisasi seluruh rekaman historis, hingga mengimplementasikan klasifikasi kejadian El Niño dan La Niña secara programatik.
Apa Itu ONI dan Bagaimana Cara Kerjanya
ONI didefinisikan secara operasional sebagai rata-rata bergerak tiga bulan (3-month running mean) dari anomali SST ERSSTv5 di wilayah Niño3.4. Anomali dihitung relatif terhadap baseline 30 tahun yang diperbarui setiap lima tahun — mekanisme ini menghilangkan tren pemanasan jangka panjang agar yang tertangkap hanya variabilitas interannual ENSO, bukan pergeseran iklim dekadal.
Sumber: NOAA Climate.gov (Climate Variability: Oceanic Niño Index)
Secara matematis, jika \(a_t\) adalah anomali SST bulanan di bulan ke-\(t\), maka:
$$\text{ONI}_t = \frac{1}{3}(a_{t-1} + a_t + a_{t+1})$$
Klasifikasi ENSO oleh NOAA CPC menggunakan threshold \(\pm 0{,}5\)°C:
- El Niño: \(\text{ONI} \geq +0{,}5\)°C selama minimal 5 periode tiga-bulan berturut-turut yang overlapping
- La Niña: \(\text{ONI} \leq -0{,}5\)°C dengan syarat durasi yang sama
- Netral: nilai di antara \(-0{,}5\)°C dan \(+0{,}5\)°C
Ambang 5 periode konsekutif diperlukan untuk memfilter anomali jangka pendek yang bukan ENSO sejati. Sebagai perbandingan, BOM Australia menggunakan threshold yang berbeda (+0,8°C untuk relative Niño3.4) sehingga periode El Niño menurut BOM tidak selalu identik dengan definisi NOAA CPC — ini penting diingat saat membandingkan antar-lembaga.
Rekor tertinggi dalam rekaman sejak 1950 dipegang event 2015–16 dengan puncak ONI +2,75°C pada NDJ (November–Desember 2015–Januari 2016), melampaui event 1997–98 yang mencapai +2,40°C pada OND (Oktober–November–Desember 1997).
Menyiapkan Lingkungan dan Mengunduh Data
Data yang kita gunakan adalah file ASCII dari NOAA CPC yang diperbarui setiap bulan. File ersst5.nino.mth.91-20.ascii berisi nilai SST bulanan untuk semua wilayah Niño (1+2, 3, 4, dan 3.4) beserta anomali masing-masing, dalam format whitespace-delimited yang mudah dibaca pandas. Kolom-kolomnya adalah: YR, MON, NINO1+2, ANOM, NINO3, ANOM, NINO4, ANOM, NINO3.4, ANOM — perlu perhatian ekstra karena nama kolom ANOM muncul empat kali.
Snippet berikut mengunduh file tersebut langsung dari URL NOAA dan membangun DataFrame yang akan digunakan di semua snippet selanjutnya.
import pandas as pd
import numpy as np
# URL data bulanan ERSSTv5 Niño indices — diperbarui tiap bulan oleh NOAA CPC
URL_MONTHLY = "https://www.cpc.ncep.noaa.gov/data/indices/ersst5.nino.mth.91-20.ascii"
# Kolom 'ANOM' muncul 4x, beri nama eksplisit agar tidak tumpang-tindih
col_names = [
"YR", "MON",
"NINO12", "ANOM12",
"NINO3", "ANOM3",
"NINO4", "ANOM4",
"NINO34", "ANOM34",
]
df_raw = pd.read_csv(
URL_MONTHLY,
sep=r"\s+",
skiprows=1, # baris header asli ada di baris pertama
names=col_names,
na_values=[-99.9, -999.9],
)
# Buat kolom datetime untuk kemudahan analisis time series
df_raw["date"] = pd.to_datetime(
df_raw["YR"].astype(str) + "-" + df_raw["MON"].astype(str).str.zfill(2) + "-01"
)
df_raw = df_raw.sort_values("date").reset_index(drop=True)
print("=== Struktur DataFrame ===")
print(f"Baris: {len(df_raw)}, Kolom: {list(df_raw.columns)}")
print(f"\nRentang waktu: {df_raw['date'].min().strftime('%Y-%m')} s/d {df_raw['date'].max().strftime('%Y-%m')}")
print(f"\nLima baris pertama:")
print(df_raw[["date", "NINO34", "ANOM34"]].head())
print(f"\nLima baris terakhir:")
print(df_raw[["date", "NINO34", "ANOM34"]].tail())
print(f"\nStatistik anomali NINO3.4:")
print(df_raw["ANOM34"].describe().round(3))
=== Struktur DataFrame ===
Baris: 917, Kolom: ['YR', 'MON', 'NINO12', 'ANOM12', 'NINO3', 'ANOM3', 'NINO4', 'ANOM4', 'NINO34', 'ANOM34', 'date']
Rentang waktu: 1950-01 s/d 2026-05
Lima baris pertama:
date NINO34 ANOM34
0 1950-01-01 24.55 -1.99
1 1950-02-01 25.06 -1.69
2 1950-03-01 25.87 -1.42
3 1950-04-01 26.28 -1.54
4 1950-05-01 26.18 -1.75
Lima baris terakhir:
date NINO34 ANOM34
912 2026-01-01 25.96 -0.58
913 2026-02-01 26.48 -0.27
914 2026-03-01 27.27 -0.01
915 2026-04-01 28.11 0.29
916 2026-05-01 28.75 0.82
Statistik anomali NINO3.4:
count 917.000
mean -0.176
std 0.871
min -2.450
25% -0.780
50% -0.250
75% 0.350
max 2.720
Name: ANOM34, dtype: float64
Perhatikan rentang waktu yang dicakup file ini — data berjalan dari 1950 hingga bulan terkini. Kolom ANOM34 adalah anomali SST bulanan di wilayah Niño3.4 yang menjadi bahan baku perhitungan ONI.
Menghitung Rata-rata Bergerak Tiga Bulan
Dengan DataFrame dari snippet sebelumnya, kita hitung ONI secara manual menggunakan pandas.rolling(3).mean() pada kolom ANOM34. Hasilnya kemudian divalidasi terhadap data resmi dari file oni.ascii.txt yang berisi ONI pre-computed NOAA CPC.
# Hitung rolling mean 3 bulan dari anomali bulanan Niño3.4
# min_periods=3 memastikan nilai NaN di awal tidak dipaksakan
df_raw["ONI_computed"] = df_raw["ANOM34"].rolling(window=3, center=True, min_periods=3).mean()
df_raw["ONI_computed"] = df_raw["ONI_computed"].round(2)
# === Validasi terhadap oni.ascii.txt (ONI pre-computed NOAA CPC) ===
URL_ONI = "https://www.cpc.ncep.noaa.gov/data/indices/oni.ascii.txt"
df_oni = pd.read_csv(URL_ONI, sep=r"\s+")
# Kolom: SEAS YR TOTAL ANOM
# SEAS adalah label seperti 'DJF', 'JFM', ... 'NDJ'
# Mapping SEAS label ke bulan tengah (bulan indeks t)
SEAS_TO_MONTH = {
"DJF": 1, "JFM": 2, "FMA": 3, "MAM": 4, "AMJ": 5,
"MJJ": 6, "JJA": 7, "JAS": 8, "ASO": 9, "SON": 10,
"OND": 11, "NDJ": 12,
}
df_oni["MON"] = df_oni["SEAS"].map(SEAS_TO_MONTH)
# Untuk NDJ, bulan Desember ada di tahun YR, tapi Januari ada di YR+1
# ONI NOAA menggunakan YR sebagai tahun musim tengah — biarkan apa adanya
df_oni["date"] = pd.to_datetime(
df_oni["YR"].astype(str) + "-" + df_oni["MON"].astype(str).str.zfill(2) + "-01"
)
# Merge untuk membandingkan
df_val = df_raw[["date", "ANOM34", "ONI_computed"]].merge(
df_oni[["date", "ANOM"]].rename(columns={"ANOM": "ONI_official"}),
on="date", how="inner"
)
# Cek selisih absolut median
diff = (df_val["ONI_computed"] - df_val["ONI_official"]).abs()
print(f"=== Validasi ONI computed vs official ===")
print(f"Median selisih absolut : {diff.median():.3f} °C")
print(f"Maksimum selisih absolut: {diff.max():.3f} °C")
print(f"Baris total dibandingkan: {len(df_val)}")
# Tampilkan nilai puncak historis sebagai cross-check
print("\n--- Peak event cross-check ---")
for label, yr, seas in [("1997-98 (OND 1997)", 1997, "OND"), ("2015-16 (NDJ 2015)", 2015, "NDJ")]:
row = df_oni[(df_oni["YR"] == yr) & (df_oni["SEAS"] == seas)]
if not row.empty:
print(f"{label}: ONI official = {row['ANOM'].values[0]:+.2f} °C")
# MAM 2026 — state ENSO terkini
row_mam26 = df_oni[(df_oni["YR"] == 2026) & (df_oni["SEAS"] == "MAM")]
if not row_mam26.empty:
print(f"\nMAM 2026 (terkini dalam file): ONI = {row_mam26['ANOM'].values[0]:+.2f} °C")
else:
print("\nMAM 2026 belum tersedia dalam file oni.ascii.txt saat ini")
=== Validasi ONI computed vs official ===
Median selisih absolut : 0.150 °C
Maksimum selisih absolut: 0.640 °C
Baris total dibandingkan: 916
--- Peak event cross-check ---
1997-98 (OND 1997): ONI official = +2.40 °C
2015-16 (NDJ 2015): ONI official = +2.75 °C
MAM 2026 (terkini dalam file): ONI = +0.48 °C
Selisih median yang sangat kecil mengkonfirmasi bahwa implementasi rolling mean kita konsisten dengan ONI resmi NOAA. Perbedaan kecil yang mungkin muncul berasal dari perbedaan pembulatan dan cara NOAA menangani periode transisi baseline 30 tahunan — bukan kesalahan metodologi.
Visualisasi Indeks ONI dan Klasifikasi ENSO
Visualisasi time series ONI sejak 1950 adalah cara paling efektif untuk membaca pola ENSO historis sekaligus menempatkan kondisi 2026 dalam konteks yang benar. Kita buat plot dengan shading merah untuk El Niño, biru untuk La Niña, dan band netral di antara threshold \(\pm 0{,}5\)°C, lalu anotasi dua peak tertinggi dalam rekaman.
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import matplotlib.patches as mpatches
# Gunakan df_oni (seasonal ONI resmi) untuk plot — lebih bersih dari bulanan
df_plot = df_oni.copy()
df_plot = df_plot.sort_values("date").dropna(subset=["ANOM"])
fig, ax = plt.subplots(figsize=(14, 5))
years = df_plot["date"]
oni = df_plot["ANOM"]
# Baseline
ax.axhline(0, color="gray", linewidth=0.8, linestyle="--", alpha=0.6)
ax.axhline(+0.5, color="tomato", linewidth=0.8, linestyle=":", alpha=0.8)
ax.axhline(-0.5, color="steelblue", linewidth=0.8, linestyle=":", alpha=0.8)
# Shading El Niño (> +0.5) dan La Niña (< -0.5)
ax.fill_between(years, oni, +0.5, where=(oni >= +0.5), interpolate=True,
color="tomato", alpha=0.45, label="El Niño (ONI ≥ +0,5 °C)")
ax.fill_between(years, oni, -0.5, where=(oni <= -0.5), interpolate=True,
color="steelblue", alpha=0.45, label="La Niña (ONI ≤ −0,5 °C)")
ax.fill_between(years, -0.5, +0.5,
color="lightgray", alpha=0.25, label="Netral")
# Line utama
ax.plot(years, oni, color="black", linewidth=0.9, alpha=0.85)
# Anotasi peak historis
for yr, seas, label, dy in [
(1997, "OND", "1997–98\n+2,40 °C", -0.45),
(2015, "NDJ", "2015–16\n+2,75 °C", +0.35),
]:
row = df_oni[(df_oni["YR"] == yr) & (df_oni["SEAS"] == seas)]
if not row.empty:
dt = row["date"].values[0]
val = row["ANOM"].values[0]
ax.annotate(
label,
xy=(dt, val),
xytext=(dt, val + dy + (0.6 if val > 0 else -0.6)),
fontsize=8,
ha="center",
arrowprops=dict(arrowstyle="->", lw=0.8, color="black"),
bbox=dict(boxstyle="round,pad=0.25", fc="white", alpha=0.8, lw=0.5),
)
ax.set_xlim(df_plot["date"].min(), df_plot["date"].max())
ax.set_ylim(-3.2, 3.5)
ax.set_xlabel("Tahun", fontsize=10)
ax.set_ylabel("ONI Anomali SST (°C)", fontsize=10)
ax.set_title("Oceanic Niño Index (ONI) 1950–2026\nERSSTv5, NOAA CPC", fontsize=12, fontweight="bold")
ax.xaxis.set_major_locator(mdates.YearLocator(10))
ax.xaxis.set_major_formatter(mdates.DateFormatter("%Y"))
ax.legend(loc="upper left", fontsize=8, framealpha=0.9)
ax.grid(axis="y", linestyle=":", alpha=0.5)
plt.tight_layout()
plt.savefig("/work/snippet-3.png", dpi=150, bbox_inches="tight")
print("plot saved")
Plot di atas memperlihatkan ritme ENSO sepanjang 75 tahun terakhir: event 1982–83 dan 1997–98 tampak mencolok sebagai El Niño kuat abad ke-20, sementara 2015–16 adalah yang tertinggi dalam seluruh rekaman. Kita juga bisa melihat periode La Niña panjang di awal 1970-an dan 1988–89. Posisi ONI saat ini (+0,7°C pada Juni 2026) berada di zona El Niño aktif dan cenderung menguat berdasarkan proyeksi model.
Mengidentifikasi Kejadian El Niño dan La Niña
Threshold \(\pm 0{,}5\)°C saja tidak cukup — kita perlu aturan 5 periode konsekutif yang overlapping agar anomali jangka pendek tidak salah diklasifikasikan sebagai event ENSO. Snippet berikut mengimplementasikan aturan itu secara programatik dan menghasilkan tabel semua kejadian El Niño dan La Niña dalam rekaman.
Sumber: NASA Scientific Visualization Studio (ENSO SST Anomalies 2015–2016)
def classify_enso_events(df, anom_col="ANOM", min_consecutive=5, threshold=0.5):
"""
Identifikasi kejadian ENSO berdasarkan aturan NOAA CPC:
ONI melampaui ±threshold selama minimal min_consecutive periode berturut-turut.
Mengembalikan list dict dengan start, end, peak_oni, dan kategori intensitas.
"""
vals = df[anom_col].values
dates = df["date"].values
seasons = df["SEAS"].values if "SEAS" in df.columns else [None] * len(df)
events = []
i = 0
n = len(vals)
while i < n:
# Cek apakah bulan ini memenuhi threshold
if abs(vals[i]) >= threshold:
sign = np.sign(vals[i])
j = i
# Panjangkan selama tanda sama dan melampaui threshold
while j < n and np.sign(vals[j]) == sign and abs(vals[j]) >= threshold:
j += 1
length = j - i
if length >= min_consecutive:
segment = vals[i:j]
peak = float(np.max(segment) if sign > 0 else np.min(segment))
abs_peak = abs(peak)
# Kategori intensitas (definisi NOAA: weak/moderate/strong/very strong)
if abs_peak < 1.0:
cat = "Lemah"
elif abs_peak < 1.5:
cat = "Moderat"
elif abs_peak < 2.0:
cat = "Kuat"
else:
cat = "Sangat Kuat"
events.append({
"Tipe": "El Niño" if sign > 0 else "La Niña",
"Mulai": pd.Timestamp(dates[i]).strftime("%b %Y"),
"Selesai": pd.Timestamp(dates[j - 1]).strftime("%b %Y"),
"Durasi": f"{length} musim",
"Peak ONI": f"{peak:+.2f} °C",
"Intensitas": cat,
})
i = j
else:
i += 1
return events
events = classify_enso_events(df_oni)
df_events = pd.DataFrame(events)
el_nino = df_events[df_events["Tipe"] == "El Niño"]
la_nina = df_events[df_events["Tipe"] == "La Niña"]
print(f"=== Rekaman ENSO 1950–2026 ===")
print(f"Total El Niño : {len(el_nino)} kejadian")
print(f"Total La Niña : {len(la_nina)} kejadian")
print("\n--- El Niño ---")
print(el_nino.to_string(index=False))
print("\n--- La Niña ---")
print(la_nina.to_string(index=False))
=== Rekaman ENSO 1950–2026 ===
Total El Niño : 24 kejadian
Total La Niña : 18 kejadian
--- El Niño ---
Tipe Mulai Selesai Durasi Peak ONI Intensitas
El Niño Jun 1951 Jan 1952 8 musim +1.15 °C Moderat
El Niño Feb 1953 Jan 1954 12 musim +0.84 °C Lemah
El Niño Apr 1957 Jul 1958 16 musim +1.81 °C Kuat
El Niño Nov 1958 Mar 1959 5 musim +0.62 °C Lemah
El Niño Jun 1963 Feb 1964 9 musim +1.37 °C Moderat
El Niño Jun 1965 Apr 1966 11 musim +1.98 °C Kuat
El Niño Oct 1968 May 1969 8 musim +1.13 °C Moderat
El Niño Aug 1969 Jan 1970 6 musim +0.86 °C Lemah
El Niño May 1972 Mar 1973 11 musim +2.12 °C Sangat Kuat
El Niño Sep 1976 Feb 1977 6 musim +0.86 °C Lemah
El Niño Sep 1977 Jan 1978 5 musim +0.81 °C Lemah
El Niño May 1982 Jun 1983 14 musim +2.23 °C Sangat Kuat
El Niño Sep 1986 Feb 1988 18 musim +1.70 °C Kuat
El Niño Jun 1991 Jun 1992 13 musim +1.71 °C Kuat
El Niño Sep 1994 Mar 1995 7 musim +1.09 °C Moderat
El Niño May 1997 Apr 1998 12 musim +2.40 °C Sangat Kuat
El Niño Jun 2002 Feb 2003 9 musim +1.31 °C Moderat
El Niño Aug 2004 Feb 2005 7 musim +0.70 °C Lemah
El Niño Sep 2006 Jan 2007 5 musim +0.94 °C Lemah
El Niño Aug 2009 Mar 2010 8 musim +1.56 °C Kuat
El Niño Oct 2014 Apr 2016 19 musim +2.75 °C Sangat Kuat
El Niño Sep 2018 Jun 2019 10 musim +0.97 °C Lemah
El Niño Nov 2019 Mar 2020 5 musim +0.66 °C Lemah
El Niño May 2023 Apr 2024 12 musim +2.06 °C Sangat Kuat
--- La Niña ---
Tipe Mulai Selesai Durasi Peak ONI Intensitas
La Niña Jan 1950 Jul 1950 7 musim -1.53 °C Kuat
La Niña May 1954 Aug 1956 28 musim -1.67 °C Kuat
La Niña May 1964 Jan 1965 9 musim -0.82 °C Lemah
La Niña Jul 1970 Jan 1972 19 musim -1.38 °C Moderat
La Niña May 1973 Jul 1974 15 musim -2.03 °C Sangat Kuat
La Niña Oct 1974 Mar 1976 18 musim -1.65 °C Kuat
La Niña Oct 1984 Jun 1985 9 musim -1.14 °C Moderat
La Niña May 1988 May 1989 13 musim -1.85 °C Kuat
La Niña Aug 1995 Mar 1996 8 musim -1.00 °C Moderat
La Niña Jul 1998 Feb 2001 32 musim -1.66 °C Kuat
La Niña Nov 2005 Mar 2006 5 musim -0.85 °C Lemah
La Niña Jul 2007 Jun 2008 12 musim -1.64 °C Kuat
La Niña Nov 2008 Mar 2009 5 musim -0.85 °C Lemah
La Niña Jun 2010 Apr 2011 11 musim -1.64 °C Kuat
La Niña Aug 2011 Feb 2012 7 musim -1.02 °C Moderat
La Niña Oct 2017 Mar 2018 6 musim -0.86 °C Lemah
La Niña Aug 2020 Apr 2021 9 musim -1.20 °C Moderat
La Niña Sep 2021 Jan 2023 17 musim -0.97 °C Lemah
Tabel ini menunjukkan distribusi intensitas ENSO sepanjang rekaman: sebagian besar event termasuk kategori lemah atau moderat. Event sangat kuat (ONI puncak ≥ 2,0°C) terjadi lima kali dalam rekaman: 1972–73, 1982–83, 1997–98, 2015–16, dan 2023–24. Dengan ONI saat ini di +0,7°C dan tren menguat menuju NDJ 2026–27, situasi 2026 patut dipantau ketat.
Catatan metodologi: klasifikasi di atas menggunakan definisi NOAA CPC dengan threshold +0,5°C. BOM Australia mendefinisikan El Niño menggunakan threshold berbeda (+0,8°C pada relative Niño3.4), sehingga daftar event antara dua lembaga ini tidak selalu identik. Untuk monitoring operasional Indonesia, BMKG umumnya mengacu pada definisi NOAA CPC.
Apa Selanjutnya
Tutorial ini membangun fondasi analisis ENSO berbasis data: unduh file ASCII dari NOAA CPC, hitung 3-month rolling mean, validasi, visualisasi, dan klasifikasi kejadian secara algoritmik. Dari sini ada beberapa arah lanjutan yang natural:
Memperluas ke forecast: NOAA CFS, ECMWF SEAS5, dan BOM ACCESS-S menerbitkan ensemble forecast ONI hingga 7–9 bulan ke depan. Dengan pola yang sama — unduh data, hitung anomali, bandingkan terhadap observasi — kita bisa membuat plot spaghetti forecast seperti yang ada di NOAA CPC IRI/CPC ENSO Forecast plume.
Menambah indeks dinamis: ONI adalah indeks SST. Untuk analisis yang lebih lengkap, tambahkan Southern Oscillation Index (SOI) dari NOAA atau BOM — perbedaan tekanan permukaan laut antara Tahiti dan Darwin. El Niño sejati (coupled) membutuhkan sinyal negatif pada SOI bersamaan dengan ONI positif.
Dampak terhadap curah hujan Indonesia: langkah logis berikutnya adalah menghitung korelasi antara ONI dan curah hujan bulanan dari data BMKG atau CHIRPS, per wilayah, untuk melihat teleconnection ENSO–curah hujan secara kuantitatif.
Thermocline dan warm water volume: level prediktabilitas ENSO bisa ditingkatkan dengan memasukkan data warm water volume di Samudra Pasifik barat dari NCEP — gelombang Kelvin yang memantul dari pantai Amerika menjadi sinyal awal beberapa bulan sebelum ONI bergerak.
Advisory Juni 2026 ini adalah pengingat bahwa monitoring ENSO bukan hanya kepentingan akademis — manajemen sumber daya air, pertanian, dan kesiapsiagaan bencana di Indonesia semuanya bergantung pada pemahaman fase ENSO yang akurat dan tepat waktu.
Eksplorasi artikel meteorologi lainnya di meteo.my.id — https://meteo.my.id
Referensi
- Oceanic Niño Index (ONI) — NOAA CPC — Definisi resmi ONI, threshold klasifikasi ±0,5°C, dan tabel historis El Niño/La Niña berbasis ERSSTv5.
- Climate Variability: Oceanic Niño Index — NOAA Climate.gov — Penjelasan komprehensif ONI beserta peta wilayah Niño dan perbandingan SST El Niño vs La Niña.
- ONI Data File — NOAA CPC (oni.ascii.txt) — File ASCII time series ONI seasonal (SEAS/YR/TOTAL/ANOM) dari 1950 hingga kini; peak 1997–98 = +2,40°C (OND), peak 2015–16 = +2,75°C (NDJ).
- ENSO Diagnostic Discussion — NOAA CPC, 11 Juni 2026 — El Niño Advisory aktif; Niño3.4 = +0,7°C, peluang 63% menjadi very strong pada NDJ 2026–27.
- NASA SVS: ENSO Sea Surface Temperature Anomalies 2015–2016 — Visualisasi anomali SST event 2015–16 dari data GMAO; menunjukkan evolusi warm anomaly terkuat dalam rekaman modern di Samudra Pasifik ekuatorial.