twitteR: Mengolah Data Twitter Hasil Crawling

Menyambung diskusi kita tentang bagaimana crawling data Twitter menggunakan package twitteR pada R, kali ini mari kita bahas bagaimana mengolah data tersebut. Raw-data yang diperoleh dari hasil crawling sebagian besar berupa list. searchTwitter() dan userTimeline() menghasilkan list dari objek status. Setiap elemen pada list tersebut berisi detail tweet yang sesuai dengan kriteria pencarian yang ditentukan. Output getUser() berupa objek user, sementara lookupUsers() berupa list dari objek user, di mana setiap elemennya berisi detail dari user. Untuk mengolah data twitter hasil crawling, kita harus mengenal objek-objek tersebut. Berikut penjelasan lebih detail mengenai objek status dan objek user:

Objek status

Dihasilkan oleh fungsi searchTwitter() dan userTimeline(), misalnya:

tw.bogor = searchTwitter("bogor", n=500)
user.tl = userTimeline("nurandi", n=500)

Untuk mengetahui tipe data tersebut, gunakan fungsi mode(tw.bogor) dan mode(user.tl). Keduanya adalah list. Sedangkan struktur datanya bisa dilihat dengan fungsi str(). Setiap elemen pada list mempunyai struktur yang sama, sehingga untuk mengetahui struktur data, kita cukup lihat satu elemen saja, misalnya: str(tw.bogor[1]) atau str(user.tl[1]). Outputnya adalah sebagai berikut:

 $ :Reference class 'status' [package "twitteR"] with 17 fields
  ..$ text         : chr "Testimoni MASKER SPIRULINA http://t.co/s96cHQKKim SMS: 089676926626 | HERBAL, BPOM #Cisarua #Bogor"
  ..$ favorited    : logi FALSE
  ..$ favoriteCount: num 0
  ..$ replyToSN    : chr(0) 
  ..$ created      : POSIXct[1:1], format: "2015-02-07 00:29:38"
  ..$ truncated    : logi FALSE
  ..$ replyToSID   : chr(0) 
  ..$ id           : chr "563857078658154496"
  ..$ replyToUID   : chr(0) 
  ..$ statusSource : chr "<a href="http://twittbot.net/" rel="nofollow">twittbot.net</a>"
  ..$ screenName   : chr "TiensCisarua"
  ..$ retweetCount : num 0
  ..$ isRetweet    : logi FALSE
  ..$ retweeted    : logi FALSE
  ..$ longitude    : chr(0) 
  ..$ latitude     : chr(0) 
  ..$ urls         :'data.frame':   0 obs. of  4 variables:
  .. ..$ url         : chr(0) 
  .. ..$ expanded_url: chr(0) 
  .. ..$ dispaly_url : chr(0) 
  .. ..$ indices     : num(0) 
  ..and 51 methods, of which 39 are possibly relevant:
  ..  getCreated, getFavoriteCount, getFavorited, getId, getIsRetweet, getLatitude,
  ..  getLongitude, getReplyToSID, getReplyToSN, getReplyToUID, getRetweetCount,
  ..  getRetweeted, getRetweeters, getRetweets, getScreenName, getStatusSource, getText,
  ..  getTruncated, getUrls, initialize, setCreated, setFavoriteCount, setFavorited,
  ..  setId, setIsRetweet, setLatitude, setLongitude, setReplyToSID, setReplyToSN,
  ..  setReplyToUID, setRetweetCount, setRetweeted, setScreenName, setStatusSource,
  ..  setText, setTruncated, setUrls, toDataFrame, toDataFrame#twitterObj

Dari output di atas kita dapat lihat bahwa objek status terdiri dari 17 variabel (text, favorited, …, urls). Gunakan perintah ?status pada R console untuk mengetahui keterangan tiap-tiap variabel.

Objek user

Dihasilkan oleh fungsi getUser() dan lookupUsers(), misalnya:

user = getUser("nurandi")
users = lookupUsers(c("nurandi","prabowo08","jokowi_do2"))

user adalah objek S4, sedangkan users adalah list. Setiap elemen pada objek users mempunyai struktur yang sama dengan objek user. Berikut adalah keluaran dari fungsi str(user).

Reference class 'user' [package "twitteR"] with 18 fields
 $ description      : chr "Oh God ! This is so sexy ...."
 $ statusesCount    : num 255
 $ followersCount   : num 196
 $ favoritesCount   : num 10
 $ friendsCount     : num 229
 $ url              : chr "http://t.co/2zFucAuWdD"
 $ name             : chr "Nur Andi Setiabudi"
 $ created          : POSIXct[1:1], format: "2009-07-22 12:13:06"
 $ protected        : logi FALSE
 $ verified         : logi FALSE
 $ screenName       : chr "nurandi"
 $ location         : chr "Jakarta - ID"
 $ lang             : chr "en"
 $ id               : chr "59108937"
 $ lastStatus       :Reference class 'status' [package "twitteR"] with 17 fields
  ..$ text         : chr "RT @kdnuggets: Data scientist memes - the ‘hottest profession’: it's not the data size, it's how you use it! http://t.co/AJDi3q"| __truncated__
  ..$ favorited    : logi FALSE
  ..$ favoriteCount: num 0
  ..$ replyToSN    : chr(0) 
  ..$ created      : POSIXct[1:1], format: "2015-02-05 11:24:56"
  ..$ truncated    : logi FALSE
  ..$ replyToSID   : chr(0) 
  ..$ id           : chr "563297217713545216"
  ..$ replyToUID   : chr(0) 
  ..$ statusSource : chr "<a href="http://twitter.com" rel="nofollow">Twitter Web Client</a>"
  ..$ screenName   : chr "Unknown"
  ..$ retweetCount : num 27
  ..$ isRetweet    : logi TRUE
  ..$ retweeted    : logi FALSE
  ..$ longitude    : chr(0) 
  ..$ latitude     : chr(0) 
  ..$ urls         :'data.frame':   1 obs. of  5 variables:
  .. ..$ url         : chr "http://t.co/AJDi3qQywE"
  .. ..$ expanded_url: chr "http://buff.ly/1z5NYD5"
  .. ..$ display_url : chr "buff.ly/1z5NYD5"
  .. ..$ start_index : num 109
  .. ..$ stop_index  : num 131
  ..and 51 methods, of which 39 are possibly relevant:
  ..  getCreated, getFavoriteCount, getFavorited, getId, getIsRetweet, getLatitude,
  ..  getLongitude, getReplyToSID, getReplyToSN, getReplyToUID, getRetweetCount,
  ..  getRetweeted, getRetweeters, getRetweets, getScreenName, getStatusSource, getText,
  ..  getTruncated, getUrls, initialize, setCreated, setFavoriteCount, setFavorited,
  ..  setId, setIsRetweet, setLatitude, setLongitude, setReplyToSID, setReplyToSN,
  ..  setReplyToUID, setRetweetCount, setRetweeted, setScreenName, setStatusSource,
  ..  setText, setTruncated, setUrls, toDataFrame, toDataFrame#twitterObj
 $ listedCount      : num 4
 $ followRequestSent: logi FALSE
 $ profileImageUrl  : chr "http://pbs.twimg.com/profile_images/2669346805/a7fe4a431fd3b401b3dd26fac1a10b98_normal.png"
 and 57 methods, of which 45 are possibly relevant:
   getCreated, getDescription, getFavorites, getFavoritesCount, getFavouritesCount,
   getFollowerIDs, getFollowers, getFollowersCount, getFollowRequestSent, getFriendIDs,
   getFriends, getFriendsCount, getId, getLang, getLastStatus, getListedCount,
   getLocation, getName, getProfileImageUrl, getProtected, getScreenName,
   getStatusesCount, getUrl, getVerified, initialize, setCreated, setDescription,
   setFavoritesCount, setFollowersCount, setFollowRequestSent, setFriendsCount, setId,
   setLang, setLastStatus, setListedCount, setLocation, setName, setProfileImageUrl,
   setProtected, setScreenName, setStatusesCount, setUrl, setVerified, toDataFrame,
   toDataFrame#twitterObj

Objek user terdiri dari 18 variabel. Untuk mengatahui penjelasan masing-masing variabel, buka dokumentasi dengan perintah ?user.

Mengakses variabel/kolom

Kolom-kolom pada objeck status maupun user dapat diakses dengan menggunakan fungsi sapply(<nama-objek>,<nama-kolom>). Misalnya,

  • User yang menulis tweet tentang bogor:

    name = sapply(tw.bogor, screenName)
    
  • Menampilkan teks tweet

    text = sapply(tw.bogor, statusText)
    
  • Melihat jumlah follower dari objek users

    nfollowers = sapply(users, followersCount)
    

Konversi ke data frame

Objek status maupun user dapat dikonversi menjadi data frame dengan fungsi twListToDF(). Misalnya:

tw.bogor.df = twListToDF(tw.bogor)
names(tw.bogor.df)

# [1] "text"          "favorited"     "favoriteCount" "replyToSN"     "created"       # "truncated"    
# [7] "replyToSID"    "id"            "replyToUID"    "statusSource"  "screenName"    "retweetCount" 
# [13] "isRetweet"     "retweeted"     "longitude"     "latitude"  
head(tw.bogor.df$text)

# [1] "Testimoni MASKER SPIRULINA http://t.co/s96cHQKKim SMS: 089676926626 | HERBAL, BPOM #Cisarua #Bogor"                                          
# [2] "He amin insyaalloh @MU_joybanget: @restinyunyun teh naha bisa geulis kitu ? Ameng atuh ka bogor xed�� xed�u0086”"                          
# [3] "Hari ini endy shoot di PGB bogor"                                                                                                            
# [4] "RT @infobogor: Hari ini! @batiknight2015 | @KuntoAjiW @endahNrhesa @GBluesShelter | info 081286890980 http://t.co/yqemocVWGO http://t.co/pz…"
# [5] "Weekendnya Dinas pagi dong xed��xed�u0086xed��xed�� (at puskesmas bogor selatan) — https://t.co/v2OpaFLTGx"                             
# [6] "RT @Indiradewiputri: Selamat pagi Bogor ;;)"  
users.df = twListToDF(users)
names(users.df)

#  [1] "description"       "statusesCount"     "followersCount"    "favoritesCount"   
#  [5] "friendsCount"      "url"               "name"              "created"          
#  [9] "protected"         "verified"          "screenName"        "location"         
# [13] "lang"              "id"                "listedCount"       "followRequestSent"
# [17] "profileImageUrl" 
users.df$name
# [1] "Nur Andi Setiabudi" "Prabowo Subianto"   "Joko Widodo"