Tugas Kelompok Classification Tree CART - Kelompok 3
Kelompok 3
Mufti Habibie Alayubi G1401201027
Angelika Anggreni Batubara G1401201040
Alifa Shakila G1401201087
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
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.
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)| 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
Bidder_Tendency : memiliki nilai minimum 0, median 0.06250, maximum 1 dan terdapat outlier
Bidding_Ratio : memiliki nilai minimum 0.01176, median 0.08333, maximum 1 dan terdapat outlier
Successive_Outbidding : memiliki nilai minimum 0, median 0, maximum 1 dan terdapat outlier
Last_Bidding : memiliki nilai minimum 0, median 0.44094, dan maximum 0.99990
Starting_Price_Average : memiliki nilai minimum 0, median 0, dan maximum 0.9999
Early_Bidding : memiliki nilai minimum 0, median 0.36010, dan maximum 0.99990
Winning_Ratio : memiliki nilai minimum 0, median 0, dan maximum 1
Auction_Duration : memiliki nilai minimum 1, median 5, dan maximum 10
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.