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(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)
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
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)
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
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
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
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 "
# 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
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
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_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)
Membuat model Naive Bayes
naive_spam_model1 <- naiveBayes(x = sms_train_bn_model1,
y = label_train_model1)
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
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
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
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
##
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).
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 "
# 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
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
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_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)
Membuat model Naive Bayes
naive_spam_model2 <- naiveBayes(x = sms_train_bn_model2,
y = label_train_model2)
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
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
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
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
##
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).
sms.corpus_model3 <- sms.corpus_model2
# 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
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
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_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)
Membuat model Naive Bayes
naive_spam_model3 <- naiveBayes(x = sms_train_bn_model3,
y = label_train_model3)
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
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
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
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
##
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).
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" "" "" ""
# 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
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
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_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)
Membuat model Naive Bayes
naive_spam_model4 <- naiveBayes(x = sms_train_bn_model4,
y = label_train_model4)
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
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
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
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
##
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
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!
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)
# 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_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)
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
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)
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.
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)
}
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)
}
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_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
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.