<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>missing data | Irpan Chumaedi</title><link>https://www.irpanchumaedi.com/tag/missing-data/</link><atom:link href="https://www.irpanchumaedi.com/tag/missing-data/index.xml" rel="self" type="application/rss+xml"/><description>missing data</description><generator>Wowchemy (https://wowchemy.com)</generator><language>en-us</language><lastBuildDate>Tue, 12 May 2026 00:00:00 +0000</lastBuildDate><image><url>https://www.irpanchumaedi.com/images/icon_huc8b49dbecede763dad003ee9bbdb929f_244914_512x512_fill_lanczos_center_2.png</url><title>missing data</title><link>https://www.irpanchumaedi.com/tag/missing-data/</link></image><item><title>Download Data Hujan BMKG: Cara Akses, Keterbatasan, dan Strategi Data Hilang</title><link>https://www.irpanchumaedi.com/post/materi-download-bmkg/</link><pubDate>Tue, 12 May 2026 00:00:00 +0000</pubDate><guid>https://www.irpanchumaedi.com/post/materi-download-bmkg/</guid><description>&lt;h2 id="data-bmkg-sebagai-referensi-utama">Data BMKG sebagai Referensi Utama&lt;/h2>
&lt;p>Data curah hujan observasi dari &lt;strong>Badan Meteorologi, Klimatologi, dan Geofisika (BMKG)&lt;/strong> adalah referensi primer dalam setiap studi hidrologi di Indonesia. Berbeda dengan data satelit (GPM IMERG) yang merupakan estimasi, data BMKG berasal dari &lt;strong>pengukuran langsung&lt;/strong> di lapangan menggunakan penakar hujan standar.&lt;/p>
&lt;p>&lt;strong>Keunggulan data BMKG:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>✅ Data pengukuran langsung (ground truth)&lt;/li>
&lt;li>✅ Umumnya tersedia hingga puluhan tahun (beberapa stasiun sejak 1970-an)&lt;/li>
&lt;li>✅ Diakui secara legal dan ilmiah untuk keperluan perizinan dan AMDAL&lt;/li>
&lt;li>✅ Menjadi acuan kalibrasi/validasi untuk data satelit&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Keterbatasan data BMKG:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>❌ Kerapatan stasiun tidak merata — banyak area terpencil tidak terjangkau&lt;/li>
&lt;li>❌ Data seringkali tidak lengkap (banyak missing data)&lt;/li>
&lt;li>❌ Akses data historis panjang memerlukan permohonan resmi (berbayar)&lt;/li>
&lt;li>❌ Portal online hanya tersedia 2 tahun terakhir secara gratis&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="cara-mengakses-data-bmkg">Cara Mengakses Data BMKG&lt;/h2>
&lt;p>Ada tiga jalur utama untuk mendapatkan data curah hujan BMKG:&lt;/p>
&lt;h3 id="jalur-1-portal-bmkg-data-online-gratis-terbatas-2-tahun">Jalur 1: Portal BMKG Data Online (Gratis, Terbatas 2 Tahun)&lt;/h3>
&lt;p>🔗 &lt;strong>URL:&lt;/strong> &lt;a href="https://dataonline.bmkg.go.id/" target="_blank" rel="noopener">https://dataonline.bmkg.go.id/&lt;/a>&lt;/p>
&lt;p>Portal ini menyediakan akses gratis ke data iklim (curah hujan, suhu, kelembaban, dll.) namun &lt;strong>hanya 2 tahun terakhir&lt;/strong> yang bisa diunduh secara mandiri.&lt;/p>
&lt;p>&lt;strong>Langkah akses:&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>Buka &lt;a href="https://dataonline.bmkg.go.id/" target="_blank" rel="noopener">https://dataonline.bmkg.go.id/&lt;/a>&lt;/li>
&lt;li>Klik &lt;strong>&amp;ldquo;Masuk&amp;rdquo;&lt;/strong> → daftar akun gratis jika belum punya&lt;/li>
&lt;li>Pilih menu &lt;strong>&amp;ldquo;Data Iklim&amp;rdquo;&lt;/strong> → &lt;strong>&amp;ldquo;Unduh Data&amp;rdquo;&lt;/strong>&lt;/li>
&lt;li>Pilih stasiun, parameter (Curah Hujan / RR), dan periode waktu&lt;/li>
&lt;li>Format output: &lt;strong>Excel (.xlsx)&lt;/strong> atau CSV&lt;/li>
&lt;/ol>
&lt;blockquote>
&lt;p>&lt;strong>Catatan penting:&lt;/strong> Server BMKG Data Online menerapkan pembatasan ketat. Permintaan data lebih dari 2 tahun akan ditolak secara otomatis oleh sistem, bukan karena akun terbatas.&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h3 id="jalur-2-permohonan-resmi-ke-upt-bmkg-data-historis-panjang">Jalur 2: Permohonan Resmi ke UPT BMKG (Data Historis Panjang)&lt;/h3>
&lt;p>Untuk data historis lebih dari 2 tahun (misalnya 10–30 tahun untuk keperluan AMDAL), kamu perlu mengajukan &lt;strong>permohonan data resmi&lt;/strong> ke Balai Besar / UPT BMKG setempat.&lt;/p>
&lt;p>&lt;strong>Prosedur permohonan:&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>Buat surat permohonan data resmi di atas kop perusahaan/instansi&lt;/li>
&lt;li>Cantumkan: nama stasiun, parameter, periode, dan tujuan penggunaan&lt;/li>
&lt;li>Kirimkan ke UPT BMKG yang membawahi wilayah stasiun target&lt;/li>
&lt;li>Biaya: bervariasi, umumnya &lt;strong>Rp 50.000 – Rp 500.000&lt;/strong> per stasiun per periode (PNBP)&lt;/li>
&lt;li>Waktu proses: &lt;strong>1–3 minggu&lt;/strong> tergantung beban kerja UPT&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>Kontak UPT BMKG berdasarkan wilayah:&lt;/strong>&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Wilayah&lt;/th>
&lt;th>UPT BMKG&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Jawa Barat&lt;/td>
&lt;td>BMKG Stamet Bandung, BBTMC Serpong&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Kalimantan Selatan&lt;/td>
&lt;td>BMKG Staklim Banjarbaru&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Kalimantan Timur&lt;/td>
&lt;td>BMKG Staklim Samarinda&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Maluku Utara&lt;/td>
&lt;td>BMKG Stamet Ternate&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Sulawesi&lt;/td>
&lt;td>BMKG Staklim Makassar&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;hr>
&lt;hr>
&lt;h2 id="memahami-format-data-bmkg">Memahami Format Data BMKG&lt;/h2>
&lt;p>Data yang diunduh dari portal BMKG biasanya berbentuk tabel Excel dengan format seperti ini:&lt;/p>
&lt;pre>&lt;code>Nama Stasiun : Stasiun Klimatologi Banjarbaru
Lintang : -3.4425° LS
Bujur : 114.8253° BT
Elevasi : 66 m
Parameter : Curah Hujan (mm)
Tanggal | RR
-----------|------
2023-01-01 | 15.2
2023-01-02 | 0.0
2023-01-03 | 8888 ← kode data hilang (missing)
2023-01-04 | 9999 ← kode tidak ada pengamatan
2023-01-05 | 22.4
&lt;/code>&lt;/pre>
&lt;p>&lt;strong>Kode khusus yang sering muncul:&lt;/strong>&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Kode&lt;/th>
&lt;th>Makna&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>8888&lt;/code>&lt;/td>
&lt;td>Data hilang / tidak tercatat&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>9999&lt;/code>&lt;/td>
&lt;td>Tidak ada pengamatan (hari libur, dll.)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>-&lt;/code> atau &lt;code>NaN&lt;/code>&lt;/td>
&lt;td>Tidak ada data&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>0.0&lt;/code>&lt;/td>
&lt;td>Tidak hujan (hari kering)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>Tr&lt;/code>&lt;/td>
&lt;td>&lt;em>Trace&lt;/em> — hujan sangat kecil, tidak terukur (&amp;lt;0.5 mm)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;blockquote>
&lt;p>&lt;strong>Penting:&lt;/strong> Jangan sampai kode &lt;code>8888&lt;/code> atau &lt;code>9999&lt;/code> ikut dihitung sebagai nilai curah hujan! Ini adalah kesalahan umum yang membuat analisis frekuensi menjadi tidak valid.&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h2 id="identifikasi-dan-penanganan-data-hilang-missing-data">Identifikasi dan Penanganan Data Hilang (Missing Data)&lt;/h2>
&lt;h3 id="langkah-1-hitung-persentase-data-hilang">Langkah 1: Hitung Persentase Data Hilang&lt;/h3>
&lt;p>Sebelum menggunakan data BMKG, wajib hukumnya mengecek kualitas data:&lt;/p>
&lt;pre>&lt;code class="language-r"># ============================================================
# Identifikasi missing data pada dataset BMKG
# ============================================================
options(OutDec = &amp;quot;.&amp;quot;)
library(dplyr)
library(lubridate)
# Baca data (sesuaikan path)
data_hujan &amp;lt;- read.csv(&amp;quot;data_bmkg_banjarbaru.csv&amp;quot;,
stringsAsFactors = FALSE)
# Konversi tanggal
data_hujan$tanggal &amp;lt;- as.Date(data_hujan$tanggal, format = &amp;quot;%Y-%m-%d&amp;quot;)
# Ganti kode missing dengan NA
data_hujan$rr[data_hujan$rr %in% c(8888, 9999)] &amp;lt;- NA
data_hujan$rr[data_hujan$rr == &amp;quot;Tr&amp;quot;] &amp;lt;- 0 # Trace dianggap 0
# Hitung persentase missing per tahun
ringkasan_missing &amp;lt;- data_hujan %&amp;gt;%
mutate(tahun = year(tanggal)) %&amp;gt;%
group_by(tahun) %&amp;gt;%
summarise(
total_hari = n(),
hari_missing = sum(is.na(rr)),
persen_missing = round(hari_missing / total_hari * 100, 1)
)
print(ringkasan_missing)
&lt;/code>&lt;/pre>
&lt;p>&lt;strong>Panduan interpretasi kualitas data:&lt;/strong>&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Persentase Missing&lt;/th>
&lt;th>Kategori&lt;/th>
&lt;th>Tindakan&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&amp;lt; 5%&lt;/td>
&lt;td>Baik&lt;/td>
&lt;td>Imputasi sederhana&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>5% – 15%&lt;/td>
&lt;td>Cukup&lt;/td>
&lt;td>Imputasi dengan stasiun tetangga&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>15% – 30%&lt;/td>
&lt;td>Kurang&lt;/td>
&lt;td>Pertimbangkan data satelit sebagai suplemen&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&amp;gt; 30%&lt;/td>
&lt;td>Buruk&lt;/td>
&lt;td>Hindari penggunaan, gunakan GPM IMERG&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h3 id="langkah-2-strategi-imputasi-data-hilang">Langkah 2: Strategi Imputasi Data Hilang&lt;/h3>
&lt;p>Ada beberapa metode pengisian data hilang, pilih berdasarkan kondisi lapangan:&lt;/p>
&lt;h4 id="metode-1-rata-rata-stasiun-tetangga-normal-ratio-method">Metode 1: Rata-rata Stasiun Tetangga (Normal Ratio Method)&lt;/h4>
&lt;p>Metode ini menggunakan bobot berdasarkan rasio curah hujan normal tahunan antara stasiun target dan stasiun pengisi.&lt;/p>
&lt;pre>&lt;code class="language-r"># ============================================================
# Imputasi dengan Normal Ratio Method
# ============================================================
# Curah hujan tahunan rata-rata (mm/tahun) dari masing-masing stasiun
# Dapatkan nilai ini dari 10–30 tahun data di tiap stasiun
n_target &amp;lt;- 2100 # Stasiun target (yang punya missing data)
n_stasiun1 &amp;lt;- 1950 # Stasiun tetangga 1
n_stasiun2 &amp;lt;- 2300 # Stasiun tetangga 2
n_stasiun3 &amp;lt;- 2050 # Stasiun tetangga 3
# Jika deviasi curah hujan normal antar stasiun &amp;lt; 10%:
# Gunakan rata-rata aritmetika sederhana
# Jika deviasi ≥ 10%: Gunakan Normal Ratio Method
hitung_imputasi_normal_ratio &amp;lt;- function(rr1, rr2, rr3,
n_t, n_1, n_2, n_3) {
# Formula: P_x = (N_x/3) * (P_1/N_1 + P_2/N_2 + P_3/N_3)
nilai &amp;lt;- (n_t / 3) * (rr1/n_1 + rr2/n_2 + rr3/n_3)
return(round(nilai, 1))
}
# Contoh pengisian untuk satu hari missing
rr_imputasi &amp;lt;- hitung_imputasi_normal_ratio(
rr1 = 18.5, rr2 = 22.0, rr3 = 15.8,
n_t = n_target, n_1 = n_stasiun1,
n_2 = n_stasiun2, n_3 = n_stasiun3
)
cat(&amp;quot;Curah hujan hasil imputasi:&amp;quot;, rr_imputasi, &amp;quot;mm\n&amp;quot;)
&lt;/code>&lt;/pre>
&lt;h4 id="metode-2-inverse-distance-weighting-idw-antar-stasiun">Metode 2: Inverse Distance Weighting (IDW) antar Stasiun&lt;/h4>
&lt;pre>&lt;code class="language-r"># ============================================================
# Imputasi dengan IDW berdasarkan jarak antar stasiun
# ============================================================
# Koordinat stasiun (dalam derajat desimal)
stasiun &amp;lt;- data.frame(
nama = c(&amp;quot;Target&amp;quot;, &amp;quot;Sts_1&amp;quot;, &amp;quot;Sts_2&amp;quot;, &amp;quot;Sts_3&amp;quot;),
lon = c(114.825, 114.600, 115.100, 114.700),
lat = c(-3.443, -3.200, -3.600, -3.700),
rr_hari = c(NA, 18.5, 22.0, 15.8) # NA = missing
)
# Hitung jarak Euclidean (approx) dalam km
hitung_jarak_km &amp;lt;- function(lon1, lat1, lon2, lat2) {
dx &amp;lt;- (lon2 - lon1) * 111.32 * cos(lat1 * pi / 180)
dy &amp;lt;- (lat2 - lat1) * 110.57
sqrt(dx^2 + dy^2)
}
stasiun_pengisi &amp;lt;- stasiun[!is.na(stasiun$rr_hari), ]
# Hitung jarak dari stasiun target ke pengisi
stasiun_pengisi$jarak &amp;lt;- mapply(
hitung_jarak_km,
lon1 = stasiun$lon[1], lat1 = stasiun$lat[1],
lon2 = stasiun_pengisi$lon, lat2 = stasiun_pengisi$lat
)
# Bobot IDW (1/d^2)
stasiun_pengisi$bobot &amp;lt;- 1 / stasiun_pengisi$jarak^2
# Curah hujan hasil IDW
rr_idw &amp;lt;- sum(stasiun_pengisi$rr_hari * stasiun_pengisi$bobot) /
sum(stasiun_pengisi$bobot)
cat(&amp;quot;Curah hujan IDW:&amp;quot;, round(rr_idw, 1), &amp;quot;mm\n&amp;quot;)
&lt;/code>&lt;/pre>
&lt;h4 id="metode-3-isi-dengan-data-gpm-imerg-rekomendasi-modern">Metode 3: Isi dengan Data GPM IMERG (Rekomendasi Modern)&lt;/h4>
&lt;p>Jika tidak ada stasiun tetangga yang memadai, data GPM IMERG Final Run bisa digunakan untuk mengisi missing data setelah dilakukan &lt;strong>bias correction&lt;/strong>:&lt;/p>
&lt;pre>&lt;code class="language-r"># ============================================================
# Koreksi bias GPM IMERG menggunakan ratio scaling
# ============================================================
# Periode yang memiliki data lengkap di keduanya (untuk kalibrasi)
# bmkg_lengkap = data BMKG periode overlap (tanpa missing)
# gpm_overlap = data GPM periode yang sama
# Hitung faktor koreksi bulanan
faktor_koreksi &amp;lt;- data.frame(
bulan = 1:12,
fc = tapply(bmkg_lengkap$rr, month(bmkg_lengkap$tanggal),
mean, na.rm = TRUE) /
tapply(gpm_overlap$rr, month(gpm_overlap$tanggal),
mean, na.rm = TRUE)
)
# Terapkan koreksi ke GPM untuk mengisi missing BMKG
data_gabungan &amp;lt;- data_hujan # copy data BMKG
bln_missing &amp;lt;- month(data_gabungan$tanggal[is.na(data_gabungan$rr)])
fc_terpilih &amp;lt;- faktor_koreksi$fc[bln_missing]
data_gabungan$rr[is.na(data_gabungan$rr)] &amp;lt;-
gpm_data$rr[is.na(data_hujan$rr)] * fc_terpilih
&lt;/code>&lt;/pre>
&lt;hr>
&lt;h2 id="validasi-kualitas-data-akhir">Validasi Kualitas Data Akhir&lt;/h2>
&lt;p>Setelah imputasi, lakukan validasi visual sebelum data digunakan untuk analisis lanjutan:&lt;/p>
&lt;pre>&lt;code class="language-r"># ============================================================
# Plot curah hujan tahunan untuk deteksi anomali
# ============================================================
library(ggplot2)
data_tahunan &amp;lt;- data_hujan %&amp;gt;%
mutate(tahun = year(tanggal)) %&amp;gt;%
group_by(tahun) %&amp;gt;%
summarise(rr_tahunan = sum(rr, na.rm = TRUE))
ggplot(data_tahunan, aes(x = tahun, y = rr_tahunan)) +
geom_bar(stat = &amp;quot;identity&amp;quot;, fill = &amp;quot;#2196F3&amp;quot;, alpha = 0.8) +
geom_hline(yintercept = mean(data_tahunan$rr_tahunan),
linetype = &amp;quot;dashed&amp;quot;, color = &amp;quot;red&amp;quot;, linewidth = 0.8) +
labs(
title = &amp;quot;Curah Hujan Tahunan — Stasiun BMKG&amp;quot;,
subtitle = &amp;quot;Garis merah: rata-rata periode analisis&amp;quot;,
x = &amp;quot;Tahun&amp;quot;,
y = &amp;quot;Curah Hujan Tahunan (mm)&amp;quot;
) +
theme_bw(base_size = 12)
&lt;/code>&lt;/pre>
&lt;p>Perhatikan anomali seperti lonjakan ekstrem atau nilai nol pada seluruh tahun — ini bisa mengindikasikan kesalahan dalam proses imputasi atau kode missing yang belum tergantikan.&lt;/p>
&lt;hr>
&lt;h2 id="kesimpulan-kapan-gunakan-data-bmkg-vs-gpm-imerg">Kesimpulan: Kapan Gunakan Data BMKG vs GPM IMERG?&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Kondisi&lt;/th>
&lt;th>Rekomendasi&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Stasiun BMKG &amp;lt; 5 km dari area studi, data lengkap&lt;/td>
&lt;td>Gunakan BMKG saja&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Stasiun BMKG ada tapi banyak missing data (&amp;gt;15%)&lt;/td>
&lt;td>Gabungkan BMKG + GPM (hybrid)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Tidak ada stasiun BMKG dalam radius 20 km&lt;/td>
&lt;td>Gunakan GPM IMERG Final Run&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Keperluan AMDAL formal&lt;/td>
&lt;td>BMKG sebagai primer, GPM sebagai sekunder&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Data &amp;gt; 10 tahun diperlukan dan proses lambat&lt;/td>
&lt;td>GPM + Open-Meteo ERA5 sebagai suplemen&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="referensi">Referensi&lt;/h2>
&lt;ul>
&lt;li>BMKG Data Online: &lt;a href="https://dataonline.bmkg.go.id/" target="_blank" rel="noopener">https://dataonline.bmkg.go.id/&lt;/a>&lt;/li>
&lt;li>WMO (2012). &lt;em>Guide to Meteorological Instruments and Methods of Observation&lt;/em>. WMO No. 8.&lt;/li>
&lt;li>Paulhus, J.L.H. &amp;amp; Kohler, M.A. (1952). Interpolation of missing precipitation records. &lt;em>Monthly Weather Review&lt;/em>, 80(8), 129–133.&lt;/li>
&lt;li>Soewarno (1995). &lt;em>Hidrologi: Aplikasi Metode Statistik untuk Analisa Data&lt;/em>. Nova, Bandung.&lt;/li>
&lt;/ul></description></item></channel></rss>