# 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

A. Variabel yang paling penting dalam memisahkan kelas diabetes berdasarkan model decision tree yang terbentuk.

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.

B. Aturan keputusan (decision rules) dari pohon klasifikasi yang dihasilkan.

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.

1) Root

  • Jika glucose < 128, maka data diklasifikasikan ke cabang kiri (negatif diabetes)
  • Jika glucose ≥ 128, maka data diklasifikasikan ke cabang kanan (positif diabetes)

2) Cabang Kiri (glucose < 128)

  • Jika age < 29, maka diklasifikasikan sebagai negatif diabetes
  • Jika age ≥ 29 dan mass < 28, maka diklasifikasikan sebagai 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.

3) Cabang Kanan (glucose ≥ 128)

  • jika glucose ≥ 156, maka diklasifikasikan sebagai positif diabetes
  • jika glucose < 156 dan mass < 30, maka diklasifikasikan sebagai negatif diabetes

Hal ini menunjukkan bahwa meskipun kadar glukosa tinggi merupakan faktor utama diabetes, variabel lain seperti mass tetap berperan dalam menentukan hasil akhir klasifikasi.

C. Interpretasi hasil klasifikasi yang diperoleh.

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.