The SMS dataset is collected by team Algoritma for educational purposes. It is a real SMS dataset with a spam/ham label for each message. SMS: “I didn’t get your message!” Someone might contact you through old-school way of SMS and you might even skip it because the amount of the spams in your inbox is just way too much. The SMS is classified as spam is collected through user’s report for unwanted SMS. Can we build a spam classifier? The problem above urge you to classify whether a text message would be a SPAM or HAM based on the content.

Library

library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(tidyverse)
## -- Attaching packages --------------------------------------- tidyverse 1.3.1 --
## v ggplot2 3.3.5     v purrr   0.3.4
## v tibble  3.1.2     v stringr 1.4.0
## v tidyr   1.1.3     v forcats 0.5.1
## v readr   1.4.0
## -- Conflicts ------------------------------------------ tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()
library(tidytext)
library(rsample)
library(tm)
## Loading required package: NLP
## 
## Attaching package: 'NLP'
## The following object is masked from 'package:ggplot2':
## 
##     annotate
library(lubridate)
## 
## Attaching package: 'lubridate'
## The following objects are masked from 'package:base':
## 
##     date, intersect, setdiff, union
library(devtools)
## Loading required package: usethis
library(textclean)
library(katadasaR)
library(tokenizers)
library(wordcloud)
## Loading required package: RColorBrewer
library(e1071)
## 
## Attaching package: 'e1071'
## The following object is masked from 'package:rsample':
## 
##     permutations
library(caret)
## Loading required package: lattice
## 
## Attaching package: 'caret'
## The following object is masked from 'package:purrr':
## 
##     lift
library(ROCR)
library(RColorBrewer)
library(stopwords)
## 
## Attaching package: 'stopwords'
## The following object is masked from 'package:tm':
## 
##     stopwords
library(lime)
## 
## Attaching package: 'lime'
## The following object is masked from 'package:dplyr':
## 
##     explain
library(htmlwidgets)

Import Data

data <- read.csv("data-train.csv", stringsAsFactors = T)
head(data)
##               datetime
## 1 2017-02-15T14:48:00Z
## 2 2017-02-15T15:24:00Z
## 3 2017-02-15T16:07:00Z
## 4 2017-02-15T16:59:00Z
## 5 2017-02-15T18:05:00Z
## 6 2017-02-15T18:05:00Z
##                                                                                                                                                                                                                                         text
## 1                                                                                                                                                                                                                        Telegram code 53784
## 2                                                                            Rezeki Nomplok Dompetku Pengiriman Uang! Kirim uang di Alfamart & dptkan hadiah jutaan rupiah setiap hari.Periode s.d. 28Feb17.Info: http://bit.ly/dmpurna MFI1
## 3                                                                                                                                        WhatsApp code 123-994.\n\nYou can also tap on this link to verify your phone: v.whatsapp.com/123994
## 4                                                                             Transaksi travel online pakai CIMB Clicks gratis perlindungan kecelakaan & tiket nonton di Pasarpolis.com. Ayo transaksi & nikmati manfaatnya! Info S&K 14041.
## 5 Apakah Anda mencoba mengakses akun Anda dari perangkat lain? Jika ya, mohon klik tautan ini https://api.gojek.co.id/customers/device?token=f192293e-3117-46e9-bac3-1d1473c23113 dalam 72 jam ke depan. Jika tidak, mohon abaikan pesan ini
## 6 Apakah Anda mencoba mengakses akun Anda dari perangkat lain? Jika ya, mohon klik tautan ini https://api.gojek.co.id/customers/device?token=f192293e-3117-46e9-bac3-1d1473c23113 dalam 72 jam ke depan. Jika tidak, mohon abaikan pesan ini
##   status
## 1    ham
## 2   spam
## 3    ham
## 4    ham
## 5    ham
## 6    ham
test <- read.csv("data-test.csv", stringsAsFactors = T) 
head(test)
##               datetime
## 1 2018-03-01T00:32:00Z
## 2 2018-03-01T08:57:00Z
## 3 2018-03-01T09:15:00Z
## 4 2018-03-01T16:42:00Z
## 5 2018-03-01T17:42:00Z
## 6 2018-03-01T22:04:00Z
##                                                                                                                                                             text
## 1          Km baru saja akses Apps Sehari-hari terpopuler.Nikmati akses YOUTUBE ga habis habis dgn beli pkt Unlimited HANYA di *123# atau myIM3 http://im3.do/m3
## 2 GRATIS UNLIMITED YOUTUBE+INTERNET 10GB+CHAT&SOSMED+SMS+NELPON selama 30hari.Data Rollover.PROMO 100Rb (Normal 115rb). MAU? Tekan C25 kirim SMS ke 929 sekarang
## 3                    Sisa kuota 285 MB.Beli pkt Internet TERBAIK dr IM3 ooredoo di *123# atau myIM3 http:// im3.do/m3 .Kelebihan pemakaian dikenakan tarif perKB
## 4  Ada banyak lowongan kerja baru! Ayo jgn sampai kamu ketinggalan update & tips di dunia kerja, tekan *123*543*2# . Tarif Rp2.200/3hari. Info: 08001401686 DSI7
## 5 Proses PEMBLOKIRAN kartu bagi yg blm registrasi sdg berjalan,segera registrasi kartu Anda,dapatkan bonus 250MB+250mnt+250SMS.Ketik ULANG#NIK#No.KK# SMS ke4444
## 6                                                   iRing keren cuman buat km, Via Vallen-Bojo Galak (Reff),Rp.0,1/3hr prpnjngan Rp.3190 dengan hnya bls YA lho!
##   status
## 1     NA
## 2     NA
## 3     NA
## 4     NA
## 5     NA
## 6     NA

Visualisasi

head(data$datetime)
## [1] 2017-02-15T14:48:00Z 2017-02-15T15:24:00Z 2017-02-15T16:07:00Z
## [4] 2017-02-15T16:59:00Z 2017-02-15T18:05:00Z 2017-02-15T18:05:00Z
## 1739 Levels: 2017-02-15T14:48:00Z 2017-02-15T15:24:00Z ... 2018-03-31T21:17:00Z
#jam <- hour(data$datetime)
#head(jam)

data$jam <- substr(data$datetime,12,13)
head(data$jam)
## [1] "14" "15" "16" "16" "18" "18"
visual <- data %>% 
  group_by(jam) %>% 
  count(status)
ham_vs <- visual %>% 
  filter(status=="ham") %>% 
  select(jam,n)
barplot(ham_vs$n)

spam_vs <- visual %>% 
  filter(status=="spam") %>% 
  select(jam,n)
barplot(spam_vs$n)

Data Wrangling

sms <- data %>% 
       select(label = status,
              text = text) %>% 
      mutate(label = as.factor(label))
head(sms)
##   label
## 1   ham
## 2  spam
## 3   ham
## 4   ham
## 5   ham
## 6   ham
##                                                                                                                                                                                                                                         text
## 1                                                                                                                                                                                                                        Telegram code 53784
## 2                                                                            Rezeki Nomplok Dompetku Pengiriman Uang! Kirim uang di Alfamart & dptkan hadiah jutaan rupiah setiap hari.Periode s.d. 28Feb17.Info: http://bit.ly/dmpurna MFI1
## 3                                                                                                                                        WhatsApp code 123-994.\n\nYou can also tap on this link to verify your phone: v.whatsapp.com/123994
## 4                                                                             Transaksi travel online pakai CIMB Clicks gratis perlindungan kecelakaan & tiket nonton di Pasarpolis.com. Ayo transaksi & nikmati manfaatnya! Info S&K 14041.
## 5 Apakah Anda mencoba mengakses akun Anda dari perangkat lain? Jika ya, mohon klik tautan ini https://api.gojek.co.id/customers/device?token=f192293e-3117-46e9-bac3-1d1473c23113 dalam 72 jam ke depan. Jika tidak, mohon abaikan pesan ini
## 6 Apakah Anda mencoba mengakses akun Anda dari perangkat lain? Jika ya, mohon klik tautan ini https://api.gojek.co.id/customers/device?token=f192293e-3117-46e9-bac3-1d1473c23113 dalam 72 jam ke depan. Jika tidak, mohon abaikan pesan ini

Exploratory Data Analysis (EDA)

Random & Visualisasi WordCloud Spam

sms %>% 
  filter(label == "spam") %>% 
  head(10) %>% 
  pull(text)
##  [1] Rezeki Nomplok Dompetku Pengiriman Uang! Kirim uang di Alfamart & dptkan hadiah jutaan rupiah setiap hari.Periode s.d. 28Feb17.Info: http://bit.ly/dmpurna MFI1 
##  [2] YEAY! Free Ice Tea atau Cashback up to 30% dg transaksi  di AH Resto! Hanya untuk pengguna TCASH TAP. S&K Berlaku. Info tsel.me/tappromo                        
##  [3] Voting your Offer. Disc 40%, 1 crispy chicken+1 spicy chicken+ nasi+lotteria tea Rp.26rb. Tukar SMS ini di LOTTERIA terdekat. Berlaku hari ini. SKB. Promo *606#
##  [4] Ayo bergabung dgn Freedom Postpaid! Makin rame makin seru, ajak teman & keluarga diskonnya lebih besar. Daftar di http://im3.do/uxU PAI1                        
##  [5] Nikmati kemudahan mewujudkan impian kamu dan pasangan utk masa depan yg lebih cerah. Cek Dana Bantuan Sahabat di DOMPETKU! Info: http://bit.ly/dmpdbs MFI3      
##  [6] Gratis 1 bulan Spotify Premium khusus FreedomCombo. Bisa bebas dengar musik,bikin playlist sepuasnya tanpa iklan dgn Spotify Premium. Aktifkan di *123*123# CVI1
##  [7] Masukan Username & Password ini di aplikasi Spotify. Username:085722688068 Password:1khF1SpC Mohon lgsg ganti alamat email & password di aplikasi Spotify.      
##  [8] TIPS HEMAT DATA: pakai resolusi 480p ketika menonton video online, temukan di setting layanan video yg kamu nikmati. Ini akan membuat pemakaian data lbh hemat  
##  [9] Ayam (syp/paha bwh),Nasi,Ades Rp.18.181. Add on CD Bebi Glenn Rp.22.727. Tkr SMS hari ini di CFC CIBUBUR JUNC. Selama persediaan msh ada. Promo*606#            
## [10] YEAY! Kejutan cashback & freebies dg TCASH TAP! Terus #pakeTCASH, cek HP kamu & dapatkan kejutannya. S&K berlaku. Info cek tsel.me/yeay                         
## 1615 Levels: 'GRATIS YouTube & Instagram selama 3 hari hanya di aplikasi myIM3. Download aplikasinya sekarang di http://bit.ly/myim3arn ...

kata yang mungkin sebagai penanda spam secara random : dapatkan, hadiah, free, cashback, berlaku, gratis, dll

spam_wc <- sms %>% 
  filter(label == "spam")

sms_spamwc.corpus <- VCorpus(VectorSource(spam_wc$text))
sms_spamwc.corpus
## <<VCorpus>>
## Metadata:  corpus specific: 0, document level (indexed): 0
## Content:  documents: 842
sms_spamwc.corpus <- tm_map(x = sms_spamwc.corpus, content_transformer(tolower))    # lowercase
sms_spamwc.corpus <- tm_map(x = sms_spamwc.corpus, FUN = removeNumbers)              # number
 
transformer <- content_transformer(FUN = function(x, pattern){
  gsub(x = x, 
       pattern = pattern, 
       replacement = " ") 
})

sms_spamwc.corpus <- tm_map(x = sms_spamwc.corpus, transformer, "/")                # remove object
sms_spamwc.corpus <- tm_map(x = sms_spamwc.corpus, transformer, "@")
sms_spamwc.corpus <- tm_map(x = sms_spamwc.corpus, transformer, "-")
sms_spamwc.corpus <- tm_map(x = sms_spamwc.corpus, transformer, "\\.")
sms_spamwc.corpus <- tm_map(sms_spamwc.corpus, removePunctuation)                   # punctuation
sms_spamwc.corpus <- tm_map(sms_spamwc.corpus, stripWhitespace)


dtm_spam <- TermDocumentMatrix(sms_spamwc.corpus) 
matrix_spam <- as.matrix(dtm_spam) 
words_spam <- sort(rowSums(matrix_spam),decreasing=TRUE) 
df_spam <- data.frame(word = names(words_spam),freq=words_spam)

set.seed(1234) # for reproducibility 
wordcloud(words = df_spam$word, freq = df_spam$freq, min.freq = 50,           
          max.words=200, random.order=FALSE, rot.per=0.35,            
          colors=brewer.pal(8, "Dark2"))

kata yang mungkin sebagai penanda spam secara visual wordcloud : info, pulsa, kuota, anda, sms, axisbonus dll

Random & Visualisasi WordCloud Ham

sms %>% 
  filter(label == "ham") %>% 
  tail(10) %>% 
  pull(text)
##  [1] Teat                                                                                                                                                            
##  [2] Kamu blm REG. Segera REGISTRASI ULANG.Pemblokiran mulai Senin 26Mar18.Ketik ULANG#NIK#No.KK# SMS ke 4444. Dptkn BNS 10GB+Nelp&SMS sepuasnya. Abaikan jk sdh REG 
##  [3] De, dimana ?                                                                                                                                                    
##  [4] De, dimana?                                                                                                                                                     
##  [5] Telegram code 89789                                                                                                                                             
##  [6] Telegram code 89789                                                                                                                                             
##  [7] Only for Staff! Register w/CIMBNiaga email at shop.samsung .com/id_epp/cimbniaga. Disc upto 30%+Add Disc selected items +0% upto 24mos till 31Mar18. Info 14041 
##  [8] Cashback IDR500,000 limited for first 100 cardholders + 0% upto 24 mos with Credit Card at Tory Burch boutiques Jakarta&Surabaya, till 31Mar'18. T&C. Info 14041
##  [9] PERHATIAN!\nKartu AXIS-mu sdh dlm masa peringatan!Registrasikan skrg jg agar tdk terblokir,ke *123*4444# atau telp 838.BONUS kuota 1GB slm 7hr. AAG23C          
## [10] Dimana de ?                                                                                                                                                     
## 1615 Levels: 'GRATIS YouTube & Instagram selama 3 hari hanya di aplikasi myIM3. Download aplikasinya sekarang di http://bit.ly/myim3arn ...

kata yang mungkin sebagai penanda spam secara random : code, passcode, telegram, dll

ham_wc <- sms %>% 
  filter(label == "ham")

sms_hamwc.corpus <- VCorpus(VectorSource(ham_wc$text))
sms_hamwc.corpus
## <<VCorpus>>
## Metadata:  corpus specific: 0, document level (indexed): 0
## Content:  documents: 1162
sms_hamwc.corpus <- tm_map(x = sms_hamwc.corpus, content_transformer(tolower))    # lowercase
sms_hamwc.corpus <- tm_map(x = sms_hamwc.corpus, FUN = removeNumbers)              # number
 
transformer <- content_transformer(FUN = function(x, pattern){
  gsub(x = x, 
       pattern = pattern, 
       replacement = " ") 
})

sms_hamwc.corpus <- tm_map(x = sms_hamwc.corpus, transformer, "/")                # remove object
sms_hamwc.corpus <- tm_map(x = sms_hamwc.corpus, transformer, "@")
sms_hamwc.corpus <- tm_map(x = sms_hamwc.corpus, transformer, "-")
sms_hamwc.corpus <- tm_map(x = sms_hamwc.corpus, transformer, "\\.")
sms_hamwc.corpus <- tm_map(sms_hamwc.corpus, removePunctuation)                   # punctuation
sms_hamwc.corpus <- tm_map(sms_hamwc.corpus, stripWhitespace)


dtm_ham <- TermDocumentMatrix(sms_hamwc.corpus) 
matrix_ham <- as.matrix(dtm_ham) 
words_ham <- sort(rowSums(matrix_ham),decreasing=TRUE) 
df_ham <- data.frame(word = names(words_ham),freq=words_ham)

set.seed(1234) # for reproducibility 
wordcloud(words = df_ham$word, freq = df_ham$freq, min.freq = 30,           
          max.words=200, random.order=FALSE, rot.per=0.35,            
          colors=brewer.pal(8, "Dark2"))

kata yang mungkin sebagai penanda spam secara visual wordcloud : saya, besar, sms, anda, pak dll

Model 1

Data Preprocessing

Text Cleansing

sms_model1 <- sms
sms_model1$text <- replace_emoji(as.character(sms_model1$text)) 
sms_model1$text <- replace_emoticon(sms_model1$text)

stemming <- function(x){
  paste(lapply(x,katadasar),collapse = " ")}

sms_model1$text <- lapply(tokenize_words(sms_model1$text[]), stemming)

sms.corpus_model1 <- VCorpus(VectorSource(sms_model1$text))
sms.corpus_model1
## <<VCorpus>>
## Metadata:  corpus specific: 0, document level (indexed): 0
## Content:  documents: 2004
sms.corpus_model1 <- tm_map(x = sms.corpus_model1, content_transformer(tolower))    # lowercase
sms.corpus_model1 <- tm_map(x = sms.corpus_model1, FUN = removeNumbers)              # number

transformer <- content_transformer(FUN = function(x, pattern){
  gsub(x = x, 
       pattern = pattern, 
       replacement = " ") 
})

sms.corpus_model1 <- tm_map(sms.corpus_model1, transformer, "/")                # remove object
sms.corpus_model1 <- tm_map(sms.corpus_model1, transformer, "@")
sms.corpus_model1 <- tm_map(sms.corpus_model1, transformer, "-")
sms.corpus_model1 <- tm_map(sms.corpus_model1, transformer, "\\.")
sms.corpus_model1 <- tm_map(sms.corpus_model1, removePunctuation)                   # punctuation
sms.corpus_model1 <- tm_map(sms.corpus_model1, stripWhitespace)                     # white space
sms.corpus_model1[[20]]$content
## [1] "beli extra kuota gb harga diskon cuma rprb ketik ya kirim ke sd "

Document-Term Matrix (DTM)

# ubah menjadi DTM
sms.dtm_model1 <- DocumentTermMatrix(x = sms.corpus_model1)
inspect(sms.dtm_model1)
## <<DocumentTermMatrix (documents: 2004, terms: 2524)>>
## Non-/sparse entries: 23116/5034980
## Sparsity           : 100%
## Maximal term length: 33
## Weighting          : term frequency (tf)
## Sample             :
##      Terms
## Docs  anda atau http info kamu kuota paket pulsa skeptical sms
##   193    0    0    0    0    0     0     0     0         0   0
##   197    0    0    0    0    0     0     0     0         0   1
##   225    0    0    0    0    0     0     0     0         0   0
##   29     0    1    0    0    0     0     0     0         0   0
##   378    0    0    0    0    0     0     0     0         0   0
##   409    0    0    0    0    0     0     0     0         0   0
##   410    1    0    1    2    0     0     2     2         1   7
##   5      2    0    0    0    0     0     0     0         1   0
##   6      2    0    0    0    0     0     0     0         1   0
##   955    0    0    0    0    0     0     3     3         0   0

Cross-Validation

RNGkind(sample.kind = "Rounding")
## Warning in RNGkind(sample.kind = "Rounding"): non-uniform 'Rounding' sampler
## used
set.seed(100)

index_model1 <- sample(nrow(sms.dtm_model1), nrow(sms.dtm_model1)*0.80)

sms_train_model1 <- sms.dtm_model1[index_model1,]
sms_test_model1 <- sms.dtm_model1[-index_model1,]
label_train_model1 <- sms[index_model1, 'label']
label_test_model1 <- sms[-index_model1, 'label']
prop.table(table(sms_model1$label))
## 
##       ham      spam 
## 0.5798403 0.4201597
prop.table(table(label_train_model1))
## label_train_model1
##       ham      spam 
## 0.5826575 0.4173425
prop.table(table(label_test_model1))
## label_test_model1
##       ham      spam 
## 0.5685786 0.4314214

Further Data Preprocessing

Remove Infrequent Words

dim(sms_train_model1)
## [1] 1603 2524
dim(sms_test_model1)
## [1]  401 2524
sms_freq_train_model1 <- findFreqTerms(sms_train_model1, lowfreq = 10)
length(sms_freq_train_model1)
## [1] 406
sms_freq_test_model1 <- findFreqTerms(sms_test_model1, lowfreq = 10)
length(sms_freq_test_model1)
## [1] 146
sms_train_model1 <- sms_train_model1[, sms_freq_train_model1]
inspect(sms_train_model1)
## <<DocumentTermMatrix (documents: 1603, terms: 406)>>
## Non-/sparse entries: 14290/636528
## Sparsity           : 98%
## Maximal term length: 14
## Weighting          : term frequency (tf)
## Sample             :
##       Terms
## Docs   anda atau http info kamu kuota paket pulsa skeptical sms
##   1189    1    1    0    0    0     2     1     1         0   1
##   1400    1    1    0    0    0     2     1     1         0   1
##   1504    0    0    1    1    0     1     0     0         1   0
##   1528    2    1    0    0    0     0     0     3         0   1
##   197     0    0    0    0    0     0     0     0         0   1
##   29      0    1    0    0    0     0     0     0         0   0
##   409     0    0    0    0    0     0     0     0         0   0
##   410     1    0    1    2    0     0     2     2         1   7
##   571     0    0    1    1    0     0     1     0         1   1
##   982     0    0    2    1    2     0     0     1         2   0
sms_test_model1 <- sms_test_model1[, sms_freq_test_model1]
inspect(sms_test_model1)
## <<DocumentTermMatrix (documents: 401, terms: 146)>>
## Non-/sparse entries: 2655/55891
## Sparsity           : 95%
## Maximal term length: 12
## Weighting          : term frequency (tf)
## Sample             :
##       Terms
## Docs   anda atau bonus info ini kamu kuota pulsa saya sms
##   1707    0    1     0    0   0    0     0     0    0   0
##   1713    0    1     0    0   0    0     0     0    0   0
##   172     0    0     0    0   3    1     1     0    0   0
##   1726    0    1     0    0   0    0     0     0    0   0
##   1765    0    1     0    0   0    0     0     0    0   0
##   1893    0    0     0    1   1    2     0     1    0   0
##   1931    0    1     0    1   1    1     0     2    0   0
##   1932    1    1     0    0   0    0     2     1    0   1
##   766     0    0     0    0   0    1     0     0    0   0
##   955     0    0     0    0   1    0     0     3    0   0

Bernoulli Converter

bernoulli_conv <- function(x){
  # parameter ifelse: kondisi, TRUE, FALSE
  x <- as.factor(ifelse(x > 0, 1, 0)) 
  return(x)
}
sms_train_bn_model1 <- apply(X = sms_train_model1, MARGIN = 2,FUN = bernoulli_conv)
sms_test_bn_model1 <- apply(X = sms_test_model1,MARGIN = 2, FUN = bernoulli_conv)

Model Fitting Naiave Bayes

Membuat model Naive Bayes

naive_spam_model1 <- naiveBayes(x = sms_train_bn_model1,
                         y = label_train_model1)

Model Prediction

sms_Class_naive_model1 <- predict(object = naive_spam_model1,
                          newdata = sms_test_bn_model1,
                          type = "class")
head(sms_Class_naive_model1)
## [1] ham  spam ham  spam spam ham 
## Levels: ham spam

Input To Data Set

sms_test_naive_model1 <- data[-index_model1,]
sms_test_naive_model1$prediksi <- sms_Class_naive_model1
head(sms_test_naive_model1)
##                datetime
## 7  2017-02-15T18:08:00Z
## 8  2017-02-16T10:04:00Z
## 14 2017-02-17T11:52:00Z
## 16 2017-02-18T12:23:00Z
## 18 2017-02-18T15:54:00Z
## 21 2017-02-20T07:55:00Z
##                                                                                                                                                          text
## 7       15/02/2017 18:08:02 Silakan gunakan passcode 7791 untuk Login Go Mobile CIMB Niaga. Passcode bersifat RAHASIA. Jangan memberitahukan kepada siapapun!
## 8                    YEAY! Free Ice Tea atau Cashback up to 30% dg transaksi  di AH Resto! Hanya untuk pengguna TCASH TAP. S&K Berlaku. Info tsel.me/tappromo
## 14 Masukan Username & Password ini di aplikasi Spotify. Username:085722688068 Password:1khF1SpC Mohon lgsg ganti alamat email & password di aplikasi Spotify.
## 16       Ayam (syp/paha bwh),Nasi,Ades Rp.18.181. Add on CD Bebi Glenn Rp.22.727. Tkr SMS hari ini di CFC CIBUBUR JUNC. Selama persediaan msh ada. Promo*606#
## 18           PT.Pertamina Bina Medika Menerima Karyawan Baru 2017 Dengan Berbagai Jurusan L/P, Info Lengkap Kunjungi : http://www.recruitment-pertamedika.com
## 21                                                                                                                                    Posisinya di mana ya bu
##    status jam prediksi
## 7     ham  18      ham
## 8    spam  10     spam
## 14   spam  11      ham
## 16   spam  12     spam
## 18    ham  15     spam
## 21    ham  07      ham

Wrong Prediction

sms_test_naive_model1 %>% 
  filter(status != prediksi)
##                datetime
## 1  2017-02-17T11:52:00Z
## 2  2017-02-18T15:54:00Z
## 3  2017-02-24T13:38:00Z
## 4  2017-02-26T13:14:00Z
## 5  2017-03-15T07:04:00Z
## 6  2017-03-15T07:07:00Z
## 7  2017-03-16T10:22:00Z
## 8  2017-07-13T12:48:00Z
## 9  2017-07-19T07:13:00Z
## 10 2017-07-24T16:57:00Z
## 11 2017-08-18T08:05:00Z
## 12 2017-09-10T12:41:00Z
## 13 2017-09-15T10:10:00Z
## 14 2017-09-24T13:36:00Z
## 15 2017-10-02T01:09:00Z
## 16 2017-11-01T09:29:00Z
## 17 2017-11-27T19:41:00Z
## 18 2017-12-04T14:14:00Z
## 19 2017-12-07T22:01:00Z
## 20 2017-12-16T06:22:00Z
## 21 2017-12-21T17:36:00Z
## 22 2017-12-22T10:18:00Z
## 23 2017-12-26T08:21:00Z
## 24 2017-12-27T05:45:00Z
## 25 2017-12-28T20:07:00Z
## 26 2017-12-28T21:45:00Z
## 27 2018-01-07T18:19:00Z
## 28 2018-01-19T11:18:00Z
## 29 2018-01-24T19:02:00Z
## 30 2018-02-05T14:13:00Z
## 31 2018-02-13T09:00:00Z
## 32 2018-02-17T14:45:00Z
## 33 2018-03-04T11:37:00Z
## 34 2018-03-05T10:10:00Z
## 35 2018-03-07T11:32:00Z
## 36 2018-03-11T10:40:00Z
## 37 2018-03-14T14:49:00Z
## 38 2018-03-20T14:48:00Z
##                                                                                                                                                                     text
## 1             Masukan Username & Password ini di aplikasi Spotify. Username:085722688068 Password:1khF1SpC Mohon lgsg ganti alamat email & password di aplikasi Spotify.
## 2                       PT.Pertamina Bina Medika Menerima Karyawan Baru 2017 Dengan Berbagai Jurusan L/P, Info Lengkap Kunjungi : http://www.recruitment-pertamedika.com
## 3                                                                         Bagikan rezeki-mu melalui TCASH. Hubungi *800#, pilih menu pembayaran, lalu pilih menu donasi.
## 4               Travelingnya happy, terbangnya aman, hotelnya nyaman karena dapat diskon AGODA 7% + Asuransi Gratis 25 Jt! Buruan ke sini http://bit.ly/AktifkanSekarang
## 5           oh bisa ya hari ini? boleh sih dok nanti dibilangin ke yang di rumah. Yang harus disiapin apa aja ya? Terus nanti untuk biayanya berapa dan gimana bayarnya?
## 6              bisa mba.. disiapkan kucingnya saja.. mau lngsung plng kan ? atau mau diinapkan sehari post operasi mbak ? utk operasinya 400rb.. sdh dengan injeksi anti
## 7          Langganan Spotify Premium kamu berakhir pd 2017-03-17. Pastikan pulsa kamu cukup utk trs menikmati jutaan musik tanpa iklan. Isi ulang di bit.ly/topupindosat
## 8                  Sisa kuota 2.0GB+ BONUS 4G:1.27GB,  DATA ROLLOVER 411.0MB+ Akses aplikasi 182.0MB. Beli EXTRA Kuota atau upgrade FREEDOM COMBO di*123# atau im3.do/mc
## 9             Sekarang dg DATA ROLLOVER, kuota utama kamu Gak hangus pd saat perpanjangan pkt internet yg sama atau beli pkt yg lbh besar. Cek info *123# atau im3.do/mc
## 10                                         No +6285721812244 tdk berhasil SMS kamu. Jgn sampai kamu melewatkan pesan darinya! Balas YA dgn biaya Rp 350. Info: *123*883#
## 11      Freedom M Rp 55rb/30hr berhasil dprpanjang sd 17/09/2017 08:05. Nikmati BONUS KUOTA sd 10GB dismua jaringan,APPS TANPA KUOTA,DATA ROLLOVER. Cek http://im3.do/mc
## 12                                                                     Eksplorasi alam Jambi lewat Festival Geopark Merangin, 11-14 Sept'17. Info Lengkap: bit.ly/FGMJ17
## 13                                                                                                                                                Truecaller code 794761
## 14                        MAAF, Paket EXTRA yang Kamu pilih tidak tersedia. Silakan daftar Paket EXTRA atau Paket Lainnya di *123# atau http://mycare.indosatooredoo.com
## 15                          Uber: Anda mendapatkan potongan 50% hingga Rp 5000, untuk 10 perjalanan uberMOTOR Anda. Ayo pesan Uber-mu sekarang! http://t.uber.com/nguber
## 16          Maaf, Keyword Salah. Pkt Lengkap Terbaik,DATA ROLLOVER, BONUS4G, STREAM ON, UNLIMITED Nelp&SMS dng FREEDOM COMBO. Info/beli paket,Tekan*123#  atau im3.do/mc
## 17       Khusus buat kamu pelanggan IM3Ooredoo,nikmati nonton ribuan film melalui IFLIX,TANPA BIAYA BERLANGGANAN. Download di http://im3.do/iflix & lgs nikmati filmnya!
## 18                      Sukseskan Sail Sabang 2017 tgl 25 November - 5 Desember 2017 di Pulau We, Kota Sabang. Untuk info lengkap kunjungi website: sailsabang2017.co.id
## 19                                                            Maaf, keyword yang Anda masukan salah. Untuk informasi lebih lanjut tekan *123# lalu OK/YES atau hub : 185
## 20          Selamat..! SIM CARD\nAnda terpilih menjadi\nPemenang dari\nPesta ISI ULANG\nMOBOINDOSAT\nPin JK25FGR untk info\nSlhkn kunjungi:\nwww.rejekimobo.blogspot.com
## 21                           Sisa kuota Kuota Utama: 434.2 MB, Kuota Malam 01.00-06.00: 9.8 GB. Beli EXTRA Kuota atau upgrade paket sekarang! Tekan *123# atau im3.do/mc
## 22         Plgn 085722688068, +10 KOIN PULSA mu hari ini belum diambil? Hub *858*22# utk Ambil. Sayang lho ga diambil, bisa buat tuker pulsa. Hub *858*22# & Pilih 1 OK.
## 23                                                                                                                                        UNREG Internet 2GB Rp45rb-30hr
## 24       1 hari lg prpanjangan Internet 2GB Rp45rb-30hr. Jgn lupa isi ulang pulsa utk dpt BONUS KUOTA sd 10GB di semua jaringan, DataRollover & trhindar tarif perKB. Ce
## 25                                                                                  Registrasi Prabayar Sukses. Data pelanggan sesuai identitas  Anda telah didaftarkan.
## 26                                         No +6285721812244 tdk berhasil SMS kamu. Jgn sampai kamu melewatkan pesan darinya! Balas YA dgn biaya Rp 399. Info: *123*883#
## 27 TIKETUX U/ LINTAS\nD/H MGO/CIPAGANTI\nKE SOETTA NAIK DARI CIHAMPELAS CM 150rb\ngoo.gl/maps/1jYYWYn8jAF2\nBELI TIKET DI SOETTA\nDAPAT VOUCHER 20rb\nUTK KE SOETTA LAGI
## 28      Untuk mengindari PEMBLOKIRAN, Pemerintah mewajibkan SEGERA REGISTRASI ULANG kartu Anda. Ketik: ULANG#NIK#No.KK# kirim SMS ke4444, klik: http://im3.do/registrasi
## 29                                                                                  Isi Voucher Regular 25K pd 24/01/18 19:02 dr GO-JEK SUKSES. TID:01119500004241618765
## 30                                                                                                                                                           a. Info 185
## 31                                                         awas ketinggalan iRing Aldy Maldini-Biar Aku Yang Pergi, Rp.0,1/3hr prpnjngan Rp.3190 .Lngsung bls YA aja ya!
## 32                         Nikmati akses ke FB, Path, Twitter,Whatsapp, BBM, Line,FB Msg, iFlix&Spotify gak habis habis kuotanya. Info *123# atau myIM3 http://im3.do/m3
## 33        Proses PEMBLOKIRAN kartu bagi yg blm registrasi sdg berjalan,segera registrasi kartu Anda,dapatkan bonus 250MB+250mnt+250SMS.Ketik ULANG#NIK#No.KK# SMS ke4444
## 34        Proses PEMBLOKIRAN kartu bagi yg blm registrasi sdg berjalan,segera registrasi kartu Anda,dapatkan bonus 250MB+250mnt+250SMS.Ketik ULANG#NIK#No.KK# SMS ke4444
## 35       Proses PEMBLOKIRAN bg yg blm REGISTRASI sdg berjalan. SEGERA  REGISTRASI ULANG. Dptkan BONUS 10GB+Nelpon&SMS sepuasnya u/3hr. Ketik ULANG#NIK#No.KK# SMS ke4444
## 36       Proses PEMBLOKIRAN bg yg blm REGISTRASI sdg berjalan. SEGERA  REGISTRASI ULANG. Dptkan BONUS 10GB+Nelpon&SMS sepuasnya u/3hr. Ketik ULANG#NIK#No.KK# SMS ke4444
## 37       Proses PEMBLOKIRAN bg yg blm REGISTRASI sdg berjalan. SEGERA  REGISTRASI ULANG. Dptkan BONUS 10GB+Nelpon&SMS sepuasnya u/3hr. Ketik ULANG#NIK#No.KK# SMS ke4444
## 38       Proses PEMBLOKIRAN bg yg blm REGISTRASI sdg berjalan. SEGERA  REGISTRASI ULANG. Dptkan BONUS 10GB+Nelpon&SMS sepuasnya u/3hr. Ketik ULANG#NIK#No.KK# SMS ke4444
##    status jam prediksi
## 1    spam  11      ham
## 2     ham  15     spam
## 3    spam  13      ham
## 4     ham  13     spam
## 5     ham  07     spam
## 6     ham  07     spam
## 7     ham  10     spam
## 8     ham  12     spam
## 9     ham  07     spam
## 10    ham  16     spam
## 11    ham  08     spam
## 12   spam  12      ham
## 13   spam  10      ham
## 14    ham  13     spam
## 15    ham  01     spam
## 16    ham  09     spam
## 17    ham  19     spam
## 18   spam  14      ham
## 19    ham  22     spam
## 20   spam  06      ham
## 21    ham  17     spam
## 22    ham  10     spam
## 23   spam  08      ham
## 24    ham  05     spam
## 25    ham  20     spam
## 26    ham  21     spam
## 27   spam  18      ham
## 28    ham  11     spam
## 29   spam  19      ham
## 30   spam  14      ham
## 31   spam  09      ham
## 32    ham  14     spam
## 33    ham  11     spam
## 34    ham  10     spam
## 35    ham  11     spam
## 36    ham  10     spam
## 37    ham  14     spam
## 38    ham  14     spam

Model Evaluation

Confusion Matrix

confusionMatrix(data = sms_Class_naive_model1,
                reference = label_test_model1,
                positive = "spam")
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction ham spam
##       ham  201   11
##       spam  27  162
##                                           
##                Accuracy : 0.9052          
##                  95% CI : (0.8723, 0.9321)
##     No Information Rate : 0.5686          
##     P-Value [Acc > NIR] : < 2e-16         
##                                           
##                   Kappa : 0.809           
##                                           
##  Mcnemar's Test P-Value : 0.01496         
##                                           
##             Sensitivity : 0.9364          
##             Specificity : 0.8816          
##          Pos Pred Value : 0.8571          
##          Neg Pred Value : 0.9481          
##              Prevalence : 0.4314          
##          Detection Rate : 0.4040          
##    Detection Prevalence : 0.4713          
##       Balanced Accuracy : 0.9090          
##                                           
##        'Positive' Class : spam            
## 

ROC and AUC

sms_prob_naive_model1 <- predict(naive_spam_model1, sms_test_bn_model1, type = "raw")
head(sms_prob_naive_model1)
##              ham         spam
## [1,] 1.000000000 6.877637e-14
## [2,] 0.001456285 9.985437e-01
## [3,] 0.995447258 4.552742e-03
## [4,] 0.005722635 9.942774e-01
## [5,] 0.020055614 9.799444e-01
## [6,] 0.999095309 9.046912e-04
sms_roc_naive_model1 <- data.frame(pred_prob_model1 = sms_prob_naive_model1[,'spam'],
                           actual_label = ifelse(label_test_model1 == 'spam', 1, 0))

head(sms_roc_naive_model1)
##   pred_prob_model1 actual_label
## 1     6.877637e-14            0
## 2     9.985437e-01            1
## 3     4.552742e-03            1
## 4     9.942774e-01            1
## 5     9.799444e-01            0
## 6     9.046912e-04            0
roc_naive_model1 <- prediction(predictions = sms_roc_naive_model1$pred_prob,
                            labels = sms_roc_naive_model1$actual_label)

plot(performance(roc_naive_model1, "tpr", "fpr"))
abline(0, 1, lty = 2)

auc_naive_model1 <- performance(roc_naive_model1, measure = "auc")
auc_naive_model1@y.values
## [[1]]
## [1] 0.9686771

Nilai AUC = 0.96868, sehingga dapat disimpulkan bahwa performa model Naive Bayes Spam Classifier sudah sangat baik dalam memisahkan mana yang kelas positive (spam) dengan kelas negative (ham).

Model 2

Data Preprocessing

Text Cleansing

sms_model2 <- sms
sms_model2$text <- replace_emoji(as.character(sms_model2$text))
sms_model2$text <- replace_emoticon(sms_model2$text)

sms_model2$text <- sms_model2$text %>% 
  replace_number(remove = TRUE) %>% 
  replace_url(replacement = "") %>% 
  replace_email() %>% 
  replace_html(symbol = FALSE)

stemming <- function(x){
  paste(lapply(x,katadasar),collapse = " ")}

sms_model2$text <- lapply(tokenize_words(sms_model2$text[]), stemming)

sms.corpus_model2 <- VCorpus(VectorSource(sms_model2$text))
sms.corpus_model2
## <<VCorpus>>
## Metadata:  corpus specific: 0, document level (indexed): 0
## Content:  documents: 2004
sms.corpus_model2 <- tm_map(x = sms.corpus_model2, content_transformer(tolower))    # lowercase
sms.corpus_model2 <- tm_map(x = sms.corpus_model2, FUN = removeNumbers)  


transformer <- content_transformer(FUN = function(x, pattern){
  gsub(x = x, 
       pattern = pattern, 
       replacement = " ") 
})

sms.corpus_model2 <- tm_map(sms.corpus_model2, transformer, "/")                # remove object
sms.corpus_model2 <- tm_map(sms.corpus_model2, transformer, "@")
sms.corpus_model2 <- tm_map(sms.corpus_model2, transformer, ":")
sms.corpus_model2 <- tm_map(sms.corpus_model2, transformer, "-")
sms.corpus_model2 <- tm_map(sms.corpus_model2, transformer, "\\.")
sms.corpus_model2 <- tm_map(sms.corpus_model2, removePunctuation)                   # punctuation
sms.corpus_model2 <- tm_map(sms.corpus_model2, stripWhitespace)                     # white space
sms.corpus_model2[[20]]$content
## [1] "beli extra kuota gb harga diskon cuma rprb ketik ya kirim ke sd "

Document-Term Matrix (DTM)

# ubah menjadi DTM
sms.dtm_model2 <- DocumentTermMatrix(x = sms.corpus_model2)
inspect(sms.dtm_model2)
## <<DocumentTermMatrix (documents: 2004, terms: 2508)>>
## Non-/sparse entries: 22830/5003202
## Sparsity           : 100%
## Maximal term length: 33
## Weighting          : term frequency (tf)
## Sample             :
##      Terms
## Docs  anda atau dgn info kamu kuota paket pulsa skeptical sms
##   193    0    0   0    0    0     0     0     0         0   0
##   196    0    0   0    0    0     0     0     0         0   0
##   197    0    0   0    0    0     0     0     0         0   1
##   225    0    0   0    0    0     0     0     0         0   0
##   29     0    1   0    0    0     0     0     0         0   0
##   378    0    0   0    0    0     0     0     0         0   0
##   409    0    0   0    0    0     0     0     0         0   0
##   410    1    0   1    2    0     0     2     2         1   7
##   903    0    0   0    0    1     0     0     0         0   0
##   955    0    0   0    0    0     0     3     3         0   0

Cross-Validation

RNGkind(sample.kind = "Rounding")
## Warning in RNGkind(sample.kind = "Rounding"): non-uniform 'Rounding' sampler
## used
set.seed(100)

index_model2 <- sample(nrow(sms.dtm_model2), nrow(sms.dtm_model2)*0.70)

sms_train_model2 <- sms.dtm_model2[index_model2,]
sms_test_model2 <- sms.dtm_model2[-index_model2,]
label_train_model2 <- sms[index_model2, 'label']
label_test_model2 <- sms[-index_model2, 'label']
prop.table(table(sms_model2$label))
## 
##       ham      spam 
## 0.5798403 0.4201597
prop.table(table(label_train_model2))
## label_train_model2
##      ham     spam 
## 0.585592 0.414408
prop.table(table(label_test_model2))
## label_test_model2
##       ham      spam 
## 0.5664452 0.4335548

Further Data Preprocessing

Remove Infrequent Words

dim(sms_train_model2)
## [1] 1402 2508
dim(sms_test_model2)
## [1]  602 2508
sms_freq_train_model2 <- findFreqTerms(sms_train_model2, lowfreq = 3)
length(sms_freq_train_model2)
## [1] 877
sms_freq_test_model2 <- findFreqTerms(sms_test_model2, lowfreq = 3)
length(sms_freq_test_model2)
## [1] 508
sms_train_model2 <- sms_train_model2[, sms_freq_train_model2]
inspect(sms_train_model2)
## <<DocumentTermMatrix (documents: 1402, terms: 877)>>
## Non-/sparse entries: 14237/1215317
## Sparsity           : 99%
## Maximal term length: 14
## Weighting          : term frequency (tf)
## Sample             :
##       Terms
## Docs   anda atau dgn info kamu kuota paket pulsa skeptical sms
##   1189    1    1   0    0    0     2     1     1         0   1
##   1400    1    1   0    0    0     2     1     1         0   1
##   196     0    0   0    0    0     0     0     0         0   0
##   197     0    0   0    0    0     0     0     0         0   1
##   239     0    1   0    0    0     0     0     0         0   0
##   29      0    1   0    0    0     0     0     0         0   0
##   403     0    0   0    0    0     0     0     0         0   0
##   404     0    0   0    0    0     0     0     0         0   0
##   409     0    0   0    0    0     0     0     0         0   0
##   410     1    0   1    2    0     0     2     2         1   7
sms_test_model2 <- sms_test_model2[, sms_freq_test_model2]
inspect(sms_test_model2)
## <<DocumentTermMatrix (documents: 602, terms: 508)>>
## Non-/sparse entries: 5983/299833
## Sparsity           : 98%
## Maximal term length: 14
## Weighting          : term frequency (tf)
## Sample             :
##       Terms
## Docs   anda atau bonus info kamu kuota pulsa saya sms ulang
##   1395    2    1     0    0    0     0     3    0   1     0
##   1423    2    1     0    0    0     0     3    0   1     0
##   1426    2    1     0    0    0     0     3    0   1     0
##   1444    2    1     0    0    0     0     3    0   1     0
##   172     0    0     0    0    1     1     0    0   0     0
##   193     0    0     0    0    0     0     0    0   0     0
##   1932    1    1     0    0    0     2     1    0   1     0
##   766     0    0     0    0    1     0     0    0   0     0
##   784     0    1     0    0    0     0     0    0   0     0
##   955     0    0     0    0    0     0     3    0   0     0

Bernoulli Converter

bernoulli_conv <- function(x){
  # parameter ifelse: kondisi, TRUE, FALSE
  x <- as.factor(ifelse(x > 0, 1, 0)) 
  return(x)
}
sms_train_bn_model2 <- apply(X = sms_train_model2, MARGIN = 2,FUN = bernoulli_conv)
sms_test_bn_model2 <- apply(X = sms_test_model2,MARGIN = 2, FUN = bernoulli_conv)

Model Fitting Naiave Bayes

Membuat model Naive Bayes

naive_spam_model2 <- naiveBayes(x = sms_train_bn_model2,
                         y = label_train_model2)

Model Prediction

sms_Class_naive_model2 <- predict(object = naive_spam_model2,
                          newdata = sms_test_bn_model2,
                          type = "class")
head(sms_Class_naive_model2)
## [1] ham  spam spam ham  spam ham 
## Levels: ham spam

Input To Data Set

sms_test_naive_model2 <- data[-index_model2,]
sms_test_naive_model2$prediksi <- sms_Class_naive_model2
head(sms_test_naive_model2)
##                datetime
## 7  2017-02-15T18:08:00Z
## 8  2017-02-16T10:04:00Z
## 9  2017-02-16T11:29:00Z
## 14 2017-02-17T11:52:00Z
## 16 2017-02-18T12:23:00Z
## 17 2017-02-18T15:00:00Z
##                                                                                                                                                                text
## 7             15/02/2017 18:08:02 Silakan gunakan passcode 7791 untuk Login Go Mobile CIMB Niaga. Passcode bersifat RAHASIA. Jangan memberitahukan kepada siapapun!
## 8                          YEAY! Free Ice Tea atau Cashback up to 30% dg transaksi  di AH Resto! Hanya untuk pengguna TCASH TAP. S&K Berlaku. Info tsel.me/tappromo
## 9  Voting your Offer. Disc 40%, 1 crispy chicken+1 spicy chicken+ nasi+lotteria tea Rp.26rb. Tukar SMS ini di LOTTERIA terdekat. Berlaku hari ini. SKB. Promo *606#
## 14       Masukan Username & Password ini di aplikasi Spotify. Username:085722688068 Password:1khF1SpC Mohon lgsg ganti alamat email & password di aplikasi Spotify.
## 16             Ayam (syp/paha bwh),Nasi,Ades Rp.18.181. Add on CD Bebi Glenn Rp.22.727. Tkr SMS hari ini di CFC CIBUBUR JUNC. Selama persediaan msh ada. Promo*606#
## 17                                                                                                                                                   De aku prgi ya
##    status jam prediksi
## 7     ham  18      ham
## 8    spam  10     spam
## 9    spam  11     spam
## 14   spam  11      ham
## 16   spam  12     spam
## 17    ham  15      ham

Wrong Prediction

sms_test_naive_model2 %>% 
  filter(status != prediksi)
##                datetime
## 1  2017-02-17T11:52:00Z
## 2  2017-02-18T15:54:00Z
## 3  2017-02-26T13:14:00Z
## 4  2017-02-27T12:25:00Z
## 5  2017-02-27T14:37:00Z
## 6  2017-02-27T17:39:00Z
## 7  2017-03-16T10:22:00Z
## 8  2017-03-17T10:22:00Z
## 9  2017-07-13T12:48:00Z
## 10 2017-07-19T02:20:00Z
## 11 2017-07-19T07:13:00Z
## 12 2017-07-24T16:57:00Z
## 13 2017-07-24T17:30:00Z
## 14 2017-08-18T08:05:00Z
## 15 2017-09-15T10:10:00Z
## 16 2017-09-24T13:36:00Z
## 17 2017-09-29T09:04:00Z
## 18 2017-10-02T01:09:00Z
## 19 2017-10-12T16:33:00Z
## 20 2017-11-01T09:29:00Z
## 21 2017-11-01T09:29:00Z
## 22 2017-11-27T19:41:00Z
## 23 2017-12-04T14:14:00Z
## 24 2017-12-09T09:52:00Z
## 25 2017-12-21T17:36:00Z
## 26 2017-12-22T10:18:00Z
## 27 2017-12-25T12:19:00Z
## 28 2017-12-25T20:03:00Z
## 29 2017-12-26T08:21:00Z
## 30 2017-12-27T05:45:00Z
## 31 2017-12-28T20:07:00Z
## 32 2017-12-28T21:45:00Z
## 33 2017-12-31T15:41:00Z
## 34 2018-01-19T11:18:00Z
## 35 2018-01-19T11:59:00Z
## 36 2018-01-20T10:19:00Z
## 37 2018-02-05T14:13:00Z
## 38 2018-02-17T14:45:00Z
## 39 2018-02-17T14:45:00Z
## 40 2018-02-27T15:21:00Z
## 41 2018-03-06T15:45:00Z
##                                                                                                                                                                                       text
## 1                               Masukan Username & Password ini di aplikasi Spotify. Username:085722688068 Password:1khF1SpC Mohon lgsg ganti alamat email & password di aplikasi Spotify.
## 2                                         PT.Pertamina Bina Medika Menerima Karyawan Baru 2017 Dengan Berbagai Jurusan L/P, Info Lengkap Kunjungi : http://www.recruitment-pertamedika.com
## 3                                 Travelingnya happy, terbangnya aman, hotelnya nyaman karena dapat diskon AGODA 7% + Asuransi Gratis 25 Jt! Buruan ke sini http://bit.ly/AktifkanSekarang
## 4  Apakah Anda yakin mendaftar paket Freedom M Rp 59rb/30hr? Sisa kuota 24jam dari paket sebelumnya (Freedom M Rp 59rb/30hr) akan di akumulasikan, balas OK jika setuju,BATAL jk tdk stuju
## 5                         Selamat Anda mendapatkan perlindungan dari PasarPolis.com. Segera daftar di http://bit.ly/2jY1FnY  Gratis tiket nonton utk 500 pendaftar pertama. Info S&K 14041
## 6                                                    Sisa kuota 2.0GB+ BONUS 4G:5.0GB,STREAM ON 500.0MB(iflix&Spotify). Beli EXTRA Kuota atau upgrade FREEDOM COMBO di*123# atau im3.do/mc
## 7                            Langganan Spotify Premium kamu berakhir pd 2017-03-17. Pastikan pulsa kamu cukup utk trs menikmati jutaan musik tanpa iklan. Isi ulang di bit.ly/topupindosat
## 8                                          Sayang sekali pulsa kamu tdk cukup utk berlangganan Spotify Premium. Isi ulang pulsa di topup.indosatooredoo.com &  daftar kembali di *123*123#
## 9                                    Sisa kuota 2.0GB+ BONUS 4G:1.27GB,  DATA ROLLOVER 411.0MB+ Akses aplikasi 182.0MB. Beli EXTRA Kuota atau upgrade FREEDOM COMBO di*123# atau im3.do/mc
## 10                                                                                                  Sisa kuota 116.0MB. Beli EXTRA Kuota atau upgrade FREEDOM COMBO di*123# atau im3.do/mc
## 11                              Sekarang dg DATA ROLLOVER, kuota utama kamu Gak hangus pd saat perpanjangan pkt internet yg sama atau beli pkt yg lbh besar. Cek info *123# atau im3.do/mc
## 12                                                           No +6285721812244 tdk berhasil SMS kamu. Jgn sampai kamu melewatkan pesan darinya! Balas YA dgn biaya Rp 350. Info: *123*883#
## 13                                                           No +6285721812244 tdk berhasil SMS kamu. Jgn sampai kamu melewatkan pesan darinya! Balas YA dgn biaya Rp 350. Info: *123*883#
## 14                        Freedom M Rp 55rb/30hr berhasil dprpanjang sd 17/09/2017 08:05. Nikmati BONUS KUOTA sd 10GB dismua jaringan,APPS TANPA KUOTA,DATA ROLLOVER. Cek http://im3.do/mc
## 15                                                                                                                                                                  Truecaller code 794761
## 16                                          MAAF, Paket EXTRA yang Kamu pilih tidak tersedia. Silakan daftar Paket EXTRA atau Paket Lainnya di *123# atau http://mycare.indosatooredoo.com
## 17                   Kami Dari Distributor resmi SARTIKA SHOP\nMenwarkn promo HP,laptop,kamera,dll\nharga Rp550.000\nbeli 2 grts 1,Stok terbatas\nPin BBM : DCE8372B\nWhatsApp:08975235879
## 18                                            Uber: Anda mendapatkan potongan 50% hingga Rp 5000, untuk 10 perjalanan uberMOTOR Anda. Ayo pesan Uber-mu sekarang! http://t.uber.com/nguber
## 19                                      Pulsa tdk ckp utk prpanjang.Utk tetap menggunakan internet.silakan daftar Pkt Internet 50MB Rp5,000/hari dgn Ketik Ya jika setuju atau tarif perKB
## 20                            Maaf, Keyword Salah. Pkt Lengkap Terbaik,DATA ROLLOVER, BONUS4G, STREAM ON, UNLIMITED Nelp&SMS dng FREEDOM COMBO. Info/beli paket,Tekan*123#  atau im3.do/mc
## 21                            Maaf, Keyword Salah. Pkt Lengkap Terbaik,DATA ROLLOVER, BONUS4G, STREAM ON, UNLIMITED Nelp&SMS dng FREEDOM COMBO. Info/beli paket,Tekan*123#  atau im3.do/mc
## 22                         Khusus buat kamu pelanggan IM3Ooredoo,nikmati nonton ribuan film melalui IFLIX,TANPA BIAYA BERLANGGANAN. Download di http://im3.do/iflix & lgs nikmati filmnya!
## 23                                        Sukseskan Sail Sabang 2017 tgl 25 November - 5 Desember 2017 di Pulau We, Kota Sabang. Untuk info lengkap kunjungi website: sailsabang2017.co.id
## 24                                                                                                                 Paket internet Extra, kuota 2GB, Rp 10rb. ketik XD1 ke 929 sd 11/12/17.
## 25                                             Sisa kuota Kuota Utama: 434.2 MB, Kuota Malam 01.00-06.00: 9.8 GB. Beli EXTRA Kuota atau upgrade paket sekarang! Tekan *123# atau im3.do/mc
## 26                           Plgn 085722688068, +10 KOIN PULSA mu hari ini belum diambil? Hub *858*22# utk Ambil. Sayang lho ga diambil, bisa buat tuker pulsa. Hub *858*22# & Pilih 1 OK.
## 27                         Anda masih terdaftar di paket Internet 2GB Rp45rb-30hr. Untuk pindah ke paket lain, terlebih dahulu ketik UNREG Internet 2GB Rp45rb-30hr kirim ke 123.Puas Inte
## 28                         2 hari lg prpanjangan Internet 2GB Rp45rb-30hr. Jgn lupa isi ulang pulsa utk dpt BONUS KUOTA sd 10GB di semua jaringan, DataRollover & trhindar tarif perKB. Ce
## 29                                                                                                                                                          UNREG Internet 2GB Rp45rb-30hr
## 30                         1 hari lg prpanjangan Internet 2GB Rp45rb-30hr. Jgn lupa isi ulang pulsa utk dpt BONUS KUOTA sd 10GB di semua jaringan, DataRollover & trhindar tarif perKB. Ce
## 31                                                                                                    Registrasi Prabayar Sukses. Data pelanggan sesuai identitas  Anda telah didaftarkan.
## 32                                                           No +6285721812244 tdk berhasil SMS kamu. Jgn sampai kamu melewatkan pesan darinya! Balas YA dgn biaya Rp 399. Info: *123*883#
## 33                                                           No +6285721812244 tdk berhasil SMS kamu. Jgn sampai kamu melewatkan pesan darinya! Balas YA dgn biaya Rp 399. Info: *123*883#
## 34                        Untuk mengindari PEMBLOKIRAN, Pemerintah mewajibkan SEGERA REGISTRASI ULANG kartu Anda. Ketik: ULANG#NIK#No.KK# kirim SMS ke4444, klik: http://im3.do/registrasi
## 35                                                                                                                 Selamat! Ada pulsa 100rb dari RBT Dia! Info: 838 Cek aja di *123*147*2#
## 36                        Diskon 5% + Tambahan Diskon Rp300ribu + 0% sd 12 bln utk Lemari Es,Mesin Cuci & AC.Dgn Kartu Kredit di Outlet Electronic Solution. Sd 21 Jan'18. S&K. Info 14041
## 37                                                                                                                                                                             a. Info 185
## 38                                           Nikmati akses ke FB, Path, Twitter,Whatsapp, BBM, Line,FB Msg, iFlix&Spotify gak habis habis kuotanya. Info *123# atau myIM3 http://im3.do/m3
## 39                                  Kamu skrg aktif di Unlimited+3GB sd 19/03/2018 14:45.Nikmati akses UNLIMITED Apps,SMS&akses YTUBE gak habis habis.Cek kuota*123# atau http://im3.do/m3
## 40                           Trm ksh Anda sdh akses Facebook dgn IndosatOoredoo. Brdasar pngalamn Anda, sberapa puas Anda thdp kualitas akses FB kami? Balas F1 sd F5 (F5= Sgt puas). FREE
## 41                                     Besok ada interview kerja? Cari tahu dulu tips-tips nya biar nggak grogi dan sukses. Tekan *123*543*2#. Tarif Rp2.200/3hari. Info: 08001401686 DSI8
##    status jam prediksi
## 1    spam  11      ham
## 2     ham  15     spam
## 3     ham  13     spam
## 4     ham  12     spam
## 5     ham  14     spam
## 6     ham  17     spam
## 7     ham  10     spam
## 8     ham  10     spam
## 9     ham  12     spam
## 10    ham  02     spam
## 11    ham  07     spam
## 12    ham  16     spam
## 13    ham  17     spam
## 14    ham  08     spam
## 15   spam  10      ham
## 16    ham  13     spam
## 17   spam  09      ham
## 18    ham  01     spam
## 19    ham  16     spam
## 20    ham  09     spam
## 21    ham  09     spam
## 22    ham  19     spam
## 23   spam  14      ham
## 24   spam  09      ham
## 25    ham  17     spam
## 26    ham  10     spam
## 27    ham  12     spam
## 28    ham  20     spam
## 29   spam  08      ham
## 30    ham  05     spam
## 31    ham  20     spam
## 32    ham  21     spam
## 33    ham  15     spam
## 34    ham  11     spam
## 35   spam  11      ham
## 36    ham  10     spam
## 37   spam  14      ham
## 38    ham  14     spam
## 39    ham  14     spam
## 40    ham  15     spam
## 41   spam  15      ham

Model Evaluation

Confusion Matrix

confusionMatrix(data = sms_Class_naive_model2,
                reference = label_test_model2,
                positive = "spam")
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction ham spam
##       ham  309    9
##       spam  32  252
##                                           
##                Accuracy : 0.9319          
##                  95% CI : (0.9087, 0.9507)
##     No Information Rate : 0.5664          
##     P-Value [Acc > NIR] : < 2.2e-16       
##                                           
##                   Kappa : 0.8628          
##                                           
##  Mcnemar's Test P-Value : 0.0005908       
##                                           
##             Sensitivity : 0.9655          
##             Specificity : 0.9062          
##          Pos Pred Value : 0.8873          
##          Neg Pred Value : 0.9717          
##              Prevalence : 0.4336          
##          Detection Rate : 0.4186          
##    Detection Prevalence : 0.4718          
##       Balanced Accuracy : 0.9358          
##                                           
##        'Positive' Class : spam            
## 

ROC and AUC

sms_prob_naive_model2 <- predict(naive_spam_model2, sms_test_bn_model2, type = "raw")
head(sms_prob_naive_model2)
##               ham         spam
## [1,] 1.000000e+00 2.084317e-16
## [2,] 1.456862e-11 1.000000e+00
## [3,] 4.169605e-05 9.999583e-01
## [4,] 9.902907e-01 9.709278e-03
## [5,] 3.318054e-02 9.668195e-01
## [6,] 9.999693e-01 3.071732e-05
sms_roc_naive_model2 <- data.frame(pred_prob_model2 = sms_prob_naive_model2[,'spam'],
                           actual_label = ifelse(label_test_model2 == 'spam', 1, 0))

head(sms_roc_naive_model2)
##   pred_prob_model2 actual_label
## 1     2.084317e-16            0
## 2     1.000000e+00            1
## 3     9.999583e-01            1
## 4     9.709278e-03            1
## 5     9.668195e-01            1
## 6     3.071732e-05            0
roc_naive_model2 <- prediction(predictions = sms_roc_naive_model2$pred_prob,
                            labels = sms_roc_naive_model2$actual_label)

plot(performance(roc_naive_model2, "tpr", "fpr"))
abline(0, 1, lty = 2)

auc_naive_model2 <- performance(roc_naive_model2, measure = "auc")
auc_naive_model2@y.values
## [[1]]
## [1] 0.9798373

Nilai AUC = 0.97984, sehingga dapat disimpulkan bahwa performa model Naive Bayes Spam Classifier sudah sangat baik dalam memisahkan mana yang kelas positive (spam) dengan kelas negative (ham).

Model 3

Data Preprocessing

Text Cleansing

sms.corpus_model3 <- sms.corpus_model2                    

Document-Term Matrix (DTM)

# ubah menjadi DTM
sms.dtm_model3 <- DocumentTermMatrix(x = sms.corpus_model3)
inspect(sms.dtm_model3)
## <<DocumentTermMatrix (documents: 2004, terms: 2508)>>
## Non-/sparse entries: 22830/5003202
## Sparsity           : 100%
## Maximal term length: 33
## Weighting          : term frequency (tf)
## Sample             :
##      Terms
## Docs  anda atau dgn info kamu kuota paket pulsa skeptical sms
##   193    0    0   0    0    0     0     0     0         0   0
##   196    0    0   0    0    0     0     0     0         0   0
##   197    0    0   0    0    0     0     0     0         0   1
##   225    0    0   0    0    0     0     0     0         0   0
##   29     0    1   0    0    0     0     0     0         0   0
##   378    0    0   0    0    0     0     0     0         0   0
##   409    0    0   0    0    0     0     0     0         0   0
##   410    1    0   1    2    0     0     2     2         1   7
##   903    0    0   0    0    1     0     0     0         0   0
##   955    0    0   0    0    0     0     3     3         0   0

Cross-Validation

RNGkind(sample.kind = "Rounding")
## Warning in RNGkind(sample.kind = "Rounding"): non-uniform 'Rounding' sampler
## used
set.seed(100)

index_model3 <- sample(nrow(sms.dtm_model3), nrow(sms.dtm_model3)*0.80)

sms_train_model3 <- sms.dtm_model3[index_model3,]
sms_test_model3 <- sms.dtm_model3[-index_model3,]
label_train_model3 <- sms[index_model3, 'label']
label_test_model3 <- sms[-index_model3, 'label']
prop.table(table(label_train_model3))
## label_train_model3
##       ham      spam 
## 0.5826575 0.4173425
prop.table(table(label_test_model3))
## label_test_model3
##       ham      spam 
## 0.5685786 0.4314214

Further Data Preprocessing

Remove Infrequent Words

dim(sms_train_model3)
## [1] 1603 2508
dim(sms_test_model3)
## [1]  401 2508
sms_freq_train_model3 <- findFreqTerms(sms_train_model3, lowfreq = 3)
length(sms_freq_train_model3)
## [1] 940
sms_train_model3 <- sms_train_model3[, sms_freq_train_model3]
inspect(sms_train_model3)
## <<DocumentTermMatrix (documents: 1603, terms: 940)>>
## Non-/sparse entries: 16562/1490258
## Sparsity           : 99%
## Maximal term length: 14
## Weighting          : term frequency (tf)
## Sample             :
##       Terms
## Docs   anda atau dgn info kamu kuota paket pulsa skeptical sms
##   1189    1    1   0    0    0     2     1     1         0   1
##   1400    1    1   0    0    0     2     1     1         0   1
##   196     0    0   0    0    0     0     0     0         0   0
##   197     0    0   0    0    0     0     0     0         0   1
##   239     0    1   0    0    0     0     0     0         0   0
##   29      0    1   0    0    0     0     0     0         0   0
##   403     0    0   0    0    0     0     0     0         0   0
##   404     0    0   0    0    0     0     0     0         0   0
##   409     0    0   0    0    0     0     0     0         0   0
##   410     1    0   1    2    0     0     2     2         1   7
sms_test_model3 <- sms_test_model3
inspect(sms_test_model3)
## <<DocumentTermMatrix (documents: 401, terms: 2508)>>
## Non-/sparse entries: 4664/1001044
## Sparsity           : 100%
## Maximal term length: 33
## Weighting          : term frequency (tf)
## Sample             :
##       Terms
## Docs   anda atau bonus info ini kamu kuota pulsa saya sms
##   172     0    0     0    0   3    1     1     0    0   0
##   193     0    0     0    0   0    0     0     0    0   0
##   1932    1    1     0    0   0    0     2     1    0   1
##   252     0    0     0    0   1    0     0     0    0   0
##   255     0    0     0    0   0    0     0     0    1   0
##   313     0    1     0    0   0    0     0     0    2   0
##   766     0    0     0    0   0    1     0     0    0   0
##   784     0    1     0    0   1    0     0     0    0   0
##   806     0    0     0    0   0    1     0     2    0   0
##   955     0    0     0    0   1    0     0     3    0   0

Bernoulli Converter

bernoulli_conv <- function(x){
  # parameter ifelse: kondisi, TRUE, FALSE
  x <- as.factor(ifelse(x > 0, 1, 0)) 
  return(x)
}
sms_train_bn_model3 <- apply(X = sms_train_model3, MARGIN = 2,FUN = bernoulli_conv)
sms_test_bn_model3 <- apply(X = sms_test_model3,MARGIN = 2, FUN = bernoulli_conv)

Model Fitting Naiave Bayes

Membuat model Naive Bayes

naive_spam_model3 <- naiveBayes(x = sms_train_bn_model3,
                         y = label_train_model3)

Model Prediction

sms_Class_naive_model3 <- predict(object = naive_spam_model3,
                          newdata = sms_test_bn_model3,
                          type = "class")
head(sms_Class_naive_model3)
## [1] ham  spam ham  spam spam ham 
## Levels: ham spam

Input To Data Set

sms_test_naive_model3 <- data[-index_model3,]
sms_test_naive_model3$prediksi <- sms_Class_naive_model3
head(sms_test_naive_model3)
##                datetime
## 7  2017-02-15T18:08:00Z
## 8  2017-02-16T10:04:00Z
## 14 2017-02-17T11:52:00Z
## 16 2017-02-18T12:23:00Z
## 18 2017-02-18T15:54:00Z
## 21 2017-02-20T07:55:00Z
##                                                                                                                                                          text
## 7       15/02/2017 18:08:02 Silakan gunakan passcode 7791 untuk Login Go Mobile CIMB Niaga. Passcode bersifat RAHASIA. Jangan memberitahukan kepada siapapun!
## 8                    YEAY! Free Ice Tea atau Cashback up to 30% dg transaksi  di AH Resto! Hanya untuk pengguna TCASH TAP. S&K Berlaku. Info tsel.me/tappromo
## 14 Masukan Username & Password ini di aplikasi Spotify. Username:085722688068 Password:1khF1SpC Mohon lgsg ganti alamat email & password di aplikasi Spotify.
## 16       Ayam (syp/paha bwh),Nasi,Ades Rp.18.181. Add on CD Bebi Glenn Rp.22.727. Tkr SMS hari ini di CFC CIBUBUR JUNC. Selama persediaan msh ada. Promo*606#
## 18           PT.Pertamina Bina Medika Menerima Karyawan Baru 2017 Dengan Berbagai Jurusan L/P, Info Lengkap Kunjungi : http://www.recruitment-pertamedika.com
## 21                                                                                                                                    Posisinya di mana ya bu
##    status jam prediksi
## 7     ham  18      ham
## 8    spam  10     spam
## 14   spam  11      ham
## 16   spam  12     spam
## 18    ham  15     spam
## 21    ham  07      ham

Wrong Prediction

sms_test_naive_model3 %>% 
  filter(status != prediksi)
##                datetime
## 1  2017-02-17T11:52:00Z
## 2  2017-02-18T15:54:00Z
## 3  2017-02-26T13:14:00Z
## 4  2017-03-16T10:22:00Z
## 5  2017-07-13T12:48:00Z
## 6  2017-07-19T07:13:00Z
## 7  2017-07-24T16:57:00Z
## 8  2017-08-18T08:05:00Z
## 9  2017-09-15T10:10:00Z
## 10 2017-09-24T13:36:00Z
## 11 2017-10-02T01:09:00Z
## 12 2017-11-01T09:29:00Z
## 13 2017-11-27T19:41:00Z
## 14 2017-12-04T14:14:00Z
## 15 2017-12-21T17:36:00Z
## 16 2017-12-22T10:18:00Z
## 17 2017-12-26T08:21:00Z
## 18 2017-12-27T05:45:00Z
## 19 2017-12-28T20:07:00Z
## 20 2017-12-28T21:45:00Z
## 21 2018-01-19T11:18:00Z
## 22 2018-02-05T14:13:00Z
## 23 2018-02-17T14:45:00Z
## 24 2018-03-04T11:37:00Z
## 25 2018-03-05T10:10:00Z
##                                                                                                                                                                text
## 1        Masukan Username & Password ini di aplikasi Spotify. Username:085722688068 Password:1khF1SpC Mohon lgsg ganti alamat email & password di aplikasi Spotify.
## 2                  PT.Pertamina Bina Medika Menerima Karyawan Baru 2017 Dengan Berbagai Jurusan L/P, Info Lengkap Kunjungi : http://www.recruitment-pertamedika.com
## 3          Travelingnya happy, terbangnya aman, hotelnya nyaman karena dapat diskon AGODA 7% + Asuransi Gratis 25 Jt! Buruan ke sini http://bit.ly/AktifkanSekarang
## 4     Langganan Spotify Premium kamu berakhir pd 2017-03-17. Pastikan pulsa kamu cukup utk trs menikmati jutaan musik tanpa iklan. Isi ulang di bit.ly/topupindosat
## 5             Sisa kuota 2.0GB+ BONUS 4G:1.27GB,  DATA ROLLOVER 411.0MB+ Akses aplikasi 182.0MB. Beli EXTRA Kuota atau upgrade FREEDOM COMBO di*123# atau im3.do/mc
## 6        Sekarang dg DATA ROLLOVER, kuota utama kamu Gak hangus pd saat perpanjangan pkt internet yg sama atau beli pkt yg lbh besar. Cek info *123# atau im3.do/mc
## 7                                     No +6285721812244 tdk berhasil SMS kamu. Jgn sampai kamu melewatkan pesan darinya! Balas YA dgn biaya Rp 350. Info: *123*883#
## 8  Freedom M Rp 55rb/30hr berhasil dprpanjang sd 17/09/2017 08:05. Nikmati BONUS KUOTA sd 10GB dismua jaringan,APPS TANPA KUOTA,DATA ROLLOVER. Cek http://im3.do/mc
## 9                                                                                                                                            Truecaller code 794761
## 10                   MAAF, Paket EXTRA yang Kamu pilih tidak tersedia. Silakan daftar Paket EXTRA atau Paket Lainnya di *123# atau http://mycare.indosatooredoo.com
## 11                     Uber: Anda mendapatkan potongan 50% hingga Rp 5000, untuk 10 perjalanan uberMOTOR Anda. Ayo pesan Uber-mu sekarang! http://t.uber.com/nguber
## 12     Maaf, Keyword Salah. Pkt Lengkap Terbaik,DATA ROLLOVER, BONUS4G, STREAM ON, UNLIMITED Nelp&SMS dng FREEDOM COMBO. Info/beli paket,Tekan*123#  atau im3.do/mc
## 13  Khusus buat kamu pelanggan IM3Ooredoo,nikmati nonton ribuan film melalui IFLIX,TANPA BIAYA BERLANGGANAN. Download di http://im3.do/iflix & lgs nikmati filmnya!
## 14                 Sukseskan Sail Sabang 2017 tgl 25 November - 5 Desember 2017 di Pulau We, Kota Sabang. Untuk info lengkap kunjungi website: sailsabang2017.co.id
## 15                      Sisa kuota Kuota Utama: 434.2 MB, Kuota Malam 01.00-06.00: 9.8 GB. Beli EXTRA Kuota atau upgrade paket sekarang! Tekan *123# atau im3.do/mc
## 16    Plgn 085722688068, +10 KOIN PULSA mu hari ini belum diambil? Hub *858*22# utk Ambil. Sayang lho ga diambil, bisa buat tuker pulsa. Hub *858*22# & Pilih 1 OK.
## 17                                                                                                                                   UNREG Internet 2GB Rp45rb-30hr
## 18  1 hari lg prpanjangan Internet 2GB Rp45rb-30hr. Jgn lupa isi ulang pulsa utk dpt BONUS KUOTA sd 10GB di semua jaringan, DataRollover & trhindar tarif perKB. Ce
## 19                                                                             Registrasi Prabayar Sukses. Data pelanggan sesuai identitas  Anda telah didaftarkan.
## 20                                    No +6285721812244 tdk berhasil SMS kamu. Jgn sampai kamu melewatkan pesan darinya! Balas YA dgn biaya Rp 399. Info: *123*883#
## 21 Untuk mengindari PEMBLOKIRAN, Pemerintah mewajibkan SEGERA REGISTRASI ULANG kartu Anda. Ketik: ULANG#NIK#No.KK# kirim SMS ke4444, klik: http://im3.do/registrasi
## 22                                                                                                                                                      a. Info 185
## 23                    Nikmati akses ke FB, Path, Twitter,Whatsapp, BBM, Line,FB Msg, iFlix&Spotify gak habis habis kuotanya. Info *123# atau myIM3 http://im3.do/m3
## 24   Proses PEMBLOKIRAN kartu bagi yg blm registrasi sdg berjalan,segera registrasi kartu Anda,dapatkan bonus 250MB+250mnt+250SMS.Ketik ULANG#NIK#No.KK# SMS ke4444
## 25   Proses PEMBLOKIRAN kartu bagi yg blm registrasi sdg berjalan,segera registrasi kartu Anda,dapatkan bonus 250MB+250mnt+250SMS.Ketik ULANG#NIK#No.KK# SMS ke4444
##    status jam prediksi
## 1    spam  11      ham
## 2     ham  15     spam
## 3     ham  13     spam
## 4     ham  10     spam
## 5     ham  12     spam
## 6     ham  07     spam
## 7     ham  16     spam
## 8     ham  08     spam
## 9    spam  10      ham
## 10    ham  13     spam
## 11    ham  01     spam
## 12    ham  09     spam
## 13    ham  19     spam
## 14   spam  14      ham
## 15    ham  17     spam
## 16    ham  10     spam
## 17   spam  08      ham
## 18    ham  05     spam
## 19    ham  20     spam
## 20    ham  21     spam
## 21    ham  11     spam
## 22   spam  14      ham
## 23    ham  14     spam
## 24    ham  11     spam
## 25    ham  10     spam

Model Evaluation

Confusion Matrix

confusionMatrix(data = sms_Class_naive_model3,
                reference = label_test_model3,
                positive = "spam")
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction ham spam
##       ham  208    5
##       spam  20  168
##                                           
##                Accuracy : 0.9377          
##                  95% CI : (0.9093, 0.9593)
##     No Information Rate : 0.5686          
##     P-Value [Acc > NIR] : < 2e-16         
##                                           
##                   Kappa : 0.8742          
##                                           
##  Mcnemar's Test P-Value : 0.00511         
##                                           
##             Sensitivity : 0.9711          
##             Specificity : 0.9123          
##          Pos Pred Value : 0.8936          
##          Neg Pred Value : 0.9765          
##              Prevalence : 0.4314          
##          Detection Rate : 0.4190          
##    Detection Prevalence : 0.4688          
##       Balanced Accuracy : 0.9417          
##                                           
##        'Positive' Class : spam            
## 

ROC and AUC

sms_prob_naive_model3 <- predict(naive_spam_model3, sms_test_bn_model3, type = "raw")
head(sms_prob_naive_model3)
##               ham         spam
## [1,] 1.000000e+00 1.105139e-16
## [2,] 3.639582e-12 1.000000e+00
## [3,] 9.995958e-01 4.041725e-04
## [4,] 2.169312e-01 7.830688e-01
## [5,] 3.852369e-03 9.961476e-01
## [6,] 9.999932e-01 6.794271e-06
sms_roc_naive_model3 <- data.frame(pred_prob_model3 = sms_prob_naive_model3[,'spam'],
                           actual_label = ifelse(label_test_model3 == 'spam', 1, 0))

head(sms_roc_naive_model3)
##   pred_prob_model3 actual_label
## 1     1.105139e-16            0
## 2     1.000000e+00            1
## 3     4.041725e-04            1
## 4     7.830688e-01            1
## 5     9.961476e-01            0
## 6     6.794271e-06            0
roc_naive_model3 <- prediction(predictions = sms_roc_naive_model3$pred_prob,
                            labels = sms_roc_naive_model3$actual_label)

plot(performance(roc_naive_model3, "tpr", "fpr"))
abline(0, 1, lty = 2)

auc_naive_model3 <- performance(roc_naive_model3, measure = "auc")
auc_naive_model3@y.values
## [[1]]
## [1] 0.9836224

Nilai AUC = 0.9836224, sehingga dapat disimpulkan bahwa performa model Naive Bayes Spam Classifier sudah sangat baik dalam memisahkan mana yang kelas positive (spam) dengan kelas negative (ham).

Model 4

Data Preprocessing

Text Cleansing

sms_model4 <- sms
sms_model4$text <- replace_emoji(as.character(sms_model4$text))
sms_model4$text <- replace_emoticon(sms_model4$text)

sms_model4$text <- sms_model4$text %>% 
  replace_number(remove = TRUE) %>% 
  replace_url(replacement = "") %>% 
  replace_email() %>% 
  replace_html(symbol = FALSE)

myStopwords <- stopwords(language = "id",source = "stopwords-iso")
sms_model4$text <- tokenize_words(sms_model4$text, stopwords = myStopwords)
head(sms_model4$text, 3)
## [[1]]
## [1] "telegram" "code"    
## 
## [[2]]
##  [1] "rezeki"       "nomplok"      "dompetku"     "pengiriman"   "uang"        
##  [6] "kirim"        "uang"         "alfamart"     "dptkan"       "hadiah"      
## [11] "jutaan"       "rupiah"       "hari.periode" "s.d"          "28feb17"     
## [16] "info"         "skeptical"    "bit.ly"       "dmpurna"      "mfi1"        
## 
## [[3]]
##  [1] "whatsapp"       "code"           "123"            "994"           
##  [5] "you"            "can"            "also"           "tap"           
##  [9] "on"             "this"           "link"           "to"            
## [13] "verify"         "your"           "phone"          "v.whatsapp.com"
## [17] "123994"
sms.corpus_model4 <- VCorpus(VectorSource(sms_model4$text))
sms.corpus_model4
## <<VCorpus>>
## Metadata:  corpus specific: 0, document level (indexed): 0
## Content:  documents: 2004
sms.corpus_model4 <- tm_map(x = sms.corpus_model4, content_transformer(tolower))    # lowercase
sms.corpus_model4 <- tm_map(x = sms.corpus_model4, FUN = removeNumbers)  


transformer <- content_transformer(FUN = function(x, pattern){
  gsub(x = x, 
       pattern = pattern, 
       replacement = " ") 
})

sms.corpus_model4 <- tm_map(sms.corpus_model4, transformer, "/")                # remove object
sms.corpus_model4 <- tm_map(sms.corpus_model4, transformer, "@")
sms.corpus_model4 <- tm_map(sms.corpus_model4, transformer, ":")
sms.corpus_model4 <- tm_map(sms.corpus_model4, transformer, "-")
sms.corpus_model4 <- tm_map(sms.corpus_model4, transformer, "\\.")
sms.corpus_model4 <- tm_map(sms.corpus_model4, removePunctuation)                   # punctuation
sms.corpus_model4 <- tm_map(sms.corpus_model4, stripWhitespace)                     # white space
sms.corpus_model4[[20]]$content
##  [1] "beli"   "extra"  "kuota"  "gb"     "harga"  "diskon" "rprb"   "ketik" 
##  [9] "ya"     "kirim"  "sd"     ""       ""       ""

Document-Term Matrix (DTM)

# ubah menjadi DTM
sms.dtm_model4 <- DocumentTermMatrix(x = sms.corpus_model4)
inspect(sms.dtm_model4)
## <<DocumentTermMatrix (documents: 2004, terms: 2662)>>
## Non-/sparse entries: 17774/5316874
## Sparsity           : 100%
## Maximal term length: 33
## Weighting          : term frequency (tf)
## Sample             :
##       Terms
## Docs   bonus dgn info kuota paket pulsa skeptical sms ulang utk
##   1847     0   0    0     0     0     0         1   0     0   0
##   193      0   0    0     0     0     0         0   0     0   0
##   197      0   0    0     0     0     0         0   1     0   0
##   225      0   0    0     0     0     0         0   0     0   0
##   29       0   0    0     0     0     0         0   0     0   0
##   378      0   0    0     0     0     0         0   0     0   0
##   409      0   0    0     0     0     0         0   0     0   0
##   410      1   1    2     0     2     2         1   7     0   0
##   70       0   0    0     0     0     0         0   0     0   0
##   955      0   0    0     0     3     2         0   0     0   0

Cross-Validation

RNGkind(sample.kind = "Rounding")
## Warning in RNGkind(sample.kind = "Rounding"): non-uniform 'Rounding' sampler
## used
set.seed(100)

index_model4 <- sample(nrow(sms.dtm_model4), nrow(sms.dtm_model4)*0.80)

sms_train_model4 <- sms.dtm_model4[index_model4,]
sms_test_model4 <- sms.dtm_model4[-index_model4,]
label_train_model4 <- sms[index_model4, 'label']
label_test_model4 <- sms[-index_model4, 'label']
prop.table(table(sms_model4$label))
## 
##       ham      spam 
## 0.5798403 0.4201597
prop.table(table(label_train_model4))
## label_train_model4
##       ham      spam 
## 0.5826575 0.4173425
prop.table(table(label_test_model4))
## label_test_model4
##       ham      spam 
## 0.5685786 0.4314214

Further Data Preprocessing

Remove Infrequent Words

dim(sms_train_model4)
## [1] 1603 2662
dim(sms_test_model4)
## [1]  401 2662
sms_freq_train_model4 <- findFreqTerms(sms_train_model4, lowfreq = 3)
length(sms_freq_train_model4)
## [1] 868
sms_train_model4 <- sms_train_model4[, sms_freq_train_model4]
inspect(sms_train_model4)
## <<DocumentTermMatrix (documents: 1603, terms: 868)>>
## Non-/sparse entries: 12380/1379024
## Sparsity           : 99%
## Maximal term length: 16
## Weighting          : term frequency (tf)
## Sample             :
##       Terms
## Docs   bonus dgn info internet kuota paket pulsa skeptical sms ulang
##   1124     0   2    1        1     1     0     0         1   0     0
##   1177     0   2    1        1     1     0     0         1   0     0
##   1189     0   0    0        0     2     1     1         0   1     0
##   1235     0   2    1        1     1     0     0         1   0     0
##   1281     0   2    1        1     1     0     0         1   0     0
##   1400     0   0    0        0     2     1     1         0   1     0
##   1409     0   2    1        1     1     0     0         1   0     0
##   1584     0   0    1        0     0     0     0         0   0     0
##   410      1   1    2        0     0     2     2         1   7     0
##   650      0   1    0        1     0     0     0         0   0     0
sms_test_model4 <- sms_test_model4
inspect(sms_test_model4)
## <<DocumentTermMatrix (documents: 401, terms: 2662)>>
## Non-/sparse entries: 3576/1063886
## Sparsity           : 100%
## Maximal term length: 33
## Weighting          : term frequency (tf)
## Sample             :
##       Terms
## Docs   beli bonus dgn info kuota pulsa skeptical sms ulang utk
##   1343    0     4   0    0     0     2         0   0     1   0
##   14      0     0   0    0     0     0         0   0     0   0
##   193     0     0   0    0     0     0         0   0     0   0
##   1932    0     0   0    0     2     1         0   1     0   1
##   1977    0     0   2    1     0     0         0   0     0   0
##   1981    0     0   0    1     0     0         0   0     0   0
##   240     0     0   0    1     0     0         0   0     0   0
##   34      0     0   2    1     0     0         1   0     0   0
##   946     1     0   0    1     0     0         0   1     0   0
##   955     0     0   0    0     0     2         0   0     0   0

Bernoulli Converter

bernoulli_conv <- function(x){
  # parameter ifelse: kondisi, TRUE, FALSE
  x <- as.factor(ifelse(x > 0, 1, 0)) 
  return(x)
}
sms_train_bn_model4 <- apply(X = sms_train_model4, MARGIN = 2,FUN = bernoulli_conv)
sms_test_bn_model4 <- apply(X = sms_test_model4,MARGIN = 2, FUN = bernoulli_conv)

Model Fitting Naiave Bayes

Membuat model Naive Bayes

naive_spam_model4 <- naiveBayes(x = sms_train_bn_model4,
                         y = label_train_model4)

Model Prediction

sms_Class_naive_model4 <- predict(object = naive_spam_model4,
                          newdata = sms_test_bn_model4,
                          type = "class")
head(sms_Class_naive_model4)
## [1] ham  spam ham  ham  ham  ham 
## Levels: ham spam

Input To Data Set

sms_test_naive_model4 <- data[-index_model4,]
sms_test_naive_model4$prediksi <- sms_Class_naive_model4
head(sms_test_naive_model4)
##                datetime
## 7  2017-02-15T18:08:00Z
## 8  2017-02-16T10:04:00Z
## 14 2017-02-17T11:52:00Z
## 16 2017-02-18T12:23:00Z
## 18 2017-02-18T15:54:00Z
## 21 2017-02-20T07:55:00Z
##                                                                                                                                                          text
## 7       15/02/2017 18:08:02 Silakan gunakan passcode 7791 untuk Login Go Mobile CIMB Niaga. Passcode bersifat RAHASIA. Jangan memberitahukan kepada siapapun!
## 8                    YEAY! Free Ice Tea atau Cashback up to 30% dg transaksi  di AH Resto! Hanya untuk pengguna TCASH TAP. S&K Berlaku. Info tsel.me/tappromo
## 14 Masukan Username & Password ini di aplikasi Spotify. Username:085722688068 Password:1khF1SpC Mohon lgsg ganti alamat email & password di aplikasi Spotify.
## 16       Ayam (syp/paha bwh),Nasi,Ades Rp.18.181. Add on CD Bebi Glenn Rp.22.727. Tkr SMS hari ini di CFC CIBUBUR JUNC. Selama persediaan msh ada. Promo*606#
## 18           PT.Pertamina Bina Medika Menerima Karyawan Baru 2017 Dengan Berbagai Jurusan L/P, Info Lengkap Kunjungi : http://www.recruitment-pertamedika.com
## 21                                                                                                                                    Posisinya di mana ya bu
##    status jam prediksi
## 7     ham  18      ham
## 8    spam  10     spam
## 14   spam  11      ham
## 16   spam  12      ham
## 18    ham  15      ham
## 21    ham  07      ham

Wrong Prediction

sms_test_naive_model4 %>% 
  filter(status != prediksi)
##                datetime
## 1  2017-02-17T11:52:00Z
## 2  2017-02-18T12:23:00Z
## 3  2017-02-25T17:05:00Z
## 4  2017-02-26T13:14:00Z
## 5  2017-03-16T10:22:00Z
## 6  2017-07-13T12:48:00Z
## 7  2017-07-19T07:13:00Z
## 8  2017-08-18T08:05:00Z
## 9  2017-09-10T12:41:00Z
## 10 2017-09-15T10:10:00Z
## 11 2017-09-24T13:36:00Z
## 12 2017-10-02T01:09:00Z
## 13 2017-11-01T09:29:00Z
## 14 2017-11-27T19:41:00Z
## 15 2017-12-04T14:14:00Z
## 16 2017-12-21T17:36:00Z
## 17 2017-12-22T10:18:00Z
## 18 2017-12-26T08:21:00Z
## 19 2017-12-27T05:45:00Z
## 20 2017-12-28T20:07:00Z
## 21 2018-01-07T18:19:00Z
## 22 2018-01-19T11:18:00Z
## 23 2018-02-05T14:13:00Z
## 24 2018-02-17T14:45:00Z
##                                                                                                                                                                     text
## 1             Masukan Username & Password ini di aplikasi Spotify. Username:085722688068 Password:1khF1SpC Mohon lgsg ganti alamat email & password di aplikasi Spotify.
## 2                   Ayam (syp/paha bwh),Nasi,Ades Rp.18.181. Add on CD Bebi Glenn Rp.22.727. Tkr SMS hari ini di CFC CIBUBUR JUNC. Selama persediaan msh ada. Promo*606#
## 3                                              LIMITED OFFER! 20% pembelian produk. Berlaku sampai 28 Februari 2017. S&K berlaku. Kunjungi ERHA terdekat. www.erha.co.id
## 4               Travelingnya happy, terbangnya aman, hotelnya nyaman karena dapat diskon AGODA 7% + Asuransi Gratis 25 Jt! Buruan ke sini http://bit.ly/AktifkanSekarang
## 5          Langganan Spotify Premium kamu berakhir pd 2017-03-17. Pastikan pulsa kamu cukup utk trs menikmati jutaan musik tanpa iklan. Isi ulang di bit.ly/topupindosat
## 6                  Sisa kuota 2.0GB+ BONUS 4G:1.27GB,  DATA ROLLOVER 411.0MB+ Akses aplikasi 182.0MB. Beli EXTRA Kuota atau upgrade FREEDOM COMBO di*123# atau im3.do/mc
## 7             Sekarang dg DATA ROLLOVER, kuota utama kamu Gak hangus pd saat perpanjangan pkt internet yg sama atau beli pkt yg lbh besar. Cek info *123# atau im3.do/mc
## 8       Freedom M Rp 55rb/30hr berhasil dprpanjang sd 17/09/2017 08:05. Nikmati BONUS KUOTA sd 10GB dismua jaringan,APPS TANPA KUOTA,DATA ROLLOVER. Cek http://im3.do/mc
## 9                                                                      Eksplorasi alam Jambi lewat Festival Geopark Merangin, 11-14 Sept'17. Info Lengkap: bit.ly/FGMJ17
## 10                                                                                                                                                Truecaller code 794761
## 11                        MAAF, Paket EXTRA yang Kamu pilih tidak tersedia. Silakan daftar Paket EXTRA atau Paket Lainnya di *123# atau http://mycare.indosatooredoo.com
## 12                          Uber: Anda mendapatkan potongan 50% hingga Rp 5000, untuk 10 perjalanan uberMOTOR Anda. Ayo pesan Uber-mu sekarang! http://t.uber.com/nguber
## 13          Maaf, Keyword Salah. Pkt Lengkap Terbaik,DATA ROLLOVER, BONUS4G, STREAM ON, UNLIMITED Nelp&SMS dng FREEDOM COMBO. Info/beli paket,Tekan*123#  atau im3.do/mc
## 14       Khusus buat kamu pelanggan IM3Ooredoo,nikmati nonton ribuan film melalui IFLIX,TANPA BIAYA BERLANGGANAN. Download di http://im3.do/iflix & lgs nikmati filmnya!
## 15                      Sukseskan Sail Sabang 2017 tgl 25 November - 5 Desember 2017 di Pulau We, Kota Sabang. Untuk info lengkap kunjungi website: sailsabang2017.co.id
## 16                           Sisa kuota Kuota Utama: 434.2 MB, Kuota Malam 01.00-06.00: 9.8 GB. Beli EXTRA Kuota atau upgrade paket sekarang! Tekan *123# atau im3.do/mc
## 17         Plgn 085722688068, +10 KOIN PULSA mu hari ini belum diambil? Hub *858*22# utk Ambil. Sayang lho ga diambil, bisa buat tuker pulsa. Hub *858*22# & Pilih 1 OK.
## 18                                                                                                                                        UNREG Internet 2GB Rp45rb-30hr
## 19       1 hari lg prpanjangan Internet 2GB Rp45rb-30hr. Jgn lupa isi ulang pulsa utk dpt BONUS KUOTA sd 10GB di semua jaringan, DataRollover & trhindar tarif perKB. Ce
## 20                                                                                  Registrasi Prabayar Sukses. Data pelanggan sesuai identitas  Anda telah didaftarkan.
## 21 TIKETUX U/ LINTAS\nD/H MGO/CIPAGANTI\nKE SOETTA NAIK DARI CIHAMPELAS CM 150rb\ngoo.gl/maps/1jYYWYn8jAF2\nBELI TIKET DI SOETTA\nDAPAT VOUCHER 20rb\nUTK KE SOETTA LAGI
## 22      Untuk mengindari PEMBLOKIRAN, Pemerintah mewajibkan SEGERA REGISTRASI ULANG kartu Anda. Ketik: ULANG#NIK#No.KK# kirim SMS ke4444, klik: http://im3.do/registrasi
## 23                                                                                                                                                           a. Info 185
## 24                         Nikmati akses ke FB, Path, Twitter,Whatsapp, BBM, Line,FB Msg, iFlix&Spotify gak habis habis kuotanya. Info *123# atau myIM3 http://im3.do/m3
##    status jam prediksi
## 1    spam  11      ham
## 2    spam  12      ham
## 3     ham  17     spam
## 4     ham  13     spam
## 5     ham  10     spam
## 6     ham  12     spam
## 7     ham  07     spam
## 8     ham  08     spam
## 9    spam  12      ham
## 10   spam  10      ham
## 11    ham  13     spam
## 12    ham  01     spam
## 13    ham  09     spam
## 14    ham  19     spam
## 15   spam  14      ham
## 16    ham  17     spam
## 17    ham  10     spam
## 18   spam  08      ham
## 19    ham  05     spam
## 20    ham  20     spam
## 21   spam  18      ham
## 22    ham  11     spam
## 23   spam  14      ham
## 24    ham  14     spam

Kata yang sering muncul pada sms yang salah diprediksi antara lain adalah kuota, bonus, ambil, dan sebagainya

Model Evaluation

Confusion Matrix

confusionMatrix(data = sms_Class_naive_model4,
                reference = label_test_model4,
                positive = "spam")
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction ham spam
##       ham  212    8
##       spam  16  165
##                                           
##                Accuracy : 0.9401          
##                  95% CI : (0.9123, 0.9613)
##     No Information Rate : 0.5686          
##     P-Value [Acc > NIR] : <2e-16          
##                                           
##                   Kappa : 0.8787          
##                                           
##  Mcnemar's Test P-Value : 0.153           
##                                           
##             Sensitivity : 0.9538          
##             Specificity : 0.9298          
##          Pos Pred Value : 0.9116          
##          Neg Pred Value : 0.9636          
##              Prevalence : 0.4314          
##          Detection Rate : 0.4115          
##    Detection Prevalence : 0.4514          
##       Balanced Accuracy : 0.9418          
##                                           
##        'Positive' Class : spam            
## 

ROC and AUC

sms_prob_naive_model4 <- predict(naive_spam_model4, sms_test_bn_model4, type = "raw")
head(sms_prob_naive_model4)
##               ham         spam
## [1,] 1.000000e+00 2.546343e-14
## [2,] 2.122727e-10 1.000000e+00
## [3,] 9.719201e-01 2.807985e-02
## [4,] 9.349552e-01 6.504484e-02
## [5,] 8.063741e-01 1.936259e-01
## [6,] 9.993978e-01 6.022336e-04
sms_roc_naive_model4 <- data.frame(pred_prob_model4 = sms_prob_naive_model4[,'spam'],
                           actual_label = ifelse(label_test_model4 == 'spam', 1, 0))

head(sms_roc_naive_model4)
##   pred_prob_model4 actual_label
## 1     2.546343e-14            0
## 2     1.000000e+00            1
## 3     2.807985e-02            1
## 4     6.504484e-02            1
## 5     1.936259e-01            0
## 6     6.022336e-04            0
roc_naive_model4 <- prediction(predictions = sms_roc_naive_model4$pred_prob,
                            labels = sms_roc_naive_model4$actual_label)

plot(performance(roc_naive_model4, "tpr", "fpr"))
abline(0, 1, lty = 2)

auc_naive_model4 <- performance(roc_naive_model4, measure = "auc")
auc_naive_model4@y.values
## [[1]]
## [1] 0.9829505

Nilai AUC = 0.98295, sehingga dapat disimpulkan bahwa performa model Naive Bayes Spam Classifier sudah sangat baik dalam memisahkan mana yang kelas positive (spam) dengan kelas negative (ham).

Model yang dipilih untuk memprediksi data test adalah model Naive Bayes ke 4. Model ini di pilih karena memiliki nilai Accuracy, Sensitivity, Specificity, Precision dan nilai AUC yang terbaik pada data testing dibandingkan dengan model lainnya, yaitu masing-masing sebesar : Accuracy : 0.9401 Sensitivity : 0.9538 Specificity : 0.9298 Precision : 0.9116 AUC : 0.9829505

Implementasi Data Test

Data Preprocessing

sms_pred_naive <- test %>% 
       select(label = status,
              text = text) %>% 
      mutate(label = as.factor(label))
head(sms_pred_naive)
##   label
## 1  <NA>
## 2  <NA>
## 3  <NA>
## 4  <NA>
## 5  <NA>
## 6  <NA>
##                                                                                                                                                             text
## 1          Km baru saja akses Apps Sehari-hari terpopuler.Nikmati akses YOUTUBE ga habis habis dgn beli pkt Unlimited HANYA di *123# atau myIM3 http://im3.do/m3
## 2 GRATIS UNLIMITED YOUTUBE+INTERNET 10GB+CHAT&SOSMED+SMS+NELPON selama 30hari.Data Rollover.PROMO 100Rb (Normal 115rb). MAU? Tekan C25 kirim SMS ke 929 sekarang
## 3                    Sisa kuota 285 MB.Beli pkt Internet TERBAIK dr IM3 ooredoo di *123# atau myIM3 http:// im3.do/m3 .Kelebihan pemakaian dikenakan tarif perKB
## 4  Ada banyak lowongan kerja baru! Ayo jgn sampai kamu ketinggalan update & tips di dunia kerja, tekan *123*543*2# . Tarif Rp2.200/3hari. Info: 08001401686 DSI7
## 5 Proses PEMBLOKIRAN kartu bagi yg blm registrasi sdg berjalan,segera registrasi kartu Anda,dapatkan bonus 250MB+250mnt+250SMS.Ketik ULANG#NIK#No.KK# SMS ke4444
## 6                                                   iRing keren cuman buat km, Via Vallen-Bojo Galak (Reff),Rp.0,1/3hr prpnjngan Rp.3190 dengan hnya bls YA lho!

Text Cleansing

sms_pred_naive$text <- replace_emoji(as.character(sms_pred_naive$text))
sms_pred_naive$text <- replace_emoticon(sms_pred_naive$text)

sms_pred_naive$text <- sms_pred_naive$text %>% 
  replace_number(remove = TRUE) %>% 
  replace_url(replacement = "") %>% 
  replace_email() %>% 
  replace_html(symbol = FALSE)

myStopwords <- stopwords(language = "id",source = "stopwords-iso")
sms_pred_naive$text <- tokenize_words(sms_pred_naive$text, stopwords = myStopwords)
head(sms_pred_naive$text, 3)
## [[1]]
##  [1] "km"                 "akses"              "apps"              
##  [4] "sehari"             "terpopuler.nikmati" "akses"             
##  [7] "youtube"            "ga"                 "habis"             
## [10] "habis"              "dgn"                "beli"              
## [13] "pkt"                "unlimited"          "123"               
## [16] "myim3"              "skeptical"          "im3"               
## [19] "do"                 "m3"                
## 
## [[2]]
##  [1] "gratis"         "unlimited"      "youtube"        "internet"      
##  [5] "10gb"           "chat"           "sosmed"         "sms"           
##  [9] "nelpon"         "30hari.data"    "rollover.promo" "100rb"         
## [13] "normal"         "115rb"          "tekan"          "c25"           
## [17] "kirim"          "sms"           
## 
## [[3]]
##  [1] "sisa"      "kuota"     "mb.beli"   "pkt"       "internet"  "terbaik"  
##  [7] "dr"        "im3"       "ooredoo"   "123"       "myim3"     "skeptical"
## [13] "im3"       "do"        "m3"        "kelebihan" "pemakaian" "dikenakan"
## [19] "tarif"     "perkb"
sms.corpus_pred_naive <- VCorpus(VectorSource(sms_pred_naive$text))
sms.corpus_pred_naive
## <<VCorpus>>
## Metadata:  corpus specific: 0, document level (indexed): 0
## Content:  documents: 283
sms.corpus_pred_naive <- tm_map(x = sms.corpus_pred_naive, content_transformer(tolower))    
sms.corpus_pred_naive <- tm_map(x = sms.corpus_pred_naive, FUN = removeNumbers)  


transformer <- content_transformer(FUN = function(x, pattern){
  gsub(x = x, 
       pattern = pattern, 
       replacement = " ") 
})

sms.corpus_pred_naive <- tm_map(sms.corpus_pred_naive, transformer, "/")                
sms.corpus_pred_naive <- tm_map(sms.corpus_pred_naive, transformer, "@")
sms.corpus_pred_naive <- tm_map(sms.corpus_pred_naive, transformer, ":")
sms.corpus_pred_naive <- tm_map(sms.corpus_pred_naive, transformer, "-")
sms.corpus_pred_naive <- tm_map(sms.corpus_pred_naive, transformer, "\\.")
sms.corpus_pred_naive <- tm_map(sms.corpus_pred_naive, removePunctuation)            
sms.corpus_pred_naive <- tm_map(sms.corpus_pred_naive, stripWhitespace) 

Document-Term Matrix (DTM)

# ubah menjadi DTM
sms.dtm_pred_naive <- DocumentTermMatrix(x = sms.corpus_pred_naive)
inspect(sms.dtm_pred_naive)
## <<DocumentTermMatrix (documents: 283, terms: 710)>>
## Non-/sparse entries: 3300/197630
## Sparsity           : 98%
## Maximal term length: 33
## Weighting          : term frequency (tf)
## Sample             :
##      Terms
## Docs  axis bronet diblokir info jam ketik nik registrasi sms ulang
##   101    0      0        0    0   0     1   1          1   2     2
##   112    0      0        0    0   0     0   0          0   0     0
##   158    0      0        0    1   0     0   0          0   0     0
##   177    0      0        0    0   0     0   0          0   0     0
##   180    0      0        0    0   0     1   0          0   1     0
##   225    0      0        0    1   0     0   0          0   0     0
##   229    0      0        0    1   0     0   0          0   0     0
##   239    0      0        0    0   0     0   0          0   0     0
##   80     0      0        0    0   0     0   0          0   0     0
##   95     0      0        0    0   0     0   0          0   0     0

Bernoulli Converter

bernoulli_conv_pred_naive <- function(x){
  # parameter ifelse: kondisi, TRUE, FALSE
  x <- as.factor(ifelse(x > 0, 1, 0)) 
  return(x)
}
sms_test_bn_pred_naive <- apply(X = sms.dtm_pred_naive, MARGIN = 2, FUN = bernoulli_conv_pred_naive)

Model Prediction

sms_pred_Class_naive <- predict(object = naive_spam_model4,
                          newdata = sms_test_bn_pred_naive,
                          type = "class")
head(sms_pred_Class_naive)
## [1] spam spam spam spam ham  spam
## Levels: ham spam

Input in DataSet

test$status <- sms_pred_Class_naive
head(test)
##               datetime
## 1 2018-03-01T00:32:00Z
## 2 2018-03-01T08:57:00Z
## 3 2018-03-01T09:15:00Z
## 4 2018-03-01T16:42:00Z
## 5 2018-03-01T17:42:00Z
## 6 2018-03-01T22:04:00Z
##                                                                                                                                                             text
## 1          Km baru saja akses Apps Sehari-hari terpopuler.Nikmati akses YOUTUBE ga habis habis dgn beli pkt Unlimited HANYA di *123# atau myIM3 http://im3.do/m3
## 2 GRATIS UNLIMITED YOUTUBE+INTERNET 10GB+CHAT&SOSMED+SMS+NELPON selama 30hari.Data Rollover.PROMO 100Rb (Normal 115rb). MAU? Tekan C25 kirim SMS ke 929 sekarang
## 3                    Sisa kuota 285 MB.Beli pkt Internet TERBAIK dr IM3 ooredoo di *123# atau myIM3 http:// im3.do/m3 .Kelebihan pemakaian dikenakan tarif perKB
## 4  Ada banyak lowongan kerja baru! Ayo jgn sampai kamu ketinggalan update & tips di dunia kerja, tekan *123*543*2# . Tarif Rp2.200/3hari. Info: 08001401686 DSI7
## 5 Proses PEMBLOKIRAN kartu bagi yg blm registrasi sdg berjalan,segera registrasi kartu Anda,dapatkan bonus 250MB+250mnt+250SMS.Ketik ULANG#NIK#No.KK# SMS ke4444
## 6                                                   iRing keren cuman buat km, Via Vallen-Bojo Galak (Reff),Rp.0,1/3hr prpnjngan Rp.3190 dengan hnya bls YA lho!
##   status
## 1   spam
## 2   spam
## 3   spam
## 4   spam
## 5    ham
## 6   spam
write.csv(test,"C:/Users/IDR/Pictures/13 Capstone Machine Learning/Upload_Predict_Naive.csv", row.names = FALSE)

Interpretation with LIME

Interpretasi model hasil klasifikasi sulit dilakukan jika model yang digunakan merupakan model machine learning seperti Naive Bayes, Decision Tree, Random Forest dan Deep Learning. Oleh karena itu perlu adanya pra-processing dari hasil pembuatan model tersebut sehingga interpretasi dapat dilakukan. Dalam kasus ini interpretasi model klasifikasi dilakukan dengan menggunakan function LIME. Hasil dari proses interpretasi ini adalah kita dapat melihat secara lebih detail kata-kata apa saja dalam sms tertentu yang mendukung keputusan apakah sms tersebut termasuk sms “spam” atau “ham” dan melihat seberapa jauh kecocokan sms tersebut dengan “explanator” yang kita bentuk.

Create Tokenize Data Pre-Processing

tokenize_text <- function(text){
  # Create Corpuse
  data_corpus <- VCorpus(VectorSource(text))
  
  # Cleansing
  data_corpus_clean <-  data_corpus %>% 
    tm_map(content_transformer(tolower)) %>% 
    tm_map(removeNumbers) %>%
    tm_map(removePunctuation) %>%
    tm_map(stripWhitespace)

  # Document-Term Matrix and use only terms from data train
  data_dtm <- DocumentTermMatrix(data_corpus_clean)
  
  freq_dtm <- findFreqTerms(data_dtm, lowfreq = 5)
  data_dtm <- data_dtm[, freq_dtm]

  # Bernoulli Converter
  data_text <- apply(data_dtm, 2, bernoulli_conv)

  return(data_text)
}

Preparation Model and Explainer

data_train_LIME <- test$text %>% as.character()

model<-as_classifier(naive_spam_model4, labels = NULL)
model_type(model)
## [1] "classification"
explainer <- lime(data_train_LIME, # the input
                  model = model,
                  preprocess = tokenize_text)
predict_model.naiveBayes <- function(x, newdata, type = "raw") {

    # return classification probabilities only   
    res <- predict(x, newdata, type = "raw") %>% as.data.frame()
    
    return(res)
}

Created Sign in Data Test

text_test <- test$text %>% as.character()

set.seed(100)
explanation <- explain(text_test[1:4],
                       explainer = explainer, 
                       n_labels = 1,
                       n_features = 5,
                       feature_select = "none", 
                       single_explanation = F)

Plot to Get Visualization

plot_text_explanations(explanation)

Sebagaimana telah disinggung pada awal bagian interpretasi dengan menggunakan LIME, dapat terlihat perbedaan yang sangat signifikan jika kita melanjutkan proses pengolahan dengan bantuan LIME dibandingankan hanya mengandalkan metode klasifikasi pada umumnya. Hal yang sangat membedakan adalah kita dapat melihat di setiap sms, kata-kata apa saja yang mendukung sms tersebut dapat dikatakan “spam” atau “ham”. Selain itu kita juga dapat melihat rekomendasi label dan kecocokan kata-kata pada sms tersebut dengan “explanator” yang telah kita buat. Sebagai contoh kita dapat mengamati 4 sms pertama dari data test.

  • SMS 1 SMS ini terprediksi memiliki label spam dan persentase kecocokan dengan “explanator” yang dibuat hanya berkisar 28%. Kata-kata pendukung sms tersebut dikatakan spam : youtube, unlimited Kata-kata pendukung sms tersebut dikatakan bukan spam : IM3

  • SMS 2 SMS ini terprediksi memiliki label spam dan persentase kecocokan dengan “explanator” yang dibuat hanya berkisar 30%. Kata pendukung sms tersebut dikatakan spam : youtube, unlimited Kata pendukung sms tersebut dikatakan bukan spam : selama

  • SMS 3 SMS ini terprediksi memiliki label spam dan persentase kecocokan dengan “explanator” yang dibuat hanya berkisar 27%. Kata pendukung sms tersebut dikatakan spam : tarif, kuota, terbaik Kata pendukung sms tersebut dikatakan bukan spam : IM3

  • SMS 4 SMS ini terprediksi memiliki label spam dan persentase kecocokan dengan “explanator” yang dibuat hanya berkisar 36%. Kata pendukung sms tersebut dikatakan spam : ketinggalan, update, tekan Kata pendukung sms tersebut dikatakan bukan spam : banyak, sampai

Kesimpulan

Machine Learning dapat menyelesaikan permasalahan klasifikasi sms (spam/ham) dengan sangat baik. Model yang digunakan untuk melakukan klasifikasi adalah model Naive Bayes. Model Naive Bayes adalah salah satu model machine learning yang memanfaatkan teori peluang dalam melakukan klasifikasi. Model ini menggunakan asumsi yang kuat (naif) terhadap independesi dan bobot masing-masing kejadian, sehingga dalam pemebntukan modelnya pun tidak membutuhkan komputasi atau waktu yang lama. Penyelesaian permasalahan klasifikasi sms (spam/ham) ini dapat diaplikasikan dalam dunia bisnis, diantaranya adalah mengklasifikasikan email kantor, melakukan sentimen analysis pada kolom komentar website BCA dan menperkirakan debitur prospek atau tidak prospek dalam panggilan telepon wawancara.