# Load dataset
library(mlbench)
## Warning: package 'mlbench' was built under R version 4.4.3
data(PimaIndiansDiabetes)
DT::datatable(PimaIndiansDiabetes)
# Data explore
str(PimaIndiansDiabetes)
## 'data.frame': 768 obs. of 9 variables:
## $ pregnant: num 6 1 8 1 0 5 3 10 2 8 ...
## $ glucose : num 148 85 183 89 137 116 78 115 197 125 ...
## $ pressure: num 72 66 64 66 40 74 50 0 70 96 ...
## $ triceps : num 35 29 0 23 35 0 32 0 45 0 ...
## $ insulin : num 0 0 0 94 168 0 88 0 543 0 ...
## $ mass : num 33.6 26.6 23.3 28.1 43.1 25.6 31 35.3 30.5 0 ...
## $ pedigree: num 0.627 0.351 0.672 0.167 2.288 ...
## $ age : num 50 31 32 21 33 30 26 29 53 54 ...
## $ diabetes: Factor w/ 2 levels "neg","pos": 2 1 2 1 2 1 2 1 2 2 ...
summary(PimaIndiansDiabetes)
## pregnant glucose pressure triceps
## Min. : 0.000 Min. : 0.0 Min. : 0.00 Min. : 0.00
## 1st Qu.: 1.000 1st Qu.: 99.0 1st Qu.: 62.00 1st Qu.: 0.00
## Median : 3.000 Median :117.0 Median : 72.00 Median :23.00
## Mean : 3.845 Mean :120.9 Mean : 69.11 Mean :20.54
## 3rd Qu.: 6.000 3rd Qu.:140.2 3rd Qu.: 80.00 3rd Qu.:32.00
## Max. :17.000 Max. :199.0 Max. :122.00 Max. :99.00
## insulin mass pedigree age diabetes
## Min. : 0.0 Min. : 0.00 Min. :0.0780 Min. :21.00 neg:500
## 1st Qu.: 0.0 1st Qu.:27.30 1st Qu.:0.2437 1st Qu.:24.00 pos:268
## Median : 30.5 Median :32.00 Median :0.3725 Median :29.00
## Mean : 79.8 Mean :31.99 Mean :0.4719 Mean :33.24
## 3rd Qu.:127.2 3rd Qu.:36.60 3rd Qu.:0.6262 3rd Qu.:41.00
## Max. :846.0 Max. :67.10 Max. :2.4200 Max. :81.00
table(PimaIndiansDiabetes$diabetes)
##
## neg pos
## 500 268
# Bagi data training dan testing
set.seed(567)
sample_index <- sample(1:nrow(PimaIndiansDiabetes), 0.7 * nrow(PimaIndiansDiabetes))
train <- PimaIndiansDiabetes[sample_index, ] # data latih
test <- PimaIndiansDiabetes[-sample_index, ] # data yang dijadikan prediksi
# Load library CART
library(rpart)
## Warning: package 'rpart' was built under R version 4.4.3
library(rpart.plot)
## Warning: package 'rpart.plot' was built under R version 4.4.3
# Model dan visualisasi data (menggunakan data train)
model_cart <- rpart(diabetes ~ ., data = train, method = "class")
rpart.plot(model_cart)
# Prediksi (menggunakan data test)
prediksi <- predict(model_cart, test, type = "class")
# Evaluasi model
table(Prediksi = prediksi, Aktual = test$diabetes) # confusion matrix
## Aktual
## Prediksi neg pos
## neg 135 26
## pos 22 48
mean(prediksi == test$diabetes) # akurasi
## [1] 0.7922078
model_cart$variable.importance
## glucose mass age insulin pedigree pregnant triceps pressure
## 71.547338 20.935619 20.653541 14.009168 10.887594 8.877370 6.631513 5.741957
Berdasarkan hasil tersebut, variabel yang paling penting dalam memisahkan kelas diabetes berdasarkan model decision tree yang terbentuk adalah variabel glucose dengan nilai importance yaitu 71.54. Artinya, model sangat bergantung pada kadar glukosa untuk menentukan apakah seseorang diabetes atau tidak.
Selain itu, variabel mass dan age juga memiliki pengaruh cukup besar sebagai faktor pendukung untuk membantu memperjelas klasifikasi. Sementara itu, variabel seperti insulin, pedigree, pregnant, triceps dan pressure memiliki nilai importance yang relatif kecil, namun tetap berperan dalam proses klasifikasi.
Aturan keputusan (decision rules) merupakan hasil dari model classification tree yang menggambarkan proses pengklasifikasian data ke dalam kelas tertentu berdasarkan variabel-variabel yang digunakan. Setiap percabangan menunjukkan kondisi tertentu yang harus dipenuhi, sehingga menghasilkan keputusan akhir berupa klasifikasi ke dalam kelas positif diabetes atau negatif diabetes.
Hal ini menunjukkan bahwa kadar glukosa yang rendah merupakan faktor utama negatif diabetes, terutama di usia di bawah 29 tahun atau dengan body mass index (mass) yang relatif rendah.
Hal ini menunjukkan bahwa meskipun kadar glukosa tinggi merupakan faktor utama diabetes, variabel lain seperti mass tetap berperan dalam menentukan hasil akhir klasifikasi.
Berdasarkan hasil pemodelan menggunakan metode classification tree dengan algoritma CART, diperoleh hasil evaluasi model melalui confusion matrix:
table(Prediksi = prediksi, Aktual = test$diabetes)
## Aktual
## Prediksi neg pos
## neg 135 26
## pos 22 48
Berdasarkan interpretasi tersebut, model cukup baik dalam mengenali kelas negatif diabetes. Namun, masih terdapat kesalahan klasifikasi (False Negative dan False Positive), sehingga menunjukkan bahwa meskipun model cukup baik, masih diperlukan perbaikan lebih lanjut untuk meningkatkan akurasi dan mengurangi kesalahan klasifikasi.
Berdasarkan nilai akurasinya, sebesar 0.7922 atau 79.22% model decision tree mampu mengklasifikasikan data diabetes dengan cukup baik. Namun, sekitar 20.78% data masih mengalami kesalahan klasifikasi. Oleh karena itu, variabel-variabel seperti glucose, mass, dan age berperan dalam proses klasifikasi yang dilakukan oleh model.