Tugas Kelompok Praktikum

Package

library(readr)
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
## -- Conflicts ------------------------------------------ tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()
library(Metrics)
# For decision tree model
library(rpart)
library(caret)
## Loading required package: lattice
## 
## Attaching package: 'caret'
## 
## The following objects are masked from 'package:Metrics':
## 
##     precision, recall
## 
## The following object is masked from 'package:purrr':
## 
##     lift
# For data visualization
library(rpart.plot)
library(ROCR)
# Contains the data
library(ISLR)

Data

Penjelasan Peubah :

Record_ID : Pengidentifikasi unik dari record dalam kumpulan data. Auction_ID : Pengidentifikasi unik lelang. Bidder_ID : Pengidentifikasi unik penawar. 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.

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

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.

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

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

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

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

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

Auction_Duration : Berapa lama lelang berlangsung. Class : 0 untuk penawaran perilaku normal; 1 untuk sebaliknya.

dataset <- read_csv("E:/KULIAH/SEMESTER 6/STA1382 Teknik Pembelajaran Mesin/TUGAS PRAK/03. Data Decission Tree I - Shill Bidding Dataset.csv")
## Rows: 6321 Columns: 13
## -- Column specification --------------------------------------------------------
## Delimiter: ","
## chr  (1): Bidder_ID
## dbl (12): Record_ID, Auction_ID, Bidder_Tendency, Bidding_Ratio, Successive_...
## 
## i Use `spec()` to retrieve the full column specification for this data.
## i Specify the column types or set `show_col_types = FALSE` to quiet this message.
# Get the variable names
str(dataset)
## spec_tbl_df [6,321 x 13] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
##  $ Record_ID             : num [1:6321] 1 2 3 4 5 8 10 12 13 27 ...
##  $ Auction_ID            : num [1:6321] 732 732 732 732 900 900 900 900 2370 600 ...
##  $ Bidder_ID             : chr [1:6321] "_***i" "g***r" "t***p" "7***n" ...
##  $ Bidder_Tendency       : num [1:6321] 0.2 0.0244 0.1429 0.1 0.0513 ...
##  $ Bidding_Ratio         : num [1:6321] 0.4 0.2 0.2 0.2 0.222 ...
##  $ Successive_Outbidding : num [1:6321] 0 0 0 0 0 0 0 1 1 0.5 ...
##  $ Last_Bidding          : num [1:6321] 2.78e-05 1.31e-02 3.04e-03 9.75e-02 1.32e-03 ...
##  $ Auction_Bids          : num [1:6321] 0 0 0 0 0 ...
##  $ Starting_Price_Average: num [1:6321] 0.994 0.994 0.994 0.994 0 ...
##  $ Early_Bidding         : num [1:6321] 2.78e-05 1.31e-02 3.04e-03 9.75e-02 1.24e-03 ...
##  $ Winning_Ratio         : num [1:6321] 0.667 0.944 1 1 0.5 ...
##  $ Auction_Duration      : num [1:6321] 5 5 5 5 7 7 7 7 7 7 ...
##  $ Class                 : num [1:6321] 0 0 0 0 0 0 0 1 1 1 ...
##  - attr(*, "spec")=
##   .. cols(
##   ..   Record_ID = col_double(),
##   ..   Auction_ID = col_double(),
##   ..   Bidder_ID = col_character(),
##   ..   Bidder_Tendency = col_double(),
##   ..   Bidding_Ratio = col_double(),
##   ..   Successive_Outbidding = col_double(),
##   ..   Last_Bidding = col_double(),
##   ..   Auction_Bids = col_double(),
##   ..   Starting_Price_Average = col_double(),
##   ..   Early_Bidding = col_double(),
##   ..   Winning_Ratio = col_double(),
##   ..   Auction_Duration = col_double(),
##   ..   Class = col_double()
##   .. )
##  - attr(*, "problems")=<externalptr>

Kita akan menggunakan pohon klasifikasi untuk menganalisis data Shill Bidding. Kumpulan data merupakan simulasi dari penawaran lelang di 6321 auction yang berbeda. ada 6321 pengamatan dan 13 variabel dalam dataset. Kita akan memprediksi Auction_Bids 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.1429 dan No kurang dari atau sama dengan 0.1429.

head(dataset)
## # A tibble: 6 x 13
##   Record_ID Auction_ID Bidder_ID Bidde~1 Biddi~2 Succe~3 Last_~4 Aucti~5 Start~6
##       <dbl>      <dbl> <chr>       <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>
## 1         1        732 _***i      0.2      0.4         0 2.78e-5       0   0.994
## 2         2        732 g***r      0.0244   0.2         0 1.31e-2       0   0.994
## 3         3        732 t***p      0.143    0.2         0 3.04e-3       0   0.994
## 4         4        732 7***n      0.1      0.2         0 9.75e-2       0   0.994
## 5         5        900 z***z      0.0513   0.222       0 1.32e-3       0   0    
## 6         8        900 i***e      0.0385   0.111       0 1.68e-2       0   0    
## # ... with 4 more variables: Early_Bidding <dbl>, Winning_Ratio <dbl>,
## #   Auction_Duration <dbl>, Class <dbl>, and abbreviated variable names
## #   1: Bidder_Tendency, 2: Bidding_Ratio, 3: Successive_Outbidding,
## #   4: Last_Bidding, 5: Auction_Bids, 6: Starting_Price_Average
summary(dataset)
##    Record_ID       Auction_ID    Bidder_ID         Bidder_Tendency  
##  Min.   :    1   Min.   :   5   Length:6321        Min.   :0.00000  
##  1st Qu.: 3778   1st Qu.: 589   Class :character   1st Qu.:0.02703  
##  Median : 7591   Median :1246   Mode  :character   Median :0.06250  
##  Mean   : 7536   Mean   :1241                      Mean   :0.14254  
##  3rd Qu.:11277   3rd Qu.:1867                      3rd Qu.:0.16667  
##  Max.   :15144   Max.   :2538                      Max.   :1.00000  
##  Bidding_Ratio     Successive_Outbidding  Last_Bidding      Auction_Bids   
##  Min.   :0.01176   Min.   :0.0000        Min.   :0.00000   Min.   :0.0000  
##  1st Qu.:0.04348   1st Qu.:0.0000        1st Qu.:0.04793   1st Qu.:0.0000  
##  Median :0.08333   Median :0.0000        Median :0.44094   Median :0.1429  
##  Mean   :0.12767   Mean   :0.1038        Mean   :0.46312   Mean   :0.2316  
##  3rd Qu.:0.16667   3rd Qu.:0.0000        3rd Qu.:0.86036   3rd Qu.:0.4545  
##  Max.   :1.00000   Max.   :1.0000        Max.   :0.99990   Max.   :0.7882  
##  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
# Creates a new binary variable, High.
High = ifelse(dataset$Auction_Bids <=0.1429, "No", "Yes")
# Add High to the data set.
dataset=data.frame(dataset,High)
# Remove the Bidder_Tendency dan variabel yang tidak dibutuhkan from the data.
dataset2 <- dataset[,-c(1:3, 8)]
# Code High as a factor variable
dataset2$High = as.factor(dataset2$High)
class(dataset2$High)
## [1] "factor"

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

head(dataset2)
##   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
##   High
## 1   No
## 2   No
## 3   No
## 4   No
## 5   No
## 6   No
set.seed(234)
train <- createDataPartition(as.factor(dataset2$High), p=0.7, list=FALSE)
#train = sample(1:nrow(Carseats.H), 200)
dataset.train=dataset2[train,]
dataset.test=dataset2[-train,]

High.test=High[-train]

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

fit.tree = rpart(High ~ ., data=dataset.train, method = "class" , cp=0.004)
fit.tree
## n= 4426 
## 
## node), split, n, loss, yval, (yprob)
##       * denotes terminal node
## 
##   1) root 4426 2099 No (0.52575689 0.47424311)  
##     2) Bidding_Ratio>=0.04733894 3225  898 No (0.72155039 0.27844961)  
##       4) Starting_Price_Average< 0.2573036 2029  210 No (0.89650074 0.10349926)  
##         8) Successive_Outbidding< 0.25 1760  146 No (0.91704545 0.08295455) *
##         9) Successive_Outbidding>=0.25 269   64 No (0.76208178 0.23791822)  
##          18) Bidding_Ratio>=0.1639785 252   47 No (0.81349206 0.18650794) *
##          19) Bidding_Ratio< 0.1639785 17    0 Yes (0.00000000 1.00000000) *
##       5) Starting_Price_Average>=0.2573036 1196  508 Yes (0.42474916 0.57525084)  
##        10) Bidder_Tendency< 0.05042373 345  113 No (0.67246377 0.32753623) *
##        11) Bidder_Tendency>=0.05042373 851  276 Yes (0.32432432 0.67567568)  
##          22) Last_Bidding< 0.1307496 185   85 No (0.54054054 0.45945946)  
##            44) Bidding_Ratio>=0.1861472 34    3 No (0.91176471 0.08823529) *
##            45) Bidding_Ratio< 0.1861472 151   69 Yes (0.45695364 0.54304636)  
##              90) Bidder_Tendency< 0.3839286 124   58 No (0.53225806 0.46774194)  
##               180) Successive_Outbidding< 0.25 112   47 No (0.58035714 0.41964286) *
##               181) Successive_Outbidding>=0.25 12    1 Yes (0.08333333 0.91666667) *
##              91) Bidder_Tendency>=0.3839286 27    3 Yes (0.11111111 0.88888889) *
##          23) Last_Bidding>=0.1307496 666  176 Yes (0.26426426 0.73573574)  
##            46) Successive_Outbidding< 0.25 417  141 Yes (0.33812950 0.66187050)  
##              92) Bidding_Ratio>=0.2264957 23    3 No (0.86956522 0.13043478) *
##              93) Bidding_Ratio< 0.2264957 394  121 Yes (0.30710660 0.69289340) *
##            47) Successive_Outbidding>=0.25 249   35 Yes (0.14056225 0.85943775) *
##     3) Bidding_Ratio< 0.04733894 1201    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, anova digunakan untuk tipe numerik, poisson untuk count, dan exp untuk survival data.

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)

Membuat pohon yang dipangkas dengan menggunakan data latih. Model pohon yang dipangkas berisi 5 variabel yaitu Bidding_Ratio, starting_Price_Average, Successive_Outbidding, Bidder_Tendency, dan Last_Bidding dengan 11 pemisahan.

Dari model tersebut dapat kita lihat bahwa indikator Auction_Bids yang paling penting tampaknya adalah Bidding_Ratio karena cabang pertama membedakan lokasi Good versus lokasi Bad, Medium. Indikator penting berikutnya adalah starting_Price_Average.

Node 2 dan 3 dibentuk dengan memisahkan node 1, root node, pada variabel prediktor Bidding_Ratio. Titik perpecahannya adalah Bidding_Ratio>=0.047; yaitu, simpul 2 terdiri dari semua amatan dengan nilai Bidding_Ratio>=0.047 dan simpul 3 terdiri dari semua amatan dengan Bidding_Ratio<=0.047. Kelas yang diprediksi untuk node 2 adalah No, di mana No menunjukkan Auction_Bids kurang dari sama dengan 0.1429.

lanjutannnya ini kurang ngerti interpretasinya Terdapat loss sebesar 67 yang artinya akan ada sebanyak 67 amatan yang akan salah diklasifikasi jika kelas yang diprediksi untuk node tersebut diterapkan ke semua amatan. Secara khusus, dari total 220 amatan, 67 (30.45%) akan salah klasifikasi dan 153 (69.55%) akan diklasifikasikan dengan benar.

Simpul 4 adalah amatan yang memiliki Price >= $106.5. Kelas yang diprediksi untuk simpul 4 adalah No yang menunjukkan penjualan kurang dari atau sama dengan $8. Terdapat loss sebesar 27 - yaitu, 27 baris akan salah diklasifikasi jika kelas prediksi untuk node tersebut diterapkan ke semua amatan. Dari total 144 amatan, 27 (18.75%) akan salah klasifikasi dan 117 (81.25%) akan diklasifikasikan dengan benar.

# Checking the order of variable importance
fit.tree$variable.importance
##          Bidding_Ratio Starting_Price_Average        Bidder_Tendency 
##             974.830898             335.210637              79.073539 
##           Last_Bidding          Early_Bidding  Successive_Outbidding 
##              78.575167              70.705735              41.119714 
##                  Class          Winning_Ratio 
##              22.707649               2.541705
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")

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, dataset.test, type = "class")

Evaluasi Performa Pohon Klasifikasi

table(pred.tree,High.test)
##          High.test
## pred.tree  No Yes
##       No  929 148
##       Yes  67 751
matriks_kesalahan <- confusionMatrix(pred.tree, dataset.test$High)
matriks_kesalahan
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction  No Yes
##        No  929 148
##        Yes  67 751
##                                           
##                Accuracy : 0.8865          
##                  95% CI : (0.8714, 0.9005)
##     No Information Rate : 0.5256          
##     P-Value [Acc > NIR] : < 2.2e-16       
##                                           
##                   Kappa : 0.7715          
##                                           
##  Mcnemar's Test P-Value : 4.871e-08       
##                                           
##             Sensitivity : 0.9327          
##             Specificity : 0.8354          
##          Pos Pred Value : 0.8626          
##          Neg Pred Value : 0.9181          
##              Prevalence : 0.5256          
##          Detection Rate : 0.4902          
##    Detection Prevalence : 0.5683          
##       Balanced Accuracy : 0.8841          
##                                           
##        'Positive' Class : No              
## 

Dapat dilihat bahwa tingkat kesalahan klasifikasi adalah 11.35%, dihitung dari (148+67)/1895. Ini berarti bahwa model menghasilkan prediksi yang benar sebesar 88.65% 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.004049547 dan memiliki pohon dengan 7 split.

#plotcp(fit.tree)
printcp(fit.tree)
## 
## Classification tree:
## rpart(formula = High ~ ., data = dataset.train, method = "class", 
##     cp = 0.004)
## 
## Variables actually used in tree construction:
## [1] Bidder_Tendency        Bidding_Ratio          Last_Bidding          
## [4] Starting_Price_Average Successive_Outbidding 
## 
## Root node error: 2099/4426 = 0.47424
## 
## n= 4426 
## 
##          CP nsplit rel error  xerror     xstd
## 1 0.5721772      0   1.00000 1.00000 0.015827
## 2 0.0857551      1   0.42782 0.42782 0.012746
## 3 0.0566937      2   0.34207 0.34207 0.011685
## 4 0.0071463      3   0.28537 0.29347 0.010971
## 5 0.0061934      4   0.27823 0.29395 0.010978
## 6 0.0042878      5   0.27203 0.28966 0.010911
## 7 0.0040495      7   0.26346 0.28299 0.010804
## 8 0.0040000     11   0.24726 0.28299 0.010804
# Explicitly request the lowest cp value
fit.tree$cptable[which.min(fit.tree$cptable[,"xerror"]),"CP"]
## [1] 0.004049547
plotcp(fit.tree, upper = "splits")

Berikutnya kita akan membuat pohon yang dipangkas dengan menggunakan data latih. Model pohon yang dipangkas berisi 5 variabel yaitu Bidding_Ratio, starting_Price_Average, Bidder_Tendency, Last_Bidding, dan Successive_Outbidding dengan 7 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, dataset.test, type="class")

table(pred.prune, High.test)
##           High.test
## pred.prune  No Yes
##        No  922 154
##        Yes  74 745
matriks_kesalahan <- confusionMatrix(pred.prune, dataset.test$High)
matriks_kesalahan
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction  No Yes
##        No  922 154
##        Yes  74 745
##                                          
##                Accuracy : 0.8797         
##                  95% CI : (0.8642, 0.894)
##     No Information Rate : 0.5256         
##     P-Value [Acc > NIR] : < 2.2e-16      
##                                          
##                   Kappa : 0.7577         
##                                          
##  Mcnemar's Test P-Value : 1.678e-07      
##                                          
##             Sensitivity : 0.9257         
##             Specificity : 0.8287         
##          Pos Pred Value : 0.8569         
##          Neg Pred Value : 0.9096         
##              Prevalence : 0.5256         
##          Detection Rate : 0.4865         
##    Detection Prevalence : 0.5678         
##       Balanced Accuracy : 0.8772         
##                                          
##        'Positive' Class : No             
## 

Berdasarkan pohon yang telah dipangkas, sekarang hanya 87.97% dari pengamatan uji yang diklasifikasikan dengan benar, sehingga tingkat kesalahan klasifikasi adalah 12.13%. Sedangkan pohon yang belum dipangkas memiliki tingkat kesalahan klasifikasi sebesar 11.35%. Oleh karena itu, model yang dipangkas menghasilkan peningkatan bias yang diukur dengan tingkat kesalahan pengujian. Akibatnya, kita akan memilih pohon yang lebih besar dan tidak dipangkas karena tingkat kesalahan pengujian lebih rendah daripada tingkat kesalahan pengujian pohon yang dipangkas. Ingatlah bahwa pengklasifikasi yang baik adalah yang kesalahan pengujiannya paling kecil. Contoh ini menunjukkan bahwa pemangkasan tidak selalu efektif dalam mengurangi bias. Penting untuk dicatat bahwa kita dapat memilih pohon yang dipangkas jika interpretabilitas lebih penting daripada bias yang lebih rendah.

Berdasarkan hasil tersebut, pohon yang paling baik adalah pohon yang belum dipangkas karena memiliki tingkat kesalahan klasifikasi yang lebih kecil dibandingkan pohon yang telah dipangkas.

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

dataset_cm_cart <- confusionMatrix(dataset_preds_cart$predicted, reference = dataset_preds_cart$actual)
dataset_cm_cart
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction  No Yes
##        No  922 154
##        Yes  74 745
##                                          
##                Accuracy : 0.8797         
##                  95% CI : (0.8642, 0.894)
##     No Information Rate : 0.5256         
##     P-Value [Acc > NIR] : < 2.2e-16      
##                                          
##                   Kappa : 0.7577         
##                                          
##  Mcnemar's Test P-Value : 1.678e-07      
##                                          
##             Sensitivity : 0.9257         
##             Specificity : 0.8287         
##          Pos Pred Value : 0.8569         
##          Neg Pred Value : 0.9096         
##              Prevalence : 0.5256         
##          Detection Rate : 0.4865         
##    Detection Prevalence : 0.5678         
##       Balanced Accuracy : 0.8772         
##                                          
##        'Positive' Class : No             
## 
#install.packages("yardstick")
library(yardstick)
## For binary classification, the first factor level is assumed to be the event.
## Use the argument `event_level = "second"` to alter this as needed.
## 
## Attaching package: 'yardstick'
## The following objects are masked from 'package:caret':
## 
##     precision, recall, sensitivity, specificity
## The following objects are masked from 'package:Metrics':
## 
##     accuracy, mae, mape, mase, precision, recall, rmse, smape
## The following object is masked from 'package:readr':
## 
##     spec
mdl_auc <- Metrics::auc(actual = dataset_preds_cart$actual == "No", dataset_preds_cart$No)
yardstick::roc_curve(dataset_preds_cart, actual, No) %>%
  autoplot() +
  labs(
    title = "ROC Curve",
    subtitle = paste0("AUC = ", round(mdl_auc, 4))
  )