adityamulyaf/nhanes-stroke-api
Analisis Faktor Gaya Hidup pada Prediksi Risiko Stroke menggunakan Explainable Machine Learning
Repository ini berisi proyek analisis dan prediksi risiko stroke menggunakan dataset survei nasional NHANES (National Health and Nutrition Examination Survey) 2015-2016 dari CDC Amerika Serikat. Proyek ini mengevaluasi kontribusi faktor gaya hidup (tidur, stres, aktivitas fisik) sebagai tambahan dari data klinis dasar.
Anggota Tim
- Fadhil Rusadi (L0124013)
- Firizqi Aditya Mulya (L0124016)
- Nurman Aqil Wicaksono (L0124139)
Progress Proyek
- Progress 1: Dataset & Preprocessing
- Pemilihan dan pengunduhan dataset NHANES 2015-2016 (10 file modul
.xpt). - Pembersihan data, penyelarasan (recode) kode respons, pembagian data (train-test split 80:20), imputasi missing value, standardisasi fitur (StandardScaler), dan penyeimbangan kelas (SMOTE pada training set saja) untuk mencegah data leakage.
- Progress 2: Training & Evaluasi Model (Explainable AI)
- Melatih 3 model klasifikasi (Decision Tree, Random Forest, XGBoost) pada 5 skenario kombinasi fitur untuk menganalisis kontribusi tidur, stres, dan aktivitas fisik.
- Evaluasi metrik performa lengkap (Accuracy, Precision, Recall, F1-Score, AUC-ROC) dan visualisasi grafik evaluasi.
- Penerapan SHAP values untuk mengukur pengaruh dan signifikansi kontribusi kelompok fitur klinis vs gaya hidup secara kuantitatif.
- Progress 3: Web App Deployment
- Mengemas model klasifikasi terbaik yang telah dilatih ke dalam bentuk aplikasi web interaktif (Next.js & FastAPI) untuk simulasi prediksi risiko stroke mandiri oleh pengguna.
- Integrasi Explainable AI (XAI) berbasis aturan klinis untuk analisis personal secara real-time.
- Deployment backend FastAPI menggunakan Docker di Hugging Face Spaces dan frontend di Vercel.
Dataset & Fitur
Dataset menggabungkan 10 file modul survei .xpt terpisah. Model dilatih menggunakan total 31 Fitur + 1 Target (Stroke) yang dibagi menjadi 4 kelompok utama:
- Fitur Klinis (16 fitur):
- Demografi: Usia (age), jenis kelamin (gender), ras (race), tingkat pendidikan (education), rasio pendapatan (income_ratio).
- Antropometri: BMI (bmi), lingkar pinggang (waist_circ).
- Tekanan Darah: Tekanan darah sistolik (systolic_bp) & diastolik (diastolic_bp).
- Riwayat Penyakit: Hipertensi, diabetes, gagal jantung (heart_failure), penyakit koroner (coronary_disease), serangan jantung (heart_attack).
- Kebiasaan Merokok: Pernah merokok (ever_smoked), perokok aktif (current_smoker).
- Fitur Tidur (5 fitur): Jam tidur (sleep_hours), frekuensi mendengkur (snoring_freq), apnea tidur (sleep_apnea), konsultasi masalah tidur ke dokter (sleep_problem_doctor), kantuk siang hari (daytime_sleepy).
- Fitur Stres (5 fitur): Kehilangan minat (stress_anhedonia), depresi (stress_depressed), kelelahan (stress_fatigue), gangguan konsentrasi (stress_concentration), harga diri rendah (stress_self_esteem).
- Fitur Aktivitas Fisik (5 fitur): Kerja fisik berat (vigorous_work), olahraga berat (vigorous_leisure), menit olahraga berat (vigorous_leisure_min), olahraga sedang (moderate_leisure), menit sedentary (sedentary_min).
Alur Pipeline & Preprocessing
Untuk mencegah kebocoran data (data leakage), preprocessing dilakukan secara ketat dengan urutan berikut:
- Merge: Menggabungkan 10 file modul berdasarkan responden ID (
SEQN). - Seleksi & Recode: Menyelaraskan kode respons survei (misal: 1=Ya, 0=Tidak, kode 7/9 menjadi
NaN). - Split Data: Pembagian data latih dan uji secara stratified (80% Train, 20% Test).
- Imputasi: Imputasi
Medianuntuk fitur numerik kontinyu,Modusuntuk kategorik/biner, dan0untuk aktivitas fisik. - Scaling: Standardisasi skala fitur menggunakan
StandardScaler(fit pada data train, transform pada test). - SMOTE: Penanganan class imbalance (~96% tidak stroke vs ~4% stroke) khusus pada data training saja.
Model & Desain Eksperimen
Eksperimen membandingkan 3 algoritma Machine Learning: Decision Tree, Random Forest, dan XGBoost diuji pada 5 skenario kombinasi fitur:
- Skenario A: Klinis saja (Baseline)
- Skenario B: Klinis + Tidur
- Skenario C: Klinis + Stres
- Skenario D: Klinis + Aktivitas Fisik
- Skenario E: Klinis + Semua Gaya Hidup
Model terbaik diinterpretasikan secara global dan lokal menggunakan SHAP (SHapley Additive exPlanations) untuk melihat kontribusi relatif kelompok fitur.
Struktur Notebook & Dokumentasi
notebooks/preprocessing_nhanes.ipynb: Mengunduh dataset mentah, melakukan penggabungan, pembersihan, split data, standardisasi, SMOTE, dan mengekspor file siap latih kedata/processed/.notebooks/training_nhanes.ipynb: Memuat data preprocessed, melakukan perbandingan training & evaluasi pada 5 skenario eksperimen, menyimpan tabel kereports/tables/, menyimpan gambar kereports/figures/, dan menghitung SHAP values untuk interpretasi model.notebooks/feature_selection.ipynb: Melakukan eksplorasi seleksi fitur dari dataset bersih didata/processed/nhanes_clean.csv.
Struktur Folder
data/raw/: Dataset mentah NHANES dalam format.xpt.data/processed/:manual/: Dataset hasil preprocessing (31 fitur) untuk pipeline baseline.feature_selection/: Dataset hasil preprocessing (24 fitur) untuk pipeline seleksi fitur statistik.notebooks/:manual/: Notebook pengerjaan utama untuk pipeline baseline.feature_selection/: Notebook pengerjaan utama untuk pipeline seleksi fitur statistik.models/:manual/: Tempat menyimpan file model terlatih untuk pipeline baseline.feature_selection/: Tempat menyimpan file model terlatih untuk pipeline seleksi fitur.reports/:manual/: Visualisasi (figures/) dan tabel metrik (tables/) untuk pipeline baseline.feature_selection/: Visualisasi (figures/) dan tabel metrik (tables/) untuk pipeline seleksi fitur.experiments/: Berisi skrip Python independen (sepertirun_train_feature_selection.py).docs/: Dokumentasi progres dan referensi proyek.external/: Salinan repo/dataset eksternal sebagai referensi.
Live Demo & Deployment
Aplikasi ini telah dideploy secara publik dan dapat diakses melalui tautan berikut:
- Frontend Web App (Next.js): https://nhanes-stroke-dataset.vercel.app
- Backend API (FastAPI): Hugging Face Spaces
- Direct API Endpoint:
https://adityamulyaf-nhanes-stroke-api.hf.space
Panduan Menjalankan Secara Lokal
1. Prasyarat
Pastikan Anda sudah menginstal Python 3.10+ dan Node.js 18+.
2. Jalankan Backend (FastAPI)
- Buka terminal baru dan masuk ke root folder proyek:
pip install -r backend/requirements.txt- Jalankan server backend menggunakan
uvicorn:
python -m uvicorn backend.app.main:app --reload --port 8000 API akan berjalan di http://localhost:8000.
3. Jalankan Frontend (Next.js)
- Buka terminal baru lainnya, lalu masuk ke direktori
frontend:
cd frontend
npm install- Buat file
.env.localdi dalam folderfrontend/dan tentukan URL API backend lokal Anda:
NEXT_PUBLIC_API_URL=http://localhost:8000- Jalankan server Next.js dalam mode pengembangan:
npm run dev Aplikasi akan berjalan di http://localhost:3000.
