Game of Thrones Tweet
Background
Halo! Pada artikel kali ini saya akan berbagi cara bagaimana melakukan crawling data dari twitter dengan menggunakan twitter’s API. Sebelum melakukan crawling data dari twitter, saya ingin memberi tahu bagaimana cara memperoleh API token twitter kita. Caranya gampang-gampang susah, tapi sebenarnya gampang, tergantung dari kita sudah menjawab dan mengisi form persyaratan pemerolehan API twitter dengan jelas atau belum.
Okey kalau begitu langsung saja. Ikuti langkah berikut untuk memperoleh twitter’s API.
- Buat akun twitter terlebih dahulu jika belum memiliki akun di
http://twitter.com. - Masuk ke https://dev.twitter.com/apps dan log in pada akun twittermu.
- Klik “Create New App” dan isilah seluruh form yang ada.
- Klik “Agree” pada user condition.
- Pada tab “Keys and Access Tokens”, copy consumer key, consumer secret, access token, dan access key yang akan digunakan untuk crawling.
Library Used
Setelah berhasil memperoleh Keys and Access Token, kita gunakan beberapa packages yang ada dibawah ini untuk melakukan crawling data.
Crawling Data
Authentication Token
Selanjutnya kita gunakan code berikut untuk melakukan autentikasi terhadap twitter kita.
# crawling twitter using rtweet
# insert your token and remove the "#"
token <- create_token(app = "xxxXxxxXxxxx",
consumer_key = "xxxXxxxxXxxxxXxxxxXxxxxx",
consumer_secret = "xxxXxxxxXxxxxXxxxxXxxxxx ",
access_token = "xxxXxxxxXxxxxXxxxxXxxxxx-xxxXxxxxXxxxxXxxxxXxxxxx",
access_secret = "xxxXxxxxXxxxxXxxxxXxxxxx")Jika sudah berhasil melakukan connecting dan autentikasi, kita bisa menyimpan token yang telah kita dapatkan sehingga kita tidak perlu melakukan autentikasi ulang. Saya beri nama token pada token yang telah saya dapatkan tadi.
Setelah itu, kita bisa langsung mengambil data dari twitter sesuai yang kita inginkan. Perlu diingat, data yang diambil dari twitter bisa berupa tweet, hashtags, mentions, dan retweets.
Get Tweets
Untuk kali ini, saya akan mengambil data yang berisi tweet Game of Thrones dengan tweet maksimum sebanyak 10.000 tweet.
# retrieve 10000 tweets mentioning Game of Thrones
tweets <- search_tweets("Game of Thrones",n = 10e4,
include_rts = TRUE)Selanjutnya saya melakukan crawling tweet lagi dengan hashtags #GameofThrones.
Untuk melihat gambaran data yang telah berhasil dicrawling, maka kita bisa lihat dengan 3 data awal saja pada tweet yang saya simpan dengan nama objek tweet.
##
## 1 function (text, ...)
## 2 {
## 3 return(updateStatus(text, ...))
Tadi kita punya dua objek data yang berisi tweet yang berhasil kita crawling. Selanjutnya akan saya gabungkan menjadi satu data frame dengan nama objek all_tweet dan akan saya simpan berupa file .csv dan file .rds sehingga apabila sewaktu-waktu saya akan menggunakan datanya kembali saya tinggal melalukan import data.
# combine data frame
all_tweet <- rbind(tweets, got)
# change list data on data frame
all_tweet$hashtags <- vapply(all_tweet$hashtags, paste, collapse = ", ", character(1L))
all_tweet$symbols <- vapply(all_tweet$symbols, paste, collapse = ", ", character(1L))
all_tweet$urls_url <- vapply(all_tweet$urls_url, paste, collapse = ", ", character(1L))
all_tweet$urls_t.co <- vapply(all_tweet$urls_t.co, paste, collapse = ", ", character(1L))
all_tweet$urls_expanded_url <- vapply(all_tweet$urls_expanded_url, paste, collapse = ", ", character(1L))
all_tweet$media_url <- vapply(all_tweet$media_url, paste, collapse = ", ", character(1L))
all_tweet$media_t.co <- vapply(all_tweet$media_t.co, paste, collapse = ", ", character(1L))
all_tweet$media_expanded_url <- vapply(all_tweet$media_expanded_url, paste, collapse = ", ", character(1L))
all_tweet$media_type <- vapply(all_tweet$media_type, paste, collapse = ", ", character(1L))
all_tweet$ext_media_url <- vapply(all_tweet$ext_media_url, paste, collapse = ", ", character(1L))
all_tweet$ext_media_t.co <- vapply(all_tweet$ext_media_t.co, paste, collapse = ", ", character(1L))
all_tweet$ext_media_expanded_url <- vapply(all_tweet$ext_media_expanded_url, paste, collapse = ", ",
character(1L))
all_tweet$mentions_user_id <- vapply(all_tweet$mentions_user_id, paste, collapse = ", ", character(1L))
all_tweet$mentions_screen_name <- vapply(all_tweet$mentions_screen_name, paste, collapse = ", ",
character(1L))
all_tweet$geo_coords <- vapply(all_tweet$geo_coords, paste, collapse = ", ", character(1L))
all_tweet$coords_coords <- vapply(all_tweet$coords_coords, paste, collapse = ", ", character(1L))
all_tweet$bbox_coords <- vapply(all_tweet$bbox_coords, paste, collapse = ", ", character(1L))# karena data terlalu besar, saya split
intrain <- sample(nrow(all_tweets), nrow(all_tweets)*0.5)
all_tweets <- all_tweets[intrain,]Karena ada beberapa variabel yang mungkin tidak diperlukan nantinya, maka akan saya lakukan penghapusan beberapa variabel yang memiliki nilai NA atau missing value lebih dari 15.000.
library(dplyr)
clean_tweet <- all_tweets %>%
dplyr::select(-c(reply_to_status_id, reply_to_user_id, reply_to_screen_name, ext_media_type, quoted_status_id,
quoted_text, quoted_created_at, quoted_source, quoted_favorite_count, quoted_retweet_count,
quoted_user_id, quoted_screen_name, quoted_name, quoted_followers_count,
quoted_friends_count, quoted_statuses_count, quoted_location, quoted_description,
place_url, place_name, place_full_name, place_type, country, country_code))Selanjutnya, saya ingin melihat summary dari tweets tentang Game of Thrones yang berhasil saya peroleh hari ini berdasarkan waktu tweet tersebut dibuat/dipost.
## Min. 1st Qu. Median
## "2019-05-13 08:22:19" "2019-05-13 09:13:45" "2019-05-13 10:01:46"
## Mean 3rd Qu. Max.
## "2019-05-13 10:37:48" "2019-05-13 12:03:49" "2019-05-13 12:08:44"
Dari sini kita dapat tahu bahwa tweets yang saya peroleh yaitu dimulai dari pukul 08:22 AM hingga 12:08 PM pada tanggal 13 Mei 2019.
Sebelumya saya sudah pernah melakukan crawling tweets tentang Game of Thrones. Berikut summary dari tweets tersebut dibuat.
## Min. 1st Qu. Median
## "2019-05-11 23:58:46" "2019-05-12 00:56:30" "2019-05-12 01:57:10"
## Mean 3rd Qu. Max.
## "2019-05-12 02:01:41" "2019-05-12 03:07:16" "2019-05-12 04:20:33"
Untuk tweets yang pernah saya crawling sebelumnya, saya memperoleh tweets mengenai Game of Thrones dari pukul 23:58 pada tanggal 11 Mei 2019 hingga 04:20 pada tanggal 12 Mei 2019.
Frequency of Game of Thrones
Jika kita bandingkan tweets yang muncul per menitnya tanpa menghiraukan hari yang ada adalah sebagai berikut.
yesterday <- ts_plot(tw, "1 minutes", col = "#9D8221") +
labs(
x = NULL, y = NULL,
title = "Frequency of Game of Thrones status on May 11-12, 2019",
caption = "\nSource: Data collected from Twitter's REST API via rtweet"
) +
theme(plot.title = element_text(face = "bold", colour = "#e9eec9", hjust = 0.5),
plot.caption = element_text(colour = "#e9eec9"),
axis.text = element_text(colour = "#9D8221"),
plot.background = element_rect(fill = "#5E0606"),
panel.background = element_rect(fill = "#bbbbbb"),
panel.grid.minor.x = element_blank(),
panel.grid.minor.y = element_blank())
now <- ts_plot(all_tweets, "1 minutes", col = "#9D8221") +
labs(
x = NULL, y = NULL,
title = "Frequency of Game of Thrones status on May 13, 2019",
caption = "\nSource: Data collected from Twitter's REST API via rtweet"
) +
theme(plot.title = element_text(face = "bold", colour = "#e9eec9", hjust = 0.5),
plot.caption = element_text(colour = "#e9eec9"),
axis.text = element_text(colour = "#9D8221"),
plot.background = element_rect(fill = "#5E0606"),
panel.background = element_rect(fill = "#bbbbbb"),
panel.grid.minor.x = element_blank(),
panel.grid.minor.y = element_blank())
par(mfrow = c(1,2))
ggplotly(yesterday)Cleaning Text
Selanjutnya adalah proses cleaning text unutk dijadikan word cloud.
##Cleaning data
removeURL <- function(x) gsub("http[^[:space:]]*", "", x)
twitclean <- tm_map(komenc, removeURL)
removeNL <- function(y) gsub("\n", " ", y)
twitclean <- tm_map(twitclean, removeNL)
replacecomma <- function(y) gsub(",", "", y)
twitclean <- tm_map(twitclean, replacecomma)
removeRT <- function(y) gsub("RT ", "", y)
twitclean <- tm_map(twitclean, removeRT)
removetitik2 <- function(y) gsub(":", "", y)
twitclean <- tm_map(twitclean, removetitik2)
removetitikkoma <- function(y) gsub(";", " ", y)
twitclean <- tm_map(twitclean, removetitikkoma)
removetitik3 <- function(y) gsub("p…", "", y)
twitclean <- tm_map(twitclean, removetitik3)
removeamp <- function(y) gsub("&", "", y)
twitclean <- tm_map(twitclean, removeamp)
removeUN <- function(z) gsub("@\\w+", "", z)
twitclean <- tm_map(twitclean, removeUN)
remove.all <- function(xy) gsub("[^[:alpha:][:space:]]*", "", xy)
twitclean <- tm_map(twitclean,remove.all)
twitclean <- tm_map(twitclean, removePunctuation)
twitclean <- tm_map(twitclean, tolower)#Menghapus stopword
twitclean <- tm_map(twitclean, removeWords, stopwords("english"))
twitclean_new <- tm_map(twitclean, removePunctuation)
# menghapus imbuhan
library(SnowballC)
twitclean_new <- tm_map(twitclean_new, stemDocument) # merubah kata imbuhan menjadi kata dasar.
twitclean_new <- tm_map(twitclean_new, stripWhitespace) # untuk remove extra spasi. jadi hasilnya single spasi.#Menghapus stopword manual
twitclean <- tm_map(twitclean_new, removeWords,
c('of','the', 'and'))
twitclean[[1]]$content## [1] "game throne mother day quit remind everyon love die eat arbi"
#Build a term-document matrix
{
dtm <- TermDocumentMatrix(twitclean)
m <- as.matrix(dtm)
v <- sort(rowSums(m),decreasing=TRUE)
d <- data.frame(word = names(v),freq=v)
}## word freq
## gameofthron gameofthron 8114
## throne throne 7739
## game game 7691
## daeneri daeneri 1917
## episod episod 1727
## season season 1696
## que que 1554
## cersei cersei 1265
## like like 1212
## got got 1212
Word Cloud Game of Thrones
library(wordcloud2)
wordcloud2(d,shape = "cloud",
backgroundColor = "black",
color = 'random-light' ,
size = 0.5)Jika kita ingin melihat hubungan antar kata dari arya dengan nilai korelasi antara 0.3 dan 0.2 diperoleh kata yang berhubungan adalah sebagai berikut.
## $arya
## dond reaparec escena muri parec
## 0.55 0.55 0.54 0.49 0.48