Klasifikasi dengan Machine Learning
Klik disini untuk ke halaman rpubs.
Studi Kasus
Sebuah operator telekomunikasi seluler akan menjajagi kerja sama dengan sebuah bank untuk meningkatkan angka recharge pelanggan pra-bayar melalui channel perbankan (ATM, internet banking, dsb). Mereka ingin memperoleh model yang dapat digunakan untuk meprediksi pelangaan mana saja yang potensial untuk diajak menggunakan channel tersebut. Anda diberikan data berisi 50.000 pelanggan. Informasi mengenai penggunaan channel perbankan dari 50.000 pelanggan diberikan kepada Anda. Susun model machine learning terbaik berdasarkan data 50.000 pelanggan.
Packages
library(tidyverse)
library(readxl)
library(rpart)
library(rpart.plot)
library(mlr3verse)
library(mlr3extralearners)
library(ggpubr)Data
Read Data
Berikut adalah proses untuk memasukkan data dari excel ke dalam objek R.
dataTelp <- read_excel("Tugas_STA581.xlsx")Karena variabel respon yang diperlukan berupa factor maka akan dilakukan perubahan tipe data pada variabel respon Y menjadi factor. Kemudian, dilakukan juga cleaning data dengan menghilangkan variabel ID pada data.
dataTelp$Y <- as.factor(dataTelp$Y)
dataTelp <- dataTelp %>% select(-ID)Deskripsi Data
Berikut adalah keterangan pada masing-masing variabel yang terdapat dalam dataset
| Variabel | Keterangan |
|---|---|
| X1 | Rata- rata durasi melakukan panggilan per bulan (menit) |
| X2 | Rata-rata penghasilan dari transaksi panggilan per bulan (Rp) |
| X3 | Rata-rata frekuensi melakukan panggilan per bulan |
| X4 | Persentase panggilan di jam kerja |
| X5 | Persentase panggilan sesama operator |
| X6 | Rata-rata penghasilan dari transaksi SMS per bulan (Rp) |
| X7 | Persentase transaksi SMS sesama operator |
| X8 | Rata- rata pemakaian data per bulan (MB) |
| X9 | Rata-rata penghasilan dari transaksi pemakaian data per bulan (Rp) |
| X10 | Rata- rata frekuensi melakukan recharfe pulsa per bulan |
| X11 | Rata-rata banyaknya wilayah yang dikunjungi per bulan |
Eksplorasi Data
Summary Data
Untuk melihat ringkasan dari data maka digunakan fungsi summary
summary(dataTelp) X1 X2 X3 X4
Min. : 0.0 Min. : 0 Min. : 0.00 Min. :0.0000
1st Qu.: 14.0 1st Qu.: 10621 1st Qu.: 10.00 1st Qu.:0.6975
Median : 47.0 Median : 22092 Median : 24.00 Median :0.7498
Mean : 110.7 Mean : 27908 Mean : 40.23 Mean :0.7342
3rd Qu.: 131.0 3rd Qu.: 36629 3rd Qu.: 50.00 3rd Qu.:0.8011
Max. :4130.0 Max. :638172 Max. :1007.00 Max. :1.0000
X5 X6 X7 X8
Min. :0.0000 Min. : 0 Min. :0.0000 Min. : 0.0
1st Qu.:0.8534 1st Qu.: 1422 1st Qu.:0.6400 1st Qu.: 0.0
Median :0.9703 Median : 3975 Median :0.8626 Median : 0.0
Mean :0.8824 Mean : 6746 Mean :0.7718 Mean : 666.8
3rd Qu.:0.9972 3rd Qu.: 9261 3rd Qu.:0.9816 3rd Qu.: 622.0
Max. :1.0000 Max. :244444 Max. :1.0000 Max. :31275.0
X9 X10 X11 Y
Min. : 0 Min. : 0.000 Min. : 0.000 0:40664
1st Qu.: 0 1st Qu.: 3.300 1st Qu.: 2.000 1: 9336
Median : 2514 Median : 6.000 Median : 3.000
Mean : 16144 Mean : 7.129 Mean : 3.676
3rd Qu.: 24431 3rd Qu.: 9.700 3rd Qu.: 4.700
Max. :504086 Max. :30.700 Max. :35.700
Jika melihat dari summary data tersebut, terlihat bahwa respon Y dengan klasifikasi 0 cenderung lebih banyak dari klasifikasi 1, yaitu sekitar 81.328%.
Plot pada Dataset
A <- ggplot(dataTelp, aes(x=X1, y= Y)) +
geom_boxplot()+
labs(x = "Rata-rata Durasi Panggilan per Bulan (menit)",
y = "Klasifikasi")
B <- ggplot(dataTelp, aes(x=X2, y= Y)) +
geom_boxplot()+
labs(x = "Rata-rata Penghasilan (Rp)",
y = "Klasifikasi")
C <- ggplot(dataTelp, aes(x=X3, y= Y)) +
geom_boxplot()+
labs(x = "Rata-rata Frekuensi Panggilan Per Bulan",
y = "Klasifikasi")
D <- ggplot(dataTelp, aes(x=X4, y= Y)) +
geom_boxplot()+
labs(x = "Persentase Panggilan di Jam Kerja",
y = "Klasifikasi")
E <- ggplot(dataTelp, aes(x=X5, y= Y)) +
geom_boxplot()+
labs(x = "Persentase Panggilan Sesama Operator",
y = "Klasifikasi")
G <- ggplot(dataTelp, aes(x=X6, y= Y)) +
geom_boxplot()+
labs(x = "Rata- rata penghasilan (Rp)",
y = "Klasifikasi")
H <- ggplot(dataTelp, aes(x=X7, y= Y)) +
geom_boxplot()+
labs(x = "Persentase Transaksi SMS",
y = "Klasifikasi")
I <- ggplot(dataTelp, aes(x=X8, y= Y)) +
geom_boxplot()+
labs(x = "Rata-rata (mb)",
y = "Klasifikasi")
J <- ggplot(dataTelp, aes(x=X9, y= Y)) +
geom_boxplot()+
labs(x = "Rata-rata (Rp)",
y = "Klasifikasi")
K <- ggplot(dataTelp, aes(x=X10, y= Y)) +
geom_boxplot()+
labs(x = "Rata-rata Frekuensi Recharge Pulsa",
y = "Klasifikasi")
L <- ggplot(dataTelp, aes(x=X11, y= Y)) +
geom_boxplot()+
labs(x = "Rata-rata Banyak Wilayah yang Dikunjungi",
y = "Klasifikasi")
ggarrange(A, B, C , D,
ncol = 2, nrow = 2)ggarrange(E, G, H , I,
ncol = 2, nrow = 2)ggarrange(J, K, L ,
ncol = 2, nrow = 2) Hasil plot memperlihatkan hubungan antara masing-masing variabel x dengan variabel y. Terlihat dari data bahwa seluruh variabel X tersebut mempunyai distribusi data yang cenderung kurang baik, seperti terdapat outlier.
Respon yang akan diukur berdasarkan data tersebut adalah berupa data kategorik untuk memprediksi pelanggan yang potensial. Terdapat beberapa model pembelajaran mesin yang dapat digunakan. Dalam penelitian ini digunakan model regresi logistik, pohon klasifikasi, random forest, Bagging, KNN.
Tahapan Pemodelan
Berikut adalah ilustrasi dari tahapan pemodelan yang dilakukan
Persiapan Data
Import Data ke Ekosistem mlr3
taskTelp = TaskClassif$new(id="telp",
backend = dataTelp,
target = "Y",
positive ="1")learner_logreg <- lrn("classif.log_reg", predict_type="prob")
learner_knn <- lrn("classif.kknn",predict_type="prob",k=10,kernel="rectangular")
learner_tree <- lrn("classif.rpart", cp = 0.001, predict_type="prob")
learner_bagging <- lrn(id="bagging clf", "classif.ranger", mtry=11, predict_type="prob", importance="impurity")
learner_rf <- lrn("classif.ranger",predict_type="prob",importance="impurity")Split Data
Split Data dapat dilakukan dengan beberapa cara. Cara yang dilakukan pada klasifikasi ini adalah holdout yang membagi data train dan data test pada rasio 0.8.
set.seed(123)
resampleTelp1 =rsmp("holdout", ratio = 0.8)
resampleTelp1$instantiate(task=taskTelp)Regresi Logistik
Regresi logistik merupakan suatu model yang dapat digunakan untuk mendeskripsikan hubungan antara peubah respon yang terdiri dari dua kategori atau lebih dengan peubah prediktor yang berskala numerik maupun berskala kategorik (Hosmer dan Lemeshow 2000). Regresi logistik terbagi atas tiga macam, 3 yaitu regresi logistik biner, regresi logistik ordinal dan regresi logistik multinomial. Dalam penelitian ini digunakan model regresi logistik biner karena variabel respon memiliki dua kategori.
Interpretasi Model
learner_logreg$train(task = taskTelp)
summary(learner_logreg$model)
Call:
stats::glm(formula = task$formula(), family = "binomial", data = task$data(),
model = FALSE)
Deviance Residuals:
Min 1Q Median 3Q Max
-3.1097 0.3286 0.4993 0.6429 4.0835
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) 1.830e+00 7.454e-02 24.550 < 2e-16 ***
X1 -5.394e-04 8.568e-05 -6.295 3.07e-10 ***
X10 1.189e-01 5.493e-03 21.646 < 2e-16 ***
X11 8.883e-02 1.033e-02 8.602 < 2e-16 ***
X2 -1.516e-05 5.617e-07 -26.980 < 2e-16 ***
X3 4.174e-05 3.472e-04 0.120 0.904
X4 -1.012e+00 9.153e-02 -11.059 < 2e-16 ***
X5 3.814e-01 7.511e-02 5.078 3.82e-07 ***
X6 -1.366e-05 1.854e-06 -7.371 1.70e-13 ***
X7 -4.482e-02 5.431e-02 -0.825 0.409
X8 -4.664e-05 1.061e-05 -4.397 1.10e-05 ***
X9 -1.794e-05 6.623e-07 -27.089 < 2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
(Dispersion parameter for binomial family taken to be 1)
Null deviance: 48143 on 49999 degrees of freedom
Residual deviance: 42882 on 49988 degrees of freedom
AIC: 42906
Number of Fisher Scoring iterations: 5
train_test_telp_log = resample(task = taskTelp,
learner = learner_logreg,
resampling = resampleTelp1,
store_models = TRUE)INFO [10:31:06.760] [mlr3] Applying learner 'classif.log_reg' on task 'telp' (iter 1/1)
Prediksi
Berikut adalah prediksi yang dilakukan dengan menggunakan model regresi logistik. Prediksi disajikan dalam bentuk tabel dan terlihat kolom truth, response, prob.1 dan prob.0. Masing-masing variabel tersebut menyatakan keadaan sebenarnya, hasil klasifikasi, dan peluang untuk masing-masing klasifikasi.
prediksi_test = as.data.table(train_test_telp_log$prediction())
head(prediksi_test) row_ids truth response prob.1 prob.0
1: 1 1 0 0.1723710 0.8276290
2: 9 0 0 0.1389085 0.8610915
3: 13 0 0 0.0185263 0.9814737
4: 15 0 0 0.1399040 0.8600960
5: 20 0 0 0.1752311 0.8247689
6: 23 1 0 0.1103992 0.8896008
Confusion Matrix
train_test_telp_log$prediction()$confusion truth
response 1 0
1 192 142
0 1722 7944
accreglog <- train_test_telp_log$aggregate(list(msr("classif.acc"),
msr("classif.specificity"),
msr("classif.sensitivity")
))
accreglog classif.acc classif.specificity classif.sensitivity
0.8136000 0.9824388 0.1003135
Dari hasil confusion matrix terlihat bahwa akurasi model ini cukup baik yaitu di atas 80 persen. Perlu diperhatikan bahwa tujuan pemodelan ini adalah untuk mencari pelanggan yang potensial, namun pada confusion matrix terlihat bahwa sebanyak 1722 data test yang merupakan pelanggan potensial justru terklasifikasikan sebagai pelanggan non potensial. Selanjutnya perlu dikaji model yang dapat memberikan hasil lebih baik dari regresi logistik.
Berikut adalah plot ROC
autoplot(train_test_telp_log, type = "roc")KNN
K - Nearest Neighbor (KNN) merupakan salah satu metode klasifikasi yang menggunakan prinsip ketetanggaan dalam memprediksi kelas data baru (Siringoringo 2018). Kelas data baru ditentukan berdasarkan kelas tetangga terdekat yang paling banyak muncul (Karno 2016), namun apabila terdapat beberapa k tetangga terdekat yang memiliki frekuensi kemunculan yang sama, maka akan dipilih satu tetangga terdekat secara acak.
set.seed(123)
train_test_telp_knn = resample(task = taskTelp,
learner = learner_knn,
resampling = resampleTelp1,
store_models = TRUE)INFO [17:27:51.634] [mlr3] Applying learner 'classif.kknn' on task 'telp' (iter 1/1)
Prediksi
prediksi_test = as.data.table(train_test_telp_knn$prediction())
head(prediksi_test) row_ids truth response prob.1 prob.0
1: 1 1 0 0.4 0.6
2: 9 0 0 0.1 0.9
3: 13 0 0 0.0 1.0
4: 15 0 0 0.0 1.0
5: 20 0 0 0.1 0.9
6: 23 1 0 0.1 0.9
Confusion Matrix
train_test_telp_knn$prediction()$confusion truth
response 1 0
1 370 390
0 1544 7696
accknn <- train_test_telp_knn$aggregate(list(msr("classif.acc"),
msr("classif.specificity"),
msr("classif.sensitivity")))
accknn classif.acc classif.specificity classif.sensitivity
0.8066000 0.9517685 0.1933124
Akurasi yang dihasilkan oleh KNN juga cukup baik yaitu di atas 80 persen tetapi lebih kecil sedikit dibandingkan dengan model sebelumnya. Namun, model ini memberikan sensitivity yang lebih baik dibandingkan model sebelumnya, artinya model ini memiliki kemampuan yang sedikit lebih baik dibandingkan model-model sebelumnya dalam memprediksi pelanggan yang potensial.
Plot ROC
autoplot(train_test_telp_knn, type = "roc")Pohon Klasifikasi
Classification and Regression Tree (CART) adalah metode klasifikasi dengan pendekatan statistik nonparametrik (Breiman 2001). CART menghasilkan pohon klasifikasi jika peubah responnya bersifat kategorik dan pohon regresi jika peubah responnya bersifat numerik. Pada penelitian ini menghasilkan pohon klasifikasi karena peubah yang digunakan dalam penelitian bersifat kategorik. Pohon klasifikasi digunakan untuk mengidentifikasi peubah apa yang dapat dijadikan sebagai pembeda antar kelas/kategori, dan memprediksi keanggotaan kelas dari suatu individu amatan berdasarkan karakteristiknya. Pembentukan pohon klasifikasi dimulai dengan melakukan penyekatan simpul utama yang memiliki beberapa kelas data menjadi simpul anak. Penyekatan ini dilakukan oleh peubah prediktor yang terpilih menjadi pemilah terbaik. Pemilah terbaik merupakan peubah prediktor yang memiliki pemilahan dengan memaksimalkan nilai penurunan keheterogenan di dalam masing-masing simpul anak relatif terhadap simpul utama. Penyekatan ini dilakukan secara berulang hingga simpul anak berisi amatan yang berasal dari satu kategori, simpul anak berisi amatan yang seluruh peubah prediktornya identik, dan kedalaman pohon sudah mencapai kedalaman maksimal (Breiman et al. 1993).
Interpretasi Model
learner_tree$train(task = taskTelp)
rpart.plot(learner_tree$model,roundint = F,type = 5,tweak = 2) Untuk dapat melihat peluang pada masing masing klasifikasi menggunakan pohon klasifikasi dapat dilakukan dengan menelusuri setiap garisnya.
set.seed(123)
train_test_telp_tree = resample(task = taskTelp,
learner = learner_tree,
resampling = resampleTelp1,
store_models = TRUE
)INFO [17:28:02.839] [mlr3] Applying learner 'classif.rpart' on task 'telp' (iter 1/1)
Hasil Prediksi
Hasil prediksi dilakukan untuk data test.
prediksi_test = as.data.table(train_test_telp_tree$prediction())
head(prediksi_test) row_ids truth response prob.1 prob.0
1: 1 1 0 0.1707665 0.8292335
2: 9 0 0 0.1338998 0.8661002
3: 13 0 0 0.1338998 0.8661002
4: 15 0 0 0.1338998 0.8661002
5: 20 0 0 0.1338998 0.8661002
6: 23 1 0 0.1338998 0.8661002
Confusion Matrix
train_test_telp_tree$prediction()$confusion truth
response 1 0
1 262 242
0 1652 7844
acctree<- train_test_telp_tree$aggregate(list(msr("classif.acc"),
msr("classif.specificity"),
msr("classif.sensitivity")
))
acctree classif.acc classif.specificity classif.sensitivity
0.8106000 0.9700717 0.1368861
Tidak jauh berbeda dengan hasil menggunakan regresi logistik, akurasi dari yang dihasilkan dari pohon klasifikasi juga di atas 80 persen. Kemudian, jika dilihat pada confusion matrix terlihat bahwa prediksi dari 1 menjadi 0 masih cenderung lebih besar dibandingkan prediksi dari 1 menjadi 1-nya sendiri. Sehingga, model ini pun masih belum dapat dikatakan baik dalam memprediksi pelanggan yang potensial.
ROC Plot
autoplot(train_test_telp_tree, type = "roc")Bagging
Bagging merupakan suatu metode yang mampu meningkatkan akurasi dari suatu prediksi data yang dikenalkan pertama kali oleh Leo Breiman pada tahun 1996, metode ini mampu mengurangi keberagaman yang berkaitan dengan prediksi. Bagging terdiri dari dua tahapan utama yaitu bootstrap yang merupakan proses pengambilan contoh dari data data contoh yang dimiliki (resampling) dan aggregating yakni proses penggabungan beberapa nilai prediksi menjadi satu nilai prediksi (Sartono et al 2010). Bagging mampu menurunkan rata-rata kesalahan prediksi dengan cara melakukan pengulangan yang bertujuan untuk membentuk beberapa kemungkinan pohon klasifikasi dengan data yang berbeda untuk kemudian dilakukan penarikan kesimpulan secara agregat.
set.seed(123)
train_test_bagging = resample(task = taskTelp,
learner = learner_bagging,
resampling = resampleTelp1,
store_models = TRUE
)INFO [17:28:04.006] [mlr3] Applying learner 'bagging clf' on task 'telp' (iter 1/1)
Growing trees.. Progress: 15%. Estimated remaining time: 2 minutes, 58 seconds.
Growing trees.. Progress: 29%. Estimated remaining time: 2 minutes, 33 seconds.
Growing trees.. Progress: 44%. Estimated remaining time: 2 minutes, 0 seconds.
Growing trees.. Progress: 58%. Estimated remaining time: 1 minute, 29 seconds.
Growing trees.. Progress: 73%. Estimated remaining time: 58 seconds.
Growing trees.. Progress: 88%. Estimated remaining time: 25 seconds.
train_test_bagging$prediction()$confusion truth
response 1 0
1 368 300
0 1546 7786
accbagging <- train_test_bagging$aggregate(list(msr("classif.acc"),
msr("classif.specificity"),
msr("classif.sensitivity")))
accbagging classif.acc classif.specificity classif.sensitivity
0.8156000 0.9616621 0.1985371
Akurasi yang dihasilkan dari bagging cenderung tidak jauh berbeda dari model-model sebelumnya yaitu di atas 80 persen, dengan sensitivity juga juga mirip dengan model-model sebelumnya.
Plot ROC
autoplot(train_test_bagging, type = "roc")Random Forest
Metode random forest adalah pengembangan dari metode CART, yaitu dengan menerapkan metode bootstrap aggregating (bagging) dan random feature selection (Breiman 2001). Metode random forest merupakan salah satu metode pohon gabungan dimana sebanyak k pohon ditumbuhkan sehingga terbentuk suatu hutan (forest), kemudian analisis dilakukan pada kumpulan pohon tersebut dengan cara menggabungkan hasil prediksi dari k pohon yang terbentuk.
Interpretasi Model
learner_rf$train(task=taskTelp)Growing trees.. Progress: 29%. Estimated remaining time: 1 minute, 14 seconds.
Growing trees.. Progress: 58%. Estimated remaining time: 45 seconds.
Growing trees.. Progress: 85%. Estimated remaining time: 16 seconds.
learner_rf$model$variable.importance X1 X10 X11 X2 X3 X4 X5 X6
934.7189 937.4487 851.2770 1484.4582 851.0634 1112.0146 1046.8367 1120.6270
X7 X8 X9
945.3693 1155.2229 1391.1196
Nilai variable importance untuk Random Forest tersebut adalah nilai Gini Impurity. Semakin besar nilainya maka akan semakin berpengaruh prediktor tersebut. Untuk memudahkan melihat variable importance tersebut, maka dapat dibuat plot
#dataframe
importance <- data.frame(Predictors = names(learner_rf$model$variable.importance),
impurity = learner_rf$model$variable.importance)
rownames(importance) <- NULL
importance <- importance %>% arrange(desc(impurity))
#grafik
ggplot(importance,
aes(x=impurity,
y=reorder(Predictors,impurity))) +
geom_col(fill = "steelblue")+
geom_text(aes(label=round(impurity,2)),hjust=1.2)Terlihat bahwa variabel yang paling berpengaruh adalah X2 yaitu rata-rata penghasilan dari transaksi panggilan per bulan (Rp) dan yang paling tidak berpengaruh adalah X3 yaitu rata-rata frekuensi melakukan panggilan per bulan.
set.seed(123)
train_test_telp_forest = resample(task = taskTelp,
learner = learner_rf,
resampling = resampleTelp1,
store_models = TRUE
)INFO [17:36:33.423] [mlr3] Applying learner 'classif.ranger' on task 'telp' (iter 1/1)
Growing trees.. Progress: 50%. Estimated remaining time: 30 seconds.
Growing trees.. Progress: 100%. Estimated remaining time: 0 seconds.
Hasil Prediksi
Hasil prediksi dilakukan untuk data test.
prediksi_test = as.data.table(train_test_telp_forest$prediction())
head(prediksi_test) row_ids truth response prob.1 prob.0
1: 1 1 0 0.24935476 0.7506452
2: 9 0 0 0.16985873 0.8301413
3: 13 0 0 0.09158968 0.9084103
4: 15 0 0 0.06309444 0.9369056
5: 20 0 0 0.09393492 0.9060651
6: 23 1 0 0.06921587 0.9307841
Confusion Matrix
train_test_telp_forest$prediction()$confusion truth
response 1 0
1 337 262
0 1577 7824
accforest <- train_test_telp_forest$aggregate(list(msr("classif.acc"),
msr("classif.specificity"),
msr("classif.sensitivity")
))
accforest classif.acc classif.specificity classif.sensitivity
0.8161000 0.9675983 0.1760711
Akurasi dari random forest juga di atas 80 persen tetapi memberikan hasil yang lebih besar sedikit dibandingkan dengan model lainnya. Namun, dapat terlihat dari confusion matrix bahwa pelanggan yang pada kenyataan berkode 1 (potensial) diprediksi menjadi 0 (tidak potensial) cenderung tinggi sehingga model ini masih dapat dikembangkan.
Plot ROC
autoplot(train_test_telp_forest$prediction(), type = "roc")Komparasi Model
Berikut akan dilakukan perbandingan dari beberapa model dengan melihat uji kebaikan berupa akurasi dan AUC.
accall<- list(regresi.logistik= accreglog,knn= accknn,pohon.klasifikasi=acctree,random.forest=accforest,bagging=accbagging)
accall$regresi.logistik
classif.acc classif.specificity classif.sensitivity
0.8136000 0.9824388 0.1003135
$knn
classif.acc classif.specificity classif.sensitivity
0.8066000 0.9517685 0.1933124
$pohon.klasifikasi
classif.acc classif.specificity classif.sensitivity
0.8106000 0.9700717 0.1368861
$random.forest
classif.acc classif.specificity classif.sensitivity
0.8161000 0.9675983 0.1760711
$bagging
classif.acc classif.specificity classif.sensitivity
0.8156000 0.9616621 0.1985371
Dari nilai akurasi di atas terlihat bahwa model random forest memiliki akurasi yang paling tinggi. Akurasi ini merupakan persentase prediksi dari model yang benar dari total prediksi yang dibuat. Nilai AUC pada random forest juga yang paling tinggi.
Namun, apabila sensitivity disini menjadi concern pembuat kebijakan, maka sensitivity juga dapat diperhatikan. Sensitivity disini adalah jumlah prediksi pelanggan potensial yang benar dibandingkan jumlah seluruh pelanggan potensial.
set.seed(123)
learner_telp <- list(learner_logreg,
learner_tree,
learner_rf,
learner_knn,
learner_bagging)set.seed(123)
design.telp <- benchmark_grid(tasks = taskTelp,
learners = learner_telp,
resamplings = resampleTelp1
)set.seed(123)
bmr = benchmark(design.telp, store_models = TRUE)INFO [19:32:16.774] [mlr3] Running benchmark with 5 resampling iterations
INFO [19:32:17.069] [mlr3] Applying learner 'classif.ranger' on task 'telp' (iter 1/1)
Growing trees.. Progress: 47%. Estimated remaining time: 35 seconds.
Growing trees.. Progress: 94%. Estimated remaining time: 4 seconds.
INFO [19:33:32.420] [mlr3] Applying learner 'classif.rpart' on task 'telp' (iter 1/1)
INFO [19:33:33.583] [mlr3] Applying learner 'bagging clf' on task 'telp' (iter 1/1)
Growing trees.. Progress: 15%. Estimated remaining time: 2 minutes, 58 seconds.
Growing trees.. Progress: 28%. Estimated remaining time: 2 minutes, 37 seconds.
Growing trees.. Progress: 42%. Estimated remaining time: 2 minutes, 6 seconds.
Growing trees.. Progress: 56%. Estimated remaining time: 1 minute, 36 seconds.
Growing trees.. Progress: 70%. Estimated remaining time: 1 minute, 7 seconds.
Growing trees.. Progress: 84%. Estimated remaining time: 34 seconds.
Growing trees.. Progress: 99%. Estimated remaining time: 2 seconds.
INFO [19:37:22.199] [mlr3] Applying learner 'classif.kknn' on task 'telp' (iter 1/1)
INFO [19:37:31.343] [mlr3] Applying learner 'classif.log_reg' on task 'telp' (iter 1/1)
INFO [19:37:31.761] [mlr3] Finished benchmark
bmr$aggregate(list(msr("classif.auc"))) nr resample_result task_id learner_id resampling_id iters
1: 1 <ResampleResult[20]> telp classif.log_reg holdout 1
2: 2 <ResampleResult[20]> telp classif.rpart holdout 1
3: 3 <ResampleResult[20]> telp classif.ranger holdout 1
4: 4 <ResampleResult[20]> telp classif.kknn holdout 1
5: 5 <ResampleResult[20]> telp bagging clf holdout 1
classif.auc
1: 0.7417796
2: 0.6454658
3: 0.7620696
4: 0.7102136
5: 0.7542452
autoplot(bmr,type = "roc")AUC (Area Under the Curve) adalah luas area di bawah curve ROC. Dengan kata lain, semakin besar luas area di bawah kurva ROC maka kemampuan prediksi yang dihasilkan oleh model semakin baik.
Dari grafik ROC di atas terlihat bahwa model Random Forest memiliki AUC terbesar sehingga dipilih model Random Forest sebagai model terbaik dalam mengklasifikasikan/memprediksi pelanggan operator telekomunikasi seluler yang potensial untuk bergabung dalam channel perbankan.
Kesimpulan
Hasil dari model yang dibentuk untuk memprediksi pelanggan operator telekomunikasi seluler yang potensial untuk bergabung dalam channel perbankan diperoleh bahwa model Random Forest adalah yang terbaik.
Model Random Forest ini menghasilkan peubah-peubah penting yang menjadikannya sebagai faktor-faktor penting dalam pengklasifikasian pelanggan suatu operator telekomunikasi seluler yang potensial untuk bergabung dalam channel perbankan.
Faktor penting tersebut secara berurutan yakni X2 rata-rata penghasilan dari transaksi panggilan per bulan (Rp), X9 rata-rata penghasilan dari transaksi pemakaian data per bulan (Rp), X8 rata-rata pemakaian data per bulan (MB), X6 rata-rata penghasilan dari transaksi SMS per bulan (Rp), X4 persentase panggilan di jam kerja, X5 persentase panggilan sesama operator, X7 persentase transaksi SMS sesama operator, X10 rata-rata frekuensi melakukan recharge pulsa per bulan, X1 rata-rata durasi melakukan panggilan per bulan (menit), X11 rata-rata banyaknya wilayah yang dikunjungi per bulan, dan X3 rata-rata frekuensi melakukan panggilan per bulan.
Saran untuk penelitian selanjutnya sebaiknya diperhatikan metode resampling yang digunakan. Jika dilihat dari confusion matrix yang dihasilkan, meskipun akurasinya besar, namun kemampuan model untuk memprediksi pelanggan yang potensial cenderung rendah. Hal ini terlihat dari kesalahan klasifikasi pelanggan yang potensial menjadi tidak potensial cukup tinggi. Model lain dapat dicoba untuk data yang cenderung imbalance seperti ini.
Referensi
Breiman L. 2001. Random Forests. Machine Learning. 45(1): 5–32.
Breiman L, Friedman JH, Olshen RA, Stone CJ. 1993. Classification and Regression Trees. New York (US): Chapman and Hill.
Dito, G.A. 2021. Neural Network dengan Keras di R. Retrieved from https://gerrydito.github.io/Neural-Network-with-Keras-in-R/
Dito, G.A. 2021. Statistical Machine Learning dengan mlr3. Retrieved from https://gerrydito.github.io/Statistical-Learning/
Dito, G.A. 2021. Tree Based Method dengan mlr3. Retrieved from https://gerrydito.github.io/Tree-Based-Methods/
Fawcett T. 2006. An Introduction to ROC Analysis. Pattern Recognition Letters. 2(1):861–874.
Hosmer DW, Lemeshow S. 2010. Applied Logistic Regression. 2nd ed. Toronto (CAN): John Wiley & Sons, Inc.
Karno. 2016. Penentuan Parameter Pada Algoritma Klasifikasi K-Nearest Neighbor Berbasis Algoritma Genetika. Seminar Nasional Teknologi Informasi (SNTI) 8 UNTAR; 2016 Oktober 29; Jakarta, Indonesia. Jakarta (ID): UNTAR. 165- 169.
Kohavi R. 1995. A Study of Cross-Validation and Bootstrap for Accuracy Estimation and Model Selection. Prosiding of the 14th International Joint Conference on Artrificial Intelligence - Volume 2: 1137–1143.
Sartono B, Syafitri UD. 2010. Metode pohon gabungan: solusi pilihan untuk mengatasi kelemahan pohon regresi dan klasifikasi tunggal. Forum Statistika dan Komputasi 15 (1): 1-7.
Sartono B. 2010. Pengenalan Algoritma Genetik Untuk Pemilihan Peubah Penjelas Dalam Model Regresi Menggunakan SAS/IML. Forum Statistika dan Komputasi 15 (2): 10-15.
Siringoringo R. 2018. Klasifikasi DAta Tidak Seimbang Menggunakan Algoritma SMOTE dan K-Nearest Neighbor. Jurnal ISD. 3(1): 44-49
Mahasiswa Pascasarjana Statistika dan Sains Data, IPB University, annisarahminur@apps.ipb.ac.id↩︎
Mahasiswa Pascasarjana Statistika dan Sains Data, IPB University, reniamelia@apps.ipb.ac.id↩︎