Tugas Kelompok Classification Tree CART - Kelompok 3

Kelompok 3

  1. Mufti Habibie Alayubi G1401201027

  2. Angelika Anggreni Batubara G1401201040

  3. Alifa Shakila G1401201087

  4. Dhea Puspita Adinda G1401201090

Library

library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(tidyverse)
## -- Attaching packages --------------------------------------- tidyverse 1.3.2 --
## v ggplot2 3.3.6     v purrr   0.3.4
## v tibble  3.1.8     v stringr 1.4.1
## v tidyr   1.2.1     v forcats 0.5.2
## v readr   2.1.2     
## -- Conflicts ------------------------------------------ tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()
# For decision tree model
library(rpart)
library(caret)
## Loading required package: lattice
## 
## Attaching package: 'caret'
## 
## The following object is masked from 'package:purrr':
## 
##     lift
# For data visualization
library(rpart.plot)
library(ROCR)
# Contains the data
library(ISLR)
library(mlbench) # data pima Indian Dataset
library(cowplot) # menampilkan plot dalam bentuk Grid
library(caret)
library(car)
## Loading required package: carData
## 
## Attaching package: 'car'
## 
## The following object is masked from 'package:purrr':
## 
##     some
## 
## The following object is masked from 'package:dplyr':
## 
##     recode
library(dplyr)
library(tidyverse)
library(caret)
library(skimr)
library(ggplot2)
library(cowplot)
library(dplyr)
library(gridExtra)
## 
## Attaching package: 'gridExtra'
## 
## The following object is masked from 'package:dplyr':
## 
##     combine
library(glmnet)
## Loading required package: Matrix
## 
## Attaching package: 'Matrix'
## 
## The following objects are masked from 'package:tidyr':
## 
##     expand, pack, unpack
## 
## Loaded glmnet 4.1-4

Deskripsi Peubah Data Shill Bidding

  1. Record_ID : Pengidentifikasi unik dari record dalam kumpulan data.

  2. Auction_ID : Pengidentifikasi unik lelang.

  3. Bidder_ID : Pengidentifikasi unik penawar.

  4. Bidder_Tendency : Seorang penawar yang berani berpartisipasi secara eksklusif dalam lelang beberapa penjual daripada lot yang terdiversifikasi. Ini adalah tindakan kolusi yang melibatkan penjual penipu dan kaki tangannya.

  5. Bidding_Ratio : Seorang penawar yang lebih tinggi berpartisipasi lebih sering untuk menaikkan harga lelang dan menarik tawaran yang lebih tinggi dari peserta yang sah.

  6. Successive_Outbidding : Seorang penawar penawar berturut-turut mengalahkan dirinya sendiri meskipun dia adalah pemenang saat ini untuk menaikkan harga secara bertahap dengan kenaikan kecil berturut-turut.

  7. Last_Bidding : Penawar yang akan menjadi tidak aktif pada tahap terakhir lelang (lebih dari 90% durasi lelang) untuk menghindari memenangkan lelang.

  8. Auction_Bids : Lelang dengan aktivitas SB cenderung memiliki jumlah tawaran yang jauh lebih tinggi daripada rata-rata tawaran dalam lelang bersamaan.

  9. Starting_Price_Average: penawar pemula biasanya menawarkan harga awal yang kecil untuk menarik penawar yang sah ke dalam pelelangan.

  10. Early_Bidding : Penawar yang lebih tinggi cenderung menawar cukup awal dalam lelang (kurang dari 25% dari durasi lelang) untuk menarik perhatian pengguna lelang.

  11. Winning_Ratio : Penawar yang berani bersaing di banyak lelang tetapi hampir tidak memenangkan lelang apa pun.

  12. Auction_Duration : Berapa lama lelang berlangsung.

  13. Class : 0 untuk penawaran perilaku normal; 1 untuk sebaliknya.

1. Tahap Penyiapan Data

data <- read.csv("D:/Semester 6/TPM/Shill Bidding Dataset.csv")
data.H <- data[,c(-1,-2,-3,-8)]
head(data.H)
##   Bidder_Tendency Bidding_Ratio Successive_Outbidding Last_Bidding
## 1      0.20000000     0.4000000                     0 0.0000277778
## 2      0.02439024     0.2000000                     0 0.0131226852
## 3      0.14285714     0.2000000                     0 0.0030416667
## 4      0.10000000     0.2000000                     0 0.0974768519
## 5      0.05128205     0.2222222                     0 0.0013177910
## 6      0.03846154     0.1111111                     0 0.0168435847
##   Starting_Price_Average Early_Bidding Winning_Ratio Auction_Duration Class
## 1              0.9935928  0.0000277778     0.6666667                5     0
## 2              0.9935928  0.0131226852     0.9444444                5     0
## 3              0.9935928  0.0030416667     1.0000000                5     0
## 4              0.9935928  0.0974768519     1.0000000                5     0
## 5              0.0000000  0.0012417328     0.5000000                7     0
## 6              0.0000000  0.0168435847     0.8000000                7     0
skimr::skim(data.H)
Data summary
Name data.H
Number of rows 6321
Number of columns 9
_______________________
Column type frequency:
numeric 9
________________________
Group variables None

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
Bidder_Tendency 0 1 0.14 0.20 0.00 0.03 0.06 0.17 1 ▇▁▁▁▁
Bidding_Ratio 0 1 0.13 0.13 0.01 0.04 0.08 0.17 1 ▇▁▁▁▁
Successive_Outbidding 0 1 0.10 0.28 0.00 0.00 0.00 0.00 1 ▇▁▁▁▁
Last_Bidding 0 1 0.46 0.38 0.00 0.05 0.44 0.86 1 ▇▂▂▃▆
Starting_Price_Average 0 1 0.47 0.49 0.00 0.00 0.00 0.99 1 ▇▁▁▁▇
Early_Bidding 0 1 0.43 0.38 0.00 0.03 0.36 0.83 1 ▇▂▂▂▅
Winning_Ratio 0 1 0.37 0.44 0.00 0.00 0.00 0.85 1 ▇▁▁▁▅
Auction_Duration 0 1 4.62 2.47 1.00 3.00 5.00 7.00 10 ▅▅▃▇▁
Class 0 1 0.11 0.31 0.00 0.00 0.00 0.00 1 ▇▁▁▁▁

Berdasarkan output diatas, dapat dilihat bahwa terdapat 13 peubah dan 6.321 observasi, tetapi peubah yang digunakan hanya 9. Peubah yang digunakan yaitu Bidder_Tendency, Bidding_Ratio, Successive_Outbidding, Last_Bidding, Starting_Price_Average, Early_Bidding, Winning_Ratio, Auction_Duration, dan Class. Dapat dilihat bahwa tidak terdapat missing value pada semua peubah data Shill Bidding, sehingga tidak diperlukan penanganan missing value.

2. Eksplorasi

summary(data.H)
##  Bidder_Tendency   Bidding_Ratio     Successive_Outbidding  Last_Bidding    
##  Min.   :0.00000   Min.   :0.01176   Min.   :0.0000        Min.   :0.00000  
##  1st Qu.:0.02703   1st Qu.:0.04348   1st Qu.:0.0000        1st Qu.:0.04793  
##  Median :0.06250   Median :0.08333   Median :0.0000        Median :0.44094  
##  Mean   :0.14254   Mean   :0.12767   Mean   :0.1038        Mean   :0.46312  
##  3rd Qu.:0.16667   3rd Qu.:0.16667   3rd Qu.:0.0000        3rd Qu.:0.86036  
##  Max.   :1.00000   Max.   :1.00000   Max.   :1.0000        Max.   :0.99990  
##  Starting_Price_Average Early_Bidding     Winning_Ratio    Auction_Duration
##  Min.   :0.0000         Min.   :0.00000   Min.   :0.0000   Min.   : 1.000  
##  1st Qu.:0.0000         1st Qu.:0.02662   1st Qu.:0.0000   1st Qu.: 3.000  
##  Median :0.0000         Median :0.36010   Median :0.0000   Median : 5.000  
##  Mean   :0.4728         Mean   :0.43068   Mean   :0.3677   Mean   : 4.615  
##  3rd Qu.:0.9936         3rd Qu.:0.82676   3rd Qu.:0.8519   3rd Qu.: 7.000  
##  Max.   :0.9999         Max.   :0.99990   Max.   :1.0000   Max.   :10.000  
##      Class       
##  Min.   :0.0000  
##  1st Qu.:0.0000  
##  Median :0.0000  
##  Mean   :0.1068  
##  3rd Qu.:0.0000  
##  Max.   :1.0000
boxplot(data.H,  border = "steelblue", col="orange")

Berdasarkan output diatas, terlihat bahwa peubah

  1. Bidder_Tendency : memiliki nilai minimum 0, median 0.06250, maximum 1 dan terdapat outlier

  2. Bidding_Ratio : memiliki nilai minimum 0.01176, median 0.08333, maximum 1 dan terdapat outlier

  3. Successive_Outbidding : memiliki nilai minimum 0, median 0, maximum 1 dan terdapat outlier

  4. Last_Bidding : memiliki nilai minimum 0, median 0.44094, dan maximum 0.99990

  5. Starting_Price_Average : memiliki nilai minimum 0, median 0, dan maximum 0.9999

  6. Early_Bidding : memiliki nilai minimum 0, median 0.36010, dan maximum 0.99990

  7. Winning_Ratio : memiliki nilai minimum 0, median 0, dan maximum 1

  8. Auction_Duration : memiliki nilai minimum 1, median 5, dan maximum 10

  9. Class : memiliki nilai minimum 0, median 0, maximum 1 dan terdapat outlier

# menghitung korelasi antar kolom
corr_matrix <- round(cor(data.H), 2)
library(corrplot)
# membuat plot korelasi
corrplot(corr_matrix, 
         type="lower",
         method = "color", 
         tl.cex = 0.5, 
         tl.col = "black",
         addCoef.col = "#2F2F2F",
         addCoefasPercent = FALSE,
         number.cex = 0.5,
         diag = FALSE)

Berdasarkan corrplot diatas, terlihat bahwa korelasi antara Early_Bidding dengan Last_Bidding memiliki korelasi yang paling tinggi yaitu 0.95 dan Auction_Duration dengan Bidder_Tendency tidak memiliki korelasi

3. Pemodelan

# Creates a new binary variable, High.
High = ifelse(data$Auction_Bids <=0.3, "No", "Yes")
# Add High to the data set.
data=data.frame(data,High)
# Remove the Sales variable from the data.
data.H <- data[,c(-1,-2,-3,-8)]
# Code High as a factor variable
data.H$High = as.factor(data$High)
class(data.H$High)
## [1] "factor"

Kami akan menggunakan pohon klasifikasi untuk menganalisis data lelang (shill bidding). Kami akan memprediksi Auction Bids (Tawaran Lelang) berdasarkan variabel lainnya. Namun, karena Auction Bids merupakan variabel kontinu, maka kita perlu mengodekannya kembali sebagai variabel biner. Variabel baru diberi nama High yang berisi nilai Yes jika variabel Auction Bids melebihi 0.3 dan No kurang dari atau sama dengan 0.3.

set.seed(234)
train <- createDataPartition(as.factor(data.H$High), p=0.7, list=FALSE)
#train = sample(1:nrow(Carseats.H), 200)
data.train=data.H[train,]
data.test=data.H[-train,]

High.test=High[-train]

Pengklasifikasian yang baik adalah yang memiliki tingkat kesalahan pengujian yang paling kecil. Untuk mengevaluasi kinerja pohon klasifikasi, maka dataset dibagi menjadi data latih (data.train) sebesar 70% dan data uji (data.test) sebesar 30%.

Kita akan membuat pohon klasifikasi menggunakan data latih untuk memprediksi variabel High menggunakan semua variabel kecuali Auction Bids.

fit.tree = rpart(High ~ ., data=data.train, method = "class", cp=0.005)
fit.tree
## n= 4425 
## 
## node), split, n, loss, yval, (yprob)
##       * denotes terminal node
## 
##  1) root 4425 1708 No (0.61401130 0.38598870)  
##    2) Bidding_Ratio>=0.03960784 3509  792 No (0.77429467 0.22570533)  
##      4) Starting_Price_Average< 0.2573036 2130  124 No (0.94178404 0.05821596) *
##      5) Starting_Price_Average>=0.2573036 1379  668 No (0.51559101 0.48440899)  
##       10) Bidder_Tendency< 0.07809147 598  178 No (0.70234114 0.29765886)  
##         20) Bidder_Tendency< 0.0244902 217   34 No (0.84331797 0.15668203) *
##         21) Bidder_Tendency>=0.0244902 381  144 No (0.62204724 0.37795276)  
##           42) Bidding_Ratio>=0.07846154 190   52 No (0.72631579 0.27368421) *
##           43) Bidding_Ratio< 0.07846154 191   92 No (0.51832461 0.48167539)  
##             86) Bidding_Ratio< 0.0531015 92   26 No (0.71739130 0.28260870) *
##             87) Bidding_Ratio>=0.0531015 99   33 Yes (0.33333333 0.66666667) *
##       11) Bidder_Tendency>=0.07809147 781  291 Yes (0.37259923 0.62740077)  
##         22) Auction_Duration< 4 340  169 No (0.50294118 0.49705882)  
##           44) Successive_Outbidding< 0.25 228   96 No (0.57894737 0.42105263) *
##           45) Successive_Outbidding>=0.25 112   39 Yes (0.34821429 0.65178571)  
##             90) Bidding_Ratio>=0.3735465 33   12 No (0.63636364 0.36363636) *
##             91) Bidding_Ratio< 0.3735465 79   18 Yes (0.22784810 0.77215190) *
##         23) Auction_Duration>=4 441  120 Yes (0.27210884 0.72789116)  
##           46) Last_Bidding< 0.4399454 143   61 Yes (0.42657343 0.57342657)  
##             92) Bidding_Ratio>=0.1898327 22    2 No (0.90909091 0.09090909) *
##             93) Bidding_Ratio< 0.1898327 121   41 Yes (0.33884298 0.66115702) *
##           47) Last_Bidding>=0.4399454 298   59 Yes (0.19798658 0.80201342) *
##    3) Bidding_Ratio< 0.03960784 916    0 Yes (0.00000000 1.00000000) *
  • Method merupakan argumen yang dapat dimodifikasi atau dipilih berdasarkan tipe data dari variable respon. Class digunakan untuk tipe kategorik/faktor.

  • CP merupakan nilai numerik yang diberikan untuk menentukan seberapa dalam kita ingin menumbuhkan pohon. Semakin kecil nilainya (mendekati 0), maka akan semakin besar pohonnya. Nilai defaultnya adalah 0.01

# Visualizing the unpruned tree
rpart.plot(fit.tree)

Plot pohon di atas menunjukkan variabel yang digunakan untuk membangun pohon. Pohon yang dipilih berisi 6 variabel dengan 11 pemisahan. Variabel yang digunakan adalah Bidding_Ratio, Starting_Price_Average,Bidder_Tendency, Auction_Duration, Successive_Outbidding, dan Last_Bidding

Dari model tersebut dapat kita lihat bahwa indikator Auction Bids yang paling penting tampaknya adalah Bidding_Ratio karena cabang pertama membedakan nilai lebih besar dari sama dengan 0.04 versus kurang dari 0.04. Indikator penting berikutnya adalah Starting_Price_Average, karena cabang kedua membedakan nilai lebih besar dari 0.26 versus kurang dari 0.26.

Node 2 dan 3 dibentuk dengan memisahkan node 1, root node, pada variabel prediktor Bidding_Ratio. Titik perpecahannya adalah Bidding_Ratio>=0.04; yaitu, simpul 2 terdiri dari semua amatan dengan nilai Bidding_Ratio>=0.04 dan simpul 3 terdiri dari semua amatan dengan Bidding_Ratio<0.04. Kelas yang diprediksi untuk node 2 adalah No, di mana No menunjukkan Bidding_Ratio kurang dari sama dengan 0.04. Terdapat loss sebesar 792 yang artinya akan ada sebanyak 792 amatan yang akan salah diklasifikasi jika kelas yang diprediksi untuk node tersebut diterapkan ke semua amatan. Secara khusus, dari total 3509 amatan, 792 (22.57%) akan salah klasifikasi dan 2717 (77.43%) akan diklasifikasikan dengan benar.

Simpul 4 adalah amatan yang memiliki Starting_Price_Average <0.26. Kelas yang diprediksi untuk simpul 4 adalah No yang menunjukkan penjualan kurang dari atau sama dengan 0.26. Terdapat loss sebesar 124 yaitu, 124 baris akan salah diklasifikasi jika kelas prediksi untuk node tersebut diterapkan ke semua amatan. Dari total 2130 amatan, 124 (5.82%) akan salah klasifikasi dan 2006 (94.18%) akan diklasifikasikan dengan benar.

# Checking the order of variable importance
fit.tree$variable.importance
##          Bidding_Ratio Starting_Price_Average        Bidder_Tendency 
##             950.639202             305.964226             102.005897 
##           Last_Bidding          Early_Bidding  Successive_Outbidding 
##              67.698753              65.376430              29.293682 
##       Auction_Duration          Winning_Ratio                  Class 
##              22.554438              14.541055               7.441722
fit.tree$variable.importance %>% 
   data.frame() %>%
   rownames_to_column(var = "Feature") %>%
   rename(Overall = '.') %>%
   ggplot(aes(x = fct_reorder(Feature, Overall), y = Overall)) +
   geom_pointrange(aes(ymin = 0, ymax = Overall), color = "cadetblue", size = .3) +
   theme_minimal() +
   coord_flip() +
   labs(x = "", y = "", title = "Variable Importance with Simple Classication")

Terlihat peubah yang paling penting adalah peubah Bidding_Ratio lalu Starting_Price_Average, Bidder_Tendency, Last_Bidding, Early_Bidding, Successive_Outbidding, Auction_Duration, Winning_Ratio, dan yang terakhir peubah Class.

Prediksi dengan pohon klasifikasi

Berikutnya kita akan menggunakan model pohon klasifikasi yang telah didapat dari data latih kepada data uji. Kita akan menggunakan fungsi predict() untuk memprediksi variabel High. Meskipun model dapat menghasilkan prediksi yang baik pada data latih, tetap akan ada kemungkinan model bisa menghasilkan prediksi atau kinerja yang buruk pada data uji. Artinya, pohon yang dihasilkan mungkin terlalu rumit. Pohon yang lebih kecil dengan pemisahan yang lebih sedikit akan menghasilkan varians yang lebih rendah dan interpretasi yang lebih baik dengan bias yang kecil.

pred.tree = predict(fit.tree, data.test, type = "class")

Evaluasi Performa Pohon Klasifikasi

table(pred.tree,High.test)
##          High.test
## pred.tree   No  Yes
##       No  1088  168
##       Yes   76  564
matriks_kesalahan <- confusionMatrix(pred.tree, data.test$High)
matriks_kesalahan
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction   No  Yes
##        No  1088  168
##        Yes   76  564
##                                           
##                Accuracy : 0.8713          
##                  95% CI : (0.8554, 0.8861)
##     No Information Rate : 0.6139          
##     P-Value [Acc > NIR] : < 2.2e-16       
##                                           
##                   Kappa : 0.722           
##                                           
##  Mcnemar's Test P-Value : 5.688e-09       
##                                           
##             Sensitivity : 0.9347          
##             Specificity : 0.7705          
##          Pos Pred Value : 0.8662          
##          Neg Pred Value : 0.8812          
##              Prevalence : 0.6139          
##          Detection Rate : 0.5738          
##    Detection Prevalence : 0.6624          
##       Balanced Accuracy : 0.8526          
##                                           
##        'Positive' Class : No              
## 

Dapat dilihat bahwa tingkat kesalahan klasifikasi adalah 12.87%, dihitung dari (168+76)/1896. Ini berarti bahwa model menghasilkan prediksi yang benar sebesar 87.13% pengamatan dalam data uji, atau bisa juga dilihat dari nilai accuracy.

Berikutnya kita dapat melakukan proses Pruning (pemangkasan) untuk melihat apakah dapat memberikan hasil yang lebih baik. Kita akan melihat apakah pemangkasan akan menghasilkan persentase kesalahan klasifikasi yang lebih rendah dan prediksi yang benar dengan persentase yang lebih tinggi. Pemangkasan memilih nilai cp (parameter kompleksitas) yang terkait dengan pohon yang lebih pendek yang meminimalkan tingkat kesalahan validasi silang (xerror). Dari tabel di bawah ini, kita dapat memilih nilai cp yang menghasilkan kesalahan validasi silang (xerror) terendah. Nilai cp terendah adalah 0.005 dan memiliki pohon dengan 11 split.

#plotcp(fit.tree)
printcp(fit.tree)
## 
## Classification tree:
## rpart(formula = High ~ ., data = data.train, method = "class", 
##     cp = 0.005)
## 
## Variables actually used in tree construction:
## [1] Auction_Duration       Bidder_Tendency        Bidding_Ratio         
## [4] Last_Bidding           Starting_Price_Average Successive_Outbidding 
## 
## Root node error: 1708/4425 = 0.38599
## 
## n= 4425 
## 
##          CP nsplit rel error  xerror     xstd
## 1 0.5362998      0   1.00000 1.00000 0.018960
## 2 0.0582553      1   0.46370 0.46370 0.014930
## 3 0.0105386      3   0.34719 0.35714 0.013427
## 4 0.0064403      5   0.32611 0.35246 0.013352
## 5 0.0052693      8   0.30679 0.34660 0.013258
## 6 0.0050000     11   0.29098 0.33841 0.013124
# Explicitly request the lowest cp value
fit.tree$cptable[which.min(fit.tree$cptable[,"xerror"]),"CP"]
## [1] 0.005
plotcp(fit.tree, upper = "splits")

Berikutnya kita akan membuat pohon yang dipangkas dengan menggunakan data latih. Model pohon yang dipangkas berisi 6 variabel yaitu Bidding_Ratio, Starting_Price_Average, Bidder_Tendency, Auction_Duration, Successive_Outbidding, dan Last_Bidding dengan 11 pemisahan.

bestcp <-fit.tree$cptable[which.min(fit.tree$cptable[,"xerror"]),"CP"]
pruned.tree <- prune(fit.tree, cp = bestcp)
rpart.plot(pruned.tree)

Menggunakan Pohon yang dipangkas untuk memprediksi data uji dan mengevaluasi performa pohon.

# Alternate specification 
pred.prune = predict(pruned.tree, data.test, type="class")
table(pred.prune, High.test)
##           High.test
## pred.prune   No  Yes
##        No  1088  168
##        Yes   76  564

Confusion Matrix adalah pengukuran performa untuk masalah klasifikasi machine learning dimana keluaran dapat berupa dua kelas atau lebih. Confusion Matrix berbentuk tabel berisi kombinasi dari nilai prediksi dan nilai aktual. Hasil proses klasifikasi pada confusion matrix direpresentasikan oleh True Positive (TP), True Negative (TN), False Positive (FP), dan False Negative (FN).

True Positive (TP) : Memprediksi positif dan pada aslinya benar demikian.

True Negative (TN): Memprediksi negatif dan pada aslinya benar demikian.

False Positive (FP) / (Kesalahan Tipe 1) Memprediksi positif dan pada aslinya tidak demikian.

False Negative (FN) / Kesalahan Tipe 2 Memprediksi negatif dan pada aslinya tidak demikian (kesalahan yang berbahaya)

Rumus akurasi = (TP+TN) / (TP+FP+FN+TN)

matriks_kesalahan <- confusionMatrix(pred.prune, data.test$High)
matriks_kesalahan
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction   No  Yes
##        No  1088  168
##        Yes   76  564
##                                           
##                Accuracy : 0.8713          
##                  95% CI : (0.8554, 0.8861)
##     No Information Rate : 0.6139          
##     P-Value [Acc > NIR] : < 2.2e-16       
##                                           
##                   Kappa : 0.722           
##                                           
##  Mcnemar's Test P-Value : 5.688e-09       
##                                           
##             Sensitivity : 0.9347          
##             Specificity : 0.7705          
##          Pos Pred Value : 0.8662          
##          Neg Pred Value : 0.8812          
##              Prevalence : 0.6139          
##          Detection Rate : 0.5738          
##    Detection Prevalence : 0.6624          
##       Balanced Accuracy : 0.8526          
##                                           
##        'Positive' Class : No              
## 

Berdasarkan output di atas jika nilai-nilai tersebut dimasukkan ke dalam rumus, nilai akurasinya adalah sebesar 0.8713 yang artinya 87.13% dari pengamatan diklasifikasikan dengan benar, sehingga tingkat kesalahan klasifikasi adalah 12.87%.

data_preds_cart <- bind_cols(
   predict(pruned.tree, newdata = data.test, type = "prob"),
   predicted = predict(pruned.tree, newdata = data.test, type = "class"),
   actual = data.test$High
)

data_cm_cart <- confusionMatrix(data_preds_cart$predicted, reference = data_preds_cart$actual)
data_cm_cart
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction   No  Yes
##        No  1088  168
##        Yes   76  564
##                                           
##                Accuracy : 0.8713          
##                  95% CI : (0.8554, 0.8861)
##     No Information Rate : 0.6139          
##     P-Value [Acc > NIR] : < 2.2e-16       
##                                           
##                   Kappa : 0.722           
##                                           
##  Mcnemar's Test P-Value : 5.688e-09       
##                                           
##             Sensitivity : 0.9347          
##             Specificity : 0.7705          
##          Pos Pred Value : 0.8662          
##          Neg Pred Value : 0.8812          
##              Prevalence : 0.6139          
##          Detection Rate : 0.5738          
##    Detection Prevalence : 0.6624          
##       Balanced Accuracy : 0.8526          
##                                           
##        'Positive' Class : No              
## 
library(yardstick)
mdl_auc <- Metrics::auc(actual = data_preds_cart$actual == "No", data_preds_cart$No)
yardstick::roc_curve(data_preds_cart, actual, No) %>%
  autoplot() +
  labs(
    title = "ROC Curve",
    subtitle = paste0("AUC = ", round(mdl_auc, 4))
  )

Kurva ROC merupakan sebuah kurva yang menggambarkan keakuratan diagnostik dari area di bawah kurva serta menentukan nilai cut-off yang optimal untuk mengidentifikasi kondisi positif dan negatif dalam diagnosis. Area di bawah kurva ROC dapat diukur dengan menggunakan aturan trapesium.

AUC merupakan daerah berbentuk persegi yang nilainya selalu berada diantara 0 dan 1. Pada output di atas, ditunjukkan bahwa nilai AUC dari hasil kurva ROC sebesar 0.9291 atau 92% yang artinya termasuk ke dalam kriteria klasifikasi yang baik.