Assalamualaikum wr. wb.
Hai data enthusiast….
Kali ini saya akan melakukan analisa komentar pada pengunjung tempat wisata dalam fitur “Things to Do” yang termuat dalam website https://www.tripadvisor.com/.
Sebelum menganalisis komentar pengunjung tempat wisata, kita harus mengetahui arti dari text mining.
Apa yang dimaksud dengan Text Mining ?
Text mining adalah proses ekstraksi pola berupa informasi dan pengetahuan yang berguna dari sejumlah besar sumber data teks, seperti dokumen Word, PDF, kutipan teks, dll. [1]
Tempat wisata yang akan dianalisis komentarnya yaitu Kuta beach-Bali.
Data yang digunakan untuk analisis komentar, berasal dari scraping menggunakan aplikasi “SelectorGadget” pada ulasan pengunjung tempat wisata Kuta beach-Bali.
Siapkan R Studio, lalu packages yang harus di install adalah
> install.packages("xml2")
> library(xml2)> install.packages("rvest")
> library(rvest)
sehingga hasilnya
Kemudian ambil ulasan Kuta beach yang ada di kota Bali
Lalu masukkan alamat website pada R, dengan hasil pembacaan halaman website “Bali”
> Bali <- read_html(“https://www.tripadvisor.com/Attraction_Review-g297697-d1772185-Reviews-Kuta_Beach_Bali-Kuta_Kuta_District_Bali.html#REVIEWS")
> Bali
Dapat dilihat hasilnya seperti berikut,
Kemudian lakukan scraping pada SelectorGadget untuk melihat posisi ulasan pengunjung
Lalu masukkan lagi ke R dengan script sebagai berikut
> review <- html_nodes(Bali,”.cPQsENeY”)
> reviewtext <- html_text(review)
> reviewtext
tampak hasilnya,
Lalu, bersihkan data hasil scraping dengan menggunakan script berikut. Jika terdapat huruf “n” dan lainnya yang tidak diperlukan. Kemudian simpan hasilnya dalam csv.
> reviewtextbaru<-gsub(“n”,””,reviewtext)
> reviewtextbaru
> write.csv(reviewtextbaru,”E://New folder/reviewtextbaru.csv”)
Hasilnya tersimpan pada folder yang telah dibuat
Berikut tampilan dari microsoft excel reviewtextbaru
Kemudian bersihkan datanya dengan cara menghapus baris pertama karena tidak memuat komentar pengunjung (,”x”) dan save
Install packages tambahan untuk analisa selanjutnya
> install.packages("tm")
> library(tm)> install.packages("SnowballC")
> library(SnowballC)> install.packages("wordcloud")
> library(wordcloud)> install.packages("RColorBrewer")
> library(RColorBrewer)> install.packages("stringr")
> library(stringr)
nampak hasilnya sebagai berikut
Setelah itu gunakan script berikut untuk membaca kembali dokumen yang berada dalam folder buat menjadi Corpus
> dokumen <- readLines(“E://New folder/reviewtextbaru.csv”)
> dokumen> dokumen <- VCorpus(VectorSource(dokumen))
> dokumen
Sehingga hasilnya
Kemudian tampilkan struktur dari dokumen
> str(dokumen)
tampak hasilnya sebagai berikut
Jika perintah “str(dokumen)” tidak muncul tampilan seperti diatas atau tidak dapat digunakan, maka pada perintah sebelumnya ganti dengan perintah “dokumen <- Corpus(VectorSource(dokumen))”. Selanjutnya, untuk menampilkan dokumen pada setiap baris maka menggunakan script berikut
> dokumen[[1]]
> dokumen[[2]]$content
sehingga hasilnya
Selanjutnya buat matriks kata-kata dalam dokumen dengan script berikut
> dokumenDTM <-DocumentTermMatrix(dokumen,control=list(tolower=TRUE,
removeNumbers=TRUE,
stopwords=TRUE,
removePunctuation=TRUE,
stemming=TRUE))
> dokumenDTM
hasilnya
Berdasarkan output diatas, dari 5 dokumen terdapat 92 kata yang berbeda.
Kemudian menampilkan daftar kata-kata yang diurutkan secara abjad atau lexical dan dianggap sebagai kolom, pada perintah inspect hanya diperlihatkan 10 kata-kata pertama saja.
Misalkan pada dokumen ke-1 kata “airport” muncul 1 kali, kata “bali” tidak muncul, kata “beach” muncul 4 kali dan seterusnya.
Jika ingin menampilkan lebih detail tentang struktur dokumenDTM maka menggunakan script berikut
str(dokumenDTM)
hasilnya
Berikut adalah kata-kata yang ditampilkan dalam bentuk matriks
> dokumenDTM$dimnames$Terms
[1] "airport" "all" "along" "also" "around" "away" "back" "bali"
[9] "beach" "beach…" "beauti" "beer" "befor" "beginn" "both" "brother"
[17] "busier" "catch" "choic" "clean" "collect" "colour" "due" "effort"
[25] "end" "enjoy" "especi" "facil" "fan" "get" "gonna" "good"
[33] "great" "guess" "guest" "holiday" "hope" "hotel" "howev" "intern"
[41] "itself" "just" "kuta" "last" "learn" "local" "long" "look"
[49] "love" "made" "make" "mani" "min" "much" "never" "nice"
[57] "night" "normal" "not" "open" "pandem" "pandemi" "peopl" "poppi"
[65] "pretti" "quit" "realli" "sad" "sand" "saw" "secur" "sell"
[73] "shells…" "show" "snak" "soon" "step" "stop" "sunset" "surf"
[81] "surfer" "thing" "time" "total" "tourism" "tri" "walk" "want"
[89] "water" "way" "worth" "yesterday"
Selanjutnya untuk menampilkan kata-kata yang mempunyai frekuensi 3 kali muncul atau lebih dan kata-kata yang mempunyai kemunculan 4 kali atau lebih, dapat menggunakan script berikut
> dokumenfreq<-findFreqTerms(dokumenDTM,3)
> dokumenfreq
> dokumenfreq<-findFreqTerms(dokumenDTM,4)
> dokumenfreq
hasilnya
Kemudian untuk menampilkan struktur matriks dari dokumen dan membuat matriks, maka dapat menggunakan script berikut
> dokkudtm <- TermDocumentMatrix(dokumen)
> em <- as.matrix(dokkudtm)
> em
nampak hasilnya
> em
Docs
Terms 1 2 3 4 5
""" 0 0 0 1 1
"1,""we 1 0 0 0 0
"2,""kuta 0 1 0 0 0
"3,""both 0 0 1 0 0
"4,""so 0 0 0 1 0
"5,""not 0 0 0 0 1
(poppies 0 1 0 0 0
about 1 0 0 0 1
after 0 1 0 0 1
airport 1 0 0 1 0
all. 0 0 0 0 1
along 0 0 1 0 0
also 0 0 1 0 0
and 2 0 1 0 0
are 1 0 0 0 0
aren't 0 0 1 0 0
around, 0 0 0 0 1
away 0 1 0 0 0
back 0 0 0 1 0
bali 0 0 0 3 0
beach 1 2 3 1 1
beach. 1 0 0 0 0
beach.…""" 1 0 0 0 0
beautiful 0 0 1 0 0
been 0 0 0 0 1
beer. 1 0 0 0 0
before. 0 0 0 0 1
beginners. 0 1 0 0 0
brother 0 0 1 0 0
busier 0 1 0 0 0
catch 0 0 1 0 0
choice 1 0 0 0 0
clean 1 0 0 0 1
collect 0 0 1 0 0
colours 0 0 1 0 0
did 1 0 1 0 0
didn't 1 0 0 0 0
due 0 0 0 0 1
effort 0 0 1 0 0
end 0 0 0 1 0
enjoyed 0 0 1 0 0
especially 0 1 0 0 0
facilities 1 0 0 0 0
fans, 0 0 1 0 0
few 0 1 1 0 0
for 1 3 1 1 0
from 0 1 0 0 0
getting 0 1 0 0 0
gonna 1 0 0 0 0
good 1 0 0 0 1
great 0 1 1 0 0
guess 1 0 0 0 1
guess, 0 1 0 0 0
guest 0 0 0 1 0
have 1 0 0 0 0
here 1 0 0 0 0
holiday. 0 0 1 0 0
hope 0 0 0 3 0
hotel 0 1 0 0 0
hotel). 0 1 0 0 0
how 1 0 0 0 0
however, 0 0 1 0 0
international 0 0 0 1 0
it, 0 0 1 0 0
its 1 0 0 0 0
itself, 1 0 0 0 0
just 0 0 0 1 0
kuta 1 0 1 1 0
last 0 0 1 0 0
learn 1 0 0 0 0
local 1 0 0 0 0
long 1 0 0 0 0
looking 0 0 0 1 0
love 0 0 0 1 0
made 0 0 1 0 0
make 0 0 1 0 0
many 0 0 0 0 1
min. 1 0 0 0 0
much 2 0 0 0 0
never 0 0 0 0 1
nice. 1 0 0 0 0
night 0 0 1 0 0
normal 0 0 0 1 0
not 1 0 0 0 0
opening 0 0 0 1 0
our 1 1 1 0 0
pandemi 0 0 0 1 0
pandemi. 0 0 0 0 1
pandemic 0 0 0 0 1
people 1 0 0 0 1
pretty 0 0 1 0 0
quite, 0 0 0 1 0
really 0 0 1 0 0
sad 0 0 0 1 0
sand 1 0 0 0 0
saw 1 0 0 0 0
security 0 0 0 1 0
sell 1 0 0 0 0
shells.…""" 0 0 1 0 0
show. 0 0 1 0 0
snaks 1 0 0 0 0
some 1 0 0 1 0
soon, 0 0 0 3 0
steps 0 1 0 0 0
stop 1 0 0 0 0
sunset 0 1 1 0 0
surf 1 0 0 0 0
surfers 1 0 0 0 0
surfing, 0 1 0 0 0
the 3 0 4 0 1
there 1 0 0 0 0
there's 0 0 0 0 1
thing 0 0 0 0 1
this 0 0 0 1 1
time 1 0 0 0 0
time.""" 0 1 0 0 0
totally 0 0 1 0 0
tourism 0 0 0 1 0
try 1 0 0 0 0
very 1 0 0 0 0
walk 0 0 1 0 0
want 1 0 0 0 0
was 1 1 1 0 0
water 1 0 0 0 0
way 1 0 0 0 0
were 0 0 0 0 1
who 1 0 0 0 0
with 0 0 0 1 0
worth 0 0 1 0 0
yesterday, 0 0 0 1 0
you 1 0 0 0 0
lanjutkan dengan script berikut
> ve <- sort(rowSums(em),decreasing=TRUE)
> ve
maka hasilnya
> ve
beach the for and bali hope kuta
8 8 6 3 3 3 3
our soon, was “”” about after airport
3 3 3 2 2 2 2
clean did few good great guess much
2 2 2 2 2 2 2
people some sunset this “1,””we “2,””kuta “3,””both
2 2 2 2 1 1 1
“4,””so “5,””not (poppies all. along also are
1 1 1 1 1 1 1
aren’t around, away back beach. beach.…””” beautiful
1 1 1 1 1 1 1
been beer. before. beginners. brother busier catch
1 1 1 1 1 1 1
choice collect colours didn’t due effort end
1 1 1 1 1 1 1
enjoyed especially facilities fans, from getting gonna
1 1 1 1 1 1 1
guess, guest have here holiday. hotel hotel).
1 1 1 1 1 1 1
how however, international it, its itself, just
1 1 1 1 1 1 1
last learn local long looking love made
1 1 1 1 1 1 1
make many min. never nice. night normal
1 1 1 1 1 1 1
not opening pandemi pandemi. pandemic pretty quite,
1 1 1 1 1 1 1
really sad sand saw security sell shells.…”””
1 1 1 1 1 1 1
show. snaks steps stop surf surfers surfing,
1 1 1 1 1 1 1
there there’s thing time time.””” totally tourism
1 1 1 1 1 1 1
try very walk want water way were
1 1 1 1 1 1 1
who with worth yesterday, you
1 1 1 1 1
untuk melihat 6 data terbesar dapat menggunakan script berikut
> de <- data.frame(word = names(ve),freq=ve)
> head(de, 15)
> str(de)
> de$word
> de$freq
hasilnya
> head(de, 15)
word freq
beach beach 8
the the 8
for for 6
and and 3
bali bali 3
hope hope 3
kuta kuta 3
our our 3
soon, soon, 3
was was 3
""" """ 2
about about 2
after after 2
airport airport 2
clean clean 2
> str(de)
'data.frame': 131 obs. of 2 variables:
$ word: Factor w/ 131 levels """"",""1,""we",..: 21 110 46 14 20 58 68 86 103 123 ...
$ freq: num 8 8 6 3 3 3 3 3 3 3 ...> de$word
[1] beach the for and bali hope kuta
[8] our soon, was “”” about after airport
[15] clean did few good great guess much
[22] people some sunset this “1,””we “2,””kuta “3,””both
[29] “4,””so “5,””not (poppies all. along also are
[36] aren’t around, away back beach. beach.…””” beautiful
[43] been beer. before. beginners. brother busier catch
[50] choice collect colours didn’t due effort end
[57] enjoyed especially facilities fans, from getting gonna
[64] guess, guest have here holiday. hotel hotel).
[71] how however, international it, its itself, just
[78] last learn local long looking love made
[85] make many min. never nice. night normal
[92] not opening pandemi pandemi. pandemic pretty quite,
[99] really sad sand saw security sell shells.…”””
[106] show. snaks steps stop surf surfers surfing,
[113] there there’s thing time time.””” totally tourism
[120] try very walk want water way were
[127] who with worth yesterday, you
131 Levels: “”” “1,””we “2,””kuta “3,””both “4,””so “5,””not (poppies about after airport all. along … you> de$freq
[1] 8 8 6 3 3 3 3 3 3 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
[53] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
[105] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
Kemudian untuk menampilkan wordcloud maka dapat menggunakan script berikut
> wordcloud(words = de$word, freq = de$freq, min.freq = 1,
max.words=50, random.order=FALSE, rot.per=0.35,
colors=brewer.pal(8, "Dark2"))
hasilnya sebagai berikut
Berdasarkan output diatas, stopwords yang digunakan dalam bentuk bahasa inggris, karena data yang discraping hanya ulasan pengunjung Kuta beach dalam bahasa inggris saja. Selain itu jarak antar kata per kata masih terlihat renggang, hal ini disebabkan data yang discraping hanya 5 ulasan pengunjung.
Untuk mengetahui asosiasi dari kata-kata yang sering muncul, misalnya pada kata “bali”, “kuta”, dan “beach”, dapat menggunakan script berikut
> vee <- as.list(findAssocs(dokkudtm, terms =c(“bali”, “kuta”, “beach”), corlimit = c(0.15,0.15,0.15,0.15,0.15,0.15)))
> vee
sehingga hasil yang didapatkan
> vee
$bali
“4,””so back end guest hope international
1.00 1.00 1.00 1.00 1.00 1.00
just looking love normal opening pandemi
1.00 1.00 1.00 1.00 1.00 1.00
quite, sad security soon, tourism with
1.00 1.00 1.00 1.00 1.00 1.00
yesterday, “”” airport some this
1.00 0.61 0.61 0.61 0.61$kuta
airport did some and the “1,””we
0.67 0.67 0.67 0.61 0.55 0.41
“3,””both “4,””so along also are aren’t
0.41 0.41 0.41 0.41 0.41 0.41
back beach. beach.…””” beautiful beer. brother
0.41 0.41 0.41 0.41 0.41 0.41
catch choice collect colours didn’t effort
0.41 0.41 0.41 0.41 0.41 0.41
end enjoyed facilities fans, gonna guest
0.41 0.41 0.41 0.41 0.41 0.41
have here holiday. hope how however,
0.41 0.41 0.41 0.41 0.41 0.41
international it, its itself, just last
0.41 0.41 0.41 0.41 0.41 0.41
learn local long looking love made
0.41 0.41 0.41 0.41 0.41 0.41
make min. much nice. night normal
0.41 0.41 0.41 0.41 0.41 0.41
not opening pandemi pretty quite, really
0.41 0.41 0.41 0.41 0.41 0.41
sad sand saw security sell shells.…”””
0.41 0.41 0.41 0.41 0.41 0.41
show. snaks soon, stop surf surfers
0.41 0.41 0.41 0.41 0.41 0.41
there time totally tourism try very
0.41 0.41 0.41 0.41 0.41 0.41
walk want water way who with
0.41 0.41 0.41 0.41 0.41 0.41
worth yesterday,you our was
0.41 0.41 0.41 0.17 0.17$beach
few great sunset “3,””both along also aren’t
0.92 0.92 0.92 0.88 0.88 0.88 0.88
beautiful brother catch collect colours effort enjoyed
0.88 0.88 0.88 0.88 0.88 0.88 0.88
fans, holiday.however, it, last made make
0.88 0.88 0.88 0.88 0.88 0.88 0.88
night pretty really shells.…”””show. totally walk
0.88 0.88 0.88 0.88 0.88 0.88 0.88
worth our was the did for “2,””kuta
0.88 0.61 0.61 0.49 0.41 0.36 0.25
(poppies away beginners. busier especially from getting
0.25 0.25 0.25 0.25 0.25 0.25 0.25
guess, hotel hotel). steps surfing, time.”””
0.25 0.25 0.25 0.25 0.25 0.25
Berdasarkan output diatas, kata “bali” mempunyai hubungan asosiasi yang erat dengan kata “love” (1.00) dan “tourism” (1.00), begitupun dengan yang lainnya, atau dapat diinterpretasikan dengan asosiasi kata yang lainnya.
Setelah melakukan asosiasi dari kata per kata, dilanjutkan dengan sentiment analysis
Apa yang dimaksud dengan Sentiment Analysis ?
Sentiment analysis adalah teknik dalam mengekstrak informasi berupa pandangan (sentimen) seseorang terhadap suatu isu atau kejadian. [2]
Install packages untuk analisis sentimen
> install.packages("syuzhet")
> library(syuzhet)
Lalu untuk menampilkan 8 analisis sentimen negatif dan positif maka dapat menggunakan script berikut
> get_nrc_sentiment(‘happy’)
> get_nrc_sentiment(‘excitement’)
nampak hasilnya
Lalu untuk menghubungkan hasil dari 8 analisis sentimen dengan hasil reviewtextbaru, dapat menggunakan script berikut
> s <- get_nrc_sentiment(reviewtextbaru)
> review_sentiment <- cbind(reviewtextbaru,s)
> review_sentiment
didapatkan hasil sebagai berikut
Berdasarkan output diatas, ulasan pengunjung pertama menunjukkan analisis sentimen positif, hal ini dapat dilihat dari kata yang menunjukkan klasifikasi “anticipation ” sebanyak 4, “joy” sebanyak 4, “surprise” sebanyak 2, “trust” sebanyak 2, dan “positive” sebanyak 5. Begitupun dengan ulasan lainnya.
Terakhir untuk menampilkan plot dari analisis sentimen ulasan pengunjung Kuta Beach dapat menggunakan script berikut
> barplot(colSums(s),col = rainbow(10),ylab = ‘Count’, main = ‘Sentiment score for Kuta Beach reviews’
hasilnya
Berdasarkan plot diatas, dapat dilihat bahwa sebagian besar ulasan pengunjung Kuta Beach menunjukkan ulasan positif.
Notes : Analisis sentimen yang dilakukan merupakan solusi cepat dan tidak menutup kemungkinan jika tidak dapat mendeteksi kata seperti “tidak baik/tidak buruk” dengan tepat dan benar
Sekian gambaran dari ulasan pengunjung terhadap Kuta Beach-Bali
Wassalamualaikum wr. wb.
[1.] https://id.wikipedia.org/wiki/Penambangan_teks
[2.] https://medium.com/@irvanseptiar/introduction-sentiment-analysis-mudah-5785f88e435d
[3.] https://medium.com/@986110101/text-mining-using-r-28ada2abb883