Klasifikasi dengan Machine Learning

Klik disini untuk ke halaman rpubs.

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 meprediksi pelangaan mana saja yang potensial untuk diajak menggunakan channel tersebut. Anda diberikan data berisi 50.000 pelanggan. Informasi mengenai penggunaan channel perbankan dari 50.000 pelanggan diberikan kepada Anda. Susun model machine learning terbaik berdasarkan data 50.000 pelanggan.

Packages

library(tidyverse)
library(readxl)
library(rpart)
library(rpart.plot)
library(mlr3verse)
library(mlr3extralearners)
library(ggpubr)

Data

Read Data

Berikut adalah proses untuk memasukkan data dari excel ke dalam objek R.

dataTelp <- read_excel("Tugas_STA581.xlsx")

Karena variabel respon yang diperlukan berupa factor maka akan dilakukan perubahan tipe data pada variabel respon Y menjadi factor. Kemudian, dilakukan juga cleaning data dengan menghilangkan variabel ID pada data.

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

Deskripsi Data

Berikut adalah keterangan pada masing-masing variabel yang terdapat dalam dataset

Variabel Keterangan
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 recharfe pulsa per bulan
X11 Rata-rata banyaknya wilayah yang dikunjungi per bulan

Eksplorasi Data

Summary Data

Untuk melihat ringkasan dari data maka digunakan fungsi summary

summary(dataTelp)
       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 :    0.0  
 Mean   :0.8824   Mean   :  6746   Mean   :0.7718   Mean   :  666.8  
 3rd Qu.:0.9972   3rd Qu.:  9261   3rd Qu.:0.9816   3rd Qu.:  622.0  
 Max.   :1.0000   Max.   :244444   Max.   :1.0000   Max.   :31275.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            

Jika melihat dari summary data tersebut, terlihat bahwa respon Y dengan klasifikasi 0 cenderung lebih banyak dari klasifikasi 1, yaitu sekitar 81.328%.

Plot pada Dataset

A <- ggplot(dataTelp, aes(x=X1, y= Y)) +
  geom_boxplot()+
  labs(x = "Rata-rata Durasi Panggilan per Bulan (menit)",
       y = "Klasifikasi")

B <- ggplot(dataTelp, aes(x=X2, y= Y)) +
  geom_boxplot()+
  labs(x = "Rata-rata Penghasilan (Rp)",
       y = "Klasifikasi")

C <- ggplot(dataTelp, aes(x=X3, y= Y)) +
  geom_boxplot()+
  labs(x = "Rata-rata Frekuensi Panggilan Per Bulan",
       y = "Klasifikasi")

D <- ggplot(dataTelp, aes(x=X4, y= Y)) +
  geom_boxplot()+
  labs(x = "Persentase Panggilan di Jam Kerja",
       y = "Klasifikasi")

E <- ggplot(dataTelp, aes(x=X5, y= Y)) +
  geom_boxplot()+
  labs(x = "Persentase Panggilan Sesama Operator",
       y = "Klasifikasi")

G <- ggplot(dataTelp, aes(x=X6, y= Y)) +
  geom_boxplot()+
  labs(x = "Rata- rata penghasilan (Rp)",
       y = "Klasifikasi")

H <- ggplot(dataTelp, aes(x=X7, y= Y)) +
  geom_boxplot()+
  labs(x = "Persentase Transaksi SMS",
       y = "Klasifikasi")

I <- ggplot(dataTelp, aes(x=X8, y= Y)) +
  geom_boxplot()+
  labs(x = "Rata-rata (mb)",
       y = "Klasifikasi")

J <- ggplot(dataTelp, aes(x=X9, y= Y)) +
  geom_boxplot()+
  labs(x = "Rata-rata (Rp)",
       y = "Klasifikasi")

K <- ggplot(dataTelp, aes(x=X10, y= Y)) +
  geom_boxplot()+
  labs(x = "Rata-rata Frekuensi Recharge Pulsa",
       y = "Klasifikasi")

L <- ggplot(dataTelp, aes(x=X11, y= Y)) +
  geom_boxplot()+
  labs(x = "Rata-rata Banyak Wilayah yang Dikunjungi",
       y = "Klasifikasi")

ggarrange(A, B, C , D,
          ncol = 2, nrow = 2)

ggarrange(E, G, H , I,
          ncol = 2, nrow = 2)

ggarrange(J, K, L , 
          ncol = 2, nrow = 2)

Hasil plot memperlihatkan hubungan antara masing-masing variabel x dengan variabel y. Terlihat dari data bahwa seluruh variabel X tersebut mempunyai distribusi data yang cenderung kurang baik, seperti terdapat outlier.

Respon yang akan diukur berdasarkan data tersebut adalah berupa data kategorik untuk memprediksi pelanggan yang potensial. Terdapat beberapa model pembelajaran mesin yang dapat digunakan. Dalam penelitian ini digunakan model regresi logistik, pohon klasifikasi, random forest, Bagging, KNN.

Tahapan Pemodelan
Berikut adalah ilustrasi dari tahapan pemodelan yang dilakukan Alt text

Persiapan Data

Import Data ke Ekosistem mlr3

taskTelp = TaskClassif$new(id="telp",
                           backend = dataTelp,
                           target = "Y",
                           positive ="1")
learner_logreg <- lrn("classif.log_reg", predict_type="prob")
learner_knn <-  lrn("classif.kknn",predict_type="prob",k=10,kernel="rectangular")
learner_tree <-  lrn("classif.rpart", cp = 0.001, predict_type="prob")
learner_bagging  <-  lrn(id="bagging clf", "classif.ranger", mtry=11, predict_type="prob", importance="impurity")
learner_rf <-  lrn("classif.ranger",predict_type="prob",importance="impurity")

Split Data

Split Data dapat dilakukan dengan beberapa cara. Cara yang dilakukan pada klasifikasi ini adalah holdout yang membagi data train dan data test pada rasio 0.8.

set.seed(123)
resampleTelp1 =rsmp("holdout", ratio = 0.8)
resampleTelp1$instantiate(task=taskTelp)

Regresi Logistik

Regresi logistik merupakan suatu model yang dapat digunakan untuk mendeskripsikan hubungan antara peubah respon yang terdiri dari dua kategori atau lebih dengan peubah prediktor yang berskala numerik maupun berskala kategorik (Hosmer dan Lemeshow 2000). Regresi logistik terbagi atas tiga macam, 3 yaitu regresi logistik biner, regresi logistik ordinal dan regresi logistik multinomial. Dalam penelitian ini digunakan model regresi logistik biner karena variabel respon memiliki dua kategori.

Interpretasi Model

learner_logreg$train(task = taskTelp)
summary(learner_logreg$model)

Call:
stats::glm(formula = task$formula(), family = "binomial", data = task$data(), 
    model = FALSE)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-3.1097   0.3286   0.4993   0.6429   4.0835  

Coefficients:
              Estimate Std. Error z value Pr(>|z|)    
(Intercept)  1.830e+00  7.454e-02  24.550  < 2e-16 ***
X1          -5.394e-04  8.568e-05  -6.295 3.07e-10 ***
X10          1.189e-01  5.493e-03  21.646  < 2e-16 ***
X11          8.883e-02  1.033e-02   8.602  < 2e-16 ***
X2          -1.516e-05  5.617e-07 -26.980  < 2e-16 ***
X3           4.174e-05  3.472e-04   0.120    0.904    
X4          -1.012e+00  9.153e-02 -11.059  < 2e-16 ***
X5           3.814e-01  7.511e-02   5.078 3.82e-07 ***
X6          -1.366e-05  1.854e-06  -7.371 1.70e-13 ***
X7          -4.482e-02  5.431e-02  -0.825    0.409    
X8          -4.664e-05  1.061e-05  -4.397 1.10e-05 ***
X9          -1.794e-05  6.623e-07 -27.089  < 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: 42882  on 49988  degrees of freedom
AIC: 42906

Number of Fisher Scoring iterations: 5
train_test_telp_log = resample(task = taskTelp,
                               learner = learner_logreg,
                               resampling = resampleTelp1,
                               store_models = TRUE)
INFO  [10:31:06.760] [mlr3]  Applying learner 'classif.log_reg' on task 'telp' (iter 1/1) 

Prediksi

Berikut adalah prediksi yang dilakukan dengan menggunakan model regresi logistik. Prediksi disajikan dalam bentuk tabel dan terlihat kolom truth, response, prob.1 dan prob.0. Masing-masing variabel tersebut menyatakan keadaan sebenarnya, hasil klasifikasi, dan peluang untuk masing-masing klasifikasi.

prediksi_test = as.data.table(train_test_telp_log$prediction())
head(prediksi_test)
   row_ids truth response    prob.1    prob.0
1:       1     1        0 0.1723710 0.8276290
2:       9     0        0 0.1389085 0.8610915
3:      13     0        0 0.0185263 0.9814737
4:      15     0        0 0.1399040 0.8600960
5:      20     0        0 0.1752311 0.8247689
6:      23     1        0 0.1103992 0.8896008

Confusion Matrix

train_test_telp_log$prediction()$confusion
        truth
response    1    0
       1  192  142
       0 1722 7944
accreglog <- train_test_telp_log$aggregate(list(msr("classif.acc"),
                                   msr("classif.specificity"),
                                   msr("classif.sensitivity")
                                   ))
accreglog
        classif.acc classif.specificity classif.sensitivity 
          0.8136000           0.9824388           0.1003135 

Dari hasil confusion matrix terlihat bahwa akurasi model ini cukup baik yaitu di atas 80 persen. Perlu diperhatikan bahwa tujuan pemodelan ini adalah untuk mencari pelanggan yang potensial, namun pada confusion matrix terlihat bahwa sebanyak 1722 data test yang merupakan pelanggan potensial justru terklasifikasikan sebagai pelanggan non potensial. Selanjutnya perlu dikaji model yang dapat memberikan hasil lebih baik dari regresi logistik.

Berikut adalah plot ROC

autoplot(train_test_telp_log, type = "roc")

KNN

K - Nearest Neighbor (KNN) merupakan salah satu metode klasifikasi yang menggunakan prinsip ketetanggaan dalam memprediksi kelas data baru (Siringoringo 2018). Kelas data baru ditentukan berdasarkan kelas tetangga terdekat yang paling banyak muncul (Karno 2016), namun apabila terdapat beberapa k tetangga terdekat yang memiliki frekuensi kemunculan yang sama, maka akan dipilih satu tetangga terdekat secara acak.

set.seed(123)
train_test_telp_knn = resample(task = taskTelp,
                               learner = learner_knn,
                               resampling = resampleTelp1,
                               store_models = TRUE)
INFO  [17:27:51.634] [mlr3]  Applying learner 'classif.kknn' on task 'telp' (iter 1/1) 

Prediksi

prediksi_test = as.data.table(train_test_telp_knn$prediction())
head(prediksi_test)
   row_ids truth response prob.1 prob.0
1:       1     1        0    0.4    0.6
2:       9     0        0    0.1    0.9
3:      13     0        0    0.0    1.0
4:      15     0        0    0.0    1.0
5:      20     0        0    0.1    0.9
6:      23     1        0    0.1    0.9

Confusion Matrix

train_test_telp_knn$prediction()$confusion
        truth
response    1    0
       1  370  390
       0 1544 7696
accknn <- train_test_telp_knn$aggregate(list(msr("classif.acc"),
                             msr("classif.specificity"),
                             msr("classif.sensitivity")))
accknn
        classif.acc classif.specificity classif.sensitivity 
          0.8066000           0.9517685           0.1933124 

Akurasi yang dihasilkan oleh KNN juga cukup baik yaitu di atas 80 persen tetapi lebih kecil sedikit dibandingkan dengan model sebelumnya. Namun, model ini memberikan sensitivity yang lebih baik dibandingkan model sebelumnya, artinya model ini memiliki kemampuan yang sedikit lebih baik dibandingkan model-model sebelumnya dalam memprediksi pelanggan yang potensial.

Plot ROC

autoplot(train_test_telp_knn, type = "roc")

Pohon Klasifikasi

Classification and Regression Tree (CART) adalah metode klasifikasi dengan pendekatan statistik nonparametrik (Breiman 2001). CART menghasilkan pohon klasifikasi jika peubah responnya bersifat kategorik dan pohon regresi jika peubah responnya bersifat numerik. Pada penelitian ini menghasilkan pohon klasifikasi karena peubah yang digunakan dalam penelitian bersifat kategorik. Pohon klasifikasi digunakan untuk mengidentifikasi peubah apa yang dapat dijadikan sebagai pembeda antar kelas/kategori, dan memprediksi keanggotaan kelas dari suatu individu amatan berdasarkan karakteristiknya. Pembentukan pohon klasifikasi dimulai dengan melakukan penyekatan simpul utama yang memiliki beberapa kelas data menjadi simpul anak. Penyekatan ini dilakukan oleh peubah prediktor yang terpilih menjadi pemilah terbaik. Pemilah terbaik merupakan peubah prediktor yang memiliki pemilahan dengan memaksimalkan nilai penurunan keheterogenan di dalam masing-masing simpul anak relatif terhadap simpul utama. Penyekatan ini dilakukan secara berulang hingga simpul anak berisi amatan yang berasal dari satu kategori, simpul anak berisi amatan yang seluruh peubah prediktornya identik, dan kedalaman pohon sudah mencapai kedalaman maksimal (Breiman et al. 1993).

Interpretasi Model

learner_tree$train(task = taskTelp)
rpart.plot(learner_tree$model,roundint = F,type = 5,tweak = 2)

Untuk dapat melihat peluang pada masing masing klasifikasi menggunakan pohon klasifikasi dapat dilakukan dengan menelusuri setiap garisnya.

set.seed(123)
train_test_telp_tree = resample(task = taskTelp,
                               learner = learner_tree,
                               resampling = resampleTelp1,
                               store_models = TRUE
                               )
INFO  [17:28:02.839] [mlr3]  Applying learner 'classif.rpart' on task 'telp' (iter 1/1) 

Hasil Prediksi

Hasil prediksi dilakukan untuk data test.

prediksi_test = as.data.table(train_test_telp_tree$prediction())
head(prediksi_test)
   row_ids truth response    prob.1    prob.0
1:       1     1        0 0.1707665 0.8292335
2:       9     0        0 0.1338998 0.8661002
3:      13     0        0 0.1338998 0.8661002
4:      15     0        0 0.1338998 0.8661002
5:      20     0        0 0.1338998 0.8661002
6:      23     1        0 0.1338998 0.8661002

Confusion Matrix

train_test_telp_tree$prediction()$confusion
        truth
response    1    0
       1  262  242
       0 1652 7844
acctree<- train_test_telp_tree$aggregate(list(msr("classif.acc"),
                                   msr("classif.specificity"),
                                   msr("classif.sensitivity")
                                   ))
acctree
        classif.acc classif.specificity classif.sensitivity 
          0.8106000           0.9700717           0.1368861 

Tidak jauh berbeda dengan hasil menggunakan regresi logistik, akurasi dari yang dihasilkan dari pohon klasifikasi juga di atas 80 persen. Kemudian, jika dilihat pada confusion matrix terlihat bahwa prediksi dari 1 menjadi 0 masih cenderung lebih besar dibandingkan prediksi dari 1 menjadi 1-nya sendiri. Sehingga, model ini pun masih belum dapat dikatakan baik dalam memprediksi pelanggan yang potensial.

ROC Plot

autoplot(train_test_telp_tree, type = "roc")

Bagging

Bagging merupakan suatu metode yang mampu meningkatkan akurasi dari suatu prediksi data yang dikenalkan pertama kali oleh Leo Breiman pada tahun 1996, metode ini mampu mengurangi keberagaman yang berkaitan dengan prediksi. Bagging terdiri dari dua tahapan utama yaitu bootstrap yang merupakan proses pengambilan contoh dari data data contoh yang dimiliki (resampling) dan aggregating yakni proses penggabungan beberapa nilai prediksi menjadi satu nilai prediksi (Sartono et al 2010). Bagging mampu menurunkan rata-rata kesalahan prediksi dengan cara melakukan pengulangan yang bertujuan untuk membentuk beberapa kemungkinan pohon klasifikasi dengan data yang berbeda untuk kemudian dilakukan penarikan kesimpulan secara agregat.

set.seed(123)
train_test_bagging = resample(task = taskTelp,
                               learner = learner_bagging,
                               resampling = resampleTelp1,
                               store_models = TRUE
                               )
INFO  [17:28:04.006] [mlr3]  Applying learner 'bagging clf' on task 'telp' (iter 1/1) 
Growing trees.. Progress: 15%. Estimated remaining time: 2 minutes, 58 seconds.
Growing trees.. Progress: 29%. Estimated remaining time: 2 minutes, 33 seconds.
Growing trees.. Progress: 44%. Estimated remaining time: 2 minutes, 0 seconds.
Growing trees.. Progress: 58%. Estimated remaining time: 1 minute, 29 seconds.
Growing trees.. Progress: 73%. Estimated remaining time: 58 seconds.
Growing trees.. Progress: 88%. Estimated remaining time: 25 seconds.
train_test_bagging$prediction()$confusion
        truth
response    1    0
       1  368  300
       0 1546 7786
accbagging <- train_test_bagging$aggregate(list(msr("classif.acc"),
                             msr("classif.specificity"),
                             msr("classif.sensitivity")))
accbagging
        classif.acc classif.specificity classif.sensitivity 
          0.8156000           0.9616621           0.1985371 

Akurasi yang dihasilkan dari bagging cenderung tidak jauh berbeda dari model-model sebelumnya yaitu di atas 80 persen, dengan sensitivity juga juga mirip dengan model-model sebelumnya.

Plot ROC

autoplot(train_test_bagging, type = "roc")

Random Forest

Metode random forest adalah pengembangan dari metode CART, yaitu dengan menerapkan metode bootstrap aggregating (bagging) dan random feature selection (Breiman 2001). Metode random forest merupakan salah satu metode pohon gabungan dimana sebanyak k pohon ditumbuhkan sehingga terbentuk suatu hutan (forest), kemudian analisis dilakukan pada kumpulan pohon tersebut dengan cara menggabungkan hasil prediksi dari k pohon yang terbentuk.

Interpretasi Model

learner_rf$train(task=taskTelp)
Growing trees.. Progress: 29%. Estimated remaining time: 1 minute, 14 seconds.
Growing trees.. Progress: 58%. Estimated remaining time: 45 seconds.
Growing trees.. Progress: 85%. Estimated remaining time: 16 seconds.
learner_rf$model$variable.importance
       X1       X10       X11        X2        X3        X4        X5        X6 
 934.7189  937.4487  851.2770 1484.4582  851.0634 1112.0146 1046.8367 1120.6270 
       X7        X8        X9 
 945.3693 1155.2229 1391.1196 

Nilai variable importance untuk Random Forest tersebut adalah nilai Gini Impurity. Semakin besar nilainya maka akan semakin berpengaruh prediktor tersebut. Untuk memudahkan melihat variable importance tersebut, maka dapat dibuat plot

#dataframe
importance <- data.frame(Predictors = names(learner_rf$model$variable.importance),
                         impurity = learner_rf$model$variable.importance)
rownames(importance) <- NULL
importance <- importance %>% arrange(desc(impurity))

#grafik
ggplot(importance,
       aes(x=impurity,
           y=reorder(Predictors,impurity))) +
  geom_col(fill = "steelblue")+
  geom_text(aes(label=round(impurity,2)),hjust=1.2)

Terlihat bahwa variabel yang paling berpengaruh adalah X2 yaitu rata-rata penghasilan dari transaksi panggilan per bulan (Rp) dan yang paling tidak berpengaruh adalah X3 yaitu rata-rata frekuensi melakukan panggilan per bulan.

set.seed(123)
train_test_telp_forest = resample(task = taskTelp,
                               learner = learner_rf,
                               resampling = resampleTelp1,
                               store_models = TRUE
                               )
INFO  [17:36:33.423] [mlr3]  Applying learner 'classif.ranger' on task 'telp' (iter 1/1) 
Growing trees.. Progress: 50%. Estimated remaining time: 30 seconds.
Growing trees.. Progress: 100%. Estimated remaining time: 0 seconds.

Hasil Prediksi

Hasil prediksi dilakukan untuk data test.

prediksi_test = as.data.table(train_test_telp_forest$prediction())
head(prediksi_test)
   row_ids truth response     prob.1    prob.0
1:       1     1        0 0.24935476 0.7506452
2:       9     0        0 0.16985873 0.8301413
3:      13     0        0 0.09158968 0.9084103
4:      15     0        0 0.06309444 0.9369056
5:      20     0        0 0.09393492 0.9060651
6:      23     1        0 0.06921587 0.9307841

Confusion Matrix

train_test_telp_forest$prediction()$confusion
        truth
response    1    0
       1  337  262
       0 1577 7824
accforest <- train_test_telp_forest$aggregate(list(msr("classif.acc"),
                                   msr("classif.specificity"),
                                   msr("classif.sensitivity")
                                   ))
accforest
        classif.acc classif.specificity classif.sensitivity 
          0.8161000           0.9675983           0.1760711 

Akurasi dari random forest juga di atas 80 persen tetapi memberikan hasil yang lebih besar sedikit dibandingkan dengan model lainnya. Namun, dapat terlihat dari confusion matrix bahwa pelanggan yang pada kenyataan berkode 1 (potensial) diprediksi menjadi 0 (tidak potensial) cenderung tinggi sehingga model ini masih dapat dikembangkan.

Plot ROC

autoplot(train_test_telp_forest$prediction(), type = "roc")

Komparasi Model

Berikut akan dilakukan perbandingan dari beberapa model dengan melihat uji kebaikan berupa akurasi dan AUC.

accall<- list(regresi.logistik= accreglog,knn= accknn,pohon.klasifikasi=acctree,random.forest=accforest,bagging=accbagging)
accall
$regresi.logistik
        classif.acc classif.specificity classif.sensitivity 
          0.8136000           0.9824388           0.1003135 

$knn
        classif.acc classif.specificity classif.sensitivity 
          0.8066000           0.9517685           0.1933124 

$pohon.klasifikasi
        classif.acc classif.specificity classif.sensitivity 
          0.8106000           0.9700717           0.1368861 

$random.forest
        classif.acc classif.specificity classif.sensitivity 
          0.8161000           0.9675983           0.1760711 

$bagging
        classif.acc classif.specificity classif.sensitivity 
          0.8156000           0.9616621           0.1985371 

Dari nilai akurasi di atas terlihat bahwa model random forest memiliki akurasi yang paling tinggi. Akurasi ini merupakan persentase prediksi dari model yang benar dari total prediksi yang dibuat. Nilai AUC pada random forest juga yang paling tinggi.

Namun, apabila sensitivity disini menjadi concern pembuat kebijakan, maka sensitivity juga dapat diperhatikan. Sensitivity disini adalah jumlah prediksi pelanggan potensial yang benar dibandingkan jumlah seluruh pelanggan potensial.

set.seed(123)
learner_telp <- list(learner_logreg,
                     learner_tree,
                     learner_rf,
                     learner_knn,
                     learner_bagging)
set.seed(123)
design.telp <- benchmark_grid(tasks = taskTelp,
                         learners = learner_telp,
                         resamplings = resampleTelp1 
                         )
set.seed(123)
bmr = benchmark(design.telp, store_models = TRUE)
INFO  [19:32:16.774] [mlr3]  Running benchmark with 5 resampling iterations 
INFO  [19:32:17.069] [mlr3]  Applying learner 'classif.ranger' on task 'telp' (iter 1/1) 
Growing trees.. Progress: 47%. Estimated remaining time: 35 seconds.
Growing trees.. Progress: 94%. Estimated remaining time: 4 seconds.
INFO  [19:33:32.420] [mlr3]  Applying learner 'classif.rpart' on task 'telp' (iter 1/1) 
INFO  [19:33:33.583] [mlr3]  Applying learner 'bagging clf' on task 'telp' (iter 1/1) 
Growing trees.. Progress: 15%. Estimated remaining time: 2 minutes, 58 seconds.
Growing trees.. Progress: 28%. Estimated remaining time: 2 minutes, 37 seconds.
Growing trees.. Progress: 42%. Estimated remaining time: 2 minutes, 6 seconds.
Growing trees.. Progress: 56%. Estimated remaining time: 1 minute, 36 seconds.
Growing trees.. Progress: 70%. Estimated remaining time: 1 minute, 7 seconds.
Growing trees.. Progress: 84%. Estimated remaining time: 34 seconds.
Growing trees.. Progress: 99%. Estimated remaining time: 2 seconds.
INFO  [19:37:22.199] [mlr3]  Applying learner 'classif.kknn' on task 'telp' (iter 1/1) 
INFO  [19:37:31.343] [mlr3]  Applying learner 'classif.log_reg' on task 'telp' (iter 1/1) 
INFO  [19:37:31.761] [mlr3]  Finished benchmark 
bmr$aggregate(list(msr("classif.auc")))
   nr      resample_result task_id      learner_id resampling_id iters
1:  1 <ResampleResult[20]>    telp classif.log_reg       holdout     1
2:  2 <ResampleResult[20]>    telp   classif.rpart       holdout     1
3:  3 <ResampleResult[20]>    telp  classif.ranger       holdout     1
4:  4 <ResampleResult[20]>    telp    classif.kknn       holdout     1
5:  5 <ResampleResult[20]>    telp     bagging clf       holdout     1
   classif.auc
1:   0.7417796
2:   0.6454658
3:   0.7620696
4:   0.7102136
5:   0.7542452
autoplot(bmr,type = "roc")

AUC (Area Under the Curve) adalah luas area di bawah curve ROC. Dengan kata lain, semakin besar luas area di bawah kurva ROC maka kemampuan prediksi yang dihasilkan oleh model semakin baik.

Dari grafik ROC di atas terlihat bahwa model Random Forest memiliki AUC terbesar sehingga dipilih model Random Forest sebagai model terbaik dalam mengklasifikasikan/memprediksi pelanggan operator telekomunikasi seluler yang potensial untuk bergabung dalam channel perbankan.

Kesimpulan

Hasil dari model yang dibentuk untuk memprediksi pelanggan operator telekomunikasi seluler yang potensial untuk bergabung dalam channel perbankan diperoleh bahwa model Random Forest adalah yang terbaik.

Model Random Forest ini menghasilkan peubah-peubah penting yang menjadikannya sebagai faktor-faktor penting dalam pengklasifikasian pelanggan suatu operator telekomunikasi seluler yang potensial untuk bergabung dalam channel perbankan.

Faktor penting tersebut secara berurutan yakni X2 rata-rata penghasilan dari transaksi panggilan per bulan (Rp), X9 rata-rata penghasilan dari transaksi pemakaian data per bulan (Rp), X8 rata-rata pemakaian data per bulan (MB), X6 rata-rata penghasilan dari transaksi SMS per bulan (Rp), X4 persentase panggilan di jam kerja, X5 persentase panggilan sesama operator, X7 persentase transaksi SMS sesama operator, X10 rata-rata frekuensi melakukan recharge pulsa per bulan, X1 rata-rata durasi melakukan panggilan per bulan (menit), X11 rata-rata banyaknya wilayah yang dikunjungi per bulan, dan X3 rata-rata frekuensi melakukan panggilan per bulan.

Saran untuk penelitian selanjutnya sebaiknya diperhatikan metode resampling yang digunakan. Jika dilihat dari confusion matrix yang dihasilkan, meskipun akurasinya besar, namun kemampuan model untuk memprediksi pelanggan yang potensial cenderung rendah. Hal ini terlihat dari kesalahan klasifikasi pelanggan yang potensial menjadi tidak potensial cukup tinggi. Model lain dapat dicoba untuk data yang cenderung imbalance seperti ini.

Referensi

Breiman L. 2001. Random Forests. Machine Learning. 45(1): 5–32.

Breiman L, Friedman JH, Olshen RA, Stone CJ. 1993. Classification and Regression Trees. New York (US): Chapman and Hill.

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/

Fawcett T. 2006. An Introduction to ROC Analysis. Pattern Recognition Letters. 2(1):861–874.

Hosmer DW, Lemeshow S. 2010. Applied Logistic Regression. 2nd ed. Toronto (CAN): John Wiley & Sons, Inc. 

Karno. 2016. Penentuan Parameter Pada Algoritma Klasifikasi K-Nearest Neighbor Berbasis Algoritma Genetika. Seminar Nasional Teknologi Informasi (SNTI) 8 UNTAR; 2016 Oktober 29; Jakarta, Indonesia. Jakarta (ID): UNTAR. 165- 169.

Kohavi R. 1995. A Study of Cross-Validation and Bootstrap for Accuracy Estimation and Model Selection. Prosiding of the 14th International Joint Conference on Artrificial Intelligence - Volume 2: 1137–1143.

Sartono B, Syafitri UD. 2010. Metode pohon gabungan: solusi pilihan untuk mengatasi kelemahan pohon regresi dan klasifikasi tunggal. Forum Statistika dan Komputasi 15 (1): 1-7.

Sartono B. 2010. Pengenalan Algoritma Genetik Untuk Pemilihan Peubah Penjelas Dalam Model Regresi Menggunakan SAS/IML. Forum Statistika dan Komputasi 15 (2): 10-15.

Siringoringo R. 2018. Klasifikasi DAta Tidak Seimbang Menggunakan Algoritma SMOTE dan K-Nearest Neighbor. Jurnal ISD. 3(1): 44-49


  1. Mahasiswa Pascasarjana Statistika dan Sains Data, IPB University, ↩︎

  2. Mahasiswa Pascasarjana Statistika dan Sains Data, IPB University, ↩︎