Extracting Tweets

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

Retrieve tweets from Twitter

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)

Tweets Description

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)

Text Cleaning

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 corpus

# 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

Frequent Words

Build Term Document Matrix

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)

Top Frequent Terms

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))

Wordcloud

Build Wordcloud

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)