Proyek Data Mining untuk klasifikasi dan analisis gempa bumi menggunakan K-Means Clustering. Sistem ini mengidentifikasi pola kegempaan berdasarkan magnitudo dan kedalaman, mengklasifikasi tingkat risiko, dan menyediakan visualisasi interaktif melalui aplikasi Streamlit.
| No | Nama | NIM |
|---|---|---|
| 1. | Adam Haritsa Thahara | A11.2024.15556 |
| 2. | Angela Echa Naresti | A11.2024.15791 |
| 3. | Farros Rifantiarno R. | A11.2024.15694 |
| 4. | Nadjwa Salsabila W. | A11.2024.15670 |
| 5. | Mohammad Wisam W. | A11.2024.15739 |
- Melakukan Clustering gempa bumi menggunakan algoritma K-Means.
- Menentukan K Optimal dengan metode Silhouette Score dan Elbow Method.
- Mengklasifikasi Tingkat Risiko berdasarkan magnitudo (70%) dan kedalaman (30%).
- Menyimpan Model untuk deployment di aplikasi Streamlit.
- Visualisasi Data menggunakan peta interaktif dan grafik analisis.
| No | Nama | NIM |
|---|---|---|
| 1. | Adam Haritsa Thahara | A11.2024.15556 |
| 2. | Angela Echa Naresti | A11.2024.15791 |
| 3. | Farros Rifantiarno R. | A11.2024.15694 |
| 4. | Nadjwa Salsabila W. | A11.2024.15670 |
| 5. | Mohammad Wisam W. | A11.2024.15739 |
- Evaluasi K Optimal: Menggunakan Silhouette Score untuk menentukan jumlah klaster terbaik.
- Visualisasi Elbow & Silhouette: Menampilkan grafik untuk membantu pemilihan K.
- Remapping Cluster: Mereorder klaster berdasarkan severity score dari Low → Very High.
Sistem memberikan label risiko otomatis berdasarkan formula:
Severity Score = (0.7 × Magnitude_norm) + (0.3 × Shallow_Depth_inv_norm)
Label Risiko:
- 🟢 Low - Risiko rendah (gempa kecil/dalam)
- 🟡 Moderate - Risiko sedang
- 🟠 High - Risiko tinggi
- 🔴 Very High - Risiko sangat tinggi (gempa besar/dangkal)
- Scatter Plot: Distribusi gempa (Magnitudo vs Kedalaman).
- Box Plot: Analisis statistik per klaster.
- Pie & Bar Chart: Persentase dan jumlah gempa per risiko.
- Peta Streamlit: Tampilan geografis real-time dengan filter dinamis.
Aplikasi Streamlit menyediakan:
- Filter berdasarkan Rentang Tanggal
- Filter berdasarkan Magnitudo (Min-Max)
- Filter berdasarkan Kedalaman (Min-Max)
- Filter berdasarkan Tingkat Risiko
Masukkan magnitudo & kedalaman untuk mendapatkan prediksi:
- Cluster ID
- Risk Level
- Severity Score
KlasifikasiGempa/
├── earthquake_clustering.ipynb # 🔬 Main Jupyter Notebook (Analisis & Training)
├── streamlit_app.py # 🧠 Aplikasi web interaktif
├── katalog_gempa_v2.tsv # 📥 Dataset mentah (gempa bumi)
│
├── kmeans_model.joblib # 🤖 Model K-Means terlatih
├── scaler.joblib # 📏 MinMaxScaler untuk normalisasi
├── cluster_remap.pkl # 🔄 Mapping cluster ke label risiko
│
├── cluster_info.csv # 📊 Metadata cluster (centroid, severity_score)
├── earthquakes_with_cluster.csv # 💾 Dataset dengan label cluster
│
├── requirements.txt # 📦 Dependencies
├── README.md # 📖 Dokumentasi (file ini)
└── notes/ # 📝 Catatan tambahan
├── PENJELASAN_PERUBAHAN.txt # Daftar perubahan dari versi awal
└── informasi_keselamatan_streamlit.txt
| File | Deskripsi |
|---|---|
earthquake_clustering.ipynb |
Notebook utama berisi: import data, exploratory analysis, K-Means training, evaluasi model (Silhouette, Davies-Bouldin, Calinski-Harabasz), cluster remapping, dan visualisasi hasil. |
streamlit_app.py |
Aplikasi web untuk eksplorasi data interaktif dengan sidebar filters, peta geografis, dan prediksi cluster gempa baru. |
katalog_gempa_v2.tsv |
Dataset gempa dengan kolom: time, latitude, longitude, depth, mag (Magnitudo). Diproses dari sumber USGS/BMKG. |
kmeans_model.joblib |
Model machine learning yang sudah fit terhadap data. Digunakan untuk prediksi cluster pada data baru. |
scaler.joblib |
MinMaxScaler yang dilatih pada data training. Penting untuk normalisasi data sebelum prediksi. |
cluster_remap.pkl |
Dictionary mapping cluster ID asli → ID baru + label risiko (Low/Moderate/High/Very High). |
cluster_info.csv |
Metadata cluster berisi: centroid (mag, depth), severity_score, dan label risiko. Digunakan di Streamlit. |
earthquakes_with_cluster.csv |
Dataset lengkap dengan kolom cluster dan risk category. Hasil akhir dari training. |
- Python 3.8+ (Disarankan 3.10+)
- pip atau conda untuk package management
- Git (opsional, untuk clone repository)
# Jika menggunakan git
git clone <repository-url>
cd KlasifikasiGempa
# Atau download file ZIP dan extract# Windows
python -m venv venv
venv\Scripts\activate
# Mac/Linux
python3 -m venv venv
source venv/bin/activatepip install -r requirements.txtjupyter notebook earthquake_clustering.ipynbNotebook akan:
- ✅ Membaca data dari
katalog_gempa_v2.tsv - ✅ Melakukan exploratory analysis
- ✅ Training K-Means dengan optimal K detection
- ✅ Membuat visualisasi hasil clustering
- ✅ Menyimpan model ke
kmeans_model.joblibdanscaler.joblib - ✅ Export dataset dengan cluster ke
earthquakes_with_cluster.csv
Catatan: Jalankan semua cell secara berurutan. Model akan disimpan otomatis di akhir notebook.
Setelah model selesai ditraining, jalankan:
streamlit run streamlit_app.pyAplikasi akan terbuka di http://localhost:8501 dan menyediakan:
- 🗺️ Peta interaktif dengan filter
- 📊 Visualisasi cluster
- 🔍 Eksplorasi data lengkap
- 🤖 Prediksi cluster untuk gempa baru
Kolom yang digunakan:
time- Tanggal/waktu gempa (UTC)latitude- Koordinat lintanglongitude- Koordinat bujurdepth- Kedalaman gempa (km)mag- Magnitudo (skala Richter)
Jumlah Data: ~12,000+ gempa
- ✅ Load TSV dan rename kolom
- ✅ Konversi tipe data (datetime, numeric)
- ✅ Drop rows dengan data missing
- ✅ Normalisasi menggunakan MinMaxScaler (range 0-1)
- ✅ Feature Selection: Hanya gunakan
magdandepth(tidak lokasi)
Alasan feature selection:
- Magnitude & Depth adalah faktor risiko gempa
- Lokasi (lat/lon) dihilangkan untuk menghindari bias geografis
- Fokus pada karakteristik fisik gempa
Hyperparameters:
n_clusters: Optimal K (auto-detected via Silhouette)random_state: 42 (reproducibility)n_init: 10 (multiple random initializations)max_iter: 300
| Metrik | Interpretasi |
|---|---|
| Silhouette Score | Nilai -1 s/d 1. Semakin tinggi → cluster lebih terpisah. |
| Davies-Bouldin Index | Nilai 0+. Semakin rendah → cluster lebih optimal. |
| Calinski-Harabasz Score | Nilai 0+. Semakin tinggi → cluster lebih padat & terpisah. |
- Elbow Method - Mencari "siku" pada grafik inertia
- Silhouette Score - Memilih K dengan silhouette tertinggi
- Visual Inspection - Manual review hasil clustering
norm_magnitude = (magnitude - min_mag) / (max_mag - min_mag)
norm_depth = (depth - min_depth) / (max_depth - min_depth)
inv_depth = 1 - norm_depth # Gempa dangkal lebih berbahaya
severity_score = (0.7 × norm_magnitude) + (0.3 × inv_depth)
Bobot:
- 70% → Magnitudo (faktor utama)
- 30% → Shallow Depth (gempa dangkal lebih berbahaya)
Cluster diurutkan berdasarkan severity_score, kemudian diberi label:
- 0 = 🟢 LOW - Severity Score terendah
- 1 = 🟡 MODERATE
- 2 = 🟠 HIGH
- 3 = 🔴 VERY HIGH - Severity Score tertinggi
(Untuk k ≠ 4, label dinamis: Level 1, Level 2, dst)
Setelah menjalankan notebook, file berikut akan dihasilkan:
| File | Deskripsi |
|---|---|
kmeans_model.joblib |
Model K-Means terlatih (binary format) |
scaler.joblib |
MinMaxScaler untuk normalisasi (binary format) |
cluster_remap.pkl |
Dictionary mapping cluster → label risiko |
cluster_info.csv |
Metadata cluster: centroid, severity_score, label |
earthquakes_with_cluster.csv |
Dataset original + kolom cluster dan Risk Category |
cluster,mag,depth,latitude,longitude,severity_score,label
0,3.45,150.5,-6.2,106.8,0.1234,Low
1,4.50,80.2,-7.5,107.3,0.4567,Moderate
2,5.20,45.8,-8.1,108.5,0.7234,High
3,6.10,25.3,-9.2,109.7,0.9123,Very HighSolusi: Pastikan file TSV ada di folder yang sama dengan notebook.
Solusi: pip install plotly pandas scikit-learn joblib
Solusi: Jalankan notebook terlebih dahulu untuk generate model files.
Pastikan streamlit_app.py di folder yang sama.
Solusi: Periksa bahwa nilai input (magnitude, depth) masuk dalam range data training.
Contoh range magnitudo: 1.5 - 7.5 | range depth: 5 - 600 km
Referensi lengkap ada di requirements.txt:
- pandas - Data manipulation
- numpy - Numerical computing
- scikit-learn - Machine Learning (KMeans, StandardScaler, Metrics)
- joblib - Model serialization
- plotly - Interactive visualization
- matplotlib & seaborn - Static plots
- streamlit - Web app framework
- tqdm - Progress bar
Proyek ini mencakup konsep:
- Data Mining - Preprocessing, feature engineering, EDA
- Clustering - K-Means, Silhouette analysis, Elbow method
- ML Pipeline - Training, evaluation, model serialization
- Visualization - Interactive maps, statistical plots
- Web Development - Streamlit app with realtime filtering
- Domain Knowledge - Seismology, earthquake risk assessment
-
Earthquake Data Source:
- USGS Earthquake Hazards Program
- BMKG (Badan Meteorologi, Klimatologi, dan Geofisika Indonesia)
-
Machine Learning Documentation:
-
Visualization:
✅ DO:
- Selalu jalankan notebook dari awal untuk memastikan model di-update
- Gunakan virtual environment untuk menghindari dependency conflicts
- Dokumentasikan setiap perubahan di
notes/PENJELASAN_PERUBAHAN.txt - Test prediksi dengan nilai yang masuk range data training
❌ DON'T:
- Jangan manual edit file
.joblib(binary format) - Jangan skip normalisasi data (critical untuk K-Means)
- Jangan langsung menjalankan
streamlit_app.pytanpa model files - Jangan upload dataset besar di Git (gunakan
.gitignore)
- Implementasi algoritma clustering lain (DBSCAN, Hierarchical)
- Advanced visualization (3D clustering, interactive heatmap)
- Feature engineering tambahan (tsunami risk, historical data)
- API endpoint untuk external integration
- Dashboard comparison antar versi model
- Automated model retraining pipeline
- Time-series forecasting untuk prediksi gempa
- Fork repository
- Buat branch baru:
git checkout -b feature/nama-fitur - Commit changes:
git commit -m "Deskripsi perubahan" - Push ke branch:
git push origin feature/nama-fitur - Buat Pull Request dengan deskripsi jelas
v1.0 (Current)
- ✅ K-Means clustering dengan auto K-detection
- ✅ Severity scoring dan risk classification
- ✅ Jupyter notebook analysis
- ✅ Streamlit web app
- ✅ Interactive visualization
v0.9 (Previous)
- Basic K-Means implementation
- Manual K selection
Lihat file notes/PENJELASAN_PERUBAHAN.txt untuk detail perubahan.
Proyek ini adalah bagian dari Tugas Data Mining - Kelompok Kelas A11.43UG1, DINUS.
Digunakan untuk keperluan pendidikan. Data gempa bersumber dari USGS/BMKG (public domain).
Untuk pertanyaan atau issue:
- 📧 Email: [email protected]
- 💬 GitHub Issues: [buka issue di repo]
- 📋 Notes Tambahan: Lihat folder
notes/
Dibuat dengan ❤️ menggunakan Python, Streamlit, Scikit-Learn, dan Passion untuk Data Science.
🌍 Terima kasih telah menggunakan Aplikasi Klasifikasi Gempa!