Sistem peringatan dini longsor untuk Indonesia: susceptibility resolusi 30 m, pemicu hujan harian, dan lapisan aksi berbantuan LLM — divalidasi pada 519 kabupaten/kota di 34 provinsi.
Datathon RISTEK Fasilkom UI 2026 — University Track — Tim cupuu
| Deliverable | Tautan |
|---|---|
| Model (Hugging Face) | https://huggingface.co/FrederickAllensius/sigap-longsor |
| Repositori | https://github.com/draxmit/datathon-product |
| Makalah | paper/cupuu_Paper_Semifinal.pdf |
Bundel model ikut di repositori ini (produk/bundel/), jadi dasbor dapat dijalankan tanpa
mengunduh apa pun dari Hugging Face. Repositori Hugging Face memuat bundel yang sama beserta
model card — ambang, daftar fitur, hasil evaluasi lima protokol, dan batasan sistem.
Dasbor sudah dibundel: model, poligon peta, dan arsip hujan tersimpan di produk/bundel/
(±18 MB), jadi tidak perlu mengunduh 8,8 GB data mentah untuk menjalankannya.
pip install -r requirements.txt
streamlit run produk/app.pyTanggal yang menarik untuk dicoba: 2024-03-07 (hari terbasah dalam arsip, 14 kabupaten
terpicu) dan 2019-09-11 (hari terkering, 0 kabupaten terpicu — sistem memang diam).
| Perintah | Antarmuka |
|---|---|
streamlit run produk/app.py |
Dasbor Streamlit — tervalidasi, dipakai demo makalah |
python produk/dasbor/server.py |
Dasbor mandiri di http://127.0.0.1:8530 — tampilan ditulis sendiri |
Keduanya memanggil produk/sigap.py dan produk/distribusi.py yang sama, jadi angka di
kedua layar tidak dapat berbeda. Yang berbeda hanya lapisan tampilannya: dasbor mandiri
menggambar petanya sendiri sebagai SVG (tanpa ubin, jalan tanpa jaringan) dan menghitung
ulang ambang anggaran di peramban, sehingga slider kapasitas berubah seketika alih-alih
menjalankan ulang seluruh skrip. Rinciannya di produk/dasbor/README.md.
Tabel ini menyatakan apa yang sudah berjalan dan dapat diuji, dan apa yang belum. Setiap klaim pada makalah dapat ditelusuri ke baris di bawah.
| Komponen | Status | Bukti |
|---|---|---|
| DEM 30 m se-Indonesia (414 ubin Copernicus GLO-30) | ✅ Berjalan | skrip/get_dem_seluruh_indonesia.py |
| Fitur terrain per kabupaten (519/519) | ✅ Berjalan | skrip/kab_fitur_statis.py → data/kab_fitur_statis.csv |
| Arsip hujan harian 2018–2024 (519/519 kabupaten) | ✅ Berjalan | skrip/hujan_kabupaten.py → data/hujan_kabupaten.json |
| Penyaringan longsor ko-seismik (katalog USGS) | ✅ Berjalan | dump/skrip-riset/tandai_koseismik.py — 109/1.202 (9,1%) disaring |
| Tier 1 — susceptibility statis 30 m | ✅ Berjalan | dump/skrip-riset/tier1_train_pvmbg.py — Jawa Barat |
| Tier 2 — pemicu hujan (case-control) | ✅ Berjalan | dump/skrip-riset/tier2_hujan.py, dump/skrip-riset/tier_gabungan.py |
| Model kabupaten-hari nasional + LOPO | ✅ Berjalan | skrip/kab_model.py — 2 konfigurasi negative sampling |
| Skor nasional + peta choropleth | ✅ Berjalan | dump/skrip-riset/skor_nasional.py → hasil/peta_skor_nasional.png |
| Kurva recall vs beban alarm (out-of-fold) | ✅ Berjalan | produk/kurva_operasional.py |
| Mesin skor + atribusi SHAP + narasi berlapis | ✅ Berjalan | produk/sigap.py |
| Dasbor BPBD (5 tab: prioritas, detail, kapasitas, keandalan, simulasi) | ✅ Berjalan | produk/app.py |
| Lapisan LLM + pengaman | ✅ Berjalan | produk/sigap.py::narasi_llm — fallback deterministik |
| Modul validasi kelayakan (Landslide4Sense) | ✅ Berjalan | sigap-longsor-modul-validasi.ipynb Bab 0–16 |
| Litologi nasional | ✅ Berjalan | geoportal.esdm.go.id — cakupan nasional. Versi awal README menyebut layanan ini mati; itu keliru, yang 404 adalah host geologi.esdm.go.id |
| Susceptibility 8 m (DEMNAS) | ⬜ Belum | Portal BIG mengembalikan respons kosong |
| Umpan hujan real-time | Sumber yang sama berlatensi 0 hari — lihat catatan sumber di bawah | |
| Distribusi WhatsApp/SMS | ⬜ Belum | Rancangan pada makalah §5.1 |
| Agregasi ke poligon desa | ⬜ Belum | Unit terkecil saat ini kabupaten — lihat "Unit alarm" |
Dilatih pada 7.648 sampel kabupaten-hari (478 positif dari 102 kabupaten, setelah penyaringan ko-seismik), ensemble RandomForest + LightGBM.
| Protokol evaluasi | AUC | Menjawab |
|---|---|---|
| GroupKFold kabupaten — Konfig A | 0,931 | kabupaten baru di wilayah yang sudah dikenal |
| GroupKFold kabupaten — Konfig B | 0,831 | sama, geografi dikunci ke kabupaten pernah longsor |
| Leave-one-block-out (5 blok) | 0,874 | wilayah sama sekali baru — 100% positif teruji |
| Leave-one-province-out (3 provinsi) | 0,836 | provinsi ditahan penuh (83% positif) |
| Spatio-temporal (paling ketat) | 0,850 | wilayah baru dan tahun masa depan |
Angka di atas berasal dari produk/bundel/metrik.json — sumber yang sama yang dibaca
dasbor dan makalah, sehingga ketiganya tidak dapat menyimpang diam-diam.
Selisih A−B (0,10–0,17) adalah diagnostik yang disengaja, bukan kelemahan tersembunyi. Konfigurasi A boleh memilih negatif dari kabupaten datar yang tidak akan pernah longsor, sehingga sebagian AUC-nya berasal dari "mengingat geografi". Konfigurasi B menutup jalan itu. Kami melaporkan keduanya karena selisihnya justru mengukur seberapa besar porsi tersebut.
Diukur out-of-fold — tiap kabupaten diskor oleh model yang belum pernah melihatnya.
| Beban verifikasi | Tolok ukur peringkat | Di wilayah yang sama sekali baru |
|---|---|---|
| 3 kabupaten/hari | 31.2% | 19.0% |
| 5 kabupaten/hari | 42.5% | 23.6% |
| 8 kabupaten/hari | 51.5% | 28.9% |
| 25 kabupaten/hari | 73.2% | 54.6% |
Kolom kiri diukur pada kabupaten baru di wilayah yang sudah dikenal; kolom kanan pada wilayah yang belum pernah dilihat sama sekali (leave-one-block-out). Kolom kanan adalah yang seharusnya dikutip untuk perluasan ke wilayah tak berlabel. Keduanya retrospektif — belum ada validasi prospektif.
AUC 0,83–0,93 tidak berarti sistem menangkap 83–93% kejadian. Penyebabnya ketimpangan kelas: longsor tercatat terjadi pada sekitar 1 dari 116 kabupaten-hari. Sistem ini memfokuskan perhatian 44× lebih baik daripada memilih acak pada beban 5 kabupaten/hari — bukan menjamin penangkapan. Angka ini ditampilkan di dasbor, bukan disembunyikan.
Satu AUC menyembunyikan dua kemampuan. Dipecah menurut apakah pasangan
pembandingnya berasal dari kabupaten yang sama, kemampuan mengenali tempat
adalah 0,932 sementara kemampuan menentukan hari hanya 0,774 — dan model
statis-saja terbukti 0,500 tepat pada metrik yang kedua. Rinciannya di
skrip/kab_dekomposisi_skill.py dan makalah §4.6.
Pada 50 patch validasi terpisah di level patch (bebas kebocoran spasial): F1 = 0,697 (IoU 0,534), ROC AUC = 0,987, 95% CI bootstrap [0,577–0,763], waktu fit 27,1 detik (CPU 12-core, tanpa GPU). Modul ini membuktikan kelayakan pipeline, bukan implementasi Tier 1 — tugas, masukan, dan labelnya berbeda (lihat makalah §4.1).
Skor dihitung pada resolusi 30 m, tetapi alarm dipicu di tingkat kabupaten. Ini keputusan desain yang dipaksa oleh data, bukan penyederhanaan.
Longsor tercatat terjadi pada sekitar 1 dari 25.000 desa-hari. Pada prevalensi itu, menangkap 80% kejadian di tingkat desa menuntut peringatan pada ~44% desa setiap hari — tidak mungkin dijalankan siapa pun. Pada tingkat kabupaten prevalensinya ~200× lebih tinggi (1 per ~116 kabupaten-hari), dan beban 3–8 kabupaten/hari se-Indonesia berada dalam kapasitas piket BPBD yang nyata.
.
├── README.md · requirements.txt · .gitignore
├── sigap-longsor-modul-validasi.ipynb # modul validasi kelayakan (Bab 0–16)
├── produk/ # dasbor operasional — MULAI DARI SINI
│ ├── app.py # dasbor Streamlit (tampilan saja)
│ ├── sigap.py # mesin inti: skor, SHAP, narasi berlapis
│ ├── bangun_bundel.py # latih model produksi + distribusi referensi
│ ├── kurva_operasional.py # kurva recall vs beban, out-of-fold
│ ├── sederhanakan_peta.py # poligon 159 MB → 2,6 MB
│ ├── bundel/ # aset siap pakai (±18 MB, ikut di-commit)
│ └── README.md # catatan desain produk
├── skrip/ # 31 skrip pipeline (lihat urutan di bawah)
├── data/ # 8,8 GB — TIDAK di-commit (.gitignore)
├── hasil/ # gambar hasil untuk makalah
├── paper/
│ └── cupuu_Paper_Semifinal.pdf # AI Product Proposal — makalah semifinal
├── panduan/ # ketentuan & rubrik semifinal
└── arsip/ # versi lama, jejak revisi
arsip/ dan panduan/ bukan bagian dari produk; keduanya disimpan agar riwayat keputusan
dapat ditelusuri.
Hanya perlu bila ingin memverifikasi pipeline penuh — dasbor sudah jalan dari bundel/.
Prasyarat: Python 3.9+, ~9 GB ruang disk, koneksi internet. Tanpa GPU. Tanpa kredensial: seluruh sumber data terbuka dan tidak memerlukan login.
python -m venv .venv && source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -r requirements.txtJalankan berurutan — perkiraan waktu total ±3 jam, didominasi unduhan:
| # | Perintah | Waktu | Keluaran |
|---|---|---|---|
| 1 | python skrip/get_dem_seluruh_indonesia.py |
~90 mnt | 414 ubin DEM (7,3 GB) |
| 2 | python skrip/kab_fitur_statis.py |
38 mnt | data/kab_fitur_statis.csv (519 kab) |
| 3 | python skrip/hujan_kabupaten.py |
18 mnt | data/hujan_kabupaten.json |
| 4 | python dump/skrip-riset/tandai_koseismik.py |
<1 mnt | penanda longsor akibat gempa |
| 5 | python skrip/kab_model.py |
~10 mnt | model + LOPO, konfigurasi A & B |
| 6 | python dump/skrip-riset/skor_nasional.py |
~3 mnt | hasil/peta_skor_nasional.png |
| 7 | python produk/bangun_bundel.py |
~4 mnt | produk/bundel/ |
| 8 | python produk/sederhanakan_peta.py |
~1 mnt | poligon ringan |
| 9 | python produk/kurva_operasional.py |
~5 mnt | kurva recall out-of-fold |
Langkah 1 tahan-putus: unduhan memverifikasi Content-Length sebelum menerima berkas dan
melanjutkan dari ubin terakhir bila dihentikan. Langkah 2 melewati (bukan menggagalkan) ubin
yang tidak terbaca dan mencatatnya.
Reproducibility. Seluruh keacakan dikunci pada SEED = 42 — random, numpy,
PYTHONHASHSEED, serta random_state pada setiap estimator, split, bootstrap, dan
permutation importance. Menjalankan ulang menghasilkan angka yang identik.
huggingface-cli download ibm-nasa-geospatial/Landslide4sense \
--repo-type dataset --local-dir ./landslide
export L4S_DATA=$PWD/landslide/dl # PowerShell: $env:L4S_DATA = "...\landslide\dl"
jupyter notebook sigap-longsor-modul-validasi.ipynbKenapa split
test, bukantrain? Pada seluruh mirror HuggingFace yang kami periksa (ibm-nasa-geospatial,tagaxie,harshinde,Chad-2004), berkasannotations/train/*.h5berukuran 800 B dan tidak memuat dataset apa pun — HDF5 valid tetapi kosong. Hanya splittestyang mask-nya utuh. Notebook mendeteksi split otomatis (test → train → validation) dan memvalidasi setiap mask sebelum dipakai.
Seluruhnya berlisensi terbuka. Tidak ada yang memerlukan login — perubahan disengaja dari rencana awal, karena sumber berkredensial (GPM IMERG lewat Earthdata) membuat pipeline tidak dapat direproduksi orang lain tanpa akun.
| Sumber | Akses | Penggunaan | Status |
|---|---|---|---|
| Copernicus GLO-30 | AWS Open Data, tanpa auth | DEM 30 m, 414 ubin | ✅ Aktif |
| Open-Meteo (analisis ECMWF IFS) | Terbuka | Hujan harian 2018–2024 | ✅ Aktif |
| PVMBG | Terbuka | Label longsor (koordinat survei) | ✅ Aktif |
| USGS Earthquake | Terbuka | Penyaringan ko-seismik | ✅ Aktif |
| geoBoundaries | Terbuka | Poligon ADM1/ADM2 | ✅ Aktif |
| SoilGrids | ISRIC, terbuka | Tanah (clay/sand) | ✅ Aktif |
| ESA WorldCover | Terbuka | Tutupan lahan | ✅ Aktif |
| Landslide4Sense | HuggingFace | Modul validasi | ✅ Aktif |
| Litologi Badan Geologi | ArcGIS | Litologi + umur batuan | ✅ Nasional |
| DEMNAS 8 m | BIG | Susceptibility 8 m | ⬜ Portal respons kosong |
| GPM IMERG | Earthdata login | Hujan real-time | ⬜ Di luar cakupan |
Daftar ini ada supaya tidak ada yang perlu menebak batas sistem. Versi lengkap ada di
produk/sigap.py::BATASAN dan tampil di tab "Reliabilitas & batas" pada dasbor.
- Indeks bukan probabilitas longsor — melainkan posisi kondisi hujan-lereng hari ini terhadap 250.000 kabupaten-hari historis.
- Demo arsip, bukan sistem langsung. Hujan berasal dari arsip analisis ECMWF IFS 2018–2024 (via Open-Meteo best match). Versi awal dokumen ini menyebutnya ERA5; audit sumber menunjukkan itu keliru — data tersimpan cocok
ecmwf_ifs31/31 hari dan ERA5 0/31. - Tidak pernah memicu peringatan publik otomatis. Tingkat tertinggi berhenti di permintaan verifikasi lapangan BPBD — konsekuensi langsung dari batas reliabilitas terukur.
- Longsor akibat gempa di luar cakupan — 9,1% kejadian arsip (Palu, Lombok) disaring keluar dari pelatihan; sistem ini tidak akan menangkapnya.
- Tidak ada estimasi waktu kejadian — data hujan hanya bergranularitas harian.
- Sel hujan konvektif lokal bisa terlewat — arsipnya beresolusi ~9 km.
- Belum ada uji prospektif. Seluruh validasi bersifat retrospektif pada tanggal historis.
Frederick Allensius · Kang Nicholas Darren Nugroho · Ivan William Lianata Data Science, Universitas Bina Nusantara