Klasifikasi: Studi Kasus Prediksi Recharge

Tugas UAS Praktikum STA581 Sains Data

Nur Andi Setiabudi1, Nashir Fakhrudin2, Nabila Ghoni3

2021-11-26

Link RPub: rpubs.com/nurandi/sta581-p1-k8

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, dan sebagainya) Mereka ingin memperoleh model yang dapat digunakan untuk memprediksi pelanggan 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.

Data

Persiapan Packages

Beberapa packages yang digunakan untuk analisis antara lain:

library(caret)
library(rpart.plot)
library(NeuralNetTools)
library(pROC)
library(PRROC)
library(MLmetrics)
library(MLeval)
library(skimr)
library(parallel) 
library(doParallel)
library(ggplot2)
library(cowplot)

Membaca Data

Membaca data dari file ke dalam R dilakukan dengan perintah:

recharge <- read.csv("Tugas_STA581.csv")

head(recharge)
ID X1 X2 X3 X4 X5 X6 X7 X8 X9 X10 X11 Y
1 257 13643 27 0.7799619 0.9627874 5217 0.7687453 768 30006 6.3 4.7 1
2 24 13897 15 0.7393772 0.9061206 18025 0.2906286 2368 39954 7.3 5.3 1
3 1 760 1 0.5000000 1.0000000 3275 0.9617486 2542 43544 1.3 1.3 0
4 627 41160 97 0.7065245 0.9976897 2864 0.7232183 0 0 9.3 5.0 0
5 42 19002 38 0.7495756 0.9643634 2794 0.7481289 0 0 4.0 1.0 0
6 65 38253 43 0.7786787 1.0000000 1122 1.0000000 5 1719 17.0 14.7 1

Deskripsi Data

Berikut adalah penjelasan setiap variabel yang terdapat dalam dataset:

Variabel Deskripsi Alias
ID ID pelanggan ID
X1 Rata- rata durasi melakukan panggilan per bulan (menit) duration_call
X2 Rata-rata penghasilan dari transaksi panggilan per bulan (Rp) revenue_call
X3 Rata-rata frekuensi melakukan panggilan per bulan freq_call
X4 Persentase panggilan di jam kerja pct_call_workhr
X5 Persentase panggilan sesama operator pct_call_onnet
X6 Rata-rata penghasilan dari transaksi SMS per bulan (Rp) revenue_sms
X7 Persentase transaksi SMS sesama operator pct_sms_onnet
X8 Rata- rata pemakaian data per bulan (MB) usage_data
X9 Rata-rata penghasilan dari transaksi pemakaian data per bulan (Rp) revenue_data
X10 Rata- rata frekuensi melakukan recharfe pulsa per bulan freq_recharge
X11 Rata-rata banyaknya wilayah yang dikunjungi per bulan region_visit
Y Recharge (1/0) recharge

Untuk keperluan analisis, juga dilakukan beberapa hal sebagai berikut:

  • Mengubah peubah kolom response menjadi factor
  • Mengubah nama kolom dengan alias seperti pada tabel
recharge$ID <- as.character(recharge$ID)

recharge$Y <- as.factor(recharge$Y)
levels(recharge$Y) <- c("No", "Yes")

col_names <- c(
  ID = "ID",
  X1 = "duration_call",
  X2 = "revenue_call",
  X3 = "freq_call",
  X4 = "pct_call_workhr",
  X5 = "pct_call_onnet",
  X6 = "revenue_sms",
  X7 = "pct_sms_onnet",
  X8 = "usage_data",
  X9 = "revenue_data",
  X10 = "freq_recharge",
  X11 = "region_visit",
  Y = "recharge"
)

names(recharge) <- col_names

Ringkasan Data

skim(recharge)
Data summary
Name recharge
Number of rows 50000
Number of columns 13
_______________________
Column type frequency:
character 1
factor 1
numeric 11
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
ID 0 1 1 5 0 50000 0

Variable type: factor

skim_variable n_missing complete_rate ordered n_unique top_counts
recharge 0 1 FALSE 2 No: 40664, Yes: 9336

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
duration_call 0 1 110.67 180.63 0 14.00 47.00 131.00 4130.0 ▇▁▁▁▁
revenue_call 0 1 27907.54 27361.61 0 10620.75 22092.00 36629.25 638172.0 ▇▁▁▁▁
freq_call 0 1 40.23 51.21 0 10.00 24.00 50.00 1007.0 ▇▁▁▁▁
pct_call_workhr 0 1 0.73 0.14 0 0.70 0.75 0.80 1.0 ▁▁▁▇▃
pct_call_onnet 0 1 0.88 0.20 0 0.85 0.97 1.00 1.0 ▁▁▁▁▇
revenue_sms 0 1 6745.71 7915.11 0 1422.00 3975.00 9261.00 244444.0 ▇▁▁▁▁
pct_sms_onnet 0 1 0.77 0.25 0 0.64 0.86 0.98 1.0 ▁▁▂▃▇
usage_data 0 1 946.87 2260.86 0 0.00 73.00 925.00 59611.0 ▇▁▁▁▁
revenue_data 0 1 16144.17 26826.08 0 0.00 2514.50 24431.25 504086.0 ▇▁▁▁▁
freq_recharge 0 1 7.13 4.84 0 3.30 6.00 9.70 30.7 ▇▆▂▁▁
region_visit 0 1 3.68 2.41 0 2.00 3.00 4.70 35.7 ▇▁▁▁▁

Data recharge terdiri atas 13 peubah dan 50000 observasi. Peubah yang akan digunakan adalah 11 peubah numerik sebagai peubah prediktor dan satu peubah kategorik dengan dua kelas (biner) sebagai peubah respon (recharge).

prop.table(table(recharge$recharge))
## 
##      No     Yes 
## 0.81328 0.18672

Berdasarkan statistik deskiptif di atas dapat diketahui bahwa peubah respon memiliki anggota kelas “No” sebanyak 81% , lebih besar dibandingkan dengan kelas “Yes” yang terdiri dari 19% pengamatan.

Sebaran Data

Untuk melihat sebaran data, setiap variabel digambarkan dalam bentuk box-plot dan density-plot. Untuk memperjelas hasil, data yang digunakan merupakan data contoh sebanyak 1000 pengamatan.

recharge_s <- recharge[sample(nrow(recharge), 1000),]

featurePlot(x = recharge_s[, 2:12], 
            y = recharge_s$recharge, 
            plot = "box",
            do.out = FALSE,
            layout = c(3,4),
            strip=strip.custom(par.strip.text=list(cex=.7)),
            scales = list(x = list(relation="free"), 
                          y = list(relation="free")))

featurePlot(x = recharge_s[, 2:12], 
            y = recharge_s$recharge,
            plot = "density",
            layout = c(3,4),
            strip=strip.custom(par.strip.text=list(cex=.7)),
            scales = list(x = list(relation="free"), 
                          y = list(relation="free")))

Dari box-plot dan density plot di atas, terlihat bahwa hampir seluruh variabel mempunyai sebaran yang tidak simetris, dan terdapat cukup banyak outlier.

Dari box-plot, terlihat secara grafis bahwa ada perbedaan secara rata-rata antara kelompok recharge=Yes dan recharge=No untuk peubah-peubah: rata-rata penghasil dari data, rekuensi recharge dan banyaknya wilayah yang dikunjungi. Ketiga peubah ini diindikasikan merupakan peubah-peubah terpenting terpenting dalam modeling recharge.

Tahapan Modeling

Tahapan pemodelan diringkas dalam diagram alur berikut:

Split Data

Split Train/Testing adalah salah satu metode yang dapat digunakan untuk mengevaluasi performa model machine learning. Metode ini membagi dataset menjadi dua bagian, yaitu data training atau data latih dan data testing atau data uji. Data training digunakan untuk membuat model, sementara data testing digunakan untuk evaluasi kebaikan model.

set.seed(100)
train_idx <- createDataPartition(recharge$recharge, p = 0.7, list=FALSE)

trainData <- recharge[train_idx,]
testData <- recharge[-train_idx,]

Kolom ID dihapus dari data training dan data testing karena tidak digunakan dalam pemodelan:

trainData$ID <- NULL
testData$ID <- NULL

Standarisasi Data

Tahapan pra-proses selanjutnya adalah standarisasi karena satuan dari peubah yang digunakan berbeda-beda. Standarisasi dilakukan agar seluruh peubah memiliki satuan yang sama, tidak ada peubah yang dianggap lebih besar bobotnya. Metode standarisasi yang digunakan adalah transformasi ke normal baku (Z).

standardize <- preProcess(trainData, method = c("center", "scale"))
trainData_z <- predict(standardize, newdata = trainData)
testData_z <- predict(standardize, newdata = testData)

head(trainData_z)
duration_call revenue_call freq_call pct_call_workhr pct_call_onnet revenue_sms pct_sms_onnet usage_data revenue_data freq_recharge region_visit recharge
1 0.8145999 -0.5258463 -0.2614749 0.3277520 0.4097455 -0.1885564 -0.0109159 -0.0792842 0.5135055 -0.1731711 0.4214585 Yes
3 -0.6105111 -0.9982820 -0.7713051 -1.6619450 0.6002273 -0.4299480 0.7443580 0.7133084 1.0159235 -1.2045004 -0.9818080 No
4 2.8743307 0.4832365 1.1111448 -0.1941696 0.5884013 -0.4810355 -0.1890756 -0.4224134 -0.6000679 0.4456264 0.5452761 No
7 0.5473916 1.7936836 4.3466055 0.2682633 0.4897255 0.9107576 -0.3762437 -0.4224134 -0.6000679 3.6221205 2.4850857 No
9 -0.5270085 -0.9348040 -0.7320874 -1.9157675 0.2346029 -0.6018557 0.8940459 -0.2414664 0.1026048 -0.7094624 -0.6929002 No
10 0.0352423 0.9928568 1.5817573 0.3221887 0.6002273 -0.3122354 0.8940459 -0.4224134 -0.6000679 0.3218669 0.9580015 No

Cross Validation

Cross validation (CV) adalah metode untuk mengevaluasi kinerja model atau algoritma. Terdapat beberapa tipe dari CV, salah satunya k-Fold CV. Pada studi kasus ini digunakan 5-fold Cross Validation. Data dipartisi secara acak ke dalam lima subset data (folds). Untuk masing-masing subset data tersebut, CV akan menggunakan empat folds untuk training dan satu fold untuk testing.

Cross validation dalam studi kasus ini juga digunakan untuk tuning parameter, yaitu mencari paramter terbaik bagi model yang meberikan metrik evaliasi yang optimal.

fitControl <- trainControl(
    method = 'cv',
    number = 5,
    savePredictions = 'final',
    classProbs = T,
    summaryFunction = prSummary,
    allowParallel = T
) 

Dalam cross-validation pada studi kasus ini, metrik yang digunakan adalah F1-score, yang merupakan rataan harmonik antara sensitivitas dan spesifisitas.

Penentuan Batas Peluang (Threshold)

Secara default, batas untuk penentuan kelas prediksi adalah 0.5. Artinya, jika dugaan dari nilai peluang di atas 0.5, maka akan diprediksi sebagai sukses (“Yes”), sebaliknya gagal (“No”). Namun, nilai batas (threshold) ini dapat dioptimalisasi, terutama pada kasus data tidak seimbang.

Pada studi kasus ini, nilai threshold dipilih sedemikian sehingga terjadi keseimbangan antara sensitivitas dan spesifisitas.

bestThres <- function(m) {
  proba1 <- predict(m, testData_z, type = "prob")$Yes
  r <- data.frame(recharge = testData_z$recharge, proba1) %>% pROC::roc(recharge, proba1)
  bst <- coords(r, x="best", input="threshold", best.method="youden", transpose = F)
  plot(r, print.thres="best", print.thres.best.method="youden") 
  return(bst)
}
confMatrix <- function(m, threshold){
  proba1 <- predict(m, testData_z, type = "prob")$Yes
  pred <- as.factor(ifelse( proba1 > threshold, "Yes", "No"))
  confusionMatrix(pred, testData_z$recharge, positive = "Yes")
}

Adapun pengertian dari metriks-metriks yg dimaksud diringkas dalam tabel berikut:

Algoritma Pemodelan

Ada beberapa algoritma yang digunakan untuk pemodelan, yaitu:

  • Logistic regression
  • k-nearest neighbors (KNN)
  • Naive Bayes classifier
  • Classification tree
  • Bagging
  • Neural network
  • Random forest
  • Support vector machine

Hasil dari kedelapan algoritma di atas di bandingkan dan dipilih model yang memberikan hasil prediksi terbaik.

Opsional: Pemrosesan Paralel

Untuk mempercepat proses modeling, dilakukan pemrosesan secara paralel.

set.seed(123)
no_cores <- detectCores() - 2

cl <- makePSOCKcluster(no_cores)
registerDoParallel(cl)

Hasil Modeling

Pemodelan dilakukan menggunakan package caret:

Logistict Regression

Regresi logistik merupakan suatu metode analisis data untuk mengetahui hubungan antara peubah respon yang bersifat kategorik dengan satu atau lebih peubah penjelas yang bersifat kontinu maupun kategorik. Regresi logistik dirancang untuk menggambarkan peluang kategori kejadian pada peubah respon. Pada studi kasus ini digunakan model regresi logistik biner, dimana peubah respon terdiri dari dua kategori yaitu 0 (“No”) dan 1 (“Yes”)

Fitting model

reglog <- train(recharge ~ ., data = trainData_z, 
                method ='glm', family = 'binomial', 
                metric = "F",
                tuneLength = 20, trControl = fitControl)
reglog
## Generalized Linear Model 
## 
## 35001 samples
##    11 predictor
##     2 classes: 'No', 'Yes' 
## 
## No pre-processing
## Resampling: Cross-Validated (5 fold) 
## Summary of sample sizes: 28000, 28001, 28001, 28001, 28001 
## Resampling results:
## 
##   AUC      Precision  Recall     F        
##   0.91499  0.8252894  0.9809239  0.8964012

Dari hasil output di atas, dapat diketahui hasil modeling logistic regression memberikan AUC (luas area di bawah kurva ROC), precision, recall, dan F-score yang tinggi, sehingga kinerja model regresi logistik dapat dikatakan sudah cukup baik.

Variable Importance

plot(varImp(reglog, scale = FALSE))

Dari output di atas, penghasilan dari data, penghasilan dari panggilan dan frekuensi recharge merupakan tiga variable terpenting bagi model regresi logistik.

Evaluasi

Evaluasi dapat dilakukan dengan confusion matrix dari data test/uji. Secara default, jika nilai peluang > 0.5, maka akan diprediksi sebagai “Yes”, selainnya “No”

confMatrix(reglog, 0.5)
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction    No   Yes
##        No  11958  2514
##        Yes   241   286
##                                              
##                Accuracy : 0.8163             
##                  95% CI : (0.81, 0.8225)     
##     No Information Rate : 0.8133             
##     P-Value [Acc > NIR] : 0.1756             
##                                              
##                   Kappa : 0.1199             
##                                              
##  Mcnemar's Test P-Value : <0.0000000000000002
##                                              
##             Sensitivity : 0.10214            
##             Specificity : 0.98024            
##          Pos Pred Value : 0.54269            
##          Neg Pred Value : 0.82629            
##              Prevalence : 0.18668            
##          Detection Rate : 0.01907            
##    Detection Prevalence : 0.03514            
##       Balanced Accuracy : 0.54119            
##                                              
##        'Positive' Class : Yes                
## 

Terlihat dari output di atas, jika kita menggunakan default threshold 0.5 akurasi memang sangat tinggi (0.8163). Namun apabila dicermati dari confusion matrix, kemampuan model untuk memprediksi kelas “Yes” sangat rendah. Akibatnya, nilai sensitivitasnya juga akan rendah, yaitu 0.10214. Artinya, hanya 10% dari pelanggan potensial yang dapat diprediksi.

Untuk mensolusikan permasalahan ini, dilakukan pemilahan threshold optimal untuk menyeimbangkan specificity dan sensitivity sebagai berikut:

bst <- bestThres(reglog)

bst
threshold specificity sensitivity
0.1836616 0.6844004 0.7021429

Berdasarkan output di atas, threshold optimal adalah 0.1836616, yang memberikan specificity dan sensitivity atau masing-masing sebesar 0.6844004 dan 0.7021429.

cm.reglog <- confMatrix(reglog, bst[1,1])
cm.reglog
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction   No  Yes
##        No  8349  834
##        Yes 3850 1966
##                                              
##                Accuracy : 0.6877             
##                  95% CI : (0.6802, 0.6951)   
##     No Information Rate : 0.8133             
##     P-Value [Acc > NIR] : 1                  
##                                              
##                   Kappa : 0.2732             
##                                              
##  Mcnemar's Test P-Value : <0.0000000000000002
##                                              
##             Sensitivity : 0.7021             
##             Specificity : 0.6844             
##          Pos Pred Value : 0.3380             
##          Neg Pred Value : 0.9092             
##              Prevalence : 0.1867             
##          Detection Rate : 0.1311             
##    Detection Prevalence : 0.3878             
##       Balanced Accuracy : 0.6933             
##                                              
##        'Positive' Class : Yes                
## 

Dengan threshold tersebut, diperoleh akurasi prediksi sebesar 0.6877.

K-Nearest Neighbour

K-Nearest Neighbour merupakan salah satu algoritma supervised learning dimana hasil klasifikasi data baru didasarkan pada kategori mayoritas tetangga terdekat ke-K. Tujuan dari algoritma ini adalah mengklasifikasikan objek baru berdasarkan atribut dan data training. Klasifikasi dilakukan tanpa menggunakan model namun hanya berdasarkan berapa banyak dari tetangga terdekatnya.

Fitting model

knn <- train(recharge ~ ., data = trainData_z, 
                method ='knn', 
                metric = "F",
                tuneLength = 10, trControl = fitControl)
knn
## k-Nearest Neighbors 
## 
## 35001 samples
##    11 predictor
##     2 classes: 'No', 'Yes' 
## 
## No pre-processing
## Resampling: Cross-Validated (5 fold) 
## Summary of sample sizes: 28001, 28001, 28001, 28000, 28001 
## Resampling results across tuning parameters:
## 
##   k   AUC        Precision  Recall     F        
##    5  0.4221618  0.8389164  0.9352890  0.8844843
##    7  0.5090152  0.8376140  0.9457228  0.8883905
##    9  0.5753764  0.8351172  0.9522923  0.8898633
##   11  0.6269877  0.8344645  0.9575268  0.8917683
##   13  0.6682893  0.8344213  0.9618479  0.8936139
##   15  0.7015703  0.8338848  0.9637801  0.8941392
##   17  0.7287961  0.8335053  0.9660636  0.8949016
##   19  0.7528833  0.8326483  0.9671175  0.8948589
##   21  0.7738813  0.8323179  0.9691902  0.8955538
##   23  0.7910213  0.8320246  0.9706306  0.8959971
## 
## F was used to select the optimal model using the largest value.
## The final value used for the model was k = 23.

Dari hasil output di atas, dapat diketahui hasil tunning parameter dengan cross-validation untuk model KNN memberikan AUC (luas area di bawah kurva ROC), precision, recall, dan F-score yang tinggi, sehingga kinerja model KNN dapat dikatakan sudah cukup baik. Model optimal diperoleh dengan parameter k = 23.

Variable Importance

plot(varImp(knn, scale = FALSE))

Dari output di atas, dapat diketahui bahwa penghasilan dari data, rata-rata penggunaan data dan frekuensi recharge merupakan tiga variable terpenting bagi model KNN.

Evaluasi

Evaluasi dilakukan terhadap data uji dengan menggunakan threshold optimal:

bst <- bestThres(knn)

bst
threshold specificity sensitivity
0.1911232 0.7019428 0.6471429

Berdasarkan output di atas, threshold optimal adalah 0.1911232, yang memberikan specificity dan sensitivity atau masing-masing sebesar 0.7019428 dan 0.6471429

cm.knn <- confMatrix(knn, bst[1,1])
cm.knn
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction   No  Yes
##        No  8563  988
##        Yes 3636 1812
##                                              
##                Accuracy : 0.6917             
##                  95% CI : (0.6843, 0.6991)   
##     No Information Rate : 0.8133             
##     P-Value [Acc > NIR] : 1                  
##                                              
##                   Kappa : 0.2559             
##                                              
##  Mcnemar's Test P-Value : <0.0000000000000002
##                                              
##             Sensitivity : 0.6471             
##             Specificity : 0.7019             
##          Pos Pred Value : 0.3326             
##          Neg Pred Value : 0.8966             
##              Prevalence : 0.1867             
##          Detection Rate : 0.1208             
##    Detection Prevalence : 0.3632             
##       Balanced Accuracy : 0.6745             
##                                              
##        'Positive' Class : Yes                
## 

Dengan threshold tersebut, diperoleh akurasi prediksi sebesar 0.6917.

Naive Bayes

Naive Bayes adalah salah satu algoritme pengklasifikasian untuk memprediski probabilitas keanggotaan suatu kelas. Klasifikasi ini didasarkan pada teorema Bayes yang memiliki kemampuan klasifikasi yang serupa dengan decesion tree dan neural network. Pada tahapan pengklasifikasian akan dihitung nilai probabilitas dari masing-masing label kelas yang ada terhadap masukan yang diberikan. Lalu, label kelas yang memiliki nilai probabilitas paling besar akan dijadikan label kelas data masukan tersebut.

Fitting model

nb <- train(recharge ~ ., data = trainData_z, 
                method ='nb', 
                metric = "F",
                tuneLength = 10, trControl = fitControl)
nb
## Naive Bayes 
## 
## 35001 samples
##    11 predictor
##     2 classes: 'No', 'Yes' 
## 
## No pre-processing
## Resampling: Cross-Validated (5 fold) 
## Summary of sample sizes: 28001, 28001, 28000, 28001, 28001 
## Resampling results across tuning parameters:
## 
##   usekernel  AUC        Precision  Recall     F        
##   FALSE      0.8934921  0.8383931  0.9234499  0.8788603
##    TRUE      0.8993530  0.8540892  0.8869138  0.8701838
## 
## Tuning parameter 'fL' was held constant at a value of 0
## Tuning
##  parameter 'adjust' was held constant at a value of 1
## F was used to select the optimal model using the largest value.
## The final values used for the model were fL = 0, usekernel = FALSE and adjust
##  = 1.

Dari hasil output di atas, dapat diketahui hasil tunning parameter dengan cross-validation untuk model Naive Bayes memberikan AUC (luas area di bawah kurva ROC), precision, recall, dan F-score yang tinggi, sehingga kinerja model Naive Bayes dapat dikatakan sudah cukup baik. Final model menggunakan parameter fL = 0, usekernel = FALSE and adjust = 1.

Variable Importance

plot(varImp(nb, scale = FALSE))

Dari output di atas, dapat diketahui bahwa penghasilan dari data, rata-rata penggunaan data dan frekuensi recharge merupakan tiga variable terpenting bagi model Naive Bayes.

Evaluasi

Evaluasi dilakukan terhadap data uji dengan menggunakan threshold optimal:

bst <- bestThres(nb)

bst
threshold specificity sensitivity
0.1292398 0.6505451 0.6842857

Berdasarkan output di atas, threshold optimal adalah 0.1292398, yang memberikan specificity dan sensitivity atau masing-masing sebesar 0.6505451 dan 0.6842857

cm.nb <- confMatrix(nb, bst[1,1])
cm.nb
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction   No  Yes
##        No  7936  884
##        Yes 4263 1916
##                                              
##                Accuracy : 0.6568             
##                  95% CI : (0.6492, 0.6644)   
##     No Information Rate : 0.8133             
##     P-Value [Acc > NIR] : 1                  
##                                              
##                   Kappa : 0.2286             
##                                              
##  Mcnemar's Test P-Value : <0.0000000000000002
##                                              
##             Sensitivity : 0.6843             
##             Specificity : 0.6505             
##          Pos Pred Value : 0.3101             
##          Neg Pred Value : 0.8998             
##              Prevalence : 0.1867             
##          Detection Rate : 0.1277             
##    Detection Prevalence : 0.4120             
##       Balanced Accuracy : 0.6674             
##                                              
##        'Positive' Class : Yes                
## 

Dengan threshold tersebut, diperoleh akurasi prediksi sebesar 0.6568.

Classification Tree

Classification tree atau pohon klasifikasi merupakan metode nonparametrik sehingga tidak diperlukan pemenuhan asumsi kenormalan data. Perhitungan metode pohon klasifikasi sulit dilakukan secara manual karena banyaknya kombinasi untuk mencari peubah yang paling dominan. Pohon klasifikasi ini dibentuk melalui penyekatan berulang yang akan membentuk partisi-partisi kelas pengamatan yang lebih homogen dengan karakteristik tertentu, sehingga pengamatan dalam satu cabang pohon memiliki kesamaan ciri. Proses disebut binary karena setiap simpul asal akan selalu mengalami pemecahan kedalam tepat dua simpul dalam. Proses pemecahan ini akan terus dilakukan sampai tidak dapat dilakukan pemecahan berikutnya.

Fitting model

ctree <- train(recharge ~ ., data = trainData_z, 
                method ='rpart', 
                metric = "F",
                tuneLength = 10, trControl = fitControl)
ctree
## CART 
## 
## 35001 samples
##    11 predictor
##     2 classes: 'No', 'Yes' 
## 
## No pre-processing
## Resampling: Cross-Validated (5 fold) 
## Summary of sample sizes: 28001, 28001, 28001, 28001, 28000 
## Resampling results across tuning parameters:
## 
##   cp            AUC         Precision  Recall     F        
##   0.0007139943  0.83305197  0.8357103  0.9609696  0.8939657
##   0.0007649939  0.81531061  0.8353892  0.9616020  0.8940528
##   0.0008414933  0.81415365  0.8346530  0.9638152  0.8945916
##   0.0008669931  0.79278009  0.8347044  0.9643422  0.8948502
##   0.0009179927  0.79270711  0.8344594  0.9649394  0.8949669
##   0.0009485924  0.79270711  0.8344594  0.9649394  0.8949669
##   0.0009944920  0.79868058  0.8350059  0.9643422  0.8950252
##   0.0013004896  0.58321453  0.8309383  0.9724925  0.8961427
##   0.0021419829  0.46804306  0.8272556  0.9791674  0.8967941
##   0.0077009384  0.08439963  0.8195113  0.9897418  0.8965085
## 
## F was used to select the optimal model using the largest value.
## The final value used for the model was cp = 0.002141983.

Dari hasil output di atas, dapat diketahui hasil tunning parameter dengan cross-validation untuk model classification tree memberikan AUC (luas area di bawah kurva ROC), precision, recall, dan F-score yang tinggi, sehingga kinerja model classification tree dapat dikatakan sudah cukup baik. Model final diperoleh dengan parameter cp = 0.002141983.

Bagan Pohon Klasifikasi

rpart.plot(ctree$finalModel)

Dari bagan di atas, terbentuk tree dengan depth sebesar lima, di mana spliting pertama menggunakan peubah penghasilan dari data, diikuti penghasilan dari panggilana, jumlah wilayan yang dikunjungi dan rata-rata penggunaan data.

Variable Importance

plot(varImp(ctree, scale = FALSE))

Dari output di atas, dapat diketahui bahwa penghasilan dari data, rata-rata wilayah yang dikunjungi, dan rata-rata penggunaan data merupakan tiga variable terpenting bagi model classification tree.

Evaluasi

Evaluasi dilakukan terhadap data uji dengan menggunakan threshold optimal:

bst <- bestThres(ctree)

bst
threshold specificity sensitivity
0.2023826 0.7814575 0.4796429

Berdasarkan output di atas, threshold optimal adalah 0.2023826, yang memberikan specificity dan sensitivity atau masing-masing sebesar 0.7814575 dan 0.4796429

cm.ctree <- confMatrix(ctree, bst[1,1])
cm.ctree
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction   No  Yes
##        No  9533 1457
##        Yes 2666 1343
##                                              
##                Accuracy : 0.7251             
##                  95% CI : (0.7179, 0.7322)   
##     No Information Rate : 0.8133             
##     P-Value [Acc > NIR] : 1                  
##                                              
##                   Kappa : 0.2239             
##                                              
##  Mcnemar's Test P-Value : <0.0000000000000002
##                                              
##             Sensitivity : 0.47964            
##             Specificity : 0.78146            
##          Pos Pred Value : 0.33500            
##          Neg Pred Value : 0.86742            
##              Prevalence : 0.18668            
##          Detection Rate : 0.08954            
##    Detection Prevalence : 0.26728            
##       Balanced Accuracy : 0.63055            
##                                              
##        'Positive' Class : Yes                
## 

Dengan threshold tersebut, diperoleh akurasi prediksi sebesar 0.7251.

Bagging

Bagging merupakan singkatan dari bootstrap aggregating, dimana bootstrap adalah proses pengambilan contoh dari data data contoh yang dimiliki (resampling) dan aggregating yaitu proses penggabungan beberapa nilai prediksi menjadi satu nilai prediksi. Bagging baik digunakan untuk klasifikasi dan regresi. Bagging mampu meningkatkan akurasi secara signifikan lebih besar dibandingkan model individual, dan lebih kuat terhadap efek noise dan overfitting dari data training.

Fitting model

set.seed(123)
treebag <- train(recharge ~ ., data=trainData_z, 
                  method='treebag',
                  metric = "F",
                  tuneLength=10, trControl = fitControl)
treebag
## Bagged CART 
## 
## 35001 samples
##    11 predictor
##     2 classes: 'No', 'Yes' 
## 
## No pre-processing
## Resampling: Cross-Validated (5 fold) 
## Summary of sample sizes: 28000, 28001, 28001, 28001, 28001 
## Resampling results:
## 
##   AUC        Precision  Recall     F        
##   0.7634554  0.8387371  0.9512032  0.8914347

Dari hasil output di atas, model bagging memberikan AUC (luas area di bawah kurva ROC), precision, recall, dan F-score yang tinggi, sehingga kinerja model bagging dapat dikatakan sudah cukup baik.

Variable Importance

plot(varImp(treebag, scale = FALSE))

Dari output di atas, dapat diketahui bahwa penghasilan dari panggilan, persentase panggilan di jam kerja dan persentase panggilan sesama opetarot merupakan tiga variable terpenting bagi model bagging.

Evaluasi

Evaluasi dilakukan terhadap data uji dengan menggunakan threshold optimal:

bst <- bestThres(treebag)

bst
threshold specificity sensitivity
0.22 0.6942372 0.6471429

Berdasarkan output di atas, threshold optimal adalah 0.22, yang memberikan specificity dan sensitivity atau masing-masing sebesar 0.6942372 dan 0.6471429.

cm.treebag <- confMatrix(treebag, bst[1,1])
cm.treebag
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction   No  Yes
##        No  8469  988
##        Yes 3730 1812
##                                              
##                Accuracy : 0.6854             
##                  95% CI : (0.6779, 0.6929)   
##     No Information Rate : 0.8133             
##     P-Value [Acc > NIR] : 1                  
##                                              
##                   Kappa : 0.2479             
##                                              
##  Mcnemar's Test P-Value : <0.0000000000000002
##                                              
##             Sensitivity : 0.6471             
##             Specificity : 0.6942             
##          Pos Pred Value : 0.3270             
##          Neg Pred Value : 0.8955             
##              Prevalence : 0.1867             
##          Detection Rate : 0.1208             
##    Detection Prevalence : 0.3695             
##       Balanced Accuracy : 0.6707             
##                                              
##        'Positive' Class : Yes                
## 

Dengan threshold tersebut, diperoleh akurasi prediksi sebesar 0.6854.

AdaBoost

Metode boosting dilakukan dengan memanfaatkan model hasil klasifikasi atau prediksi yang memiliki nilai bobot paling besar. Salah satu algoritma boosting yang populer adalah Adaboost. Adaboost adalah algoritma yang ide dasarnya memilih dan menggabungkan sekelompok pengklasifikasi lemah untuk membentuk klasifikasi yang kuat. Algoritma adaboost iteratif bekerja pada klasifikasi naive bayes dengan bobot normal dan mengklasifikasikan masukan yang diberikan ke dalam kelas yang berbeda dengan beberapa atribut.

Proses fitting model dengan algoritma AdaBoost membutuhkan waktu yang sangat lama, sehingga diputuskan modeling dengan AdaBoost tidak dilakukan.

# tidak dijalankan
set.seed(123)
adaboost <- train(recharge ~ ., data=trainData_z, 
                  method='adaboost',
                  metric = "F",
                  tuneLength=10, trControl = fitControl)
adaboost
bst <- bestThres(adaboost)
bst
cm.adaboost <- confMatrix(adaboost, bst[1,1])
cm.adaboost

Neural Network

Jaringan syaraf tiruan atau artificial neural network (NN) adalah teknik yang menirukan syaraf manusia dimana syaraf merupakan bagian fundamental dari otak. NN terdiri atas input layer dan output layer. Setiap lapis terdiri atas satu atau beberapa unit neuron. Untuk menambah kemampuan dari NN, bisa ditambahkan lapis tersembunyi (hidden layer) untuk. Namun, kemampuan NN juga terbatas pada jumlah lapisan. Semakin banyak jumlah lapisan maka semakin tinggi kapasitas NN tersebut dan semakin banyaknya jumlah iterasi atau training yang dibutuhkan.

Fitting model

set.seed(123)
nn <- train(recharge ~ ., data=trainData_z, 
                  method='nnet',
                  metric = "F",
                  tuneLength=10, trControl = fitControl)
nn
## Neural Network 
## 
## 35001 samples
##    11 predictor
##     2 classes: 'No', 'Yes' 
## 
## No pre-processing
## Resampling: Cross-Validated (5 fold) 
## Summary of sample sizes: 28000, 28001, 28001, 28001, 28001 
## Resampling results across tuning parameters:
## 
##   size  decay         AUC        Precision  Recall     F        
##    1    0.0000000000  0.7174214  0.8171348  0.9927630  0.8963793
##    1    0.0001000000  0.8511203  0.8188104  0.9902336  0.8963574
##    1    0.0002371374  0.9192808  0.8197576  0.9888986  0.8963896
##    1    0.0005623413  0.9192808  0.8197576  0.9888986  0.8963896
##    1    0.0013335214  0.9192768  0.8201776  0.9883717  0.8964262
##    1    0.0031622777  0.9192797  0.8197576  0.9888986  0.8963896
##    1    0.0074989421  0.9192799  0.8197576  0.9888986  0.8963896
##    1    0.0177827941  0.9192931  0.8197343  0.9888986  0.8963755
##    1    0.0421696503  0.9192679  0.8196486  0.9889689  0.8963537
##    1    0.1000000000  0.9192673  0.8194854  0.9891446  0.8963275
##    3    0.0000000000  0.9240070  0.8356497  0.9697523  0.8977196
##    3    0.0001000000  0.9240708  0.8353199  0.9700685  0.8976590
##    3    0.0002371374  0.9233157  0.8350954  0.9681012  0.8966869
##    3    0.0005623413  0.9245019  0.8354484  0.9695767  0.8975270
##    3    0.0013335214  0.9246565  0.8348737  0.9695767  0.8971902
##    3    0.0031622777  0.9243054  0.8360163  0.9675040  0.8969658
##    3    0.0074989421  0.9242524  0.8344349  0.9702793  0.8972416
##    3    0.0177827941  0.9240643  0.8353665  0.9714737  0.8982907
##    3    0.0421696503  0.9248659  0.8348713  0.9706657  0.8976596
##    3    0.1000000000  0.9245977  0.8355042  0.9690146  0.8973133
##    5    0.0000000000  0.9253808  0.8364136  0.9701036  0.8983090
##    5    0.0001000000  0.9247322  0.8352691  0.9711576  0.8981004
##    5    0.0002371374  0.9250209  0.8369937  0.9682768  0.8978582
##    5    0.0005623413  0.9241215  0.8364661  0.9695767  0.8981131
##    5    0.0013335214  0.9252023  0.8349881  0.9691551  0.8970799
##    5    0.0031622777  0.9252247  0.8371106  0.9690848  0.8982689
##    5    0.0074989421  0.9253765  0.8372861  0.9696118  0.8985983
##    5    0.0177827941  0.9254186  0.8360697  0.9715791  0.8987393
##    5    0.0421696503  0.9252165  0.8364110  0.9695415  0.8980648
##    5    0.1000000000  0.9255096  0.8369321  0.9696469  0.8984113
##    7    0.0000000000  0.9257014  0.8364899  0.9684525  0.8976421
##    7    0.0001000000  0.9248684  0.8368310  0.9683471  0.8977919
##    7    0.0002371374  0.9256483  0.8370433  0.9683822  0.8979295
##    7    0.0005623413  0.9247111  0.8376915  0.9665203  0.8975009
##    7    0.0013335214  0.9253581  0.8386102  0.9677850  0.8985726
##    7    0.0031622777  0.9252637  0.8365769  0.9700334  0.8983739
##    7    0.0074989421  0.9257554  0.8364989  0.9692956  0.8980130
##    7    0.0177827941  0.9260766  0.8373135  0.9691551  0.8984079
##    7    0.0421696503  0.9257373  0.8374893  0.9676093  0.8978532
##    7    0.1000000000  0.9262665  0.8362716  0.9696469  0.8980315
##    9    0.0000000000  0.9258063  0.8367961  0.9670473  0.8972152
##    9    0.0001000000  0.9252418  0.8377329  0.9669770  0.8977163
##    9    0.0002371374  0.9256273  0.8379310  0.9675391  0.8980805
##    9    0.0005623413  0.9262877  0.8377620  0.9670473  0.8977695
##    9    0.0013335214  0.9250337  0.8362172  0.9696469  0.8980020
##    9    0.0031622777  0.9252555  0.8366714  0.9688038  0.8978948
##    9    0.0074989421  0.9254126  0.8378572  0.9687687  0.8985652
##    9    0.0177827941  0.9265658  0.8376832  0.9681363  0.8981959
##    9    0.0421696503  0.9259132  0.8382036  0.9676093  0.8982630
##    9    0.1000000000  0.9259757  0.8365549  0.9687687  0.8978138
##   11    0.0000000000  0.9254244  0.8374930  0.9676796  0.8978891
##   11    0.0001000000  0.9253748  0.8380209  0.9667311  0.8977824
##   11    0.0002371374  0.9254792  0.8372140  0.9673283  0.8975784
##   11    0.0005623413  0.9260756  0.8384383  0.9669419  0.8981138
##   11    0.0013335214  0.9254190  0.8373517  0.9673283  0.8976512
##   11    0.0031622777  0.9242400  0.8374768  0.9675391  0.8978182
##   11    0.0074989421  0.9247295  0.8386068  0.9666959  0.8981044
##   11    0.0177827941  0.9246333  0.8382139  0.9662392  0.8976792
##   11    0.0421696503  0.9244424  0.8376122  0.9680660  0.8981152
##   11    0.1000000000  0.9261929  0.8377265  0.9685579  0.8983961
##   13    0.0000000000  0.9244510  0.8385694  0.9664500  0.8979775
##   13    0.0001000000  0.9248916  0.8376905  0.9657825  0.8971838
##   13    0.0002371374  0.9253002  0.8399736  0.9657825  0.8984870
##   13    0.0005623413  0.9235837  0.8380150  0.9664500  0.8976551
##   13    0.0013335214  0.9254766  0.8387911  0.9656069  0.8977353
##   13    0.0031622777  0.9247656  0.8373561  0.9666608  0.8973688
##   13    0.0074989421  0.9252081  0.8382980  0.9668365  0.8979855
##   13    0.0177827941  0.9256417  0.8381111  0.9666257  0.8977879
##   13    0.0421696503  0.9264807  0.8379906  0.9679607  0.8982975
##   13    0.1000000000  0.9269457  0.8376065  0.9682768  0.8982104
##   15    0.0000000000  0.9250090  0.8380663  0.9675040  0.8981363
##   15    0.0001000000  0.9254483  0.8380556  0.9658879  0.8974403
##   15    0.0002371374  0.9255151  0.8373886  0.9668716  0.8974767
##   15    0.0005623413  0.9246111  0.8376953  0.9656420  0.8971242
##   15    0.0013335214  0.9265476  0.8382323  0.9656771  0.8974490
##   15    0.0031622777  0.9258995  0.8376570  0.9677499  0.8980125
##   15    0.0074989421  0.9259083  0.8394499  0.9654312  0.8980426
##   15    0.0177827941  0.9252680  0.8388860  0.9658879  0.8979100
##   15    0.0421696503  0.9257308  0.8380453  0.9655718  0.8972929
##   15    0.1000000000  0.9252516  0.8381393  0.9669770  0.8979537
##   17    0.0000000000  0.9250124  0.8386821  0.9649745  0.8973987
##   17    0.0001000000  0.9250310  0.8387697  0.9652907  0.8975905
##   17    0.0002371374  0.9241796  0.8383524  0.9668013  0.8979981
##   17    0.0005623413  0.9256595  0.8387969  0.9656771  0.8977723
##   17    0.0013335214  0.9251658  0.8391407  0.9648340  0.8976020
##   17    0.0031622777  0.9252074  0.8396270  0.9655366  0.8981839
##   17    0.0074989421  0.9250705  0.8393253  0.9660285  0.8982178
##   17    0.0177827941  0.9247150  0.8382980  0.9660987  0.8976674
##   17    0.0421696503  0.9256062  0.8393220  0.9651502  0.8978418
##   17    0.1000000000  0.9264570  0.8380577  0.9667662  0.8978175
##   19    0.0000000000  0.9243271  0.8379982  0.9653610  0.8971730
##   19    0.0001000000  0.9259453  0.8383929  0.9633585  0.8965363
##   19    0.0002371374  0.9238199  0.8383005  0.9643422  0.8969121
##   19    0.0005623413  0.9240513  0.8380508  0.9647637  0.8969520
##   19    0.0013335214  0.9231883  0.8382720  0.9653610  0.8973330
##   19    0.0031622777  0.9238446  0.8386248  0.9660285  0.8978245
##   19    0.0074989421  0.9229386  0.8373051  0.9673634  0.8976397
##   19    0.0177827941  0.9252259  0.8385245  0.9657474  0.8976482
##   19    0.0421696503  0.9250472  0.8382990  0.9672229  0.8981536
##   19    0.1000000000  0.9247890  0.8378262  0.9669419  0.8977598
## 
## F was used to select the optimal model using the largest value.
## The final values used for the model were size = 5 and decay = 0.01778279.

Dari hasil output di atas, dapat diketahui hasil tunning parameter dengan cross-validation untuk model neural network memberikan AUC (luas area di bawah kurva ROC), precision, recall, dan F-score yang tinggi, sehingga kinerja model neural network dapat dikatakan sudah cukup baik. Model final diperoleh dengan paramter size = 5 and decay = 0.01778279.

Visualisasi Network

Berikut adalah visualisasi dari model neural network yang terbentuk.

plotnet(nn) 

Variable Importance

plot(varImp(nn, scale = FALSE))

Dari output di atas, dapat diketahui bahwa penggunaan dari data, penghasilan dari data dan rata-rata wilayah yang dikunjungi merupakan tiga variable terpenting bagi model neural network.

Evaluasi

Evaluasi dilakukan terhadap data uji dengan menggunakan threshold optimal:

bst <- bestThres(nn)

bst
threshold specificity sensitivity
0.1793524 0.6910402 0.7107143

Berdasarkan output di atas, threshold optimal adalah 0.1793524, yang memberikan specificity dan sensitivity atau masing-masing sebesar 0.6910402 dan 0.7107143

cm.nn <- confMatrix(nn, bst[1,1])
cm.nn
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction   No  Yes
##        No  8430  810
##        Yes 3769 1990
##                                              
##                Accuracy : 0.6947             
##                  95% CI : (0.6873, 0.7021)   
##     No Information Rate : 0.8133             
##     P-Value [Acc > NIR] : 1                  
##                                              
##                   Kappa : 0.2855             
##                                              
##  Mcnemar's Test P-Value : <0.0000000000000002
##                                              
##             Sensitivity : 0.7107             
##             Specificity : 0.6910             
##          Pos Pred Value : 0.3455             
##          Neg Pred Value : 0.9123             
##              Prevalence : 0.1867             
##          Detection Rate : 0.1327             
##    Detection Prevalence : 0.3840             
##       Balanced Accuracy : 0.7009             
##                                              
##        'Positive' Class : Yes                
## 

Dengan threshold tersebut, diperoleh akurasi prediksi sebesar 0.6947.

Random Forest

Random forest merupakan sebuah model ensemble, yaitu model yang dibentuk dari banyak model Decision Tree, baik untuk regresi maupun untuk klasifikasi, dengan menerapkan metode bagging dan random feature selection. Metode ini merupakan metode pohon gabungan. Untuk mengidentifikasi peubah penjelas yang relevan dengan peubah respons, random forest menghasilkan ukuran tingkat kepentingan (variable importance) peubah penjelas.

Fitting model

set.seed(123)
rf <- train(recharge ~ ., data=trainData_z, 
            method='ranger', 
            metric = "F",
            tuneLength=7, trControl = fitControl,
            importance = 'impurity')
rf
## Random Forest 
## 
## 35001 samples
##    11 predictor
##     2 classes: 'No', 'Yes' 
## 
## No pre-processing
## Resampling: Cross-Validated (5 fold) 
## Summary of sample sizes: 28000, 28001, 28001, 28001, 28001 
## Resampling results across tuning parameters:
## 
##   mtry  splitrule   AUC        Precision  Recall     F        
##    2    gini        0.9235844  0.8335928  0.9736870  0.8982077
##    2    extratrees  0.9242264  0.8267236  0.9840506  0.8985514
##    3    gini        0.9227030  0.8357990  0.9702442  0.8980151
##    3    extratrees  0.9246417  0.8301888  0.9796592  0.8987503
##    5    gini        0.9223429  0.8379039  0.9658879  0.8973532
##    5    extratrees  0.9239720  0.8328152  0.9735113  0.8976825
##    6    gini        0.9216592  0.8380158  0.9654312  0.8972213
##    6    extratrees  0.9239594  0.8341813  0.9718250  0.8977560
##    8    gini        0.9203486  0.8378615  0.9623397  0.8957951
##    8    extratrees  0.9232663  0.8359911  0.9687687  0.8974940
##    9    gini        0.9195822  0.8379713  0.9625505  0.8959491
##    9    extratrees  0.9232525  0.8368289  0.9682066  0.8977338
##   11    gini        0.9185462  0.8387502  0.9604426  0.8954794
##   11    extratrees  0.9228918  0.8372852  0.9662041  0.8971338
## 
## Tuning parameter 'min.node.size' was held constant at a value of 1
## F was used to select the optimal model using the largest value.
## The final values used for the model were mtry = 3, splitrule = extratrees
##  and min.node.size = 1.

Dari hasil output di atas, dapat diketahui hasil tunning parameter dengan cross-validation untuk model random forest memberikan AUC (luas area di bawah kurva ROC), precision, recall, dan F-score yang tinggi, sehingga kinerja model random forest dapat dikatakan sudah cukup baik. Model final diperoleh dengan parameter mtry = 3, splitrule = extratrees dan min.node.size = 1.

Variable Importance

plot(varImp(rf, scale = FALSE))

Dari output di atas, dapat diketahui bahwa penghasilan dari data, penghasilan dari panggilan dan frekuensi recharge merupakan tiga variable terpenting bagi model random forest.

Evaluasi

Evaluasi dilakukan terhadap data uji dengan menggunakan threshold optimal:

bst <- bestThres(rf)

bst
threshold specificity sensitivity
0.2035254 0.6910402 0.7064286

Berdasarkan output di atas, threshold optimal adalah 0.2035254, yang memberikan specificity dan sensitivity atau masing-masing sebesar 0.6910402 dan 0.7064286

cm.rf <- confMatrix(rf, bst[1,1])
cm.rf
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction   No  Yes
##        No  8430  822
##        Yes 3769 1978
##                                              
##                Accuracy : 0.6939             
##                  95% CI : (0.6865, 0.7013)   
##     No Information Rate : 0.8133             
##     P-Value [Acc > NIR] : 1                  
##                                              
##                   Kappa : 0.2828             
##                                              
##  Mcnemar's Test P-Value : <0.0000000000000002
##                                              
##             Sensitivity : 0.7064             
##             Specificity : 0.6910             
##          Pos Pred Value : 0.3442             
##          Neg Pred Value : 0.9112             
##              Prevalence : 0.1867             
##          Detection Rate : 0.1319             
##    Detection Prevalence : 0.3832             
##       Balanced Accuracy : 0.6987             
##                                              
##        'Positive' Class : Yes                
## 

Dengan threshold tersebut, diperoleh akurasi prediksi sebesar 0.6939.

Support Vector Machine

Support Vector Machine (SVM) merupakan salah satu metode dalam machine learning yang dapat digunakan untuk klasifikasi maupun regresi baik yang mempunyai hubungan linear maupu non linear. Dalam pemodelan klasifikasi, SVM digunakan untuk mencari hyperplane terbaik dengan memaksimalkan jarak antar kelas.

Fitting model

set.seed(123)
svm <- train(recharge ~ ., data=trainData_z, 
            method='svmRadial', 
            metric = "F",
            tuneLength=7, trControl = fitControl)
svm
## Support Vector Machines with Radial Basis Function Kernel 
## 
## 35001 samples
##    11 predictor
##     2 classes: 'No', 'Yes' 
## 
## No pre-processing
## Resampling: Cross-Validated (5 fold) 
## Summary of sample sizes: 28000, 28001, 28001, 28001, 28001 
## Resampling results across tuning parameters:
## 
##   C      AUC        Precision  Recall     F        
##    0.25  0.8714993  0.8256896  0.9862990  0.8988748
##    0.50  0.8709546  0.8262105  0.9863692  0.8992128
##    1.00  0.8709705  0.8264957  0.9859828  0.8992203
##    2.00  0.8711059  0.8266539  0.9850694  0.8989343
##    4.00  0.8714855  0.8265538  0.9847181  0.8987290
##    8.00  0.8722511  0.8262497  0.9850255  0.8986781
##   16.00  0.8720514  0.8237335  0.9866854  0.8978755
## 
## Tuning parameter 'sigma' was held constant at a value of 0.1316169
## F was used to select the optimal model using the largest value.
## The final values used for the model were sigma = 0.1316169 and C = 1.

Dari hasil output di atas, dapat diketahui hasil tunning parameter dengan cross-validation untuk model SVM memberikan AUC (luas area di bawah kurva ROC), precision, recall, dan F-score yang tinggi, sehingga kinerja model SVM dapat dikatakan sudah cukup baik. Model final diperoleh dengan parameter sigma = 0.1316169 dan C = 1.

Variable Importance

plot(varImp(svm, scale = FALSE))

Dari output di atas, dapat diketahui bahwa penghasilan dari data, penggunaan data dan frekuensi recharge merupakan tiga variable terpenting bagi model SVM.

Evaluasi

Evaluasi dilakukan terhadap data uji dengan menggunakan threshold optimal:

bst <- bestThres(svm)

bst
threshold specificity sensitivity
0.1614605 0.789327 0.5360714

Berdasarkan output di atas, threshold optimal adalah 0.1614605, yang memberikan specificity dan sensitivity atau masing-masing sebesar 0.789327 dan 0.5360714

cm.svm <- confMatrix(svm, bst[1,1])
cm.svm
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction   No  Yes
##        No  9629 1299
##        Yes 2570 1501
##                                              
##                Accuracy : 0.742              
##                  95% CI : (0.735, 0.749)     
##     No Information Rate : 0.8133             
##     P-Value [Acc > NIR] : 1                  
##                                              
##                   Kappa : 0.277              
##                                              
##  Mcnemar's Test P-Value : <0.0000000000000002
##                                              
##             Sensitivity : 0.5361             
##             Specificity : 0.7893             
##          Pos Pred Value : 0.3687             
##          Neg Pred Value : 0.8811             
##              Prevalence : 0.1867             
##          Detection Rate : 0.1001             
##    Detection Prevalence : 0.2714             
##       Balanced Accuracy : 0.6627             
##                                              
##        'Positive' Class : Yes                
## 

Dengan threshold tersebut, diperoleh akurasi prediksi sebesar 0.742.

Perbandingan Model

Perbandingan model yang terbentuk dengan proses resample diringkas sebagai berikut:

modelcompare <- resamples(list(glm=reglog, 
                                 knn=knn,
                                 nb=nb,
                                 rpart=ctree,
                                 treebag=treebag,
                                 nnet=nn,
                                 rf=rf,
                                 svm=svm))
summary(modelcompare)
## 
## Call:
## summary.resamples(object = modelcompare)
## 
## Models: glm, knn, nb, rpart, treebag, nnet, rf, svm 
## Number of resamples: 5 
## 
## AUC 
##              Min.   1st Qu.    Median      Mean   3rd Qu.      Max. NA's
## glm     0.9108882 0.9121633 0.9145301 0.9149900 0.9175311 0.9198376    0
## knn     0.7872254 0.7876113 0.7906498 0.7910213 0.7929952 0.7966247    0
## nb      0.8845106 0.8895472 0.8963313 0.8934921 0.8979874 0.8990841    0
## rpart   0.1876313 0.1918755 0.2307905 0.4680431 0.8614019 0.8685161    0
## treebag 0.7502237 0.7620980 0.7637929 0.7634554 0.7699801 0.7711825    0
## nnet    0.9221225 0.9222462 0.9264196 0.9254186 0.9280051 0.9282994    0
## rf      0.9224511 0.9229421 0.9238739 0.9246417 0.9252342 0.9287073    0
## svm     0.8667314 0.8680065 0.8709307 0.8709705 0.8743077 0.8748762    0
## 
## F 
##              Min.   1st Qu.    Median      Mean   3rd Qu.      Max. NA's
## glm     0.8948761 0.8950116 0.8969892 0.8964012 0.8973042 0.8978249    0
## knn     0.8951344 0.8952582 0.8957523 0.8959971 0.8965294 0.8973113    0
## nb      0.8760677 0.8760817 0.8797669 0.8788603 0.8803469 0.8820384    0
## rpart   0.8944359 0.8965019 0.8971401 0.8967941 0.8973347 0.8985577    0
## treebag 0.8899671 0.8906996 0.8907230 0.8914347 0.8922647 0.8935189    0
## nnet    0.8973236 0.8984895 0.8985413 0.8987393 0.8996601 0.8996822    0
## rf      0.8964182 0.8979592 0.8989071 0.8987503 0.8998710 0.9005961    0
## svm     0.8983580 0.8984026 0.8991415 0.8992203 0.8995668 0.9006326    0
## 
## Precision 
##              Min.   1st Qu.    Median      Mean   3rd Qu.      Max. NA's
## glm     0.8232517 0.8246004 0.8258751 0.8252894 0.8260870 0.8266332    0
## knn     0.8309838 0.8317025 0.8324022 0.8320246 0.8324568 0.8325778    0
## nb      0.8363147 0.8370939 0.8379365 0.8383931 0.8396135 0.8410069    0
## rpart   0.8223454 0.8251366 0.8257508 0.8272556 0.8284270 0.8346183    0
## treebag 0.8367094 0.8377795 0.8380053 0.8387371 0.8401059 0.8410853    0
## nnet    0.8335091 0.8340585 0.8355233 0.8360697 0.8380967 0.8391608    0
## rf      0.8284699 0.8288826 0.8302506 0.8301888 0.8316197 0.8317215    0
## svm     0.8237879 0.8256773 0.8275456 0.8264957 0.8276219 0.8278459    0
## 
## Recall 
##              Min.   1st Qu.    Median      Mean   3rd Qu.      Max. NA's
## glm     0.9785702 0.9801511 0.9812050 0.9809239 0.9822589 0.9824346    0
## knn     0.9678553 0.9683822 0.9704901 0.9706306 0.9731249 0.9733005    0
## nb      0.9158616 0.9188477 0.9272791 0.9234499 0.9272791 0.9279817    0
## rpart   0.9697875 0.9755841 0.9787458 0.9791674 0.9813806 0.9903390    0
## treebag 0.9478307 0.9504655 0.9504655 0.9512032 0.9529246 0.9543299    0
## nnet    0.9683822 0.9696118 0.9717197 0.9715791 0.9717197 0.9764623    0
## rf      0.9759354 0.9776919 0.9803267 0.9796592 0.9819076 0.9824346    0
## svm     0.9841911 0.9848937 0.9850694 0.9859828 0.9878799 0.9878799    0
dotplot(modelcompare)

Dari perbandingan di atas, terlihat bahwa model-model yang terbentuk memiliki kinerja yang sudah cukup baik. Hanya saja, model classification tree memberikan AUC yang beragam, yang berarti model ini kurang stabil.

Perbandingan Akurasi dengan threshold optimal

accuracyTbl <- data.frame(rbind(
  reglog = c(cm.reglog$byClass[1:2], cm.reglog$overall[1]), 
    knn= c(cm.knn$byClass[1:2], cm.knn$overall[1]),
    nb = c(cm.nb$byClass[1:2], cm.nb$overall[1]),
    ctree = c(cm.ctree$byClass[1:2], cm.ctree$overall[1]),
    treebag = c(cm.treebag$byClass[1:2], cm.treebag$overall[1]),
    nn = c(cm.nn$byClass[1:2], cm.nn$overall[1]),
    rf = c(cm.rf$byClass[1:2], cm.rf$overall[1]),
    svm = c(cm.svm$byClass[1:2], cm.svm$overall[1])
))

accuracyTbl
Sensitivity Specificity Accuracy
reglog 0.7021429 0.6844004 0.6877125
knn 0.6471429 0.7019428 0.6917128
nb 0.6842857 0.6505451 0.6568438
ctree 0.4796429 0.7814575 0.7251150
treebag 0.6471429 0.6942372 0.6854457
nn 0.7107143 0.6910402 0.6947130
rf 0.7064286 0.6910402 0.6939129
svm 0.5360714 0.7893270 0.7420495

Dari tabel di atas, sangat sulit untuk menentukan model terbaik karena metriks yang dihasilkan relatif sama antar model. Meskipun demikian, model neural network dipilih sebagai model terbaik karena memberikan sensitivitas dan spesifisitas yang tinggi dan tidak jauh berbeda, meskipun keduanya mempunyai akurasi total <70%. Model terbaik selanjutnya adalah random forest, yang mempunyai kinerja tidak jauh berbeda dengan neural network.

Kesimpulan dan Saran

Berdasarkan hasil modeling untuk memprediksi pelanggan operator seluler yang berpotensi melakukan recharge melalui channel perbankan serta perbandingan kinerjanya, model dengan algoritma *neural network merupakan model terbaik, yang memberikan nilai akurasi 69%.

Berdasarkan nilai variable importance, peubah-peubah prediktor dapat diurutkan berdasarkan dari yang terpenting, sebagai berikut:

  • Rata- rata pemakaian data per bulan (MB)
  • Rata-rata penghasilan dari transaksi pemakaian data per bulan (Rp)
  • Rata-rata banyaknya wilayah yang dikunjungi per bulan
  • Rata-rata penghasilan dari transaksi panggilan per bulan (Rp)
  • Rata- rata frekuensi melakukan recharfe pulsa per bulan
  • Rata-rata penghasilan dari transaksi SMS per bulan (Rp)
  • Rata- rata durasi melakukan panggilan per bulan (menit)
  • Persentase panggilan di jam kerja
  • Rata-rata frekuensi melakukan panggilan per bulan
  • Persentase panggilan sesama operator
  • Persentase transaksi SMS sesama operator

Untuk penelitian selanjutnya, direkomendasikan untuk dilakukan penanganan terhadap kondisi response yang tidak seimbang. Beberapa cara yang dapat dilakukan antara lain:

  • resampling, baik undersampling maupun oversampling
  • penggunaan bobot dalam pemodelan

Selain itu, dapat penentuan cut-off/threshold sebaiknya dilakukan dengan mempertimbangkan:

  • Keuntungan yang diperoleh apabila model dapat memprediksi dengan benar (true positive),
  • Potensi keuntungan yang hilang karena memprediksi pelanggan yang potensial sebagai pelanggan yang tidak potensial (false negative),
  • Biaya yang timbul karena memprediksi pelanggan yang tidak potensial sebagai pelanggan yang potensial (false positive).

Daftar Pustaka

Andrea Peters and Torsten Hothorn (2021). ipred: Improved Predictors. R package version 0.9-12. https://CRAN.R-project.org/package=ipred

Beck MW (2018). “NeuralNetTools: Visualization and Analysis Tools for Neural Networks.” Journal of Statistical Software, 85(11), 1-20. doi: 10.18637/jss.v085.i11 (URL: https://doi.org/10.18637/jss.v085.i11).

Claus O. Wilke (2020). cowplot: Streamlined Plot Theme and Plot Annotations for ‘ggplot2’. R package version 1.1.1. https://CRAN.R-project.org/package=cowplot

Christopher R John (2020). MLeval: Machine Learning Model Evaluation. R package version 0.3. https://CRAN.R-project.org/package=MLeval

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/

Elin Waring, Michael Quinn, Amelia McNamara, Eduardo Arino de la Rubia, Hao Zhu and Shannon Ellis (2021). skimr: Compact and Flexible Summaries of Data. R package version 2.1.3. https://CRAN.R-project.org/package=skimr

H. Wickham. ggplot2: Elegant Graphics for Data Analysis. Springer-Verlag New York, 2016.

Marvin N. Wright, Andreas Ziegler (2017). ranger: A Fast Implementation of Random Forests for High Dimensional Data in C++ and R. Journal of Statistical Software, 77(1), 1-17. doi:10.18637/jss.v077.i01

Max Kuhn (2021). caret: Classification and Regression Training. R package version 6.0-89. https://CRAN.R-project.org/package=caret Stephen Milborrow (2021). rpart.plot: Plot ‘rpart’ Models: An Enhanced Version of ‘plot.rpart’. R package version 3.1.0. https://CRAN.R-project.org/package=rpart.plot

R Core Team (2021). R: A language and environment for statistical computing. R Foundation for Statistical Computing, Vienna, Austria. URL https://www.R-project.org/.

Terry Therneau and Beth Atkinson (2019). rpart: Recursive Partitioning and Regression Trees. R package version 4.1-15. https://CRAN.R-project.org/package=rpart

Venables, W. N. & Ripley, B. D. (2002) Modern Applied Statistics with S. Fourth Edition. Springer, New York. ISBN 0-387-95457-0

Weihs, C., Ligges, U., Luebke, K. and Raabe, N. (2005). klaR Analyzing German Business Cycles. In Baier, D., Decker, R. and Schmidt-Thieme, L. (eds.). Data Analysis and Decision Support, 335-343, Springer-Verlag, Berlin.

Xavier Robin, Natacha Turck, Alexandre Hainard, Natalia Tiberti, Frédérique Lisacek, Jean-Charles Sanchez and Markus Müller (2011). pROC: an open-source package for R and S+ to analyze and compare ROC curves. BMC Bioinformatics, 12, p. 77. DOI: 10.1186/1471-2105-12-77 http://www.biomedcentral.com/1471-2105/12/77/


  1. Mahasiswa Prodi Statistika dan Sains Data, Bogor University. NIM: G1501211061. Email: ↩︎

  2. Mahasiswa Prodi Statistika dan Sains Data, Bogor University. NIM: G1501211007. Email: ↩︎

  3. Mahasiswa Prodi Statistika dan Sains Data, Bogor University. NIM: G14180064. Email: ↩︎