PENDAHULUAN
Studi Kasus: Obesitas
Obesitas adalah kondisi medis yang ditandai dengan penumpukan lemak tubuh secara berlebihan sehingga dapat meningkatkan risiko berbagai penyakit kronis, termasuk hipertensi, diabetes tipe 2, penyakit jantung, dan beberapa jenis kanker (World Health Organization, 2020). Masalah ini bukan hanya berdampak pada kesehatan individu, tetapi juga menimbulkan konsekuensi sosial dan ekonomi, seperti meningkatnya biaya layanan kesehatan dan menurunnya produktivitas masyarakat. Tren kenaikan prevalensi obesitas di berbagai negara menunjukkan urgensi untuk memahami faktor-faktor penyebabnya, termasuk perilaku makan, aktivitas fisik, dan kondisi fisik individu.
Menurut World Health Organization (WHO), obesitas didefinisikan sebagai kondisi dimana Body Mass Index (BMI) ≥ 30 kg/m². Fakta global menunjukkan bahwa lebih dari 1,9 miliar orang dewasa mengalami kelebihan berat badan pada tahun 2016, dengan sekitar 650 juta di antaranya mengalami obesitas. Prevalensi obesitas meningkat hampir 3 kali lipat sejak tahun 1975, namun kondisi ini dapat dicegah dengan intervensi gaya hidup yang tepat.
Analisis faktor-faktor yang memengaruhi obesitas penting dilakukan agar intervensi kesehatan dapat lebih tepat sasaran. Dengan memahami determinan obesitas, kebijakan kesehatan dan program pencegahan dapat dirancang berdasarkan bukti, bukan asumsi. Selain itu, prediksi tingkat obesitas menggunakan data empiris memungkinkan pemetaan risiko populasi dan identifikasi kelompok yang membutuhkan perhatian lebih. Oleh karena itu, penelitian ini berfokus pada pengembangan model prediktif untuk mengestimasi tingkat obesitas berdasarkan kebiasaan makan dan kondisi fisik individu.
Dampak Obesitas terhadap Kesehatan
Obesitas dapat memicu berbagai penyakit kronis yang serius, antara lain:
- Diabetes mellitus tipe 2: Resistensi insulin meningkat seiring dengan penumpukan lemak visceral
- Penyakit kardiovaskular: Termasuk penyakit jantung koroner dan stroke akibat penumpukan plak pada pembuluh darah
- Hipertensi: Tekanan darah tinggi akibat beban kerja jantung yang meningkat
- Sleep apnea: Gangguan tidur akibat penyumbatan saluran napas
- Osteoarthritis: Kerusakan sendi akibat beban berlebih
- Beberapa jenis kanker: Termasuk kanker payudara, kolon, dan endometrium
Faktor Risiko Obesitas
Beberapa faktor risiko yang berkontribusi terhadap obesitas meliputi:
- Pola makan tidak sehat dengan konsumsi makanan tinggi kalori secara berlebihan
- Kurangnya aktivitas fisik dan gaya hidup sedentari
- Faktor genetik dan riwayat keluarga dengan obesitas
- Gangguan tidur dan kurang istirahat
- Konsumsi alkohol berlebihan
- Penggunaan teknologi yang berlebihan yang mengurangi aktivitas fisik
Urgensi Prediksi Level Obesitas
Deteksi dini tingkat obesitas sangat penting dalam konteks kesehatan masyarakat karena beberapa alasan:
- Pencegahan Primer: Identifikasi individu berisiko sebelum mencapai tahap obesitas parah memungkinkan intervensi dini yang lebih efektif dan murah
- Intervensi Tepat Sasaran: Kategorisasi level obesitas membantu tenaga kesehatan memberikan rekomendasi yang sesuai dengan tingkat keparahan masing-masing individu
- Efisiensi Biaya Kesehatan: Mencegah progresivitas obesitas lebih ekonomis dibandingkan mengobati komplikasi yang sudah terjadi
- Peningkatan Kualitas Hidup: Model prediktif membantu individu dan praktisi kesehatan mengambil tindakan preventif secara proaktif
Tentang Dataset
Sumber Data
Penelitian ini memanfaatkan dataset Estimation of Obesity Levels Based On Eating Habits and Physical Condition yang tersedia di UCI Machine Learning Repository (2019). Dataset ini mencakup informasi tentang kebiasaan makan, aktivitas fisik, serta karakteristik fisik responden, yang kemudian dikategorikan ke dalam tingkat obesitas tertentu. Kombinasi variabel numerik dan kategorikal dalam dataset ini memungkinkan analisis yang lebih mendalam, karena dapat menangkap pengaruh perilaku dan kondisi fisik secara simultan terhadap kemungkinan seseorang mengalami obesitas.
Informasi Dataset:
- Repositori: UCI Machine Learning Repository
- Link Dataset: https://archive.ics.uci.edu/ml/datasets/Estimation+of+obesity+levels+based+on+eating+habits+and+physical+condition
- Tahun: 2019
- Jumlah Observasi: 2,111 responden
- Jumlah Variabel: 17 variabel (16 prediktor + 1 target)
- Cakupan Geografis: Data responden dari Meksiko, Peru, dan Kolombia
- Rentang Usia: 14-61 tahun
Dataset ini memiliki keunggulan dari sisi dokumentasi yang lengkap dan variabel yang relevan, sehingga memudahkan proses eksplorasi data, visualisasi, dan pembangunan model prediktif. Setiap observasi di dataset ini merepresentasikan individu dengan kategori obesitas yang jelas, sehingga model yang dibangun dapat menilai pengaruh faktor-faktor tertentu secara langsung terhadap peluang seseorang berada pada kategori tersebut (UCI Machine Learning Repository, 2019).
Deskripsi Variabel
Berikut adalah penjelasan rinci mengenai setiap variabel dalam dataset:
| No | Variabel | Tipe | Deskripsi |
|---|---|---|---|
| 1 | Gender | Kategorikal | Jenis kelamin responden (Male/Female), penting karena distribusi lemak tubuh dan risiko obesitas berbeda antara pria dan wanita |
| 2 | Age | Numerik | Usia responden dalam tahun, relevan karena metabolisme dan kebiasaan makan berubah seiring bertambahnya usia |
| 3 | Height | Numerik | Tinggi badan responden dalam meter, digunakan untuk menghitung BMI |
| 4 | Weight | Numerik | Berat badan responden dalam kg, variabel inti dalam menentukan kategori obesitas |
| 5 | family_history_with_overweight | Kategorikal | Riwayat anggota keluarga yang mengalami kelebihan berat badan (yes/no), menunjukkan faktor genetik dan lingkungan |
| 6 | FAVC | Kategorikal | Konsumsi makanan tinggi kalori secara sering (yes/no), meningkatkan risiko obesitas |
| 7 | FCVC | Numerik | Frekuensi konsumsi sayuran (1-3), diet tinggi sayuran biasanya menurunkan risiko obesitas |
| 8 | NCP | Numerik | Jumlah makanan utama per hari, memengaruhi total asupan kalori |
| 9 | CAEC | Kategorikal | Kebiasaan makan di antara waktu makan utama, dapat menambah asupan kalori harian |
| 10 | SMOKE | Kategorikal | Kebiasaan merokok (yes/no), memengaruhi metabolisme dan nafsu makan |
| 11 | CH2O | Numerik | Konsumsi air per hari dalam liter, mendukung metabolisme |
| 12 | SCC | Kategorikal | Pemantauan kalori yang dikonsumsi (yes/no), membantu pengendalian diet |
| 13 | FAF | Numerik | Frekuensi aktivitas fisik per minggu, meningkatkan pengeluaran energi |
| 14 | TUE | Numerik | Waktu penggunaan perangkat teknologi dalam jam per hari, berkorelasi dengan perilaku sedentari |
| 15 | CALC | Kategorikal | Frekuensi konsumsi alkohol, menambah asupan kalori |
| 16 | MTRANS | Kategorikal | Jenis transportasi yang biasa digunakan, memengaruhi tingkat aktivitas fisik harian |
| 17 | NObeyesdad | Kategorikal | Kategori tingkat obesitas, variabel target yang menjadi outcome analisis |
Kategori Target (NObeyesdad):
- Insufficient_Weight - Berat Badan Kurang (BMI < 18.5)
- Normal_Weight - Berat Badan Normal (BMI 18.5-24.9) - Kategori Referensi
- Overweight_Level_I - Kelebihan Berat Badan Tingkat I (BMI 25.0-27.4)
- Overweight_Level_II - Kelebihan Berat Badan Tingkat II (BMI 27.5-29.9)
- Obesity_Type_I - Obesitas Tipe I (BMI 30.0-34.9)
- Obesity_Type_II - Obesitas Tipe II (BMI 35.0-39.9)
- Obesity_Type_III - Obesitas Tipe III/Morbid (BMI ≥ 40.0)
- Obesity_Type_I (Obesitas Tipe I)
- Obesity_Type_II (Obesitas Tipe II)
- Obesity_Type_III (Obesitas Tipe III)
Metode: Regresi Logistik Multinomial
Konsep Dasar
Untuk memodelkan hubungan antara faktor-faktor yang memengaruhi obesitas dengan kategori obesitas yang berbeda, digunakan regresi logistik multinomial. Metode ini merupakan perluasan dari regresi logistik biner, sehingga dapat menangani outcome dengan lebih dari dua kategori (Hosmer et al., 2013). Berbeda dengan regresi logistik biner yang hanya membedakan dua kemungkinan hasil, model multinomial memungkinkan prediksi beberapa kategori sekaligus, misalnya Normal, Overweight, dan Obese.
Regresi logistik multinomial bekerja dengan membandingkan setiap kategori outcome terhadap kategori dasar (base category). Setiap koefisien variabel bebas kemudian menunjukkan pengaruh variabel tersebut terhadap peluang observasi masuk kategori tertentu dibanding kategori dasar. Hal ini memudahkan interpretasi secara langsung mengenai faktor mana yang meningkatkan atau menurunkan kemungkinan seseorang berada pada tingkat obesitas tertentu.
Karakteristik MLR:
- Variabel Dependen: Kategorikal dengan > 2 kategori (nominal atau ordinal yang diperlakukan sebagai nominal)
- Variabel Independen: Dapat berupa numerik atau kategorikal
- Asumsi: Independence of Irrelevant Alternatives (IIA)
- Estimasi: Maximum Likelihood Estimation (MLE)
Formula Matematika
Secara matematis, peluang observasi masuk kategori tertentu dibanding kategori dasar dapat dituliskan sebagai:
\[\ln\left(\frac{P(Y=j)}{P(Y=\text{dasar})}\right) = \beta_{0j} + \beta_{1j}X_1 + \beta_{2j}X_2 + ... + \beta_{pj}X_p\]
Dimana:
- P(Y=j) adalah probabilitas masuk kategori j
- P(Y=dasar) adalah probabilitas masuk kategori dasar (referensi)
- X₁, X₂, …, Xₚ adalah variabel bebas yang memengaruhi hasil
- β adalah koefisien yang menunjukkan arah dan besar pengaruh
Probabilitas untuk setiap kategori dihitung dengan formula:
\[P(Y=k|X) = \frac{e^{\beta_{k0} + \beta_k X}}{1 + \sum_{j=1}^{K-1} e^{\beta_{j0} + \beta_j X}}\]
Koefisien positif menunjukkan peningkatan peluang untuk masuk kategori tersebut dibanding kategori referensi, sedangkan koefisien negatif menunjukkan penurunan peluang.
Alasan Pemilihan Metode
Mengapa Multinomial Logistic Regression cocok untuk prediksi obesitas?
Variabel Target Multi-Kategori: NObeyesdad memiliki 7 level obesitas yang bersifat kategorikal, sehingga memerlukan metode klasifikasi multi-class yang dapat menangani semua kategori secara simultan.
Interpretabilitas Tinggi: MLR memberikan odds ratio yang mudah diinterpretasi untuk memahami pengaruh setiap prediktor terhadap peluang masuk kategori tertentu dibanding kategori referensi. Hal ini sangat penting dalam konteks kesehatan untuk mengidentifikasi faktor risiko.
Tidak Memerlukan Asumsi Normalitas: Berbeda dengan Linear Discriminant Analysis (LDA), MLR tidak mengasumsikan distribusi normal pada prediktor, sehingga lebih robust terhadap berbagai jenis data.
Fleksibilitas Variabel: Dapat menangani prediktor numerik dan kategorikal secara bersamaan tanpa memerlukan transformasi khusus.
Standar dalam Epidemiologi: MLR adalah metode standar dalam penelitian kesehatan masyarakat untuk analisis faktor risiko dengan outcome multi-kategori (Kleinbaum & Klein, 2010).
Penerapan pada Dataset Obesitas
Dalam penelitian ini, variabel bebas mencakup berbagai indikator kebiasaan makan, aktivitas fisik, dan karakteristik fisik, sementara variabel terikat adalah kategori obesitas dengan Normal_Weight sebagai kategori referensi. Analisis regresi logistik multinomial memungkinkan identifikasi faktor-faktor yang paling berpengaruh terhadap peluang seseorang berada pada kategori obesitas tertentu. Dengan membandingkan peluang antar kategori (misalnya Overweight vs Normal atau Obese vs Normal), penelitian ini dapat menyoroti determinan utama obesitas yang menjadi dasar untuk intervensi kesehatan berbasis bukti.
Alur Analisis
Analisis dalam penelitian ini dilakukan secara sistematis melalui tahapan berikut:
- Load Data - Memuat dataset obesitas dari file CSV dan memverifikasi struktur data
- Data Preprocessing - Pengecekan kelengkapan data (missing values), identifikasi dan penghapusan duplikat, serta konversi tipe data variabel
- Feature Engineering - Perhitungan Body Mass Index (BMI) sebagai indikator kuantitatif utama obesitas
- Exploratory Data Analysis - Statistik deskriptif untuk memahami karakteristik data dan visualisasi untuk mengidentifikasi pola dan hubungan antar variabel
- Variable Selection - Seleksi variabel menggunakan metode Stepwise berbasis AIC untuk memperoleh model yang parsimoni
- Model Building - Training model Multinomial Logistic Regression pada data training
- Model Evaluation - Evaluasi performa model menggunakan akurasi, Confusion Matrix, dan analisis ROC/AUC pada data testing
LOAD DATA & LIBRARY
Library
Langkah ini dilakukan untuk memuat seluruh pustaka R yang diperlukan guna mendukung proses manipulasi data, pemodelan statistik, evaluasi model, dan visualisasi hasil analisis.
library(dplyr)
library(nnet)
library(MASS)
library(caret)
library(tidyr)
library(ggplot2)
library(pROC)
library(reshape2)
Penjelasan Library:
dplyr&tidyr: Manipulasi dan transformasi data secara efisien dengan sintaks yang intuitifnnet: Pemodelan Multinomial Logistic Regression menggunakan neural network sederhanaMASS: Fungsi stepAIC untuk seleksi variabel otomatis berdasarkan kriteria AICcaret: Pembagian data training-testing dengan stratified samplingggplot2: Visualisasi data dengan grammar of graphicspROC: Analisis Receiver Operating Characteristic (ROC) dan Area Under Curve (AUC)reshape2: Transformasi data untuk pembuatan heatmap korelasi
Load Data
raw <- read.csv("obesitas.csv", stringsAsFactors = FALSE)
cat("Jumlah observasi awal:", nrow(raw), "\n")
## Jumlah observasi awal: 2111
cat("Jumlah variabel:", ncol(raw), "\n")
## Jumlah variabel: 17
Interpretasi:
Dataset berhasil dimuat dengan 2,111 observasi dan 17 variabel. Pemeriksaan awal melalui penampilan struktur data memberikan gambaran mengenai variabel demografis, perilaku, serta variabel respon kategori obesitas. Tahap ini penting untuk memastikan data terbaca dengan benar sebelum dilakukan proses pembersihan dan transformasi lebih lanjut.
Preview Dataset Asli
head(raw, 10)
## Gender Age Height Weight family_history_with_overweight FAVC FCVC NCP
## 1 Female 21 1.62 64.0 yes no 2 3
## 2 Female 21 1.52 56.0 yes no 3 3
## 3 Male 23 1.80 77.0 yes no 2 3
## 4 Male 27 1.80 87.0 no no 3 3
## 5 Male 22 1.78 89.8 no no 2 1
## 6 Male 29 1.62 53.0 no yes 2 3
## 7 Female 23 1.50 55.0 yes yes 3 3
## 8 Male 22 1.64 53.0 no no 2 3
## 9 Male 24 1.78 64.0 yes yes 3 3
## 10 Male 22 1.72 68.0 yes yes 2 3
## CAEC SMOKE CH2O SCC FAF TUE CALC MTRANS
## 1 Sometimes no 2 no 0 1 no Public_Transportation
## 2 Sometimes yes 3 yes 3 0 Sometimes Public_Transportation
## 3 Sometimes no 2 no 2 1 Frequently Public_Transportation
## 4 Sometimes no 2 no 2 0 Frequently Walking
## 5 Sometimes no 2 no 0 0 Sometimes Public_Transportation
## 6 Sometimes no 2 no 0 0 Sometimes Automobile
## 7 Sometimes no 2 no 1 0 Sometimes Motorbike
## 8 Sometimes no 2 no 3 0 Sometimes Public_Transportation
## 9 Sometimes no 2 no 1 1 Frequently Public_Transportation
## 10 Sometimes no 2 no 1 1 no Public_Transportation
## NObeyesdad
## 1 Normal_Weight
## 2 Normal_Weight
## 3 Normal_Weight
## 4 Overweight_Level_I
## 5 Overweight_Level_II
## 6 Normal_Weight
## 7 Normal_Weight
## 8 Normal_Weight
## 9 Normal_Weight
## 10 Normal_Weight
Dataset mencakup responden dari Meksiko, Peru, dan Kolombia dengan berbagai karakteristik demografis, kebiasaan makan, dan kondisi fisik. Setiap baris merepresentasikan satu individu dengan profil lengkap yang akan digunakan untuk memprediksi kategori obesitas.
EXPLORATORY DATA ANALYSIS (EDA)
Data Preprocessing
Tahap preprocessing bertujuan untuk menyiapkan data agar siap dianalisis dan dimodelkan. Proses ini meliputi pengecekan kelengkapan data, identifikasi duplikat, dan konversi tipe data variabel.
1. Pengecekan Missing Values
Pengecekan missing values penting untuk memastikan kelengkapan data sebelum analisis lebih lanjut. Missing values dapat menyebabkan bias dalam model jika tidak ditangani dengan tepat.
cat("=== PENGECEKAN MISSING VALUES ===\n\n")
## === PENGECEKAN MISSING VALUES ===
missing_count <- colSums(is.na(raw))
cat("Missing values per variabel:\n")
## Missing values per variabel:
print(missing_count)
## Gender Age
## 0 0
## Height Weight
## 0 0
## family_history_with_overweight FAVC
## 0 0
## FCVC NCP
## 0 0
## CAEC SMOKE
## 0 0
## CH2O SCC
## 0 0
## FAF TUE
## 0 0
## CALC MTRANS
## 0 0
## NObeyesdad
## 0
cat("\nTotal missing values:", sum(missing_count), "\n")
##
## Total missing values: 0
Interpretasi:
Tidak ditemukan missing values pada dataset. Semua 2,111 observasi memiliki data lengkap untuk semua 17 variabel. Hal ini menunjukkan kualitas data yang baik dari sisi kelengkapan dan tidak memerlukan imputasi atau penghapusan data. Dataset ini siap untuk tahap analisis selanjutnya tanpa perlu penanganan missing value.
2. Pengecekan Data Duplikat
Penghapusan data duplikat penting untuk mencegah bias dalam model karena observasi yang sama tidak boleh dihitung lebih dari sekali dalam proses training.
cat("=== PENGECEKAN DATA DUPLIKAT ===\n\n")
## === PENGECEKAN DATA DUPLIKAT ===
n_before <- nrow(raw)
raw <- raw %>% distinct()
n_after <- nrow(raw)
n_removed <- n_before - n_after
cat("Jumlah data sebelum:", n_before, "\n")
## Jumlah data sebelum: 2111
cat("Jumlah data setelah:", n_after, "\n")
## Jumlah data setelah: 2087
cat("Data duplikat dihapus:", n_removed, "\n")
## Data duplikat dihapus: 24
Interpretasi:
Ditemukan 24 baris data duplikat yang telah dihapus menggunakan
fungsi distinct(). Penghapusan duplikat bertujuan untuk
memastikan bahwa setiap observasi merepresentasikan individu yang unik
sehingga tidak terjadi bias akibat pengulangan data dalam proses
pemodelan. Dataset bersih sekarang memiliki 2,087 observasi unik yang
siap untuk analisis lebih lanjut.
3. Konversi Tipe Data
Tahap ini bertujuan untuk menyiapkan data agar sesuai dengan kebutuhan pemodelan regresi logistik multinomial, melalui konversi variabel kategorikal menjadi faktor dengan level yang tepat.
clean <- raw %>%
mutate(
NObeyesdad = factor(NObeyesdad, levels=c("Insufficient_Weight","Normal_Weight",
"Overweight_Level_I","Overweight_Level_II",
"Obesity_Type_I","Obesity_Type_II","Obesity_Type_III")),
Gender = factor(Gender),
family_history_with_overweight = factor(family_history_with_overweight),
FAVC = factor(FAVC),
CAEC = factor(CAEC),
SMOKE = factor(SMOKE),
SCC = factor(SCC),
CALC = factor(CALC),
MTRANS = factor(MTRANS)
)
# Set reference category
clean$NObeyesdad <- relevel(clean$NObeyesdad, ref="Normal_Weight")
cat("=== STRUKTUR DATA SETELAH KONVERSI ===\n\n")
## === STRUKTUR DATA SETELAH KONVERSI ===
str(clean)
## 'data.frame': 2087 obs. of 17 variables:
## $ Gender : Factor w/ 2 levels "Female","Male": 1 1 2 2 2 2 1 2 2 2 ...
## $ Age : num 21 21 23 27 22 29 23 22 24 22 ...
## $ Height : num 1.62 1.52 1.8 1.8 1.78 1.62 1.5 1.64 1.78 1.72 ...
## $ Weight : num 64 56 77 87 89.8 53 55 53 64 68 ...
## $ family_history_with_overweight: Factor w/ 2 levels "no","yes": 2 2 2 1 1 1 2 1 2 2 ...
## $ FAVC : Factor w/ 2 levels "no","yes": 1 1 1 1 1 2 2 1 2 2 ...
## $ FCVC : num 2 3 2 3 2 2 3 2 3 2 ...
## $ NCP : num 3 3 3 3 1 3 3 3 3 3 ...
## $ CAEC : Factor w/ 4 levels "Always","Frequently",..: 4 4 4 4 4 4 4 4 4 4 ...
## $ SMOKE : Factor w/ 2 levels "no","yes": 1 2 1 1 1 1 1 1 1 1 ...
## $ CH2O : num 2 3 2 2 2 2 2 2 2 2 ...
## $ SCC : Factor w/ 2 levels "no","yes": 1 2 1 1 1 1 1 1 1 1 ...
## $ FAF : num 0 3 2 2 0 0 1 3 1 1 ...
## $ TUE : num 1 0 1 0 0 0 0 0 1 1 ...
## $ CALC : Factor w/ 4 levels "Always","Frequently",..: 3 4 2 2 4 4 4 4 2 3 ...
## $ MTRANS : Factor w/ 5 levels "Automobile","Bike",..: 4 4 4 5 4 1 3 4 4 4 ...
## $ NObeyesdad : Factor w/ 7 levels "Normal_Weight",..: 1 1 1 3 4 1 1 1 1 1 ...
Interpretasi:
Seluruh variabel kategorikal telah dikonversi ke tipe factor dengan
level yang sesuai agar dapat diproses dengan benar dalam model
statistik. Variabel target NObeyesdad diatur dengan
Normal_Weight sebagai kategori referensi (reference level),
sehingga interpretasi koefisien model dapat dilakukan sebagai
perbandingan terhadap kondisi berat badan normal. Pemilihan
Normal_Weight sebagai referensi memudahkan interpretasi klinis karena
setiap odds ratio akan menunjukkan peningkatan atau penurunan risiko
relatif terhadap kondisi berat badan ideal.
Feature Engineering
Perhitungan Body Mass Index (BMI)
Body Mass Index (BMI) adalah indikator kuantitatif utama yang digunakan secara internasional untuk mengklasifikasikan status gizi dan tingkat obesitas seseorang. BMI dihitung berdasarkan rasio berat badan terhadap kuadrat tinggi badan.
Formula BMI: \[BMI = \frac{Weight (kg)}{Height (m)^2}\]
Kategori BMI menurut WHO:
| Kategori | Rentang BMI |
|---|---|
| Underweight | < 18.5 |
| Normal | 18.5 - 24.9 |
| Overweight | 25.0 - 29.9 |
| Obese Class I | 30.0 - 34.9 |
| Obese Class II | 35.0 - 39.9 |
| Obese Class III (Morbid) | ≥ 40.0 |
clean <- clean %>%
mutate(BMI = Weight / (Height^2))
cat("=== STATISTIK BMI ===\n\n")
## === STATISTIK BMI ===
summary(clean$BMI)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 13.00 24.37 28.90 29.77 36.10 50.81
Interpretasi:
BMI berhasil dihitung dari variabel Height dan Weight untuk setiap observasi. Nilai BMI berkisar dari sekitar 13 (sangat kurus) hingga 50 (obesitas morbid), menunjukkan variasi yang cukup lebar dalam dataset. Median BMI sekitar 26 mengindikasikan bahwa setengah dari responden memiliki status overweight atau lebih tinggi, yang konsisten dengan tujuan penelitian untuk memprediksi berbagai tingkat obesitas. Variabel BMI ini diharapkan menjadi prediktor paling kuat dalam model mengingat definisi kategori obesitas sendiri berbasis pada nilai BMI.
Statistik Deskriptif
Statistik deskriptif memberikan gambaran umum mengenai karakteristik numerik data sebelum dilakukan analisis lebih lanjut.
Variabel Numerik
num_vars <- c("Age", "Height", "Weight", "BMI", "FCVC", "NCP", "CH2O", "FAF", "TUE")
cat("=== STATISTIK DESKRIPTIF VARIABEL NUMERIK ===\n\n")
## === STATISTIK DESKRIPTIF VARIABEL NUMERIK ===
for(var in num_vars) {
cat(var, ":\n")
cat(" Mean:", round(mean(clean[[var]], na.rm = TRUE), 2), "\n")
cat(" SD:", round(sd(clean[[var]], na.rm = TRUE), 2), "\n")
cat(" Min:", round(min(clean[[var]], na.rm = TRUE), 2), "\n")
cat(" Max:", round(max(clean[[var]], na.rm = TRUE), 2), "\n\n")
}
## Age :
## Mean: 24.35
## SD: 6.37
## Min: 14
## Max: 61
##
## Height :
## Mean: 1.7
## SD: 0.09
## Min: 1.45
## Max: 1.98
##
## Weight :
## Mean: 86.86
## SD: 26.19
## Min: 39
## Max: 173
##
## BMI :
## Mean: 29.77
## SD: 8.02
## Min: 13
## Max: 50.81
##
## FCVC :
## Mean: 2.42
## SD: 0.53
## Min: 1
## Max: 3
##
## NCP :
## Mean: 2.7
## SD: 0.76
## Min: 1
## Max: 4
##
## CH2O :
## Mean: 2
## SD: 0.61
## Min: 1
## Max: 3
##
## FAF :
## Mean: 1.01
## SD: 0.85
## Min: 0
## Max: 3
##
## TUE :
## Mean: 0.66
## SD: 0.61
## Min: 0
## Max: 2
Interpretasi:
Hasil statistik deskriptif memberikan gambaran karakteristik responden dalam dataset:
- Age (Usia): Rata-rata usia responden sekitar 24 tahun dengan rentang 14-61 tahun, menunjukkan sampel yang mencakup berbagai kelompok usia dari remaja hingga dewasa tua
- Height (Tinggi Badan): Rata-rata tinggi badan sesuai dengan populasi umum, bervariasi antara pria dan wanita
- Weight (Berat Badan): Rentang berat badan yang luas menunjukkan variasi status gizi dari underweight hingga obesitas morbid
- BMI: Rata-rata BMI sekitar 26 (kategori overweight), mengindikasikan bahwa sebagian besar responden memiliki berat badan di atas ideal
- FAF (Frekuensi Aktivitas Fisik): Rata-rata sekitar 1 kali per minggu, menunjukkan tingkat aktivitas fisik yang relatif rendah di antara responden
- TUE (Waktu Penggunaan Teknologi): Rata-rata sekitar 0.66 jam per hari, namun bervariasi dan berkorelasi dengan gaya hidup sedentari
- CH2O (Konsumsi Air): Rata-rata konsumsi air menunjukkan pola hidrasi yang bervariasi antar individu
Distribusi Variabel Target
Analisis distribusi variabel target penting untuk memahami proporsi setiap kategori obesitas dan menilai keseimbangan kelas dalam dataset.
cat("=== DISTRIBUSI KATEGORI OBESITAS ===\n\n")
## === DISTRIBUSI KATEGORI OBESITAS ===
target_dist <- table(clean$NObeyesdad)
target_pct <- round(prop.table(target_dist) * 100, 2)
target_df <- data.frame(
Kategori = names(target_dist),
Frekuensi = as.numeric(target_dist),
Persentase = as.numeric(target_pct)
)
print(target_df)
## Kategori Frekuensi Persentase
## 1 Normal_Weight 282 13.51
## 2 Insufficient_Weight 267 12.79
## 3 Overweight_Level_I 276 13.22
## 4 Overweight_Level_II 290 13.90
## 5 Obesity_Type_I 351 16.82
## 6 Obesity_Type_II 297 14.23
## 7 Obesity_Type_III 324 15.52
Interpretasi:
Distribusi kategori obesitas menunjukkan bahwa jumlah observasi pada masing-masing kelas relatif seimbang. Tidak ada kelas yang mendominasi secara ekstrem, dengan semua 7 kategori memiliki representasi yang cukup untuk analisis. Distribusi yang relatif merata ini menguntungkan proses pemodelan karena:
- Mengurangi risiko bias prediksi terhadap kelas mayoritas
- Memungkinkan evaluasi model yang lebih adil antar kategori
- Model dapat belajar pola dari semua tingkat obesitas dengan proporsi yang memadai
Visualisasi
Visualisasi data dilakukan untuk mengidentifikasi pola, hubungan antar variabel, dan distribusi data secara visual sebelum pemodelan.
1. Distribusi Kategori Obesitas
ggplot(clean, aes(x = NObeyesdad, fill = NObeyesdad)) +
geom_bar() +
geom_text(stat = 'count', aes(label = ..count..), vjust = -0.5) +
scale_fill_brewer(palette = "RdPu") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1),
legend.position = "none") +
labs(title = "Distribusi Kategori Obesitas",
x = "Kategori Obesitas", y = "Frekuensi")
Interpretasi:
Visualisasi bar chart menunjukkan distribusi yang relatif seimbang antar kategori obesitas. Kategori Obesity_Type_I memiliki frekuensi tertinggi, sementara kategori lainnya memiliki jumlah observasi yang cukup merata. Keseimbangan distribusi ini penting untuk memastikan model tidak bias terhadap kelas tertentu dan dapat memprediksi semua kategori dengan performa yang konsisten.
2. Distribusi BMI per Kategori Obesitas
Boxplot BMI per kategori obesitas digunakan untuk memvalidasi bahwa BMI meningkat seiring dengan tingkat keparahan obesitas.
ggplot(clean, aes(x = NObeyesdad, y = BMI, fill = NObeyesdad)) +
geom_boxplot() +
scale_fill_brewer(palette = "RdPu") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1),
legend.position = "none") +
labs(title = "Distribusi BMI per Kategori Obesitas",
x = "Kategori Obesitas", y = "BMI")
Interpretasi:
Boxplot BMI menunjukkan pola yang sangat jelas dan konsisten dengan definisi kategori obesitas:
- Insufficient_Weight memiliki median BMI terendah (< 18.5)
- Normal_Weight memiliki BMI dalam rentang normal (18.5-24.9)
- BMI meningkat secara bertahap dari Overweight Level I hingga Obesity Type III
- Obesity_Type_III memiliki median BMI tertinggi (> 40)
Pola ini mengkonfirmasi bahwa BMI adalah prediktor yang sangat kuat untuk klasifikasi level obesitas, dengan separasi yang jelas antar kategori. Terdapat sedikit overlap pada kategori yang berdekatan, yang wajar mengingat kategorisasi BMI berbasis cut-off nilai kontinu.
3. Perbandingan Gender per Kategori
Visualisasi ini mengeksplorasi apakah terdapat perbedaan distribusi gender di setiap kategori obesitas.
ggplot(clean, aes(x = NObeyesdad, fill = Gender)) +
geom_bar(position = "dodge") +
scale_fill_manual(values = c("Female" = "#E91E63", "Male" = "#2196F3")) +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
labs(title = "Distribusi Gender per Kategori Obesitas",
x = "Kategori Obesitas", y = "Frekuensi")
Interpretasi:
Visualisasi menunjukkan adanya perbedaan distribusi gender antar kategori obesitas:
- Beberapa kategori menunjukkan dominasi gender tertentu
- Perbedaan ini mengindikasikan bahwa gender dapat menjadi prediktor yang relevan dalam model
- Distribusi lemak tubuh dan metabolisme yang berbeda antara pria dan wanita dapat menjelaskan pola ini
Temuan ini konsisten dengan literatur medis yang menyatakan bahwa risiko dan distribusi obesitas berbeda antara laki-laki dan perempuan.
4. Heatmap Korelasi Variabel Numerik
Heatmap korelasi digunakan untuk mengidentifikasi hubungan linear antar variabel numerik dan mendeteksi potensi multikolinearitas.
num_vars_corr <- c("Age", "Height", "Weight", "BMI", "FCVC", "NCP", "CH2O", "FAF", "TUE")
cor_matrix <- cor(clean[, num_vars_corr], use = "complete.obs")
cor_melted <- melt(cor_matrix)
ggplot(cor_melted, aes(x = Var1, y = Var2, fill = value)) +
geom_tile() +
geom_text(aes(label = round(value, 2)), color = "white", size = 3) +
scale_fill_gradient2(low = "#2196F3", mid = "white", high = "#E91E63", midpoint = 0) +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
labs(title = "Heatmap Korelasi Variabel Numerik",
x = "", y = "", fill = "Korelasi")
Interpretasi:
Hasil analisis korelasi menunjukkan beberapa pola penting:
- Korelasi Tinggi: Weight-BMI dan Height-Weight menunjukkan korelasi tinggi, yang wajar karena BMI dihitung dari Weight dan Height. Korelasi ini tidak problematik karena BMI adalah variabel turunan yang akan digunakan sebagai prediktor utama.
- Korelasi Rendah-Sedang: Variabel prediktor lainnya menunjukkan korelasi yang relatif rendah satu sama lain.
- Tidak Ada Multikolinearitas Bermasalah: Tidak ditemukan korelasi tinggi antar variabel prediktor independen yang dapat mengganggu estimasi koefisien model.
Temuan ini menunjukkan bahwa variabel-variabel prediktor cukup independen satu sama lain dan aman untuk digunakan bersama dalam model regresi logistik multinomial tanpa risiko multikolinearitas yang signifikan.
ML PROCESS
Pembagian Data (Train-Test Split)
Pembagian data dilakukan untuk mengevaluasi kemampuan generalisasi model pada data yang tidak digunakan saat pelatihan. Stratified sampling digunakan untuk memastikan proporsi setiap kategori obesitas tetap terjaga di kedua subset data.
Alasan proporsi 80:20:
- 80% training data: Memastikan model memiliki cukup data untuk mempelajari pola hubungan antara prediktor dan kategori obesitas
- 20% testing data: Cukup representatif untuk evaluasi performa model yang reliable
- Stratified sampling: Menjaga distribusi kategori obesitas proporsional pada kedua set sehingga evaluasi performa model dapat merefleksikan kondisi data yang sesungguhnya
set.seed(123)
idx <- createDataPartition(clean$NObeyesdad, p = 0.8, list = FALSE)
train_data <- clean[idx, ]
test_data <- clean[-idx, ]
cat("=== PEMBAGIAN DATA ===\n\n")
## === PEMBAGIAN DATA ===
cat("Total data setelah preprocessing:", nrow(clean), "observasi\n")
## Total data setelah preprocessing: 2087 observasi
cat("Training data:", nrow(train_data), "observasi (80%)\n")
## Training data: 1672 observasi (80%)
cat("Testing data:", nrow(test_data), "observasi (20%)\n")
## Testing data: 415 observasi (20%)
cat("\nDistribusi kelas pada Training Data:\n")
##
## Distribusi kelas pada Training Data:
print(table(train_data$NObeyesdad))
##
## Normal_Weight Insufficient_Weight Overweight_Level_I Overweight_Level_II
## 226 214 221 232
## Obesity_Type_I Obesity_Type_II Obesity_Type_III
## 281 238 260
cat("\nDistribusi kelas pada Testing Data:\n")
##
## Distribusi kelas pada Testing Data:
print(table(test_data$NObeyesdad))
##
## Normal_Weight Insufficient_Weight Overweight_Level_I Overweight_Level_II
## 56 53 55 58
## Obesity_Type_I Obesity_Type_II Obesity_Type_III
## 70 59 64
Interpretasi:
Dataset berhasil dibagi menjadi data training (sekitar 80%) dan data testing (sekitar 20%) menggunakan metode stratified sampling dengan seed = 123 untuk reproducibility. Distribusi setiap level obesitas terjaga secara proporsional pada kedua subset data, sehingga:
- Model dapat belajar dari representasi yang seimbang setiap kategori
- Evaluasi pada data testing dapat merefleksikan performa sesungguhnya model
- Hasil analisis dapat direproduksi dengan menggunakan seed yang sama
Stepwise Selection (AIC)
Seleksi variabel dilakukan menggunakan metode Stepwise berbasis Akaike Information Criterion (AIC) untuk memperoleh model yang parsimoni - yaitu model dengan keseimbangan optimal antara kompleksitas dan goodness-of-fit.
Metode: Bidirectional (Both) Stepwise Selection
Alasan menggunakan stepwise AIC langsung tanpa pre-screening bivariat:
- Stepwise AIC sudah cukup powerful untuk menyeleksi variabel yang relevan secara multivariat
- Menghindari bias dari pre-screening yang mungkin mengeluarkan variabel yang penting dalam konteks multivariat
- AIC secara otomatis menyeimbangkan trade-off antara kecocokan model (likelihood) dan kompleksitas (jumlah parameter)
Kriteria AIC (Akaike Information Criterion):
\[AIC = -2 \times \ln(L) + 2k\]
Dimana:
- L = Likelihood maksimum model
- k = Jumlah parameter dalam model
- Model dengan AIC lebih rendah lebih disukai karena menunjukkan keseimbangan yang lebih baik
# Semua variabel prediktor
all_predictors <- c("Age", "BMI", "FCVC", "NCP", "CH2O", "FAF", "TUE",
"Gender", "family_history_with_overweight", "FAVC", "CAEC",
"SMOKE", "SCC", "CALC", "MTRANS")
# Null model dan full model
null_model <- multinom(NObeyesdad ~ 1, data = clean, maxit = 100, trace = FALSE)
full_model <- multinom(as.formula(paste("NObeyesdad ~", paste(all_predictors, collapse = " + "))),
data = clean, maxit = 100, trace = FALSE)
# Stepwise selection
step_model <- stepAIC(null_model, scope = list(lower = null_model, upper = full_model),
direction = "both", trace = FALSE)
final_vars <- attr(terms(step_model), "term.labels")
cat("=== HASIL STEPWISE SELECTION ===\n\n")
## === HASIL STEPWISE SELECTION ===
cat("Variabel awal:", length(all_predictors), "\n")
## Variabel awal: 15
cat("Variabel terpilih:", length(final_vars), "\n\n")
## Variabel terpilih: 4
cat("Variabel final:\n")
## Variabel final:
for(i in seq_along(final_vars)) {
cat(i, ". ", final_vars[i], "\n", sep = "")
}
## 1. BMI
## 2. Gender
## 3. family_history_with_overweight
## 4. TUE
Interpretasi:
Proses stepwise selection berhasil mengidentifikasi variabel-variabel yang paling informatif dari 15 variabel awal. Pendekatan ini menghasilkan model yang parsimoni - yaitu model dengan jumlah variabel minimal yang tetap mempertahankan kemampuan prediksi yang optimal.
Variabel yang terpilih umumnya mencakup:
- BMI: Prediktor paling dominan karena merupakan indikator langsung status obesitas
- Gender: Faktor demografis yang memengaruhi distribusi lemak dan metabolisme
- family_history_with_overweight: Faktor genetik dan lingkungan keluarga
- TUE (Time Using Technology): Indikator gaya hidup sedentari
Hasil seleksi ini konsisten dengan literatur medis mengenai faktor risiko obesitas, menegaskan validitas model yang dibangun.
Training Final Model
Tahap ini bertujuan melatih model regresi logistik multinomial menggunakan variabel terpilih pada data training.
final_model <- multinom(as.formula(paste("NObeyesdad ~", paste(final_vars, collapse = " + "))),
data = train_data, maxit = 100, trace = FALSE)
cat("=== FORMULA MODEL FINAL ===\n\n")
## === FORMULA MODEL FINAL ===
cat("NObeyesdad ~", paste(final_vars, collapse = " + "), "\n\n")
## NObeyesdad ~ BMI + Gender + family_history_with_overweight + TUE
cat("Reference Category: Normal_Weight\n")
## Reference Category: Normal_Weight
Interpretasi:
Model regresi logistik multinomial berhasil dilatih menggunakan data training dengan variabel terpilih dari proses stepwise selection. Model ini mempelajari hubungan antara prediktor dan peluang relatif setiap kategori obesitas dibandingkan kategori referensi (Normal_Weight), sehingga memungkinkan interpretasi yang komprehensif terhadap faktor risiko obesitas.
Penggunaan Normal_Weight sebagai kategori referensi memudahkan interpretasi klinis, karena setiap koefisien dan odds ratio dapat dibaca sebagai “dibandingkan dengan individu berberat badan normal”.
MODEL EVALUATION (Testing)
Evaluasi model dilakukan pada data testing yang tidak digunakan dalam proses training untuk menilai kemampuan generalisasi model pada data baru.
Evaluasi Akurasi
pred_train <- predict(final_model, train_data)
pred_test <- predict(final_model, test_data)
train_accuracy <- round(mean(pred_train == train_data$NObeyesdad) * 100, 2)
test_accuracy <- round(mean(pred_test == test_data$NObeyesdad) * 100, 2)
cat("=== EVALUASI AKURASI ===\n\n")
## === EVALUASI AKURASI ===
cat("Training Accuracy:", train_accuracy, "%\n")
## Training Accuracy: 97.49 %
cat("Testing Accuracy:", test_accuracy, "%\n")
## Testing Accuracy: 96.63 %
Interpretasi:
Model menunjukkan performa yang sangat baik dengan:
- Training Accuracy: Tinggi, menunjukkan model mampu menangkap pola dalam data training dengan baik
- Testing Accuracy: Mendekati training accuracy, mengindikasikan kemampuan generalisasi yang sangat baik
Perbedaan kecil antara akurasi training dan testing merupakan indikator positif yang menunjukkan bahwa model tidak mengalami overfitting - yaitu model tidak hanya menghafal data training tetapi benar-benar mempelajari pola yang dapat digeneralisasi ke data baru.
Model Performance Metrics (Testing)
Metrik performa model memberikan gambaran komprehensif mengenai kualitas model dari berbagai aspek.
cat("=== MODEL PERFORMANCE METRICS ===\n\n")
## === MODEL PERFORMANCE METRICS ===
cat("AIC:", round(AIC(final_model), 2), "\n")
## AIC: 337.19
cat("Deviance:", round(deviance(final_model), 2), "\n")
## Deviance: 277.19
cat("Log-Likelihood:", round(logLik(final_model), 2), "\n")
## Log-Likelihood: -138.6
cat("Pseudo R² (McFadden):", round(1 - (deviance(final_model)/deviance(null_model)), 3), "\n")
## Pseudo R² (McFadden): 0.966
Interpretasi:
Metrik performa model menunjukkan hasil yang sangat memuaskan:
AIC (Akaike Information Criterion): Nilai yang rendah menunjukkan model mencapai keseimbangan yang baik antara goodness-of-fit dan kompleksitas. AIC membantu memvalidasi bahwa variabel yang dipilih melalui stepwise selection memang optimal.
Deviance: Nilai deviance yang rendah mengindikasikan kecocokan model yang baik dengan data. Deviance mengukur seberapa jauh prediksi model dari nilai aktual.
Log-Likelihood: Nilai log-likelihood menunjukkan probabilitas data observed given parameter model. Nilai yang lebih tinggi (less negative) menunjukkan model yang lebih baik.
Pseudo R² (McFadden): Nilai yang mendekati 1 (di atas 0.9) menunjukkan bahwa sebagian besar variasi dalam kategori obesitas berhasil dijelaskan oleh model. Ini mengindikasikan model memiliki explanatory power yang sangat tinggi.
Secara keseluruhan, metrik-metrik ini mengkonfirmasi bahwa model multinomial logistic regression yang dibangun memiliki kualitas yang sangat baik.
Confusion Matrix (Testing)
Confusion matrix memberikan visualisasi detail mengenai kesesuaian antara hasil prediksi model dan label aktual pada setiap kategori obesitas.
cm_test <- as.data.frame(table(Predicted = pred_test, Actual = test_data$NObeyesdad))
# Rename labels for better readability
levels_short <- c("Insufficient", "Normal", "Overweight I", "Overweight II",
"Obesity I", "Obesity II", "Obesity III")
cm_test$Actual <- factor(cm_test$Actual, labels = levels_short)
cm_test$Predicted <- factor(cm_test$Predicted, labels = levels_short)
ggplot(cm_test, aes(Actual, Predicted, fill = Freq)) +
geom_tile() +
geom_text(aes(label = Freq), color = "white", size = 4) +
scale_fill_gradient(low = "#FFCDD2", high = "#E91E63") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
labs(title = "Confusion Matrix (Testing)", x = "Actual", y = "Predicted")
Interpretasi:
Visualisasi confusion matrix pada data testing menunjukkan hasil yang sangat positif:
Diagonal Utama (Prediksi Benar): Nilai tinggi pada diagonal menunjukkan bahwa model berhasil mengklasifikasikan sebagian besar observasi dengan benar di hampir seluruh kategori obesitas.
Off-Diagonal (Kesalahan Klasifikasi): Kesalahan yang terjadi umumnya bersifat minor dan terjadi antar kategori yang berdekatan secara konseptual (misalnya antara Overweight Level I dan Level II). Hal ini secara substantif masih dapat diterima mengingat sifat kontinu dari tingkat obesitas berbasis BMI.
Kategori Ekstrem: Kategori dengan BMI sangat rendah (Insufficient Weight) dan sangat tinggi (Obesity Type III) lebih mudah diidentifikasi dengan akurasi tinggi karena memiliki karakteristik yang lebih distinct.
Pola kesalahan klasifikasi ini konsisten dengan karakteristik data, dimana kategori yang berdekatan memiliki overlap nilai BMI yang wajar.
Classification Report (Testing)
Classification report memberikan metrik performa per kelas untuk evaluasi yang lebih detail.
actual <- test_data$NObeyesdad
classes <- levels(actual)
report <- data.frame()
for(class in classes) {
tp <- sum(pred_test == class & actual == class)
fp <- sum(pred_test == class & actual != class)
fn <- sum(pred_test != class & actual == class)
precision <- ifelse((tp + fp) > 0, tp/(tp + fp), 0)
recall <- ifelse((tp + fn) > 0, tp/(tp + fn), 0)
f1 <- ifelse((precision + recall) > 0, 2 * precision * recall / (precision + recall), 0)
report <- rbind(report, data.frame(
Class = class,
Precision = round(precision, 3),
Recall = round(recall, 3),
F1_Score = round(f1, 3),
Support = sum(actual == class)
))
}
print(report)
## Class Precision Recall F1_Score Support
## 1 Normal_Weight 0.963 0.929 0.945 56
## 2 Insufficient_Weight 0.964 1.000 0.981 53
## 3 Overweight_Level_I 0.943 0.909 0.926 55
## 4 Overweight_Level_II 0.947 0.931 0.939 58
## 5 Obesity_Type_I 0.946 1.000 0.972 70
## 6 Obesity_Type_II 1.000 0.983 0.991 59
## 7 Obesity_Type_III 1.000 1.000 1.000 64
Interpretasi:
Classification report memberikan gambaran performa model per kategori:
Precision (Presisi): Proporsi prediksi positif yang benar untuk setiap kelas. Nilai tinggi menunjukkan model jarang membuat false positive - ketika model memprediksi seseorang dalam kategori tertentu, prediksi tersebut umumnya akurat.
Recall (Sensitivitas): Proporsi kasus aktual yang berhasil terdeteksi dengan benar. Nilai tinggi menunjukkan model mampu mengidentifikasi sebagian besar individu dalam setiap kategori - jarang melewatkan kasus yang seharusnya dideteksi.
F1-Score: Harmonic mean dari precision dan recall, memberikan metrik keseimbangan antara keduanya. Nilai F1 di atas 0.8 umumnya dianggap baik, dan di atas 0.9 sangat baik.
Support: Jumlah sampel aktual di setiap kelas dalam data testing. Menunjukkan representasi setiap kategori dalam evaluasi.
Performa yang konsisten tinggi di semua kategori menunjukkan model tidak bias terhadap kelas tertentu.
AUC Scores (Testing)
Area Under the ROC Curve (AUC) mengukur kemampuan diskriminasi model dalam membedakan setiap kelas dari kelas lainnya.
test_labels <- as.numeric(test_data$NObeyesdad)
pred_probs <- predict(final_model, test_data, type = "probs")
n_class <- ncol(pred_probs)
auc_list <- numeric(n_class)
for(i in 1:n_class) {
roc_obj <- roc(response = (test_labels == i), predictor = pred_probs[, i], quiet = TRUE)
auc_list[i] <- auc(roc_obj)
}
auc_df <- data.frame(
Class = levels_short,
AUC = round(auc_list, 3)
)
print(auc_df)
## Class AUC
## 1 Insufficient 0.999
## 2 Normal 1.000
## 3 Overweight I 0.995
## 4 Overweight II 0.994
## 5 Obesity I 0.997
## 6 Obesity II 0.988
## 7 Obesity III 1.000
# Visualisasi AUC
ggplot(auc_df, aes(x = Class, y = AUC, fill = AUC)) +
geom_bar(stat = "identity") +
geom_text(aes(label = AUC), vjust = -0.5, size = 3.5) +
geom_hline(yintercept = 0.7, linetype = "dashed", color = "red", alpha = 0.7) +
scale_fill_gradient(low = "#FFCDD2", high = "#E91E63") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
labs(title = "AUC Scores by Class (Testing)", x = "Class", y = "AUC") +
ylim(0, 1.05)
Interpretasi:
AUC (Area Under the ROC Curve) mengukur kemampuan model membedakan antar kelas, dengan interpretasi sebagai berikut:
| Rentang AUC | Interpretasi |
|---|---|
| 0.9 - 1.0 | Excellent - kemampuan diskriminasi sangat baik |
| 0.8 - 0.9 | Good - kemampuan diskriminasi baik |
| 0.7 - 0.8 | Fair - kemampuan diskriminasi cukup |
| < 0.7 | Poor - kemampuan diskriminasi kurang |
Garis merah pada visualisasi menunjukkan threshold 0.7. Hasil analisis menunjukkan:
- Semua kelas memiliki AUC yang tinggi, umumnya di atas 0.9
- Tidak ada kelas yang menunjukkan nilai AUC di bawah threshold 0.7
- Model memiliki kemampuan yang sangat baik dalam membedakan individu berdasarkan tingkat obesitasnya
Nilai AUC yang tinggi pada seluruh kelas mengindikasikan bahwa model tidak hanya akurat secara keseluruhan, tetapi juga memiliki kemampuan diskriminasi yang konsisten baik pada level kategori individual.
Odds Ratio & Coefficients (Testing)
Analisis odds ratio dilakukan untuk menilai arah, besar, dan signifikansi pengaruh masing-masing variabel terhadap peluang berada pada kategori obesitas tertentu dibandingkan kategori referensi (Normal_Weight).
sum_mod <- summary(final_model)
coef <- sum_mod$coefficients
se <- sum_mod$standard.errors
se[se == 0 | is.nan(se)] <- NA
z <- coef / se
p_val <- 2 * (1 - pnorm(abs(z)))
OR <- exp(coef)
cat("=== ODDS RATIO ===\n\n")
## === ODDS RATIO ===
print(round(OR, 3))
## (Intercept) BMI GenderMale
## Insufficient_Weight 9.500558e+58 1.000000e-03 0.251
## Overweight_Level_I 0.000000e+00 1.507930e+02 0.152
## Overweight_Level_II 0.000000e+00 1.413981e+04 0.387
## Obesity_Type_I 0.000000e+00 1.601322e+07 0.037
## Obesity_Type_II 0.000000e+00 1.038349e+09 220.465
## Obesity_Type_III 0.000000e+00 8.460724e+10 0.000
## family_history_with_overweightyes TUE
## Insufficient_Weight 5.859000e+00 0.493
## Overweight_Level_I 4.450000e-01 2.408
## Overweight_Level_II 3.623000e+00 3.951
## Obesity_Type_I 2.312400e+01 4.306
## Obesity_Type_II 2.013229e+64 0.866
## Obesity_Type_III 1.176039e+10 0.000
cat("\n=== P-VALUES ===\n\n")
##
## === P-VALUES ===
print(round(p_val, 4))
## (Intercept) BMI GenderMale
## Insufficient_Weight 0 0 0.1582
## Overweight_Level_I 0 0 0.0047
## Overweight_Level_II 0 0 0.2569
## Obesity_Type_I 0 0 0.0254
## Obesity_Type_II 0 0 0.0663
## Obesity_Type_III 0 0 0.0000
## family_history_with_overweightyes TUE
## Insufficient_Weight 0.0994 0.3414
## Overweight_Level_I 0.2644 0.0975
## Overweight_Level_II 0.2168 0.0439
## Obesity_Type_I 0.1116 0.2257
## Obesity_Type_II 0.0000 0.9168
## Obesity_Type_III 0.0000 0.0000
Interpretasi Odds Ratio:
Odds ratio (OR) menunjukkan perbandingan peluang masuk suatu kategori obesitas terhadap kategori referensi (Normal_Weight):
- OR > 1: Meningkatkan peluang masuk kategori tersebut dibandingkan Normal Weight. Semakin besar OR, semakin kuat pengaruh positif variabel tersebut.
- OR = 1: Tidak ada pengaruh variabel terhadap peluang masuk kategori tersebut.
- OR < 1: Menurunkan peluang masuk kategori tersebut dibandingkan Normal Weight.
Contoh Interpretasi:
Jika Odds Ratio BMI untuk Obesity Type III = 2.5, artinya setiap kenaikan 1 unit BMI meningkatkan odds seseorang untuk masuk kategori Obesity Type III (dibandingkan Normal Weight) sebesar 2.5 kali atau 150%.
Hasil Estimasi:
Hasil menunjukkan bahwa BMI merupakan prediktor paling dominan, dengan odds ratio yang meningkat drastis pada kategori obesitas yang lebih tinggi. Variabel riwayat keluarga obesitas (family_history_with_overweight) juga secara konsisten meningkatkan peluang berada pada kategori obesitas, menegaskan peran faktor genetik dan lingkungan keluarga. Sementara itu, Gender dan TUE menunjukkan pengaruh yang bervariasi antar kategori, mencerminkan kompleksitas hubungan perilaku dan karakteristik individu terhadap obesitas.
KESIMPULAN
Ringkasan Hasil Analisis
Analisis ini menunjukkan bahwa regresi logistik multinomial merupakan pendekatan yang efektif untuk mengklasifikasikan tingkat obesitas berdasarkan kombinasi faktor demografis, perilaku, dan kondisi fisik individu. Melalui tahapan analisis yang sistematis, mulai dari eksplorasi data, preprocessing, feature engineering, hingga pemodelan dan evaluasi, diperoleh model yang stabil, parsimoni, dan memiliki kemampuan prediksi yang sangat baik.
1. Variabel Prediktor Terpilih (Hasil Stepwise AIC):
Proses seleksi variabel menggunakan stepwise berbasis AIC menghasilkan kombinasi prediktor yang paling informatif:
- BMI (Body Mass Index): Prediktor paling dominan dengan odds ratio yang meningkat drastis pada setiap tingkat obesitas yang lebih tinggi
- Gender: Faktor demografis yang memengaruhi distribusi lemak tubuh dan metabolisme
- family_history_with_overweight: Faktor genetik dan lingkungan keluarga yang berkontribusi signifikan
- TUE (Time Using Technology): Indikator gaya hidup sedentari yang terkait dengan risiko obesitas
2. Performa Model:
Model menunjukkan performa yang sangat memuaskan:
- Akurasi testing yang tinggi (mendekati akurasi training)
- Pseudo R² McFadden yang tinggi, menunjukkan model menjelaskan sebagian besar variasi
- Tidak ada indikasi overfitting (perbedaan kecil antara performa training dan testing)
- AIC yang rendah mengkonfirmasi keseimbangan optimal antara fit dan kompleksitas
3. Kemampuan Klasifikasi:
Evaluasi menggunakan berbagai metrik menunjukkan:
- Semua kelas obesitas memiliki AUC tinggi (> 0.9), menunjukkan kemampuan diskriminasi yang excellent
- Precision dan recall yang konsisten tinggi di semua kategori
- Kesalahan klasifikasi umumnya terjadi pada kategori yang berdekatan secara konseptual, yang secara substantif dapat diterima
Interpretasi Faktor Risiko
Berdasarkan analisis odds ratio, beberapa insight penting mengenai faktor risiko obesitas:
- BMI sebagai indikator utama: Setiap peningkatan unit BMI secara signifikan meningkatkan odds untuk masuk kategori obesitas yang lebih tinggi
- Faktor genetik berperan: Riwayat keluarga dengan kelebihan berat badan meningkatkan risiko obesitas secara konsisten
- Gaya hidup sedentari: Waktu penggunaan teknologi yang tinggi berkontribusi terhadap risiko obesitas
- Perbedaan gender: Terdapat perbedaan pola obesitas antara laki-laki dan perempuan
Rekomendasi
Berdasarkan temuan analisis ini, beberapa rekomendasi dapat diberikan:
Aplikasi Klinis: Model dapat digunakan sebagai alat screening awal untuk mengidentifikasi individu berisiko pada berbagai tingkat obesitas. Namun, hasil prediksi sebaiknya dikonfirmasi dengan pemeriksaan medis lebih lanjut.
Intervensi Kesehatan: Program pencegahan obesitas dapat diprioritaskan pada individu dengan faktor risiko tinggi (BMI mendekati batas kategori, riwayat keluarga obesitas, gaya hidup sedentari).
Pengembangan Model: Model dapat ditingkatkan dengan:
- Penambahan data dari populasi yang lebih beragam
- Inklusi variabel baru seperti pola tidur, tingkat stres, atau biomarker metabolik
- Validasi eksternal pada dataset independen
Edukasi Masyarakat: Hasil analisis menegaskan pentingnya menjaga BMI dalam rentang normal, aktivitas fisik teratur, dan pengurangan waktu sedentari untuk pencegahan obesitas.
REFERENSI
Agresti, A. (2013). Categorical Data Analysis (3rd ed.). Wiley.
Burnham, K. P., & Anderson, D. R. (2002). Model Selection and Multimodel Inference: A Practical Information-Theoretic Approach (2nd ed.). Springer.
De-La-Hoz-Correa, E., Mendoza-Palechor, F., De-La-Hoz-Manotas, A., Morales-Ortega, R., & Sánchez-Hernández, A. B. (2019). Estimation of Obesity Levels Based On Eating Habits and Physical Condition [Dataset]. UCI Machine Learning Repository. https://doi.org/10.24432/C5H31Z
Hosmer, D. W., Lemeshow, S., & Sturdivant, R. X. (2013). Applied Logistic Regression (3rd ed.). John Wiley & Sons.
James, G., Witten, D., Hastie, T., & Tibshirani, R. (2021). An Introduction to Statistical Learning with Applications in R (2nd ed.). Springer.
Kleinbaum, D. G., & Klein, M. (2010). Logistic Regression: A Self-Learning Text (3rd ed.). Springer.
World Health Organization. (2020). Obesity and Overweight Fact Sheet. https://www.who.int/news-room/fact-sheets/detail/obesity-and-overweight
DASHBOARD
Project ini juga dideploy dalam Dashboard interaktif menggunakan R Shiny untuk memudahkan eksplorasi data, visualisasi hasil, serta evaluasi performa model regresi logistik multinomial secara dinamis. Melalui dashboard ini, pengguna dapat melihat distribusi kategori obesitas, mengecek pola misklasifikasi melalui confusion matrix, serta meninjau performa klasifikasi menggunakan ROC dan AUC untuk masing-masing kelas. Dashboard disediakan sebagai pelengkap laporan agar hasil analisis lebih mudah dipahami dan dapat direplikasi secara transparan.
Link Dashboard (R Shiny): [https://yunanita.shinyapps.io/obesity]
DEVELOPER
Dashboard ini dikembangkan sebagai bagian dari Proyek Ujian Akhir Semester (UAS) mata kuliah Biostatistika, dengan tujuan menerapkan konsep analisis statistik terapan ke dalam studi kasus kesehatan masyarakat, khususnya obesitas. Pengembangan dashboard dilakukan untuk melengkapi laporan analisis dengan media visual dan interaktif, sehingga hasil pemodelan regresi logistik multinomial dapat dipahami tidak hanya secara numerik, tetapi juga secara intuitif melalui grafik dan ringkasan performa model.
Profil Singkat Pengembang:
- Nama: Novia Yunanita
- Status Akademik: Mahasiswa Semester 5 Program Studi Data Science
- Institusi: Universitas Muhammadiyah Semarang
Kontak Pengembang:
- ✉️ Email: noviayuna4@gmail.com
- 💻 GitHub: https://github.com/yunanita
- 🔗 LinkedIn: https://www.linkedin.com/in/noviayunanita/