Metode evaluasi
Seluruh 10.000 data diacak (seed 42) lalu dibagi menjadi 5 fold (k-fold cross-validation). Setiap model dilatih pada 4 fold dan diuji pada 1 fold sisanya, diulang sampai semua fold pernah menjadi data uji. Normalisasi z-score dihitung dari data latih saja agar tidak ada kebocoran data uji. Untuk klasifikasi dilaporkan akurasi dan macro-F1 (rata-rata F1 semua kelas, adil untuk kelas yang sedikit), dalam bentuk rata-rata ± simpangan baku antar fold. Untuk regresi dilaporkan MAE, RMSE, dan R².
Dihitung 2026-11-12 00:09:00 · 34.2 detik · nilai k diuji 1–30 ·
Python scikit-learn 1.6.1 ·
hitung ulang: php artisan ispu:evaluate-models
Temuan utama
- Kolom ISPU di dataset 99,3% sama dengan hasil rumus resmi ISPU (Permen LHK No. 14/2020), dan polutan penentunya hampir selalu PM2.5 (99,4% data). Kategori ISPU dan tingkat risiko juga mengikuti batas nilai ISPU. Jadi label di dataset ini dibuat dari aturan, bukan dari pengukuran lapangan yang berbeda-beda.
- Dengan semua fitur, model terbaik adalah Decision Tree (CART, kedalaman 8) (macro-F1 tingkat risiko 100,0%, kNN 86,8%). Decision Tree unggul karena bisa mempelajari batas nilai (threshold) secara langsung, sedangkan kNN merata-ratakan tetangga sehingga sering salah di dekat batas kategori.
- Tanpa sensor polutan (cuaca saja), akurasi model terbaik hanya 46,2%, tidak lebih baik dari baseline yang selalu menebak kelas terbanyak (46,1%). Artinya cuaca saja tidak cukup untuk menebak kualitas udara di dataset ini.
1. Perbandingan model klasifikasi
Kategori ISPU (5 kelas) · macro-F1 per skenario
Tingkat risiko (4 tier) · macro-F1 per skenario
Kategori ISPU (5 kelas)
| Model | Semua fitur (6 polutan + 4 cuaca) | PM2.5 + cuaca (sensor terbatas) | Cuaca saja (tanpa sensor polutan) | |||
|---|---|---|---|---|---|---|
| Akurasi | Macro-F1 | Akurasi | Macro-F1 | Akurasi | Macro-F1 | |
| Baseline (kelas terbanyak / rata-rata) | 47,1% ±1,5 | 12,8% ±0,3 | 47,1% ±1,5 | 12,8% ±0,3 | 47,1% ±1,5 | 12,8% ±0,3 |
| Gaussian Naive Bayes | 91,4% ±1,0 | 84,5% ±5,2 | 96,1% ±0,8 | 88,1% ±7,4 | 40,0% ±15,4 | 17,8% ±5,3 |
| Decision Tree (CART, kedalaman 8) | 100,0% ±0,0 | 100,0% ±0,0 | 100,0% ±0,0 | 100,0% ±0,0 | 47,4% ±1,0 | 19,3% ±0,8 |
| kNN berbobot jarak | 88,7% ±0,9 | 79,4% ±4,8 | 92,5% ±0,4 | 83,1% ±3,6 | 43,2% ±1,2 | 20,1% ±0,6 |
| Rumus resmi ISPU (bukan ML) acuan | 99,7% ±0,1 | 98,9% ±1,8 | 99,8% ±0,1 | 99,0% ±1,8 | – | – |
Baris tebal = model ML terbaik (macro-F1, semua fitur). k terbaik kNN per skenario: Semua fitur (6 polutan + 4 cuaca) k=3, PM2.5 + cuaca (sensor terbatas) k=6, Cuaca saja (tanpa sensor polutan) k=5 . Rumus resmi hanya bisa dipakai bila ada data polutan.
Tingkat risiko (4 tier)
| Model | Semua fitur (6 polutan + 4 cuaca) | PM2.5 + cuaca (sensor terbatas) | Cuaca saja (tanpa sensor polutan) | |||
|---|---|---|---|---|---|---|
| Akurasi | Macro-F1 | Akurasi | Macro-F1 | Akurasi | Macro-F1 | |
| Baseline (kelas terbanyak / rata-rata) | 46,1% ±1,5 | 15,8% ±0,4 | 46,1% ±1,5 | 15,8% ±0,4 | 46,1% ±1,5 | 15,8% ±0,4 |
| Gaussian Naive Bayes | 91,9% ±0,6 | 90,9% ±0,9 | 96,9% ±0,7 | 96,5% ±0,8 | 45,6% ±1,5 | 24,5% ±0,8 |
| Decision Tree (CART, kedalaman 8) | 100,0% ±0,0 | 100,0% ±0,0 | 100,0% ±0,0 | 100,0% ±0,0 | 46,2% ±1,5 | 24,3% ±0,6 |
| kNN berbobot jarak | 88,7% ±1,0 | 86,8% ±1,1 | 92,6% ±0,4 | 90,6% ±0,7 | 42,6% ±1,4 | 25,0% ±1,0 |
Baris tebal = model ML terbaik (macro-F1, semua fitur). k terbaik kNN per skenario: Semua fitur (6 polutan + 4 cuaca) k=3, PM2.5 + cuaca (sensor terbatas) k=6, Cuaca saja (tanpa sensor polutan) k=5 . Rumus resmi hanya bisa dipakai bila ada data polutan.
2. Perbandingan model regresi
Nilai ISPU
| Model | Skenario | MAE | RMSE | R² |
|---|---|---|---|---|
| Baseline (rata-rata) | Semua fitur (6 polutan + 4 cuaca) | 34,25 | 46,56 | -0,001 |
| Decision Tree | 0,07 | 0,45 | 1,000 | |
| kNN (k=3) | 6,97 | 9,21 | 0,961 | |
| Rumus resmi | 0,11 | 0,70 | 1,000 | |
| Baseline (rata-rata) | PM2.5 + cuaca (sensor terbatas) | 34,25 | 46,56 | -0,001 |
| Decision Tree | 0,07 | 0,44 | 1,000 | |
| kNN (k=6) | 3,85 | 6,25 | 0,982 | |
| Rumus resmi | 0,08 | 0,43 | 1,000 | |
| Baseline (rata-rata) | Cuaca saja (tanpa sensor polutan) | 34,25 | 46,56 | -0,001 |
| Decision Tree | 34,60 | 47,00 | -0,020 | |
| kNN (k=5) | 37,90 | 51,08 | -0,204 |
Beban ISPA
| Model | Skenario | MAE | RMSE | R² |
|---|---|---|---|---|
| Baseline (rata-rata) | Semua fitur (6 polutan + 4 cuaca) | 1,112 | 1,492 | -0,001 |
| Decision Tree | 0,075 | 0,097 | 0,996 | |
| kNN (k=3) | 0,213 | 0,280 | 0,965 | |
| Baseline (rata-rata) | PM2.5 + cuaca (sensor terbatas) | 1,112 | 1,492 | -0,001 |
| Decision Tree | 0,074 | 0,096 | 0,996 | |
| kNN (k=6) | 0,112 | 0,173 | 0,987 | |
| Baseline (rata-rata) | Cuaca saja (tanpa sensor polutan) | 1,112 | 1,492 | -0,001 |
| Decision Tree | 1,089 | 1,471 | 0,028 | |
| kNN (k=5) | 1,184 | 1,589 | -0,135 |
3. Pemilihan nilai k (kNN, semua fitur)
Akurasi dan macro-F1 terhadap k
Hasil
Nilai k dipilih dari rata-rata macro-F1 kategori ISPU dan tingkat risiko yang paling tinggi. Hasilnya k = 3, dengan macro-F1 kategori 80,5% dan tingkat risiko 86,9%.
k kecil membuat model peka terhadap data yang menyimpang (overfitting), sedangkan k besar mengaburkan batas antar kategori (underfitting). Halaman Prediksi otomatis memakai k ini.
Catatan: k dipilih dengan cross-validation yang sama dengan pengujian, jadi skor kNN sedikit optimis.
4. Confusion matrix dan F1 per kelas (kNN k=3, semua fitur)
Kategori ISPU (5 kelas) · akurasi 88,7%, macro-F1 80,5%
| Aktual ↓ / Prediksi → | Baik | Sedang | Tidak Sehat | Sangat Tidak Sehat | Berbahaya |
|---|---|---|---|---|---|
| Baik | 671 | 270 | 0 | 0 | 0 |
| Sedang | 178 | 4229 | 300 | 0 | 0 |
| Tidak Sehat | 0 | 315 | 3631 | 24 | 0 |
| Sangat Tidak Sehat | 0 | 0 | 25 | 329 | 1 |
| Berbahaya | 0 | 0 | 0 | 16 | 11 |
| Kelas | Precision | Recall | F1 | Jumlah |
|---|---|---|---|---|
| Baik | 79,0% | 71,3% | 75,0% | 941 |
| Sedang | 87,9% | 89,8% | 88,8% | 4.707 |
| Tidak Sehat | 91,8% | 91,5% | 91,6% | 3.970 |
| Sangat Tidak Sehat | 89,2% | 92,7% | 90,9% | 355 |
| Berbahaya | 91,7% | 40,7% | 56,4% | 27 |
Tingkat risiko (4 tier) · akurasi 88,7%, macro-F1 86,9%
| Aktual ↓ / Prediksi → | Tier 1 | Tier 2 | Tier 3 | Tier 4 |
|---|---|---|---|---|
| Tier 1 | 671 | 270 | 0 | 0 |
| Tier 2 | 178 | 4130 | 298 | 0 |
| Tier 3 | 0 | 318 | 3665 | 20 |
| Tier 4 | 0 | 0 | 46 | 404 |
| Kelas | Precision | Recall | F1 | Jumlah |
|---|---|---|---|---|
| Tier 1 - Low Background Risk | 79,0% | 71,3% | 75,0% | 941 |
| Tier 2 - Moderate Sensitive Alert | 87,5% | 89,7% | 88,6% | 4.606 |
| Tier 3 - High Population Hazard | 91,4% | 91,6% | 91,5% | 4.003 |
| Tier 4 - Severe Emergency Alert | 95,3% | 89,8% | 92,5% | 450 |
Diagonal hijau = tebakan benar, sel merah = salah. Kelas Berbahaya hanya 27 data (F1 56,4%), sehingga akurasi saja bisa menipu. Karena itu macro-F1 dipakai sebagai metrik utama.
5. Pentingnya fitur (permutation importance)
Turunnya akurasi saat fitur diacak
Cara membaca
Nilai satu fitur di data uji diacak, lalu kNN (k=3) diuji ulang pada 500 data. Makin besar akurasinya turun, makin penting fitur itu. Akurasi awal: kategori 89,6%, tingkat risiko 88,8%.
- PM10: akurasi tingkat risiko turun 18,4 poin
- PM2.5: akurasi tingkat risiko turun 14,5 poin
- NO2: akurasi tingkat risiko turun 3,8 poin
6. Kesimpulan dan keterbatasan
- Semua model ML jauh lebih baik dari baseline bila data polutan tersedia. Model terbaik: Decision Tree (CART, kedalaman 8) untuk kategori ISPU dan Decision Tree (CART, kedalaman 8) untuk tingkat risiko.
- Untuk nilai dan kategori ISPU, rumus resmi sudah memberi hasil hampir sempurna. Peran ML yang realistis di dataset ini adalah meniru aturan pada target yang rumusnya tidak diketahui (tingkat risiko dan beban ISPA), atau bekerja dengan sensor yang terbatas.
- kNN dengan PM2.5 + cuaca justru lebih baik daripada kNN dengan semua fitur (90,6% vs 86,8% macro-F1 tingkat risiko), karena fitur yang tidak relevan ikut dihitung dalam jarak. Ini menunjukkan pemilihan fitur penting untuk kNN.
- Datanya sintetis (diperkaya AI), hanya mencakup 23 provinsi dan periode Januari–Oktober 2026, jadi hasilnya belum bisa digeneralisasi ke pengukuran nyata.