UAS Machine Learning

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. Data mencangkup 50.000 orang pelanggan dengan 11 variabel sebagai berikut :

Data

library(tidyverse)
library(caret)
library(rpart)
library(rpart.plot)
library(vip)
library(Metrics)
library(e1071)
library(pROC)
library(adabag)
library(DT)
library(AppliedPredictiveModeling)
library(NeuralNetTools)
library(skimr)
library(randomForest)
library(mlbench)
## Warning: package 'mlbench' was built under R version 4.1.2
data <- read.csv("C:/sqlite/db/mydata.csv")
str(data)
## 'data.frame':    50000 obs. of  13 variables:
##  $ ID : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ X1 : int  257 24 1 627 42 65 209 11 16 117 ...
##  $ X2 : int  13643 13897 760 41160 19002 38253 76895 12650 2491 55057 ...
##  $ X3 : int  27 15 1 97 38 43 262 10 3 121 ...
##  $ X4 : num  0.78 0.739 0.5 0.707 0.75 ...
##  $ X5 : num  0.963 0.906 1 0.998 0.964 ...
##  $ X6 : int  5217 18025 3275 2864 2794 1122 14061 16131 1892 4222 ...
##  $ X7 : num  0.769 0.291 0.962 0.723 0.748 ...
##  $ X8 : int  768 2368 2542 0 0 5 0 0 405 0 ...
##  $ X9 : int  30006 39954 43544 0 0 1719 0 0 18934 0 ...
##  $ X10: num  6.3 7.3 1.3 9.3 4 17 24.7 10 3.7 8.7 ...
##  $ X11: num  4.7 5.3 1.3 5 1 14.7 9.7 5.3 2 6 ...
##  $ Y  : int  1 1 0 0 0 1 0 0 0 0 ...

Variabel Y merupkan variabel respon yang merupakan data kategorik dengan angka 0 (tidak berpotensi) dan 1 (berpotensi) untuk direkrut mengikuti channel. sedangkan variabel X1 - X11 merupakan data integer dan numerik.

Eksplorasi Data

featurePlot(x=data[,8:12], y= as.factor(data[,13]), ##angka x dan y dimana y didefinisikan sebagai faktor
            plot="box", scales=list(x=list(relation="free"), ##scale free menandakan bahwa skala akan disesuaikan berdasarkan skala data yang ada 
                                    y=list(relation="free"),auto.key=list(columns=4)))

featurePlot(x=data[,2:7], y= as.factor(data[,13]), # dibagi menjadi 2 kali agar plot tidak terlalu kecil dan lebih mudah dipahami
            plot="box", 
            scales=list(x=list(relation="free"), 
                        y=list(relation="free"),auto.key=list(columns=4)))

Dari box plot diatas dapat terlihat bahwa untuk masing - masing variabel dibagi berdasarkan Y = 0 dan Y = 1. Terlihat pada setiap box plot memiliki banyak pencilan maka dapat dikatakan bahwa distribusi data cenderung kurang baik.

newdata <- data[,2:13] ## Membuang variable indeks
str(newdata)
## 'data.frame':    50000 obs. of  12 variables:
##  $ X1 : int  257 24 1 627 42 65 209 11 16 117 ...
##  $ X2 : int  13643 13897 760 41160 19002 38253 76895 12650 2491 55057 ...
##  $ X3 : int  27 15 1 97 38 43 262 10 3 121 ...
##  $ X4 : num  0.78 0.739 0.5 0.707 0.75 ...
##  $ X5 : num  0.963 0.906 1 0.998 0.964 ...
##  $ X6 : int  5217 18025 3275 2864 2794 1122 14061 16131 1892 4222 ...
##  $ X7 : num  0.769 0.291 0.962 0.723 0.748 ...
##  $ X8 : int  768 2368 2542 0 0 5 0 0 405 0 ...
##  $ X9 : int  30006 39954 43544 0 0 1719 0 0 18934 0 ...
##  $ X10: num  6.3 7.3 1.3 9.3 4 17 24.7 10 3.7 8.7 ...
##  $ X11: num  4.7 5.3 1.3 5 1 14.7 9.7 5.3 2 6 ...
##  $ Y  : int  1 1 0 0 0 1 0 0 0 0 ...
newdata$Y =ifelse(newdata$Y == 0 ,"No","Yes") # mengubah 0,1 pada Y menjadi 0 tidak dan 1 iya


skimmed <- skim(newdata[,1:11]) ## Melihat summari data dan memeriksa terdapat adanya data hilang NA
skim <- skimmed[, c(1:6,12)] ## 1:6 -12 menunjukan apasaja summery yang ingin ditampilkan seperti mean,sd,NA dan lainya 
skim
Data summary
Name newdata[, 1:11]
Number of rows 50000
Number of columns 11
_______________________
Column type frequency:
numeric 11
________________________
Group variables None

Variable type: numeric

skim_variable n_missing complete_rate mean sd hist
X1 0 1 110.67 180.63 ▇▁▁▁▁
X2 0 1 27907.54 27361.61 ▇▁▁▁▁
X3 0 1 40.23 51.21 ▇▁▁▁▁
X4 0 1 0.73 0.14 ▁▁▁▇▃
X5 0 1 0.88 0.20 ▁▁▁▁▇
X6 0 1 6745.71 7915.11 ▇▁▁▁▁
X7 0 1 0.77 0.25 ▁▁▂▃▇
X8 0 1 946.87 2260.86 ▇▁▁▁▁
X9 0 1 16144.17 26826.08 ▇▁▁▁▁
X10 0 1 7.13 4.84 ▇▆▂▁▁
X11 0 1 3.68 2.41 ▇▁▁▁▁

Struktur dari dataset yang digunakan menunjukan bahwa dataset terdiri dari 50.000 observasi dan 12 variabel yang terbasuk varibale Y didalamnya. Didalam struktur data juga ditampilkan tipe data pada setiap variabel. Selanjutnya dengan menggunakan skimmed kita dapat melihat summary data diantaranya mean (rata-rata), standar deviasi, dan bentuk histogram dari setiap variabelnya. Seperti data pada X10 terlihat lebih condong ke kanan persebaran datanya sedangkan data X1,X2,X3 terlihat lebih dominan berada pada daerah kiri.

Split Data

set.seed(102)
index <- createDataPartition(newdata$Y, p=0.75,list=FALSE) #angka 0.75 pembagian data
train <- newdata[ index,] # include angka 0.75
test <- newdata[-index,]  # tidak temasuk kedalam 0.75
head(train)
##    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 Yes
## 2  24 13897  15 0.7393772 0.9061206 18025 0.2906286 2368 39954  7.3  5.3 Yes
## 3   1   760   1 0.5000000 1.0000000  3275 0.9617486 2542 43544  1.3  1.3  No
## 4 627 41160  97 0.7065245 0.9976897  2864 0.7232183    0     0  9.3  5.0  No
## 6  65 38253  43 0.7786787 1.0000000  1122 1.0000000    5  1719 17.0 14.7 Yes
## 7 209 76895 262 0.7715915 0.9784123 14061 0.6753892    0     0 24.7  9.7  No
dim(train)
## [1] 37500    12
dim(test)
## [1] 12500    12

Pada pemodelan klasifikasi dibutuhkan untuk membagi data menjadi data training dan data testing. Data training digunakan untuk membuat model dari klasifikasi sdangkan data testing digunakan untuk menguji peforma dari klasifikasi. Pada pemodelan kali ini training set 0.75 dan testing 0.25. Berikut merupakan nilai dari sebagian data training dengan jumlah observasi sebanyak 37.500 dan jumlah observasi data testing 12.500.

Model Klasifikasi

Cross Validation adalah metode untuk mencari angka optimal dari suatu model dengan mengevaluasi model tersebut. Cross validation yang digunakan adalah K-fold Validation dengan K = 5.

set.seed(234) 
control = trainControl( #Cross validation k =5 dengan mengunakan k-fold
   method = "cv",
   number = 5, 
   savePredictions = "final", # angka akhir prediksi yang diambil adalah angka final atau terbaik
   classProbs = TRUE, 
   summaryFunction = twoClassSummary)

Regresi Logistik

Regresi Logistik merupakan sebuah model yang dapat digunakan untuk klasifikasi dan regresi(melihat pengaruh dependent terhadapa independent). Metode regresi logistik yang digunakan kali ini merupakan metode klasifikasi yang digunakan untuk mengklasifikasikan sebuah data ke dalam data kategorik Y Berpotensi atau TidaK Berpotensi yang biasa disebut dengan biner.

log <- train(
  form = Y ~ ., #angka Y 
  data = newdata, #nama data 
  trControl = control, # Cross validation  
  method = "glm", # model logreg
  family = "binomial") # berbetuk biner 1 dan 0 

predlog = predict(log, test)  # angka testing untuk menguji model 
p_predlog = predict(log,test,type="prob")
actuallog = factor(test$Y) # angka actual Test sebagai pembanding model 

cm_log <- confusionMatrix(actuallog, predlog, positive = "Yes") # Mencari angka confusion matrix 
                                                             #dengan angka positive yang diharapkan adalah postive = YES/ berpotensi

Berdasarkan output confusion matrix pada model regresi logistik diatas dapat dilihat ada sebanyak 216 pelanggan yang diprediksi tepat dan 203 pelanggan berpotensi tidak diklasifikasikan secara tepat. Sebanyak 9963 yang diprediksi tepat tidak memiliki potensial dan 2118 orang yang tidak berpotensi diklasifikasikan kedalam berpotensi, kesalahan dalam klsifikasi masih cendrung besar.

Berdasarkan angka akurasi ternyata model regresi logistik memiliki angka akurasi yaitu 81.43 % dan dapat dikatakan bahwa akurasi model ini cukup baik

cm_log
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction   No  Yes
##        No  9963  203
##        Yes 2118  216
##                                           
##                Accuracy : 0.8143          
##                  95% CI : (0.8074, 0.8211)
##     No Information Rate : 0.9665          
##     P-Value [Acc > NIR] : 1               
##                                           
##                   Kappa : 0.1061          
##                                           
##  Mcnemar's Test P-Value : <2e-16          
##                                           
##             Sensitivity : 0.51551         
##             Specificity : 0.82468         
##          Pos Pred Value : 0.09254         
##          Neg Pred Value : 0.98003         
##              Prevalence : 0.03352         
##          Detection Rate : 0.01728         
##    Detection Prevalence : 0.18672         
##       Balanced Accuracy : 0.67010         
##                                           
##        'Positive' Class : Yes             
## 
roclog = roc(test$Y, p_predlog[,"Yes"])
## Setting levels: control = No, case = Yes
## Setting direction: controls < cases
ggroc(roclog,linetype = "dashed", size = 1,color="blue4")+
   geom_segment(aes(x = 1, xend = 0, y = 0, yend = 1), color="darkgrey", linetype="dashed")

roclog$auc
## Area under the curve: 0.7386

angka AUC pada model Regresi Logistik dengan menggunakan kurva ROC-nya adalah 0.7386.

Pohon Klasifikasi

Adalah model klasifikasi yang dibentuk menyerupai sebuah pohon dengan tiga bagaian yaitu :

  • Root (akar) yang merupakan bagian start dari klasifikasi

  • Internal node adalah bagian yang memiliki 1 bagian input daja dan memiliki setidaknya 2 cabang

  • Leaf (terminal) merupakan bagian akhir klasifikasi yang juga merupakan suatu angka akhir dari prediksi klasifikasi.

set.seed(012)

tree <- train(Y ~ ., # Variable Y 
   data = train,  # nama data
   method = "rpart", #Metode decision tree dengan  rpart
   tuneLength = 10, #Pemilihan tune da[at dilaukan dengan ditentukan sendiri
   metric = "ROC",
   trControl = control) # Cross validation dengan hasil yang diambil adallah hasil final/terbaik 

print(tree)
## CART 
## 
## 37500 samples
##    11 predictor
##     2 classes: 'No', 'Yes' 
## 
## No pre-processing
## Resampling: Cross-Validated (5 fold) 
## Summary of sample sizes: 30000, 30001, 30000, 30000, 29999 
## Resampling results across tuning parameters:
## 
##   cp           ROC        Sens       Spec     
##   0.001142531  0.6384744  0.9724572  0.1379558
##   0.001213939  0.6384644  0.9739654  0.1333845
##   0.001285347  0.6386312  0.9738341  0.1329551
##   0.001428163  0.6394424  0.9726535  0.1369551
##   0.001713796  0.6393075  0.9761948  0.1283897
##   0.001749500  0.6384518  0.9770146  0.1252491
##   0.002856327  0.6375517  0.9783262  0.1172542
##   0.003141959  0.6360755  0.9797691  0.1113927
##   0.003284776  0.6360755  0.9797691  0.1113927
##   0.007283633  0.5824688  0.9872445  0.0665543
## 
## ROC was used to select the optimal model using the largest value.
## The final value used for the model was cp = 0.001428163.
rpart.plot(tree$finalModel, tweak = 1.6) # melihat bentuk pohon klasifikasi dengan besar setiap node adalah 1.6

predtree = predict(tree, test) # angka prediksi
p_predtree = predict(tree,test,type="prob") 
actualtree = factor(test$Y) 

cm_tree <- confusionMatrix(actualtree, predtree, positive = "Yes") 
cm_tree
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction   No  Yes
##        No  9866  300
##        Yes 1982  352
##                                           
##                Accuracy : 0.8174          
##                  95% CI : (0.8106, 0.8242)
##     No Information Rate : 0.9478          
##     P-Value [Acc > NIR] : 1               
##                                           
##                   Kappa : 0.1679          
##                                           
##  Mcnemar's Test P-Value : <2e-16          
##                                           
##             Sensitivity : 0.53988         
##             Specificity : 0.83271         
##          Pos Pred Value : 0.15081         
##          Neg Pred Value : 0.97049         
##              Prevalence : 0.05216         
##          Detection Rate : 0.02816         
##    Detection Prevalence : 0.18672         
##       Balanced Accuracy : 0.68630         
##                                           
##        'Positive' Class : Yes             
## 

Berdasarkan output confusion matrix pada model pohon klasifikasi diatas dapat dilihat bahwa ada sebanyak 352 pelanggan yang diprediksi tepat memiliki potensial untuk diajak menggunakan channel perbankan, 9866 yang diprediksi tidak memiliki potensial. Namun, masih terdapat banyak kesalahan dalam prediksi, masih ada sebanyak 1982 yang diprediksi tidak berpotensi yang seharusnya berpotensi, dan ada sebanyak 300 yang diprediksi berpotensi yang seharusnya tidak berpotensi. Jika dilihat berdasarkan akurasinya tenyata model decision tree memiliki akurasi yaitu 81.74%.

roctree = roc(test$Y, p_predtree[,"Yes"])
## Setting levels: control = No, case = Yes
## Setting direction: controls < cases
ggroc(roctree,linetype = "dashed", size = 1,color="blue4")+
   geom_segment(aes(x = 1, xend = 0, y = 0, yend = 1), color="darkgrey", linetype="dashed")

roctree$auc
## Area under the curve: 0.6422

angka AUC pada model Pohon Klasifikasi dengan menggunakan kurva ROC-nya adalah 0.6422 angka ini lebih kecil dari model Regresi Logistik.

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.

set.seed(012)

forest <- train(Y ~ ., 
   data = train, 
   method = "ranger",
   metric = "ROC",
   importance = 'permutation',
   trControl = control)
## Growing trees.. Progress: 93%. Estimated remaining time: 2 seconds.
## Growing trees.. Progress: 82%. Estimated remaining time: 6 seconds.
## Growing trees.. Progress: 89%. Estimated remaining time: 3 seconds.
## Growing trees.. Progress: 89%. Estimated remaining time: 3 seconds.
## Growing trees.. Progress: 91%. Estimated remaining time: 2 seconds.
predforest = predict(forest, test, type = "raw")
p_predforest = predict(forest,test,type="prob")
actualforest = factor(test$Y)

cm_forest <- confusionMatrix(actualforest, predforest, positive = "Yes")
cm_forest
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction   No  Yes
##        No  9977  189
##        Yes 2072  262
##                                           
##                Accuracy : 0.8191          
##                  95% CI : (0.8123, 0.8258)
##     No Information Rate : 0.9639          
##     P-Value [Acc > NIR] : 1               
##                                           
##                   Kappa : 0.1359          
##                                           
##  Mcnemar's Test P-Value : <2e-16          
##                                           
##             Sensitivity : 0.58093         
##             Specificity : 0.82804         
##          Pos Pred Value : 0.11225         
##          Neg Pred Value : 0.98141         
##              Prevalence : 0.03608         
##          Detection Rate : 0.02096         
##    Detection Prevalence : 0.18672         
##       Balanced Accuracy : 0.70448         
##                                           
##        'Positive' Class : Yes             
## 

Berdasarkan output confusion matrix pada model pohon klasifikasi dapat dilihat bahwa ada sebanyak 262 pelanggan yang diprediksi tepat memiliki potensial untuk diajak menggunakan channel perbankan, 9977 yang diprediksi tidak memiliki potensial. Namun, masih terdapat banyak kesalahan dalam prediksi, masih ada sebanyak 2072 yang diprediksi tidak berpotensi yang seharusnya berpotensi, dan ada sebanyak 189 yang diprediksi berpotensi yang seharusnya tidak berpotensi. Jika dilihat berdasarkan akurasinya tenyata model decision tree memiliki akurasi yaitu 81.91%

rocforest = roc(test$Y, p_predforest[,"Yes"])
## Setting levels: control = No, case = Yes
## Setting direction: controls < cases
ggroc(rocforest,linetype = "dashed", size = 1,color="blue4")+
   geom_segment(aes(x = 1, xend = 0, y = 0, yend = 1), color="darkgrey", linetype="dashed")

rocforest$auc
## Area under the curve: 0.7578

angka AUC pada model Pohon Klasifikasi dengan menggunakan kurva ROC-nya adalah 0.7578 nilia ini lebih baik dibandingkan dengan Model Regresi Logistik dan Pohon Klasifikasi.

vip(forest,aesthetics = list(fill = "blue4")) + 
   ggtitle("Random Forest") +
   theme_minimal()

Dari hasil output diatas terlihat bahwa urutan variabel/faktor importance berutuan dimulai dari yang paling berpengaruh adalah X9 yaitu rata-rata penghasilan dari transaksi pemakaian data per-bulan (Rp) dan X2 rata-rata penghasilan dari transaksi panggilan perbulan (Rp) Sedangkan variable yang paling sedikit mempengaruhi adalah X11: rata-rata banyaknya wilayah yang dikunjungi per bulan. Variable yang berpengaruh diskalakan dengan angka maksimum 100.

Bagging

Bagging merupakan salah satu model ensemble yang sederhana namun dapat meningkatkan hasil prediksi (Liang & Zhang, 2011). Model ini bekerja dengan mengurangi variansi atau noise pada prediksi dan sangat baik digunakan pada data yang tidak stabil.

set.seed(012)
treebag <- train( Y ~ ., 
   data = train, 
   method = "treebag",
   trControl = control,
   metric = "ROC")

predtreebag = predict(treebag, test, type = "raw")
p_predtreebag = predict(treebag,test,type="prob")
actualtreebag = factor(test$Y)

cm_treebag <- confusionMatrix(actualtreebag, predtreebag, positive = "Yes")
cm_treebag
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction   No  Yes
##        No  9619  547
##        Yes 1826  508
##                                          
##                Accuracy : 0.8102         
##                  95% CI : (0.8032, 0.817)
##     No Information Rate : 0.9156         
##     P-Value [Acc > NIR] : 1              
##                                          
##                   Kappa : 0.2077         
##                                          
##  Mcnemar's Test P-Value : <2e-16         
##                                          
##             Sensitivity : 0.48152        
##             Specificity : 0.84045        
##          Pos Pred Value : 0.21765        
##          Neg Pred Value : 0.94619        
##              Prevalence : 0.08440        
##          Detection Rate : 0.04064        
##    Detection Prevalence : 0.18672        
##       Balanced Accuracy : 0.66099        
##                                          
##        'Positive' Class : Yes            
## 

Berdasarkan output confusion matrix pada model pohon klasifikasi dapat dilihat bahwa ada sebanyak 547 pelanggan yang diprediksi tepat memiliki potensial untuk diajak menggunakan channel perbankan, 9619 yang diprediksi tidak memiliki potensial. Namun, masih terdapat banyak kesalahan dalam prediksi, masih ada sebanyak 1826 yang diprediksi tidak berpotensi yang seharusnya berpotensi, dan ada sebanyak 508 yang diprediksi berpotensi yang seharusnya tidak berpotensi. Jika dilihat berdasarkan akurasinya tenyata model decision tree memiliki akurasi yaitu 81.02%

roctreebag = roc(test$Y, p_predtreebag[,"Yes"])
## Setting levels: control = No, case = Yes
## Setting direction: controls < cases
ggroc(roctreebag,linetype = "dashed", size = 1,color="blue4")+
   geom_segment(aes(x = 1, xend = 0, y = 0, yend = 1), color="darkgrey", linetype="dashed")

roctreebag$auc
## Area under the curve: 0.7245

Niai AUC pada model bagging adalah 0.7245 jika dibandingkan dengan model sebelumnya model bagging memiliki angka AUC dibawah model Regresi Logistik dan Random Forest.

AdaBoost

Adative Boosting atau Adaboost adalah model suatu model kombinasi,berjalan secara berhubungan pada setiap tahapnya (sequancing). Model awal merupakan suatu model tree yang didefinisikan sebanyak n model.Kemudian kesalahan dalam klasifikasi akan dikirim ke proses kedua dan berulang sebanyak N hingga kondisi tertentu didapatkan. Adaboost hanya memiliki 1 root (akar) dan 2 leaf (terminal) yang disebut dengan stump.

set.seed(012)
adaboost <- train( Y ~ ., 
   data = train, 
   method = "AdaBoost.M1",
   trControl = control,
   metric = "ROC")

predadaboost = predict(adaboost, test, type = "raw")
p_predadaboost = predict(adaboost,test,type="prob")
actualadaboost = factor(test$Y)

cm_adaboost <- confusionMatrix(actualadaboost, predadaboost, positive = "Yes")
cm_adaboost
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction   No  Yes
##        No  9805  361
##        Yes 1897  437
##                                           
##                Accuracy : 0.8194          
##                  95% CI : (0.8125, 0.8261)
##     No Information Rate : 0.9362          
##     P-Value [Acc > NIR] : 1               
##                                           
##                   Kappa : 0.2032          
##                                           
##  Mcnemar's Test P-Value : <2e-16          
##                                           
##             Sensitivity : 0.54762         
##             Specificity : 0.83789         
##          Pos Pred Value : 0.18723         
##          Neg Pred Value : 0.96449         
##              Prevalence : 0.06384         
##          Detection Rate : 0.03496         
##    Detection Prevalence : 0.18672         
##       Balanced Accuracy : 0.69276         
##                                           
##        'Positive' Class : Yes             
## 

Pada model adaboost didapatkan angka akurasi sebaesar 81.94% angka akurasi yang didapatkan hampir sama dengan metode random forest yaitu 81.91%. Pelanggan operator telekomunikasi seluler yang potensial untuk bergabung dalam channel perbankan.yang diprediksikan secara benar sebanyak 437 dan diprediksi salah 361. Sedangkan pelanggan yang tidak berpotensi yang di prediksi secara benar sebanyak 9805 orang dan yang salah sebanyak 1897.

rocadaboost = roc(test$Y, p_predadaboost[,"Yes"])
## Setting levels: control = No, case = Yes
## Setting direction: controls < cases
ggroc(rocadaboost,linetype = "dashed", size = 1,color="blue4")+
   geom_segment(aes(x = 1, xend = 0, y = 0, yend = 1), color="darkgrey", linetype="dashed")

rocadaboost$auc
## Area under the curve: 0.753

AUC pada model Adaboost adalah 0.753 dimana angka ini lebih baik dibandigkan Regresi Logistik, Pohon Regresi dan Bagging. Tapi, angka AUC adaboost tidak terlalu jauh berbeda dari model Random Forest dengan selisih 0.0049.

Perbandingan Model

ggroc(list(Logistic = roclog,Decision_Tree = roctree,
          Random_Forest = rocforest,
          Bagging = roctreebag,
          Adabost = rocadaboost ),linetype = "dashed", size = 1)+
   geom_segment(aes(x = 1, xend = 0, y = 0, yend = 1), color="darkgrey", linetype="dashed")

Semakin baik prediksi dari suatu model ditandai dengan semakin besar angka AUC Area Under Curva dari kurva ROC-nya. Jika dilihat hanya menggunakan kurva ROC daerah paling lebar atau garis teratas yaitu model Random forest yang juga terlihat berhimpitan dengan Adaboost yang menandakan bahwa model pengklasifikasian memiliki nilai ROC yang hampir mirip . Sedangkan model yang kurang baik dibandingkan 4 model lainya adalah model Pohon klasifikasi (Decision tree).

results <- resamples(list(RegresiLogistik =log ,PohonRegresi = tree, RandomForest= forest,Bagging = treebag, AdaativeBoost = adaboost))

bwplot(results)

Berdasarkan boxplot diatas dapat juga dilihat bahwa ROC adaboost dan Random Forest sangat berdekatan dengan seisih yang sangat kecil dan hampir sama.

auclog <- auc(roclog)
auctree <- auc(roctree)
aucforest <- auc(rocforest)
auctreebag <- auc(roctreebag)
aucadaboost <- auc(rocadaboost)

compa <- data.frame(Metode = c("Regresi Logistik","Pohon Regresi","Random Forest","Bagging","Adaative Boost"), 
                  AUC = c(auclog,auctree,aucforest,auctreebag,aucadaboost),
                  ACC = c(cm_log$overall[1],cm_tree$overall[1],
                          cm_forest$overall[1],cm_treebag$overall[1],cm_adaboost$overall[1]))
datatable(compa)

Berdasarkan angka AUC Random forest memang memiliki angka yang lebih tingi dibandingkan Adative Boosting namun selisihnya hanya sedikit, begitu juga dengan angka akurasi antara dua model tersebut. Disini diambilah ukuran Akurasi sebagai nilai keputusan maka model yang lebih baik adalah model Adaboost dengan akurasi 81.94%

Kesimpulan

Hasil dari model yang dibentuk untuk memprediksi pelanggan operator telekomunikasi seluler yang potensial untuk bergabung dalam channel perbankan diperoleh model Adative Boosting dengan akurasi 81.94% merupakan model terbaik meskipun sebenaranya model Random forest juga memiliki akurasi yang hampir sama.

Pada model Random Forest memiliki kelebihan dalam penyajian feature importance dimana secara berurutan variabel importancenya adalah :

  • X9 : rata-rata penghasilan dari transaksi pemakaian data per-bulan (Rp)

  • X2 : rata-rata penghasilan dari transaksi panggilan perbulan (Rp)

  • X5 : persentase panggilan sesama operator

  • X8 : rata-rata pemakaian data per bulan (MB)

  • X10: rata-rata frekuensi melakukan recharge pulsa per bulan

  • X3 : rata-rata frekuensi melakukan panggilan per bulan

  • X1 : rata-rata durasi melakukan panggilan per bulan (menit)

  • X7 : persentase transaksi SMS sesama operator

  • X4 : persentase panggilan di jam kerja

  • X11: rata-rata banyaknya wilayah yang dikunjungi per bulan

Namun dua model yang memiliki akurasi yang baik diatas masih perlu dipertimbangkan metode evaluasi terhadap modelnya. Dikarenakan kesalahan dalam pengklasifikasian data yang yang sebenarnya tidak berpotensi diklasifikasikan sebagai pelanggan berpotensi masih sangat cukup besar hal ini terjadi karena data yang tidak setimbang.