Key Steps
Data dimuat dari sumber publik menggunakan readr::read_csv().
Kolom artefak (...1 / Unnamed) dihapus untuk menjaga prinsip Tidy Data.
Pemeriksaan tipe data dengan str(), class(), dan identifikasi missing values.
Tabel 1.1 — Identifikasi Struktur & Tipe Data
Pemeriksaan Missing Values per Variabel
Key Steps
Konversi variabel kategorikal ke factor().
Imputasi nilai numerik hilang dengan median; kategorik dengan modus.
Standardisasi unit: berat badan dalam kg, tinggi badan dalam cm.
Reorder kolom: unit metrik (kg/cm) ditempatkan di posisi utama.
Tabel 2.1 — Dataset Final Terstandardisasi (Unit kg/cm)
Ringkasan Statistik: Verifikasi Standardisasi Unit Metrik
IQR Formula
IQR = Q3 − Q1 |
Lower = Q1 − 1.5 × IQR |
Upper = Q3 + 1.5 × IQR
Z-Score: nilai dengan |Z| > 3 dianggap outlier ekstrem.
[!] Domain check: glucose sangat tinggi mungkin valid untuk pasien diabetes.
Outlier Summary Table
Kolom IQR dan Z menunjukkan jumlah outlier per metode. Baris di-highlight otomatis berdasarkan jumlah outlier.
Interpretasi Boxplot
Berdasarkan boxplot yang ditampilkan, terlihat distribusi dan sebaran data dari empat
variabel klinis yaitu Age, BMI, Blood_Pressure, dan variabel
PhysicalActivity. Variabel PhysicalActivity memiliki rentang nilai paling
lebar dibandingkan variabel lainnya, dengan distribusi yang cukup merata dari 0 hingga
sekitar 550, menandakan variasi aktivitas fisik antar pasien sangat tinggi. Variabel
Age menunjukkan distribusi yang relatif simetris dengan median di sekitar nilai
tengah, yang berarti sebaran usia pasien cukup merata. BMI memiliki boxplot yang
sempit dan terpusat, mengindikasikan bahwa sebagian besar pasien memiliki nilai BMI yang
tidak terlalu jauh berbeda satu sama lain. Blood_Pressure terlihat memiliki satu
titik outlier di sisi kanan boxplot, yang menandakan ada satu atau beberapa pasien dengan
tekanan darah yang jauh lebih tinggi dari rata-rata populasi dataset.
Key Steps
Simulasi 10 pasien × 50 kunjungan untuk analisis longitudinal.
ΔBMI = BMI sekarang − BMI kunjungan sebelumnya · dihitung dengan lag().
Rolling Average Detak Jantung menggunakan zoo::rollmean() dengan k=3 dan k=5.
Value box menampilkan total pasien, kunjungan, rata-rata kunjungan/pasien, dan window size.
50
📊 Kunjungan per Pasien
k = 3
🔄 Window Rolling Average
Ringkasan Statistik per Pasien
Perubahan BMI (ΔBMI) per Pasien
BMI Sekarang vs BMI Sebelumnya
Rolling Average Detak Jantung
Heatmap & Tabel Rolling Average
Strategi Pengkodean Variabel Kategorikal
One-Hot Encoding: Digunakan untuk variabel nominal (tanpa urutan makna),
seperti kolom Location. Setiap kategori diubah menjadi kolom biner (0 atau 1).
Label Encoding: Digunakan untuk variabel ordinal (memiliki urutan makna),
seperti kolom Health_Condition. Setiap kategori diberi kode integer berurutan.
Gunakan model.matrix() atau fastDummies::dummy_cols() untuk one-hot,
dan factor() + as.integer() untuk label encoding di R.
1. One-Hot Encoding - kolom Location
Penjelasan: Kolom Location berisi nama kota (Bandung, Jakarta, Makassar, Medan, Surabaya) -
variabel nominal tanpa urutan. Setiap kota diubah menjadi kolom biner tersendiri (0 = bukan kota ini, 1 = kota ini).
Kolom Location_Bandung dihilangkan sebagai referensi untuk menghindari dummy variable trap.
Tabel Before-After (8 baris pertama)
| Location (asli) |
Location_Jakarta |
Location_Makassar |
Location_Medan |
Location_Surabaya |
| Makassar |
0 |
1 |
0 |
0 |
| Jakarta |
1 |
0 |
0 |
0 |
| Surabaya |
0 |
0 |
0 |
1 |
| Bandung |
0 |
0 |
0 |
0 |
| Makassar |
0 |
1 |
0 |
0 |
| Bandung |
0 |
0 |
0 |
0 |
| Makassar |
0 |
1 |
0 |
0 |
| Jakarta |
1 |
0 |
0 |
0 |
Bar Chart - Distribusi Pasien per Kota
???? Interpretasi One-Hot Encoding - Location:
Dari bar chart terlihat bahwa distribusi pasien antar 5 kota besar di Indonesia relatif merata,
masing-masing berkisar ~100 pasien dari total 500 data. Ini menunjukkan pengambilan sampel yang proporsional
dan tidak ada bias geografis dalam dataset.
Mengapa One-Hot Encoding dipilih? Karena Location adalah variabel nominal -
tidak ada urutan atau hierarki antar kota. Bandung tidak lebih tinggi atau rendah dari Jakarta.
Jika digunakan Label Encoding (misal Bandung=1, Jakarta=2), model akan keliru mengasumsikan
bahwa Jakarta dua kali lebih besar dari Bandung, padahal tidak demikian.
Hasil setelah encoding: Kolom Location diubah menjadi 4 kolom biner baru:
• Location_Jakarta → 1 jika pasien berasal dari Jakarta, 0 jika tidak
• Location_Makassar → 1 jika pasien berasal dari Makassar, 0 jika tidak
• Location_Medan → 1 jika pasien berasal dari Medan, 0 jika tidak
• Location_Surabaya → 1 jika pasien berasal dari Surabaya, 0 jika tidak
• Location_Bandung dihilangkan → dijadikan referensi (baseline)
untuk menghindari dummy variable trap (multikolinearitas sempurna antar kolom dummy).
Dengan encoding ini, model machine learning dapat menganalisis apakah lokasi geografis seorang pasien
berpengaruh terhadap kondisi kesehatannya secara statistik.
2. Label Encoding - kolom Health_Condition
Penjelasan: Kolom Health_Condition memiliki urutan keparahan yang logis:
dari kondisi paling sehat (Healthy) hingga paling berat (Cardiovascular Disease).
Karena ada urutan makna, digunakan Label Encoding (bukan One-Hot) agar model dapat
memahami tingkatan keparahan tersebut.
Tabel Mapping: Kategori -> Kode Angka
| Health_Condition (asli) |
Health_Condition_Label |
Makna |
| Healthy |
0 |
Kondisi normal / sehat |
| Obesity |
1 |
Kelebihan berat badan |
| Diabetes |
2 |
Gangguan gula darah |
| Hypertension |
3 |
Tekanan darah tinggi |
| Cardiovascular Disease |
4 |
Penyakit jantung / pembuluh darah |
Bar Chart - Distribusi Kondisi Kesehatan Pasien
???? Interpretasi Label Encoding - Health_Condition:
Dari bar chart terlihat distribusi 5 kondisi kesehatan pasien cukup merata, masing-masing
sekitar 100 pasien. Ini menunjukkan dataset mencakup berbagai profil kesehatan secara seimbang.
Penjelasan tiap kondisi dan kode label-nya:
• Healthy (0) - Kondisi tubuh normal, tidak terdeteksi penyakit kronis.
Pasien dengan label ini memiliki nilai BMI, tekanan darah, glukosa, dan kolesterol dalam rentang normal.
• Obesity (1) - Kelebihan berat badan signifikan (BMI ≥ 30). Merupakan faktor risiko
utama untuk diabetes tipe 2, hipertensi, dan penyakit jantung. Dikodekan lebih tinggi dari Healthy
karena tingkat risikonya lebih besar.
• Diabetes (2) - Gangguan metabolisme gula darah kronis. Kadar glukosa darah
melebihi batas normal (>126 mg/dL). Dapat menyebabkan kerusakan organ jangka panjang jika
tidak ditangani, sehingga keparahannya lebih tinggi dari Obesity.
• Hypertension (3) - Tekanan darah tinggi secara persisten (≥140/90 mmHg).
Meningkatkan risiko stroke, gagal jantung, dan gagal ginjal. Dikodekan lebih tinggi karena
dampak sistemiknya yang luas pada organ vital.
• Cardiovascular Disease (4) - Penyakit jantung dan pembuluh darah (misalnya
penyakit arteri koroner, gagal jantung). Ini adalah kondisi paling kritis dalam dataset,
seringkali merupakan komplikasi akhir dari diabetes dan hipertensi yang tidak terkontrol.
Mengapa Label Encoding dipilih? Karena ada urutan keparahan yang jelas:
Healthy → Obesity → Diabetes → Hypertension → Cardiovascular Disease.
Model regresi atau tree-based dapat memanfaatkan urutan ini untuk mempelajari pola keparahan penyakit.
Penggunaan One-Hot di sini justru akan menghilangkan informasi ordinal yang berharga tersebut.
Kaitan Smoking & Drinking dengan Kondisi Kesehatan di Dataset
Meskipun kolom Smoking dan Drinking tidak tersedia secara eksplisit
dalam dataset ini, kedua variabel gaya hidup tersebut diketahui secara ilmiah sebagai
faktor risiko utama dari seluruh penyakit yang terdapat pada kolom
Health_Condition. Berikut penjelasan keterkaitan langsung tiap penyakit dengan
kebiasaan merokok dan konsumsi alkohol:
Obesity (Label: 1)
???? Smoking: Merokok mengubah metabolisme tubuh dan dapat menyebabkan
penumpukan lemak visceral (lemak perut dalam), meskipun perokok aktif sering terlihat
lebih kurus - efek jangka panjangnya justru meningkatkan risiko obesitas sentral.
???? Drinking: Alkohol mengandung kalori kosong tinggi (~7 kkal/gram). Konsumsi
rutin menyebabkan penumpukan lemak di hati dan perut (beer belly),
memicu resistensi insulin dan obesitas.
Diabetes (Label: 2)
???? Smoking: Nikotin meningkatkan kadar gula darah dan menyebabkan
resistensi insulin. Perokok memiliki risiko 30-40% lebih tinggi terkena
diabetes tipe 2 dibanding bukan perokok.
???? Drinking: Alkohol berlebihan merusak pankreas (organ penghasil insulin)
dan menyebabkan fluktuasi gula darah yang ekstrem. Konsumsi kronis memicu
pankreatitis yang berujung pada diabetes tipe 3c.
Hypertension (Label: 3)
???? Smoking: Nikotin menyebabkan vasokonstriksi (penyempitan pembuluh darah)
secara langsung dan meningkatkan tekanan darah dalam hitungan menit setelah merokok.
Merokok jangka panjang merusak dinding arteri sehingga tekanan darah tinggi menjadi permanen.
???? Drinking: Alkohol meningkatkan kadar kortisol (hormon stres) yang memicu
peningkatan tekanan darah. Konsumsi >3 gelas/hari meningkatkan risiko hipertensi
hingga 2 kali lipat.
Cardiovascular Disease (Label: 4)
???? Smoking: Ini adalah penyebab utama penyakit kardiovaskular yang dapat
dicegah. Merokok merusak lapisan dalam arteri (endotelium), memicu
penumpukan plak (aterosklerosis), meningkatkan risiko serangan jantung
dan stroke hingga 4 kali lipat.
???? Drinking: Alkohol berlebihan melemahkan otot jantung (kardiomiopati
alkoholik), menyebabkan aritmia (atrial fibrillation), dan
meningkatkan risiko stroke hemoragik. Kombinasi alkohol + rokok melipatgandakan
risiko penyakit kardiovaskular secara sinergis.
???? Kesimpulan: Jika variabel Smoking dan Drinking
tersedia dalam dataset, keduanya akan menjadi kandidat kuat untuk dilakukan
One-Hot Encoding (karena bersifat nominal: Ya/Tidak) sebelum dimasukkan ke model.
Model prediktif kemudian dapat mengungkap seberapa besar kontribusi kebiasaan merokok
dan minum alkohol terhadap kemungkinan seseorang masuk ke kategori
Obesity, Diabetes, Hypertension, atau Cardiovascular Disease.
Perbandingan Visual: Original . Z-Score . Min-Max (Scatter)
Tiap series menggunakan sumbu skalanya sendiri - bentuk persebaran data tetap identik.
???? Biru = Original . ???? Hijau = Z-Score (mean=0, sd=1) . ???? Oranye = Min-Max ([0,1])
Interpretasi Hasil Normalisasi
Pertama, pada data Original,
sebaran titik menunjukkan nilai asli pasien di mana variabel Glucose memiliki
rentang angka yang jauh lebih besar dibandingkan BMI. Meskipun memberikan informasi
nyata, perbedaan skala yang drastis ini dapat menyebabkan model algoritma tertentu
memberikan bobot yang tidak seimbang pada variabel dengan angka yang lebih besar.
Kedua, melalui metode Z-Score Scaling,
data ditransformasi sedemikian rupa sehingga memiliki nilai rata-rata nol dan standar deviasi satu.
Hal ini memungkinkan kita untuk mengidentifikasi outlier secara objektif, di mana titik-titik
yang berada jauh di luar rentang angka -3 hingga 3 dianggap sebagai
nilai ekstrem yang perlu perhatian khusus dalam analisis medis.
Ketiga, penggunaan Min-Max Scaling
memetakan seluruh data ke dalam rentang tetap antara 0 dan 1.
Pendekatan ini sangat efektif untuk menormalisasi variabel yang memiliki satuan berbeda
(seperti mg/dL dan kg/m^2) ke dalam satu standar pengukuran tanpa menghilangkan esensi
informasi aslinya.
Secara keseluruhan, meskipun ketiga grafik menggunakan skala angka yang berbeda,
pola distribusi data tetap terlihat identik. Hal ini mengonfirmasi bahwa proses transformasi
data yang dilakukan oleh tim berhasil mengubah skala pengukuran demi kebutuhan komputasi
mesin tanpa merusak korelasi atau struktur informasi yang terkandung dalam dataset
kesehatan tersebut.