Best Tutorial: Scraping dan Visualisasi Trending Topic Twitter dengan R

Scraping trending topic Twitter dengan R

Salam sehat teman-teman, kita berjumpa kembali pada blog sederhana ini. Pada unggahan sebelumnya, kita telah membahas mengenai machine learning berjenis supervised learning, yaitu model Decision Tree untuk klasifikasi sekaligus regresi dan step by step praktiknya dengan R. Bagi teman-teman yang berminat menyimak keseruannya, bisa mengunjungi tautan ini.

Kali ini kita akan melanjutkan belajar dan berbagi mengenai bagaimana cara melakukan scraping topik yang sedang trending di Twitter menggunakan R. Beberapa unggahan sebelumnya, dalam blog ini sebenarnya telah membahas mengenai aktivitas scraping, namun penerapannya adalah pada blog atau website. Teman-teman yang berminat mempelajari cara web scraping, bisa berkunjung pada tautan berikut. Inti dari scraping sendiri merupakan aktivitas hacking untuk memperoleh sebagian data atau informasi atau informasi tertentu secara langsung pada sebuah page atau laman baik itu media sosial, blog, atau lainnya sedemikian rupa untuk diolah menjadi sebuah informasi baru yang bermanfaat sekaligus menambah insight bagi pengguna data atau informasi tersebut.

Hal terpenting yang harus dilakukan dalam scraping adalah bagaimana kita menerapkan etika yang baik sebelum mendapatkan data atau informasi pada sebuah page. Salah satunya etika yang biasa diterapkan adalah dengan melihat status data atau informasi pada sebuah page atau laman tertentu, diperbolehkan melakukan scraping atau tidak. Hal ini bisa kita terapkan dengan menggunakan robots.txt.

Misalkan kita akan melakukan scraping berita dari detik.com, maka etika kita untuk melihat status laman tersebut diperbolehkan atau tidak adalah dengan melihat status atau warning menggunakan "https://www.detik.com/robots.txt", setelah kita enter akan muncul keterangan berikut:

Status robots.txt detik.com sebelum melakukan scraping berita

Itu kalau website atau situs. Lantas bagaimana etika untuk melakukan scraping media sosial Twitter? Uniknya, untuk melakukan baik scraping maupun crawling, Twitter menyediakan fasilitas bagi kita untuk menjadi developernya. Untuk menjadi developer Twitter, sejumlah tahapan diperlukan dengan memenuhi sejumlah syarat dan ketentuan yang ditetapkan oleh Twitter. Dengan menjadi developer inilah kita bisa memperoleh API Twitter sebagai sarana melakukan baik scraping maupun crawling data.

Kali ini, dengan menggunakan sarana tersebut, kita akan mencoba melakukan scraping topik yang sedang trending atau trending topic di Twitter kemudian kita akan memvisualisasikannya dalam bentuk awan kata (wordcloud) dengan menggunakan package wordcloud2 yang merupakan package pengembangan dari wordcloud serta untuk memperjelas visualisasi, kita juga akan menggunakan tampilan bar chart atau diagram batang menggunakan package ggplot2.

Untuk mendapatkan sejumlah Tweet dari Twitter, pada umumnya di R kita bisa memanfaatkan package rtweet untuk membuat token baru sebagai "jalan masuk" kita menggunakan API Twitter guna melakukan scraping kali ini. Untuk lebih tergambar lebih jelas, kita dapat mengikuti beberapa code dan hasil visualisasi sebagai berikut:

#Aktivasi Package rtweet
library(rtweet)
#Membuat Kredensial Akses Twitter dengan API
create_token(app = "xxxxxxxxxxxxxxx", consumer_key = "xxxxxxxxxxxxxxxxxxxxxx",
             consumer_secret = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
             access_token = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
             access_secret = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx")
## <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> xxxxxxxxxxxxxxx
##   key:    xxxxxxxxxxxxxxxxxxxxxx
##   secret: <hidden>
## <credentials> oauth_token, oauth_token_secret
## ---
#Melihat Trending Topic di Dunia
trend <- trends_available()
head(trend)
## # A tibble: 6 x 8
##   name      url                                      parentid country  woeid countryCode  code place_type
##   <chr>     <chr>                                       <int> <chr>    <int> <chr>       <int> <chr>     
## 1 Worldwide http://where.yahooapis.com/v1/place/1           0 ""           1 <NA>           19 Supername 
## 2 Winnipeg  http://where.yahooapis.com/v1/place/2972 23424775 "Canada"  2972 CA              7 Town      
## 3 Ottawa    http://where.yahooapis.com/v1/place/3369 23424775 "Canada"  3369 CA              7 Town      
## 4 Quebec    http://where.yahooapis.com/v1/place/3444 23424775 "Canada"  3444 CA              7 Town      
## 5 Montreal  http://where.yahooapis.com/v1/place/3534 23424775 "Canada"  3534 CA              7 Town      
## 6 Toronto   http://where.yahooapis.com/v1/place/4118 23424775 "Canada"  4118 CA              7 Town
#Melihat Trending Topic di Indonesia
trendindo <- get_trends("Indonesia")
head(trendindo)
## # A tibble: 6 x 9
##   trend         url   promoted_content query tweet_volume place  woeid as_of               created_at         
##   <chr>         <chr> <lgl>            <chr>        <int> <chr>  <int> <dttm>              <dttm>             
## 1 #SUMMER_X_TO~ http~ NA               %23S~        16053 Indo~ 2.34e7 2022-06-24 09:25:58 2022-06-19 12:25:55
## 2 SMAN 1        http~ NA               %22S~           NA Indo~ 2.34e7 2022-06-24 09:25:58 2022-06-19 12:25:55
## 3 TXT FEELS LI~ http~ NA               %22T~        27600 Indo~ 2.34e7 2022-06-24 09:25:58 2022-06-19 12:25:55
## 4 #TokocryptoK~ http~ NA               %23T~           NA Indo~ 2.34e7 2022-06-24 09:25:58 2022-06-19 12:25:55
## 5 #SmartphoneO~ http~ NA               %23S~        14432 Indo~ 2.34e7 2022-06-24 09:25:58 2022-06-19 12:25:55
## 6 SDN 1         http~ NA               %22S~           NA Indo~ 2.34e7 2022-06-24 09:25:58 2022-06-19 12:25:55
#Melihat Struktur data Keseluruhan
trendindo %>%
  glimpse()
## Rows: 50
## Columns: 9
## $ trend            <chr> "#SUMMER_X_TOGETHER", "SMAN 1", "TXT FEELS LIKE SUMMER", "#TokocryptoKeSurabaya", "~
## $ url              <chr> "http://twitter.com/search?q=%23SUMMER_X_TOGETHER", "http://twitter.com/search?q=%2~
## $ promoted_content <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ query            <chr> "%23SUMMER_X_TOGETHER", "%22SMAN+1%22", "%22TXT+FEELS+LIKE+SUMMER%22", "%23Tokocryp~
## $ tweet_volume     <int> 16053, NA, 27600, NA, 14432, NA, 68840, NA, NA, NA, NA, NA, NA, NA, 1016942, 17458,~
## $ place            <chr> "Indonesia", "Indonesia", "Indonesia", "Indonesia", "Indonesia", "Indonesia", "Indo~
## $ woeid            <int> 23424846, 23424846, 23424846, 23424846, 23424846, 23424846, 23424846, 23424846, 234~
## $ as_of            <dttm> 2022-06-24 09:25:58, 2022-06-24 09:25:58, 2022-06-24 09:25:58, 2022-06-24 09:25:58~
## $ created_at       <dttm> 2022-06-19 12:25:55, 2022-06-19 12:25:55, 2022-06-19 12:25:55, 2022-06-19 12:25:55~
#Melihat Volume Tweets dari Trending Topic
library(dplyr)
trendindo %>%
  select(trend, tweet_volume)
## # A tibble: 50 x 2
##    trend                     tweet_volume
##    <chr>                            <int>
##  1 #SUMMER_X_TOGETHER               16053
##  2 SMAN 1                              NA
##  3 TXT FEELS LIKE SUMMER            27600
##  4 #TokocryptoKeSurabaya               NA
##  5 #SmartphoneOPPOdariShopee        14432
##  6 SDN 1                               NA
##  7 #TOMORROW_X_TOGETHER             68840
##  8 #HBSBongkarKasusKM50                NA
##  9 Bangun Pertahanan Kita              NA
## 10 kerja fokus prabowo                 NA
## # ... with 40 more rows
#Memfilter Volume Tweets yang tidak NA
trendindo %>%
  select(trend, tweet_volume) %>%
  filter(tweet_volume != "NA")
## # A tibble: 27 x 2
##    trend                     tweet_volume
##    <chr>                            <int>
##  1 #SUMMER_X_TOGETHER               16053
##  2 TXT FEELS LIKE SUMMER            27600
##  3 #SmartphoneOPPOdariShopee        14432
##  4 #TOMORROW_X_TOGETHER             68840
##  5 nayeon                         1016942
##  6 Cinta Laura                      17458
##  7 Nestle                           18486
##  8 Left & Right                   1611240
##  9 Maria                           208737
## 10 FELIX 1ST SOLO FEATURE           50607
## # ... with 17 more rows
#Mengurutkan dari Volume Tweets yang terbanyak
trendindo %>%
  select(trend, tweet_volume) %>%
  filter(tweet_volume != "NA") %>%
  arrange(desc(tweet_volume))
## # A tibble: 27 x 2
##    trend                   tweet_volume
##    <chr>                          <int>
##  1 Left & Right                 1611240
##  2 SAFE FLIGHT LALISA           1532522
##  3 nayeon                       1016942
##  4 #LeftandRight                 853074
##  5 Sungwoon                      688908
##  6 BON VOYAGE KIM TAEHYUNG       421206
##  7 Music Bank                    234826
##  8 Maria                         208737
##  9 Carolina                      183464
## 10 Charles                        92568
## # ... with 17 more rows
#Memvisualisasikan Trending Topic Indonesia dengan Wordcloud
library(wordcloud2)
trendindo %>%
  select(trend, tweet_volume) %>%
  filter(tweet_volume != "NA") %>%
  arrange(desc(tweet_volume)) %>% 
  wordcloud2(size = 2, shape = "circle",minRotation = -pi/6, maxRotation = -pi/6,
             rotateRatio = 1)
Visualisasi Trending Topic Twitter Indonesia

#Visualisasi Tweets menurut waktu menit
trendindo %>%
  select(trend, tweet_volume) %>%
  filter(tweet_volume != "NA") %>%
  arrange(desc(tweet_volume)) -> barku
barku
## # A tibble: 27 x 2
##    trend                   tweet_volume
##    <chr>                          <int>
##  1 Left & Right                 1611240
##  2 SAFE FLIGHT LALISA           1532522
##  3 nayeon                       1016942
##  4 #LeftandRight                 853074
##  5 Sungwoon                      688908
##  6 BON VOYAGE KIM TAEHYUNG       421206
##  7 Music Bank                    234826
##  8 Maria                         208737
##  9 Carolina                      183464
## 10 Charles                        92568
## # ... with 17 more rows
library(ggplot2)
ggplot(data = barku, aes(x = reorder(trend, tweet_volume), y = tweet_volume, fill = as.factor(trend))) +
  geom_bar(stat = "identity") +
  theme(legend.position = "none") +
  coord_flip()+
  labs(x = "Trending Topik", y = "Frekuensi Tweet", caption = paste0("Sumber: Twitter, tanggal: ", Sys.Date())) +
  ggtitle("Barchart Trending Topik Twitter Indonesia")
plot of chunk unnamed-chunk-11
Bar Chart Trending Topic Twitter Indonesia

Terlihat bahwa visualisasi awan kata (wordcloud) dengan bar chart sedikit berbeda, karena pada wordcloud belum diatur lebih lanjut mengenai ukuran minimal atau rasio visualisasi wordcloud yang ditampilkan. Topik mengenai Left and Right dan SAFE FLIGHT LALISA tidak terlihat karena jumlah Tweetnya sangat besar. Sedangkan pada bar chart, kita dapat melihat seluruh trending topic dan lebih insightfull. Setidaknya, pada 24 Juni 2022 kemarin, terdapat 5 trending topic di Twitter Indonesia, yaitu Left and Right, SAFE FLIGHT LALISA, nayeon, #LeftandRight, dan Sungwoon, sepertinya topik-topik berkaitan dengan konser NCT DREAM, termasuk boygroup Korea masih menarik perhatian netizen Twitter di Indonesia.

Demikian sedikit ulasan mengenai bagaimana melakukan scraping Twitter menggunakan R. Bagi teman-teman yang berminat memperdalam pengetahuan bagaimana melakukan scapring dan crawling menggunakan R, saya telah menuliskannya dalam buku berjudul: Pengantar Data Mining dengan R Studio. Urgensi pembuatan buku tersebut adalah untuk mempersiapkan kita menuju gerbang Data Science dan Big Data serta perkembangan Artificial Intelligence yang begitu pesat saat ini. Pemesanan buku dapat melalui tautan berikut. Selamat memahami dan mempraktikkan!

Add Comments


EmoticonEmoticon