library(tidyverse)
library(dplyr)
library(inspectdf)
library(rsample)

Background

Telemarketing adalah salah satu cara promosi yang masih dianggap efektif selain memasang iklan di media umum. Pengertian telemarketing yaitu memasarkan atau mensosialisasikan produk atau jasa melalui telepon. Biasanya, strategi pemasaran melalui telemarketing ini dipakai oleh beberapa perusahaan besar untuk menawarkan produknya. Menurut banyak ahli pemasaran, penawaran melalui telemarketing cenderung mudah diterima, karena sifatnya memang berbicara secara personal langsung kepada konsumen.

Bank merupakan salah satu lembaga yang menggunakan metode telmarketing untuk menjual product product yang ada di bank atau untuk menawarkan jasa. Bank sebagai lembaga financing sangat memperhatikan tingkat baiknya reputasi dan branding yang dimiliki, dan salah satu hal buruk yang dilakukan telemarketing dapat mengganggu reputasi itu sendiri. Jadi perlu dicari target mana yang akan membeli atau tudak membeli produk atau jasa yang akan ditawarkan oleh bank menggunakan metode telemarketing.

Read Data

Disini kita akan read data telemarketing yang kita dapatkan dari UCI Machine Learning Repository, data tersebut terkait dengan kampanye pemasaran dari lembaga perbankan Portugis. Dan disini kita akan menyimpan dataset kedalam bank.

bank <- read.csv("data_input/bank.csv", sep=";")
head(bank)
glimpse(bank)
## Rows: 4,521
## Columns: 17
## $ age       <int> 30, 33, 35, 30, 59, 35, 36, 39, 41, 43, 39, 43, 36, 20, 3...
## $ job       <chr> "unemployed", "services", "management", "management", "bl...
## $ marital   <chr> "married", "married", "single", "married", "married", "si...
## $ education <chr> "primary", "secondary", "tertiary", "tertiary", "secondar...
## $ default   <chr> "no", "no", "no", "no", "no", "no", "no", "no", "no", "no...
## $ balance   <int> 1787, 4789, 1350, 1476, 0, 747, 307, 147, 221, -88, 9374,...
## $ housing   <chr> "no", "yes", "yes", "yes", "yes", "no", "yes", "yes", "ye...
## $ loan      <chr> "no", "yes", "no", "yes", "no", "no", "no", "no", "no", "...
## $ contact   <chr> "cellular", "cellular", "cellular", "unknown", "unknown",...
## $ day       <int> 19, 11, 16, 3, 5, 23, 14, 6, 14, 17, 20, 17, 13, 30, 29, ...
## $ month     <chr> "oct", "may", "apr", "jun", "may", "feb", "may", "may", "...
## $ duration  <int> 79, 220, 185, 199, 226, 141, 341, 151, 57, 313, 273, 113,...
## $ campaign  <int> 1, 1, 1, 4, 1, 2, 1, 2, 2, 1, 1, 2, 2, 1, 1, 2, 5, 1, 1, ...
## $ pdays     <int> -1, 339, 330, -1, -1, 176, 330, -1, -1, 147, -1, -1, -1, ...
## $ previous  <int> 0, 4, 1, 0, 0, 3, 2, 0, 0, 2, 0, 0, 0, 0, 1, 0, 0, 2, 0, ...
## $ poutcome  <chr> "unknown", "failure", "failure", "unknown", "unknown", "f...
## $ y         <chr> "no", "no", "no", "no", "no", "no", "no", "no", "no", "no...
dim(bank)
## [1] 4521   17
names(bank)
##  [1] "age"       "job"       "marital"   "education" "default"   "balance"  
##  [7] "housing"   "loan"      "contact"   "day"       "month"     "duration" 
## [13] "campaign"  "pdays"     "previous"  "poutcome"  "y"

Data Cleansing & Coertions

Pertama kita akan mengecek apakah didalam dataset yang kita miliki terdapat missing values.

colSums(is.na(bank))
##       age       job   marital education   default   balance   housing      loan 
##         0         0         0         0         0         0         0         0 
##   contact       day     month  duration  campaign     pdays  previous  poutcome 
##         0         0         0         0         0         0         0         0 
##         y 
##         0

Data bank tidak memiliki missing values, jadi kita akan langsung merubah beberapa kolom varibel ke tipe data yang seharusnya. Dan kita akan mengganti kolom target kita dari y menjadi subscribe.

str(bank)
## 'data.frame':    4521 obs. of  17 variables:
##  $ age      : int  30 33 35 30 59 35 36 39 41 43 ...
##  $ job      : chr  "unemployed" "services" "management" "management" ...
##  $ marital  : chr  "married" "married" "single" "married" ...
##  $ education: chr  "primary" "secondary" "tertiary" "tertiary" ...
##  $ default  : chr  "no" "no" "no" "no" ...
##  $ balance  : int  1787 4789 1350 1476 0 747 307 147 221 -88 ...
##  $ housing  : chr  "no" "yes" "yes" "yes" ...
##  $ loan     : chr  "no" "yes" "no" "yes" ...
##  $ contact  : chr  "cellular" "cellular" "cellular" "unknown" ...
##  $ day      : int  19 11 16 3 5 23 14 6 14 17 ...
##  $ month    : chr  "oct" "may" "apr" "jun" ...
##  $ duration : int  79 220 185 199 226 141 341 151 57 313 ...
##  $ campaign : int  1 1 1 4 1 2 1 2 2 1 ...
##  $ pdays    : int  -1 339 330 -1 -1 176 330 -1 -1 147 ...
##  $ previous : int  0 4 1 0 0 3 2 0 0 2 ...
##  $ poutcome : chr  "unknown" "failure" "failure" "unknown" ...
##  $ y        : chr  "no" "no" "no" "no" ...
bank <- bank %>% 
  mutate(job = as.factor(job)) %>% 
  mutate(marital = as.factor(marital)) %>% 
  mutate(education = as.factor(education)) %>% 
  mutate(default = as.factor(default)) %>% 
  mutate(housing = as.factor(housing)) %>%
  mutate(month = as.factor(month)) %>% 
  mutate(loan = as.factor(loan)) %>% 
  mutate(contact = as.factor(contact)) %>% 
  mutate(poutcome = as.factor(poutcome)) %>% 
  mutate(subscribe = as.factor(y)) %>% 
  select(-c(y))

Data Explanation

summary(bank)
##       age                 job          marital         education    default   
##  Min.   :19.00   management :969   divorced: 528   primary  : 678   no :4445  
##  1st Qu.:33.00   blue-collar:946   married :2797   secondary:2306   yes:  76  
##  Median :39.00   technician :768   single  :1196   tertiary :1350             
##  Mean   :41.17   admin.     :478                   unknown  : 187             
##  3rd Qu.:49.00   services   :417                                              
##  Max.   :87.00   retired    :230                                              
##                  (Other)    :713                                              
##     balance      housing     loan           contact          day       
##  Min.   :-3313   no :1962   no :3830   cellular :2896   Min.   : 1.00  
##  1st Qu.:   69   yes:2559   yes: 691   telephone: 301   1st Qu.: 9.00  
##  Median :  444                         unknown  :1324   Median :16.00  
##  Mean   : 1423                                          Mean   :15.92  
##  3rd Qu.: 1480                                          3rd Qu.:21.00  
##  Max.   :71188                                          Max.   :31.00  
##                                                                        
##      month         duration       campaign          pdays       
##  may    :1398   Min.   :   4   Min.   : 1.000   Min.   : -1.00  
##  jul    : 706   1st Qu.: 104   1st Qu.: 1.000   1st Qu.: -1.00  
##  aug    : 633   Median : 185   Median : 2.000   Median : -1.00  
##  jun    : 531   Mean   : 264   Mean   : 2.794   Mean   : 39.77  
##  nov    : 389   3rd Qu.: 329   3rd Qu.: 3.000   3rd Qu.: -1.00  
##  apr    : 293   Max.   :3025   Max.   :50.000   Max.   :871.00  
##  (Other): 571                                                   
##     previous          poutcome    subscribe 
##  Min.   : 0.0000   failure: 490   no :4000  
##  1st Qu.: 0.0000   other  : 197   yes: 521  
##  Median : 0.0000   success: 129             
##  Mean   : 0.5426   unknown:3705             
##  3rd Qu.: 0.0000                            
##  Max.   :25.0000                            
## 

Age = Umur penumpang, dapat dilihat umur costumer bank, dapat dilihat costumer paling mude yaitu umur 19 dan paling tua 87 job = Jenis pekerjaan calon costumer marital = apakah customer sudah menikah, single, atau sudah bercerai education = Tipe pekerjaan calon customer default = memiliki kredit secara default balance = jumlah balance yang ada dalam rekening customer housing = apakah costumer memiliki pinjaman rumah loan = punya pinjaman pribadi contact = Tipe komunikasi yang dilakukan oleh pihak telemerketing duration = lamanya kontak yang dilakukan oleh pihak telemarketing ke costumer campaign = Jumlah berapa kali pihak telemarketing menghubungi costumer pdays = jumlah hari dari tereakhir pihak telemerkating menghubingi costumer previous = Jumlah kontak yang yang dilakukan sebelum campaign yang sedang berjalan poutcome = Hasil dari campaign sebelumnya apakah berhasil atau tidak subscribe = apakah costumer telah berhasil berlenganan deposit berjangka

Setelah merubah variabel penting kedalam tipe data yang benar. Kita akan menampilkan beberapa variabel numeric dengan histogram untuk mendapatkan distribusinya.

numericCols <- unlist(lapply(bank, is.numeric))
show_plot(inspect_num(bank[,numericCols]))

bank %>% 
  group_by(housing, subscribe) %>% 
  summarise(freq = n())
## `summarise()` regrouping output by 'housing' (override with `.groups` argument)

Dapat dilihat orang yang belum memiliki rumah justru lebih banyak berlanganan deposit berjangka

bank %>%
  filter(subscribe != "no") %>% 
  group_by(job, subscribe) %>% 
  summarise(freq = n()) %>% 
  arrange(desc(freq))
bank %>%
  filter(subscribe != "no") %>% 
  group_by(campaign, subscribe) %>% 
  summarise(freq = n()) %>% 
  arrange(desc(freq))

Conclusion

Didalam data ini orang orang yang memilki pinjaman rumah lebih tertarik untuk berlanganan kedalam produk yang ditawarkan oleh bank, dan dapat dilihat semakin dikit semakin banyak jumlah kontak yang dilakukan selama kampanya semakin dikit orang yang berlanganan berarti alangkah lebih baik jika pihak telemarketing tidak terlalu banyak melakukan kontak kepada satu client yang sama karena jika dapat meyakinkan client dalam satu kali kontak bank juga akan mendapatkan reputasi yang baik. Dapat kita lihat juga category pekerjaan management memiliki jumlah berlanganan atau subscribe-yes paling banyak dibandingkan tipe pekerjaan yang lain