Package

library(tidyverse)
library(mlr3verse)
library(mlr3extralearners)
library(rpart.plot)
library(cowplot)
library(precrec)
library(kknn)
library(ranger)

Studi Kasus

Sebuah operator telekomunikasi seluler akan menjajagi kerja sama dengan sebuah bank untuk meningkatkan angka recharge pelanggan pra-bayar melalui channel perbankan (ATM, internet banking, dsb). Mereka ingin memperoleh model yang dapat digunakan untuk memprediksi pelanggan mana saja yang potensial untuk diajak menggunakan channel tersebut

Tujuan

Mencari model Machine Learning terbaik berdasarkan data yang tersedia

model machine learning yang akan digunakan:

  • Regresi Logistik
  • KNN
  • Pohon Klasifikasi
  • Bagging
  • Random Forest

Data

Import Data

data_pelanggan <- read.csv("Tugas_STA581.csv",stringsAsFactors = TRUE)
glimpse(data_pelanggan)
## Rows: 50,000
## Columns: 13
## $ ID  <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,…
## $ X1  <int> 257, 24, 1, 627, 42, 65, 209, 11, 16, 117, 144, 184, 521, 3, 215, …
## $ X2  <int> 13643, 13897, 760, 41160, 19002, 38253, 76895, 12650, 2491, 55057,…
## $ X3  <int> 27, 15, 1, 97, 38, 43, 262, 10, 3, 121, 66, 57, 166, 7, 42, 4, 71,…
## $ X4  <dbl> 0.7799619, 0.7393772, 0.5000000, 0.7065245, 0.7495756, 0.7786787, …
## $ X5  <dbl> 0.9627874, 0.9061206, 1.0000000, 0.9976897, 0.9643634, 1.0000000, …
## $ X6  <int> 5217, 18025, 3275, 2864, 2794, 1122, 14061, 16131, 1892, 4222, 243…
## $ X7  <dbl> 0.7687453, 0.2906286, 0.9617486, 0.7232183, 0.7481289, 1.0000000, …
## $ X8  <int> 768, 2368, 2542, 0, 0, 5, 0, 0, 405, 0, 74, 8, 0, 0, 0, 666, 2397,…
## $ X9  <int> 30006, 39954, 43544, 0, 0, 1719, 0, 0, 18934, 0, 120, 13, 0, 0, 0,…
## $ X10 <dbl> 6.3, 7.3, 1.3, 9.3, 4.0, 17.0, 24.7, 10.0, 3.7, 8.7, 4.3, 4.3, 26.…
## $ X11 <dbl> 4.7, 5.3, 1.3, 5.0, 1.0, 14.7, 9.7, 5.3, 2.0, 6.0, 3.7, 3.0, 11.7,…
## $ Y   <int> 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, …

Deskripsi Data

Data yang tersedia merupakan Informasi mengenai penggunaan channel perbankan dari 50.000 pelanggan dengan 11 variabel X yaitu:

  • X1 : rata-rata durasi melakukan panggilan per bulan (menit)
  • X2 : rata-rata penghasilan dari transaksi panggilan per bulan (Rp)
  • X3 : rata-rata frekuensi melakukan panggilan per bulan
  • X4 : persentase panggilan di jam kerja
  • X5 : persentase panggilan sesama operator
  • X6 : rata-rata penghasilan dari transaksi SMS per bulan (Rp)
  • X7 : persentase transaksi SMS sesama operator
  • X8 : rata-rata pemakaian data per bulan (MB)
  • X9 : rata-rata penghasilan dari transaksi pemakaian data per bulan (Rp)
  • X10 : rata-rata frekuensi melakukan recharge pulsa per bulan
  • X11 : rata-rata banyaknya wilayah yang dikunjungi per bulan
  • Y : pelanggan yang berpotensi untuk diajak menggunakan channel perbankan (ATM, internet banking, dsb)

Variabel Y merupkan variabel respon yang memiliki tipe data kategorik yaitu 0 (tidak berpotensi) dan 1 (berpotensi), namun dari output diatas dapat dilihat bahwa tipe data var Y adalah int sehingga perlu diubah menjadi factor, selain itu variabel ID dapat dihilangkan karna tidak akan diperlukan untuk analisis selanjutnya.

data_pelanggan$Y <- as.factor(data_pelanggan$Y)
data_pelanggan <- data_pelanggan %>% select(-ID)

Eksplorasi Data

summary(data_pelanggan)
##        X1               X2               X3                X4        
##  Min.   :   0.0   Min.   :     0   Min.   :   0.00   Min.   :0.0000  
##  1st Qu.:  14.0   1st Qu.: 10621   1st Qu.:  10.00   1st Qu.:0.6975  
##  Median :  47.0   Median : 22092   Median :  24.00   Median :0.7498  
##  Mean   : 110.7   Mean   : 27908   Mean   :  40.23   Mean   :0.7342  
##  3rd Qu.: 131.0   3rd Qu.: 36629   3rd Qu.:  50.00   3rd Qu.:0.8011  
##  Max.   :4130.0   Max.   :638172   Max.   :1007.00   Max.   :1.0000  
##        X5               X6               X7               X8         
##  Min.   :0.0000   Min.   :     0   Min.   :0.0000   Min.   :    0.0  
##  1st Qu.:0.8534   1st Qu.:  1422   1st Qu.:0.6400   1st Qu.:    0.0  
##  Median :0.9703   Median :  3975   Median :0.8626   Median :   73.0  
##  Mean   :0.8824   Mean   :  6746   Mean   :0.7718   Mean   :  946.9  
##  3rd Qu.:0.9972   3rd Qu.:  9261   3rd Qu.:0.9816   3rd Qu.:  925.0  
##  Max.   :1.0000   Max.   :244444   Max.   :1.0000   Max.   :59611.0  
##        X9              X10              X11         Y        
##  Min.   :     0   Min.   : 0.000   Min.   : 0.000   0:40664  
##  1st Qu.:     0   1st Qu.: 3.300   1st Qu.: 2.000   1: 9336  
##  Median :  2514   Median : 6.000   Median : 3.000            
##  Mean   : 16144   Mean   : 7.129   Mean   : 3.676            
##  3rd Qu.: 24431   3rd Qu.: 9.700   3rd Qu.: 4.700            
##  Max.   :504086   Max.   :30.700   Max.   :35.700

berdasarkan output diatas dapat dilihat bahwa dari data pelanggan yang tersedia ternyata pelanggan yang berpotensi untuk diajak menggunakan channel perbankan (ATM, internet banking, dsb) yaitu sebesar 18.672% cenderung lebih sedikit dibandingkan pelanggan yang berpotensi untuk diajak menggunakan channel perbankan (ATM, internet banking, dsb).

Visual

x1_y <- ggplot(data_pelanggan, aes(x = X1, y = Y)) +
  geom_boxplot() +
  theme_minimal() +
  labs(title = "X1 vs Y")

x2_y <- ggplot(data_pelanggan, aes(x = X2, y = Y)) +
  geom_boxplot() +
  theme_minimal() +
  labs(title = "X2 vs Y")

x3_y <- ggplot(data_pelanggan, aes(x = X3, y = Y)) +
  geom_boxplot() +
  theme_minimal() +
  labs(title = "X3 vs Y")

x4_y <- ggplot(data_pelanggan, aes(x = X4, y = Y)) +
  geom_boxplot() +
  theme_minimal() +
  labs(title = "X4 vs Y")

x5_y <- ggplot(data_pelanggan, aes(x = X5, y = Y)) +
  geom_boxplot() +
  theme_minimal() +
  labs(title = "X5 vs Y")

x6_y <- ggplot(data_pelanggan, aes(x = X6, y = Y)) +
  geom_boxplot() +
  theme_minimal() +
  labs(title = "X6 vs Y")

x7_y <- ggplot(data_pelanggan, aes(x = X7, y = Y)) +
  geom_boxplot() +
  theme_minimal() +
  labs(title = "X7 vs Y")

x8_y <- ggplot(data_pelanggan, aes(x = X8, y = Y)) +
  geom_boxplot() +
  theme_minimal() +
  labs(title = "X8 vs Y")

x9_y <- ggplot(data_pelanggan, aes(x = X9, y = Y)) +
  geom_boxplot() +
  theme_minimal() +
  labs(title = "X9 vs Y")

x10_y <- ggplot(data_pelanggan, aes(x = X10, y = Y)) +
  geom_boxplot() +
  theme_minimal() +
  labs(title = "X10 vs Y")

x11_y <- ggplot(data_pelanggan, aes(x = X11, y = Y)) +
  geom_boxplot() +
  theme_minimal() +
  labs(title = "X11 vs Y")

plot_grid(x1_y, x2_y, x3_y, x4_y, x5_y, x6_y, x7_y, x8_y, x9_y, x10_y, x11_y)

Jika dilihat dari box plot diatas untuk masing - masing pasangan var x dengan var y terlihat bahwa terdapat banyak pencilan sehingga disarankan untuk tidak menggunakan model regresi biasa

Data Pre-processing

# Import data ke ekosistem mlr3
task_pelanggan = TaskClassif$new(id="pelanggan",
                                 backend = data_pelanggan,
                                 target = "Y", 
                                 positive = "1")

Spliting Data

Membagi data menjadi dua bagian

Pada kasus ini data akan dibagi menjadi dua bagian yaitu data training dan data testing dengan proporsi data training sebesar 0.8 dari data dan data testing sebesar 0.2 dengan menggunakan pembagian data menggunakan fungsi holdout

set.seed(6)
resample_pelanggan =rsmp("holdout", ratio = 0.8)
resample_pelanggan$instantiate(task=task_pelanggan)

Pemodelan

Regresi Logistik

Model

# model
learner_logreg <- lrn("classif.log_reg", predict_type="prob")
learner_logreg$train(task = task_pelanggan)
summary(learner_logreg$model)
## 
## Call:
## stats::glm(formula = task$formula(), family = "binomial", data = data, 
##     model = FALSE)
## 
## Coefficients:
##               Estimate Std. Error z value Pr(>|z|)    
## (Intercept) -1.832e+00  7.439e-02 -24.622  < 2e-16 ***
## X1           5.414e-04  8.572e-05   6.316 2.68e-10 ***
## X10         -1.200e-01  5.488e-03 -21.869  < 2e-16 ***
## X11         -8.910e-02  1.033e-02  -8.628  < 2e-16 ***
## X2           1.502e-05  5.612e-07  26.759  < 2e-16 ***
## X3           8.204e-07  3.471e-04   0.002    0.998    
## X4           1.011e+00  9.139e-02  11.066  < 2e-16 ***
## X5          -3.705e-01  7.503e-02  -4.939 7.87e-07 ***
## X6           1.350e-05  1.854e-06   7.280 3.34e-13 ***
## X7           4.477e-02  5.427e-02   0.825    0.409    
## X8           4.208e-06  6.030e-06   0.698    0.485    
## X9           1.992e-05  5.264e-07  37.838  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 48143  on 49999  degrees of freedom
## Residual deviance: 42901  on 49988  degrees of freedom
## AIC: 42925
## 
## Number of Fisher Scoring iterations: 5

training

train_test_reglog = resample(task = task_pelanggan,
                               learner = learner_logreg,
                               resampling = resample_pelanggan,
                               store_models = TRUE)
## INFO  [19:30:40.071] [mlr3] Applying learner 'classif.log_reg' on task 'pelanggan' (iter 1/1)

Prediksi

prediksi_test_reglog = as.data.table(train_test_reglog$prediction())
prediksi_test_reglog
##        row_ids  truth response     prob.1    prob.0
##          <int> <fctr>   <fctr>      <num>     <num>
##     1:       1      1        0 0.17991295 0.8200870
##     2:       8      0        0 0.07013938 0.9298606
##     3:      15      0        0 0.13422142 0.8657786
##     4:      17      1        0 0.19861496 0.8013850
##     5:      22      0        0 0.27956388 0.7204361
##    ---                                             
##  9996:   49971      0        0 0.22616562 0.7738344
##  9997:   49979      0        0 0.08510491 0.9148951
##  9998:   49982      1        1 0.60513922 0.3948608
##  9999:   49991      0        0 0.24768420 0.7523158
## 10000:   49996      0        0 0.03004000 0.9699600

Confusion Matrix

train_test_reglog$prediction()$confusion
##         truth
## response    1    0
##        1  187  160
##        0 1622 8031

Berdasarkan output confusion matrix pada model regresi logistik diatas dapat dilihat bahwa hasil prediksi dengan klasifikasi 0 padahal seharusnya 1 masih lebih banyak dibandingkan hasil klasifikasi 1 yang sebenarnya 1.

Performa Model

## Akurasi
akurasi_regrlog <- train_test_reglog$aggregate(list(msr("classif.acc"),
                                   msr("classif.specificity"),
                                   msr("classif.sensitivity")
                                   ))
akurasi_regrlog
##         classif.acc classif.specificity classif.sensitivity 
##           0.8218000           0.9804664           0.1033720

Jika dilihat berdasarkan akurasinya ternyata model regresi logistik memiliki akurasi yang tinggi yaitu sebesar 82.18%

# Kurva ROC
autoplot(train_test_reglog, type = "roc")

KNN

Model

learner_knn <- lrn("classif.kknn",predict_type="prob" ,k=10,kernel="rectangular")

Training

set.seed(6)
train_test_knn = resample(task = task_pelanggan,
                          learner = learner_knn,
                          resampling = resample_pelanggan,
                          store_models = TRUE)
## INFO  [19:30:41.412] [mlr3] Applying learner 'classif.kknn' on task 'pelanggan' (iter 1/1)

Prediksi

prediksi_test_KNN = as.data.table(train_test_knn$prediction())
head(prediksi_test_KNN)
##    row_ids  truth response prob.1 prob.0
##      <int> <fctr>   <fctr>  <num>  <num>
## 1:       1      1        0    0.3    0.7
## 2:       8      0        0    0.0    1.0
## 3:      15      0        0    0.0    1.0
## 4:      17      1        0    0.2    0.8
## 5:      22      0        0    0.2    0.8
## 6:      27      0        0    0.2    0.8

Confussion Matrix

train_test_knn$prediction()$confusion
##         truth
## response    1    0
##        1  345  392
##        0 1464 7799

Berdasarkan output confusion matrix pada model KNN diatas dapat dilihat bahwa hasil prediksi dengan klasifikasi 0 padahal seharusnya 1 masih lebih banyak dibandingkan hasil kalsifikasi 1 yang sebenarnya 1, sehingga model ini belum cukup baik untuk digunakan.

Performa Model

# Akurasi
akurasi_knn <- train_test_knn$aggregate(list(msr("classif.acc"),
                                   msr("classif.specificity"),
                                   msr("classif.sensitivity")
                                   ))
akurasi_knn
##         classif.acc classif.specificity classif.sensitivity 
##           0.8144000           0.9521426           0.1907131

Jika dilihat berdasarkan akurasinya ternyata model KNN memiliki akurasi yang tinggi yaitu sebesar 81.44%

# Kurva ROC
autoplot(train_test_knn, type = "roc")

Pohon Klasifikasi

Model

learner_tree <-  lrn("classif.rpart", cp = 0.001, predict_type="prob")
learner_tree$train(task = task_pelanggan)
rpart.plot(learner_tree$model,roundint = F,type = 5,tweak = 2)

Training

set.seed(6)
train_test_tree = resample(task = task_pelanggan,
                           learner = learner_tree,
                           resampling = resample_pelanggan,
                           store_models = TRUE
                           )
## INFO  [19:30:50.343] [mlr3] Applying learner 'classif.rpart' on task 'pelanggan' (iter 1/1)

Prediksi

prediksi_test_tree = as.data.table(train_test_tree$prediction())
prediksi_test_tree
##        row_ids  truth response    prob.1    prob.0
##          <int> <fctr>   <fctr>     <num>     <num>
##     1:       1      1        0 0.1592170 0.8407830
##     2:       8      0        0 0.1286781 0.8713219
##     3:      15      0        0 0.1286781 0.8713219
##     4:      17      1        0 0.2647059 0.7352941
##     5:      22      0        0 0.3762475 0.6237525
##    ---                                            
##  9996:   49971      0        0 0.1286781 0.8713219
##  9997:   49979      0        0 0.1286781 0.8713219
##  9998:   49982      1        0 0.1592170 0.8407830
##  9999:   49991      0        0 0.1286781 0.8713219
## 10000:   49996      0        0 0.1286781 0.8713219

confusion matrix

train_test_tree$prediction()$confusion
##         truth
## response    1    0
##        1  326  273
##        0 1483 7918

Berdasarkan hasil output confussion matrix diatas dapat dilihat bahwa hasil prediksi dengan klasifikasi 0 padahal seharusnya 1 lebih banyak dibandingkan hasil kalsifikasi 1 yang sebenarnya 1, sehingga model ini belum cukup baik untuk digunakan.

Performa Model

akurasi_dtree <- train_test_tree$aggregate(list(msr("classif.acc"),
                                   msr("classif.specificity"),
                                   msr("classif.sensitivity")
                                   ))
akurasi_dtree
##         classif.acc classif.specificity classif.sensitivity 
##           0.8244000           0.9666707           0.1802101

Jika dilihat berdasarkan akurasinya ternyata model pohon klasifikasi (decision tree) memiliki akurasi yang tinggi yaitu sebesar 82.44%

# KUrva ROC
autoplot(train_test_tree, type = "roc")

Bagging

Model

learner_bagging <-  lrn(id="bagging clf", "classif.ranger", mtry=11, predict_type="prob", importance="impurity")

Training

set.seed(6)
train_test_bagging = resample(task = task_pelanggan,
                               learner = learner_bagging,
                               resampling = resample_pelanggan,
                               store_models = TRUE
                               )
## INFO  [19:30:51.111] [mlr3] Applying learner 'bagging clf' on task 'pelanggan' (iter 1/1)
## Growing trees.. Progress: 25%. Estimated remaining time: 1 minute, 33 seconds.
## Growing trees.. Progress: 39%. Estimated remaining time: 1 minute, 37 seconds.
## Growing trees.. Progress: 48%. Estimated remaining time: 1 minute, 40 seconds.
## Growing trees.. Progress: 57%. Estimated remaining time: 1 minute, 35 seconds.
## Growing trees.. Progress: 65%. Estimated remaining time: 1 minute, 23 seconds.
## Growing trees.. Progress: 74%. Estimated remaining time: 1 minute, 5 seconds.
## Growing trees.. Progress: 83%. Estimated remaining time: 44 seconds.
## Growing trees.. Progress: 92%. Estimated remaining time: 22 seconds.

confusion matrix

train_test_bagging$prediction()$confusion
##         truth
## response    1    0
##        1  353  309
##        0 1456 7882

Berdasarkan output confusion matrix pada model bagging diatas dapat dilihat bahwa hasil prediksi dengan klasifikasi 0 padahal seharusnya 1 masih lebih banyak dibandingkan hasil kalsifikasi 1 yang sebenarnya 1, sehingga model ini belum cukup baik untuk digunakan.

Performa Model

# Akurasi
akurasi_bagging <- train_test_bagging$aggregate(list(msr("classif.acc"),
                                   msr("classif.specificity"),
                                   msr("classif.sensitivity")
                                   ))
akurasi_bagging
##         classif.acc classif.specificity classif.sensitivity 
##           0.8235000           0.9622757           0.1951354

Jika dilihat berdasarkan akurasinya ternyata model KNN memiliki akurasi yang tinggi yaitu sebesar 82.35%

ROC

autoplot(train_test_bagging, type = "roc")

Random Forest

Model

learner_rf <- lrn("classif.ranger", predict_type="prob",importance="impurity")
learner_rf$train(task=task_pelanggan)
## Growing trees.. Progress: 20%. Estimated remaining time: 2 minutes, 4 seconds.
## Growing trees.. Progress: 41%. Estimated remaining time: 1 minute, 27 seconds.
## Growing trees.. Progress: 62%. Estimated remaining time: 56 seconds.
## Growing trees.. Progress: 83%. Estimated remaining time: 25 seconds.
learner_rf$model$variable.importance
##        X1       X10       X11        X2        X3        X4        X5        X6 
##  934.1423  955.4392  833.3195 1459.0227  843.0345 1105.8651 1042.4550 1111.9607 
##        X7        X8        X9 
##  940.8638 1099.1962 1496.6473
importance <- data.frame(Predictors = names(learner_rf$model$variable.importance),
                         impurity = learner_rf$model$variable.importance
                         )
rownames(importance) <- NULL

importance %>% arrange(desc(impurity))
##    Predictors  impurity
## 1          X9 1496.6473
## 2          X2 1459.0227
## 3          X6 1111.9607
## 4          X4 1105.8651
## 5          X8 1099.1962
## 6          X5 1042.4550
## 7         X10  955.4392
## 8          X7  940.8638
## 9          X1  934.1423
## 10         X3  843.0345
## 11        X11  833.3195
#grafik
ggplot(importance,
       aes(x=impurity,
           y=reorder(Predictors,impurity))) +
  geom_col(fill = "steelblue")+
  geom_text(aes(label=round(impurity,2)),hjust=1.2)

Dari hasil output diatas terlihat bahwa variabel yang paling berpengaruh adalah x9 dan x2 sedangkan yang pengaruhnya kecil diantara variabel lainnya adalah x11 dan x3.

Training

set.seed(6)
train_test_rf = resample(task = task_pelanggan,
                               learner = learner_rf,
                               resampling = resample_pelanggan,
                               store_models = TRUE
                               )
## INFO  [19:38:41.522] [mlr3] Applying learner 'classif.ranger' on task 'pelanggan' (iter 1/1)
## Growing trees.. Progress: 28%. Estimated remaining time: 1 minute, 19 seconds.
## Growing trees.. Progress: 56%. Estimated remaining time: 49 seconds.
## Growing trees.. Progress: 84%. Estimated remaining time: 17 seconds.

Prediksi

prediksi_test_rf = as.data.table(train_test_rf$prediction())
head(prediksi_test_rf)
##    row_ids  truth response     prob.1    prob.0
##      <int> <fctr>   <fctr>      <num>     <num>
## 1:       1      1        0 0.29487460 0.7051254
## 2:       8      0        0 0.05367857 0.9463214
## 3:      15      0        0 0.05011032 0.9498897
## 4:      17      1        0 0.22300873 0.7769913
## 5:      22      0        0 0.39980238 0.6001976
## 6:      27      0        0 0.15816649 0.8418335

Confussion Matrix

train_test_rf$prediction()$confusion
##         truth
## response    1    0
##        1  296  251
##        0 1513 7940

Berdasarkan output confusion matrix pada model KNN diatas dapat dilihat bahwa hasil prediksi dengan klasifikasi 0 padahal seharusnya 1 masih lebih banyak dibandingkan hasil kalsifikasi 1 yang sebenarnya 1, sehingga model ini belum cukup baik untuk digunakan.

Performa Model

# Akurasi
akurasi_rf <- train_test_rf$aggregate(list(msr("classif.acc"),
                                   msr("classif.specificity"),
                                   msr("classif.sensitivity")
                                   ))
akurasi_rf
##         classif.acc classif.specificity classif.sensitivity 
##           0.8236000           0.9693566           0.1636263

Jika dilihat berdasarkan akurasinya ternyata model random forest memiliki akurasi yang tinggi yaitu sebesar 82.36%

ROC

autoplot(train_test_rf, type = "roc")

Komparasi Model

Akurasi

# Buat daftar akurasi
akurasi <- list(
  regresi.logistik = akurasi_regrlog,
  knn = akurasi_knn,
  pohon.klasifikasi = akurasi_dtree,
  bagging = akurasi_bagging,
  random.forest = akurasi_rf
)

df_akurasi <- round(t(data.frame(akurasi)), 4)
df_akurasi <- as.data.frame(df_akurasi)
df_akurasi <- df_akurasi %>% 
  select(classif.acc) %>% 
  arrange(desc(classif.acc))
df_akurasi
##                   classif.acc
## pohon.klasifikasi      0.8244
## random.forest          0.8236
## bagging                0.8235
## regresi.logistik       0.8218
## knn                    0.8144

berdasarkan hasil akurasi diatas dapat dilihat bahwa kelima model memiliki nilai akurasi yang tidak terlalu berbeda satu sama lain. Walaupun begitu pohon klasifikasi memiliki nilai akurasi paling tinggi.

Kurva ROC

set.seed(6)
learner <- list(learner_logreg,
                learner_tree,
                learner_rf,
                learner_knn,
                learner_bagging)
set.seed(6)
design <- benchmark_grid(tasks = task_pelanggan,
                         learners = learner,
                         resamplings = resample_pelanggan 
                         )
bmr = benchmark(design,store_models = TRUE)
## INFO  [19:41:05.216] [mlr3] Running benchmark with 5 resampling iterations
## INFO  [19:41:05.232] [mlr3] Applying learner 'classif.log_reg' on task 'pelanggan' (iter 1/1)
## INFO  [19:41:05.857] [mlr3] Applying learner 'classif.rpart' on task 'pelanggan' (iter 1/1)
## INFO  [19:41:06.582] [mlr3] Applying learner 'classif.ranger' on task 'pelanggan' (iter 1/1)
## Growing trees.. Progress: 28%. Estimated remaining time: 1 minute, 18 seconds.
## Growing trees.. Progress: 57%. Estimated remaining time: 46 seconds.
## Growing trees.. Progress: 86%. Estimated remaining time: 14 seconds.
## INFO  [19:43:17.879] [mlr3] Applying learner 'classif.kknn' on task 'pelanggan' (iter 1/1)
## INFO  [19:43:36.883] [mlr3] Applying learner 'bagging clf' on task 'pelanggan' (iter 1/1)
## Growing trees.. Progress: 9%. Estimated remaining time: 5 minutes, 13 seconds.
## Growing trees.. Progress: 18%. Estimated remaining time: 4 minutes, 42 seconds.
## Growing trees.. Progress: 27%. Estimated remaining time: 4 minutes, 8 seconds.
## Growing trees.. Progress: 36%. Estimated remaining time: 3 minutes, 36 seconds.
## Growing trees.. Progress: 45%. Estimated remaining time: 3 minutes, 6 seconds.
## Growing trees.. Progress: 55%. Estimated remaining time: 2 minutes, 34 seconds.
## Growing trees.. Progress: 64%. Estimated remaining time: 2 minutes, 2 seconds.
## Growing trees.. Progress: 73%. Estimated remaining time: 1 minute, 30 seconds.
## Growing trees.. Progress: 83%. Estimated remaining time: 58 seconds.
## Growing trees.. Progress: 92%. Estimated remaining time: 27 seconds.
## INFO  [19:49:33.004] [mlr3] Finished benchmark
bmr$aggregate(list(msr("classif.auc"))) %>% 
  arrange(desc(classif.auc))
##       nr   task_id      learner_id resampling_id iters classif.auc
##    <int>    <char>          <char>        <char> <int>       <num>
## 1:     3 pelanggan  classif.ranger       holdout     1   0.7612431
## 2:     5 pelanggan     bagging clf       holdout     1   0.7527958
## 3:     1 pelanggan classif.log_reg       holdout     1   0.7507214
## 4:     4 pelanggan    classif.kknn       holdout     1   0.7051158
## 5:     2 pelanggan   classif.rpart       holdout     1   0.6573313
## Hidden columns: resample_result

ROC

autoplot(bmr,type = "roc")

AUC (Area Under the Curve) adalah luas area di bawah kurva ROC, dimana semakin besar luas daerah kurva AUC maka model yang dihasilkan semakin baik.

Jika dilihat berdasarkan evaluasi menggunakn kurva ROC diatas, yang memiliki luas kurva AUC paling besar dibandingkan model lainnya adalah model Random Forest dengan kode learner_id = classif ranger dan nilai auc sebesar 0.7612431. Berdasarkan hasil evaluasi kurva AUC maka dapat dikatakan bahwa pada kasus ini model Random Forest adalah model terbaik yang bisa digunakan untuk memprediksi pelanggan mana saja yang berpotensi untuk diajak menggunakan channel perbankan (ATM, internet banking, dsb)

Referensi

Dito, G.A. 2021. Neural Network dengan Keras di R. Retrieved from https://gerrydito.github.io/Neural-Network-with-Keras-in-R/

Dito, G.A. 2021. Statistical Machine Learning dengan mlr3. Retrieved from https://gerrydito.github.io/Statistical-Learning/

Dito, G.A. 2021. Tree Based Method dengan mlr3. Retrieved from https://gerrydito.github.io/Tree-Based-Methods/