Dataset ini diperoleh dari suatu bank di Amerika Serikat. Selain layanan biasa, bank ini juga menyediakan layanan asuransi mobil. Bank menyelenggarakan kampanye reguler untuk menarik klien baru. Saat ini, bank memiliki sekumpulan data nasabah dan karyawan bank memanggil mereka untuk memasarkan opsi asuransi mobil yang tersedia. Pada data ini disediakan informasi umum mengenai klien (usia, pekerjaan, dll) serta informasi yang lebih spesifik tentang bagaimana cara mengiklankan produk asuransi saat ini dan bagaimana mengiklankan produk asuransi sebelumnya. Data ini terdiri dari 4.000 nasabah yang dihubungi selama promosi penjualan terakhir dan keputusan nasabah setelah mendengarkan iklan.Dengan informasi ini, selanjutnya akan dilakukan prediksi untuk sejumlah nasabah yang dihubungi selama kampanye saat ini, apakah mereka memutuskan untuk membeli asuransi mobil atau tidak.
sumber: Car Insurance Cold Calls - Kaggle.
library(shiny)
## Warning: package 'shiny' was built under R version 3.5.1
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 3.5.1
library(ggcorrplot)
## Warning: package 'ggcorrplot' was built under R version 3.5.1
library(caret)
## Warning: package 'caret' was built under R version 3.5.1
## Loading required package: lattice
## Warning: package 'lattice' was built under R version 3.5.1
library(e1071)
## Warning: package 'e1071' was built under R version 3.5.1
library(AUC)
## AUC 0.3.0
## Type AUCNews() to see the change log and ?AUC to get an overview.
##
## Attaching package: 'AUC'
## The following objects are masked from 'package:caret':
##
## sensitivity, specificity
raw.data <- read.csv("D:/car_insurance.csv")
summary(raw.data)
## Id Age Job Marital
## Min. : 1 Min. :18.00 management :893 divorced: 483
## 1st Qu.:1001 1st Qu.:32.00 blue-collar:759 married :2304
## Median :2000 Median :39.00 technician :660 single :1213
## Mean :2000 Mean :41.21 admin. :459
## 3rd Qu.:3000 3rd Qu.:49.00 services :330
## Max. :4000 Max. :95.00 (Other) :880
## NA's : 19
## Education Default Balance HHInsurance
## primary : 561 Min. :0.0000 Min. :-3058.0 Min. :0.0000
## secondary:1988 1st Qu.:0.0000 1st Qu.: 111.0 1st Qu.:0.0000
## tertiary :1282 Median :0.0000 Median : 551.5 Median :0.0000
## NA's : 169 Mean :0.0145 Mean : 1532.9 Mean :0.4928
## 3rd Qu.:0.0000 3rd Qu.: 1619.0 3rd Qu.:1.0000
## Max. :1.0000 Max. :98417.0 Max. :1.0000
##
## CarLoan Communication LastContactDay LastContactMonth
## Min. :0.000 cellular :2831 Min. : 1.00 may :1049
## 1st Qu.:0.000 telephone: 267 1st Qu.: 8.00 jul : 573
## Median :0.000 NA's : 902 Median :16.00 aug : 536
## Mean :0.133 Mean :15.72 jun : 454
## 3rd Qu.:0.000 3rd Qu.:22.00 nov : 347
## Max. :1.000 Max. :31.00 apr : 306
## (Other): 735
## NoOfContacts DaysPassed PrevAttempts Outcome
## Min. : 1.000 Min. : -1.00 Min. : 0.0000 failure: 437
## 1st Qu.: 1.000 1st Qu.: -1.00 1st Qu.: 0.0000 other : 195
## Median : 2.000 Median : -1.00 Median : 0.0000 success: 326
## Mean : 2.607 Mean : 48.71 Mean : 0.7175 NA's :3042
## 3rd Qu.: 3.000 3rd Qu.: -1.00 3rd Qu.: 0.0000
## Max. :43.000 Max. :854.00 Max. :58.0000
##
## CallStart CallEnd CarInsurance
## 10:42:44: 3 10:22:30: 3 Min. :0.000
## 11:48:25: 3 10:52:24: 3 1st Qu.:0.000
## 13:54:34: 3 11:27:46: 3 Median :0.000
## 15:27:56: 3 09:04:02: 2 Mean :0.401
## 15:48:27: 3 09:06:42: 2 3rd Qu.:1.000
## 17:02:39: 3 09:12:47: 2 Max. :1.000
## (Other) :3982 (Other) :3985
#Recoding CarInsurance
raw.data$CarInsurance <- ifelse(raw.data$CarInsurance == 1, "Yes", ifelse(raw.data$CarInsurance == 0, "No", 99))
raw.data$CarInsurance <- as.factor(raw.data$CarInsurance)
#Imputasi Job
freq1<-names(which.max(table(raw.data$Job)))
raw.data$Job[is.na(raw.data$Job)] <- freq1
#Imputasi Education
freq2<-names(which.max(table(raw.data$Education)))
raw.data$Education[is.na(raw.data$Education)] <- freq2
#Imputasi Communication
freq3<-names(which.max(table(raw.data$Communication)))
raw.data$Communication[is.na(raw.data$Communication)] <- freq3
data <- raw.data[,-16]
require(caTools)
## Loading required package: caTools
## Warning: package 'caTools' was built under R version 3.5.1
set.seed(123) # set seed to ensure you always have same random numbers generated
sample <- sample.split(data,SplitRatio = 0.80) # splits the data in the ratio mentioned in SplitRatio. After splitting marks these rows as logical TRUE and the the remaining are marked as logical FALSE
car.train <- subset(data,sample ==TRUE) # creates a training dataset named train1 with rows which are marked as TRUE
car.test <- subset(data, sample==FALSE)
attach(data)
count.CarInsurance <- length(which(CarInsurance == "Yes"))
mean.Age <- mean(Age)
c.By <- names(table(Communication))[table(Communication)==max(table(Communication))]
CarInsurance = as.factor(data$CarInsurance)
MaritalStatus = as.factor(data$Marital)
EducationBackgorund = as.factor(data$Education)
JobList = as.factor(data$Job)
print(count.CarInsurance)
## [1] 1604
print(mean.Age)
## [1] 41.21475
print(c.By)
## [1] "cellular"
Rata-rata nasabah bank berusia 41 tahun. Dari 4.000 orang nasabah, 1.406 orang di antaranya menggunakan jasa asuransi mobil yang ditawarkan oleh pihak bank. Mayoritas nasabah mendapatkan penawaran jasa asuransi mobil melalui media komunikasi selular. Berikut merupakan gambaran pekerjaan utama nasabah bank.
j <- ggplot(data, aes(x = "", fill = Job)) + geom_bar(width = 1) + theme(axis.line = element_blank(), plot.title = element_text(hjust = 0.5)) + labs(x = NULL, y = NULL)
j + coord_polar(theta = "y", start = 0)
Dari output pie chart di atas, dapat diketahui bahwa mayoritas nasabah masih bekerja aktif dan sangat sedikit sekali nasabah bank yang telah pensiun. Mayoritas nasabah bekerja di bidang manajemen dan blue-collar. Sedangkan, pekerjaan yang sedikit digeluti oleh nasabah adalah di bidang entrepreneur. Berikut merupakan scatterplot yang menggambarkan sebaran pekerjaan usia dan pekerjaan nasabah.
ggplot(data, aes_string(x = Age, y = Job, col = CarInsurance, width = 3)) +
labs(y = "Job", x = "Age") +
geom_point()
Scatterplot di atas menunjukkan bahwa usia nasabah aktif berada di antara 25 hingga 60 tahun. Titik-titik biru menggambarkan status nasabah yang berlangganan jasa produk asuransi mobil. Proporsi titik-titik biru lebih banyak dari titik-titik merah ditemukan pada nasabah yang berstatus pelajar dan pensiun. Artinya, semakin sedikit pendapatan nasabah, maka ia cenderung mengasuransikan mobilnya.
ggplot(data, aes(data$Age)) + geom_density(aes(fill = CarInsurance), alpha = 0.8) + scale_fill_manual(values = c("#FFFF00", "#FF0066", "#00FF00", "#99CC00", "#FF9933")) + labs(x = "Age")
Informasi yang dapat diperoleh dari barchart di atas adalah bahwa usia nasabah hampir sama berdasarkan pengambilan keputusan untuk menggunakan produk asuransi mobil. Status CarInsurance "yes" memiliki bentuk density yang skew kanan sehingga dapat dikatakan bahwa nasabah yang mmenggunakan produk asuransi mobil di bank tersebut berasal dari golongan muda yang memiliki usia antara 25-40 tahun.
ggplot(data, mapping = aes(CarInsurance, fill = Education)) + geom_bar() + labs(x = "Car Insurance") + scale_fill_brewer(palette = "Set2")
Diagram batang di atas menunjukkan bahwa nasabah yang menggunakan produk asuransi mobil berjumlah lebih sedikit daripada yang tidak. Nasabah yang berlangganan produk asuransi mobil mayoritas memiliki latar belakang pendidikan tingkat menengah.
ggplot(data, mapping = aes(CarInsurance, fill = MaritalStatus)) + geom_bar() + labs(x = "Car Insurance")
Diagram batang di atas menunjukkan bahwa nasabah yang berlangganan produk asuransi mobil mayoritas berstatus menikah. Dari analisis secara deskriptif yang telah dilakukan, diperlukan strategi marketing yang lebih baik lagi dalam menawarkan produk asuransi mobil berdasarkan karakteristik nasabah.
Berikut ini adalah hasil prediksi keputusan nasabah setelah mendapatkan penawaran produk asuransi mobil dengan pendekatan Support Vector Machine.
model.SVM <- svm(CarInsurance~., car.train, kernel="linear")
summary(model.SVM)
##
## Call:
## svm(formula = CarInsurance ~ ., data = car.train, kernel = "linear")
##
##
## Parameters:
## SVM-Type: C-classification
## SVM-Kernel: linear
## cost: 1
## gamma: 0.0001319958
##
## Number of Support Vectors: 3020
##
## ( 1805 1215 )
##
##
## Number of Classes: 2
##
## Levels:
## No Yes
Tipe SVM (Support Vector Machine) yang digunakan adalah klasifikasi dengan kernel linear. Dengan cost = 1 dan gamma = 0,0001, nomor support vector yang dihasilkan adalah 3.020.
pc <- NULL
pc <- predict(model.SVM, car.test, type="class")
xtab <- table(pc, car.test$CarInsurance)
caret::confusionMatrix(xtab, positive="Yes")
## Confusion Matrix and Statistics
##
##
## pc No Yes
## No 442 182
## Yes 88 176
##
## Accuracy : 0.6959
## 95% CI : (0.6645, 0.7261)
## No Information Rate : 0.5968
## P-Value [Acc > NIR] : 5.743e-10
##
## Kappa : 0.3401
## Mcnemar's Test P-Value : 1.515e-08
##
## Sensitivity : 0.4916
## Specificity : 0.8340
## Pos Pred Value : 0.6667
## Neg Pred Value : 0.7083
## Prevalence : 0.4032
## Detection Rate : 0.1982
## Detection Prevalence : 0.2973
## Balanced Accuracy : 0.6628
##
## 'Positive' Class : Yes
##
Dari 888 data testing, 442 data nasabah tepat diklasifikasikan ke dalam kelompok tidak menggunakan produk asuransi mobil. Selain itu, 176 data nasabah juga tepat diklasifikasikan ke dalam kelompok yang menggunakan produk asuransi mobil. Sisanya, 270 data testing tidak terklasifikasikan secara tepat. Sehingga, tingkat akurasi classifier yang dihasilkan sebesar 69,59%. Nilai spesifisitas sebesar 83,40% menunjukkan bahwa terdapat dari 1.000 orang nasabah, 830 di antaranya benar diklasifikasikan ke dalam nasabah yang tidak menggunakan produk asuransi mobil. Sedangkan nilai sensitivitas sebesar 49,16% artinya tidak sampai setengah dari jumlah nasabah total diprediksikan secara tepat untuk menggunakan produk asuransi mobil.
pb <- NULL #nilai initial
pb <- predict(model.SVM, car.test, type="raw") #memprediksi data testing menggunakan model training dg output probabilitas
pb <- as.data.frame(pb) #menghitung nilai probabilitas
pred.SVM <- data.frame(car.test$CarInsurance, pb)
colnames(pred.SVM) <- c("target", "score")
#roc chart
labels <- as.factor(ifelse(pred.SVM$target=="Yes", 1, 0))
predictions <- pred.SVM$score
auc(roc(predictions, labels), min=0, max=1)
## [1] 0.6627912
plot(roc(predictions, labels), min=0, max=1, type="l", main="SVM - ROC Chart")
Kurva ROC di atas terbentuk dengan nilai AUC sebesar 66,28%. Maka dapat disimpulkan bahwa apabila classifier tersebut dipergunakan untuk memprediksi klasifikasi 100 nasabah, maka jumlah nasabah yang akan diklasifikasikan secara tepat sebanyak 66 orang nasabah.
Classifier yang terbentuk untuk memprediksi apakah nasabah akan menggunakan produk asuransi mobil atau tidak masih menghasilkan performansi yang kurang baik. Sehingga, untuk penelitian selanjutnya perlu dilakukan tuning parameter agar mendapatkan classifier dengan performansi yang lebih baik lagi.