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)
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/
Mahasiswa Prodi Statistika dan Sains Data, Bogor University. NIM: G1501211061. Email: nur.andi@apps.ipb.ac.id↩︎
Mahasiswa Prodi Statistika dan Sains Data, Bogor University. NIM: G1501211007. Email: nashir_fakhrudina@apps.ipb.ac.id↩︎
Mahasiswa Prodi Statistika dan Sains Data, Bogor University. NIM: G14180064. Email: nabila_ghoni@apps.ipb.ac.id↩︎