Data yang akan digunakan dalam melakukan analisis text mining adalah dengan menggunakan data yang ada pada Twitter. Sbelum melakukan pengambilan data pastikan sudah memiliki akses token dan juga APIs pada https://developer.twitter.com
Pastikan package untuk mengambil data pada Twitter telah ter-install (rtweet) dan package yang akan mendukung output yang diinginkan (ex:tidyverse)
# Load packages
library(rtweet)
library(tidyverse)
Memasukkan keempat nilai token yang telah di peroleh dari developer twitter
# Twitter authentication
create_token(
app = "my_twitter_research_app",
consumer_key = consumer_key,
consumer_secret = consumer_secret,
access_token = access_token,
access_secret = access_secret)
## <Token>
## <oauth_endpoint>
## request: https://api.twitter.com/oauth/request_token
## authorize: https://api.twitter.com/oauth/authenticate
## access: https://api.twitter.com/oauth/access_token
## <oauth_app> my_twitter_research_app
## key: DDzW10CxOVC1ST877s8ZbDJfq
## secret: <hidden>
## <credentials> oauth_token, oauth_token_secret
## ---
Mengembalikan status Twitter yang cocok dengan permintaan pencarian (Shopee) yang disediakan pengguna. Hanya dapat mengambil data dari 6-9 hari sebelumnya. Untuk mengembalikan lebih dari 18.000 status dalam satu panggilan, atur “retryonratelimit” ke TRUE.
# Retrieve tweets
tweets <- search_tweets("shopee", n = 20000, tweet_mode="extended")
## Searching for tweets...
## This may take a few seconds...
## Finished collecting tweets!
tweets <- distinct(tweets, text, .keep_all=TRUE)
Menampilkan frekuensi status Twitter shopee dari 9 hari terakhir. Dapat terlihat tweet dari 9 hari teakhir terus meningkat. Diduga karena pada tanggal 11.11.2018 menunjukkan adanya Hari Belanja Nasional (HARBOLNAS). Dan Shopee merupakan salah satu online shop yang meberikan diskon besar-besaran. Sehingga telihat grafik terus meningkat
## plot time series of tweets
ts_plot(tweets, "3 hours") +
theme_minimal() +
theme(plot.title = ggplot2::element_text(face = "bold")) +
labs(
x = NULL, y = NULL,
title = "Frequency of shopee Twitter statuses from past 9 days",
subtitle = "Twitter status (tweet) counts aggregated using three-hour intervals",
caption = "\nSource: Data collected from Twitter's REST API via rtweet"
)
Berikut beberapa tweet yang menyebutkan Shopee pada status Twitter netizen
tail(tweets, 5)
Sebelum membuat wordclod dari kata yang diinginkan, maka perlu melakukan penghapusan kata-kata ataupun atribut yang diprediksikan akan sering muncul namun tidak memiliki makna yang berarti terhadap kata yang diinginkan. Jika hal ini tidak dilakukan, maka akan memberikan hasil analisis yang kurang sesuai. Pastikan package tm telah terinstall
library(tm)
## Loading required package: NLP
##
## Attaching package: 'NLP'
## The following object is masked from 'package:ggplot2':
##
## annotate
# build a corpus, and specify the source to be character vectors
myCorpus <- Corpus(VectorSource(tweets$text))
# convert to lower case
myCorpus <- tm_map(myCorpus, content_transformer(tolower))
## Warning in tm_map.SimpleCorpus(myCorpus, content_transformer(tolower)):
## transformation drops documents
# remove URLs
removeURL <- function(x) gsub("http[^[:space:]]*", "", x)
myCorpus <- tm_map(myCorpus, content_transformer(removeURL))
## Warning in tm_map.SimpleCorpus(myCorpus, content_transformer(removeURL)):
## transformation drops documents
# remove anything other than English letters or space
removeNumPunct <- function(x) gsub("[^[:alpha:][:space:]]*", "", x)
myCorpus <- tm_map(myCorpus, content_transformer(removeNumPunct))
## Warning in tm_map.SimpleCorpus(myCorpus,
## content_transformer(removeNumPunct)): transformation drops documents
# remove stopwords
myStopwords <- c(setdiff(stopwords('english'), c("r", "big")), "use", "see", "used", "via", "amp", "shopee")
stopwords_id <- read.table('stopwords-id.txt', header = FALSE)
myStopwords <- c(myStopwords, as.matrix(stopwords_id$V1), "hi", "yg")
myCorpus <- tm_map(myCorpus, removeWords, myStopwords)
## Warning in tm_map.SimpleCorpus(myCorpus, removeWords, myStopwords):
## transformation drops documents
# remove extra whitespace
myCorpus <- tm_map(myCorpus, stripWhitespace)
## Warning in tm_map.SimpleCorpus(myCorpus, stripWhitespace): transformation
## drops documents
# keep a copy for stem completion later
myCorpusCopy <- myCorpus
tdm <- TermDocumentMatrix(myCorpus, control = list(wordLengths = c(1, Inf)))
tdm
## <<TermDocumentMatrix (terms: 6783, documents: 2462)>>
## Non-/sparse entries: 23093/16676653
## Sparsity : 100%
## Maximal term length: 41
## Weighting : term frequency (tf)
freq.terms <- findFreqTerms(tdm, lowfreq = 5)
freq.terms[1:50]
## [1] "la" "lazada" "nak" "tasrif"
## [5] "dm" "exo" "free" "help"
## [9] "k" "kpopsellbuyina" "kpopsellingina" "minat"
## [13] "ongkir" "photocard" "plz" "price"
## [17] "rt" "x" "barang" "cek"
## [21] "beli" "pee" "shopeeid" "dah"
## [25] "duit" "like" "selamat" "zalora"
## [29] "goyang" "grup" "join" "one"
## [33] "wanna" "coins" "mall" "kpop"
## [37] "kuis" "special" "buy" "really"
## [41] "want" "bumili" "sa" "shopeeth"
## [45] "ko" "lt" "ni" "yung"
## [49] "drop" "im"
term.freq <- rowSums(as.matrix(tdm))
term.freq <- subset(term.freq, term.freq >= 150)
df <- data.frame(term = names(term.freq), freq = term.freq)
ggplot(df, aes(x=term, y=freq)) + geom_bar(stat="identity") +
xlab("Terms") + ylab("Count") + coord_flip() +
theme(axis.text=element_text(size=7))
library(wordcloud)
## Loading required package: RColorBrewer
m <- as.matrix(tdm)
# calculate the frequency of words and sort it by frequency
word.freq <- sort(rowSums(m), decreasing = T)
# colors
pal <- brewer.pal(9, "BuGn")[-(1:4)]
Dapat terlihat dariwrdcloud berikut shopee identik dengan kata grup, goyang dan koin. Terbukti saat ini shopee baru saja menambah fitur Grup Hemat.Grup Hemat merupakan promo di mana dapat membeli produk bersama teman dengan harga yang lebih murah. Dan juga shopee sangat identik dengan Goyang Shopee, dengan tujuan untuk mendapatkan banyak koin yang nantinya koin tersebut dapat menghemat dalam berbelanja
wordcloud(words = names(word.freq), freq = word.freq, min.freq = 100,
random.order = F, colors = pal)