Twitterのハッシュタグをアソシエーション分析【R/arules】
POSデータやレシートの分析で有名なアソシエーション分析をやってみたい。
データセットもライブラリ内蔵や既存ものではなく自分で用意したい。
ということでTwitterのハッシュタグをRのarulesパッケージでアソシエーション分析の練習をしてみました。
●ツイートの収集
まずはrtweetパッケージで「#レシピ」に関するツイートを収集します。
rm(list=ls()); gc(); gc()
if (!require("pacman")) install.packages("pacman")
pacman::p_load(tidyverse,
magrittr,
arules,
arulesViz,
visNetwork,
igraph,
rtweet,
RColorBrewer)
# tokenの設定
twitter_token <- create_token(app = "*******", # 自分で設定したappの名前
consumer_key = "*******",
consumer_secret = "*******",
access_token = "*******",
access_secret = "*******")
#todayに今日の日付と時刻を取得
today <- Sys.Date()
now <- Sys.time()
ti <- format(now, "%H%M%S")
#search_word設定
x = "#レシピ"
rt <- search_tweets(x, n = 18000, retryonratelimit = FALSE, include_rts = FALSE)
●アソシエーション分析用のデータに変換
収集したデータをアソシエーション分析用パッケージarulesのtransactions形式のデータにしてやります。
RTが1以上あるデータを抽出し、またタグのつけ方とRT数に関係があるかを調べる例として、RT4以下と5以上という情報をハッシュタグに付加してみました。
flatten()して!!!rlang::symsというかなりの力技でハッシュタグへの情報追加をやっております。もっとスマートにやる方法があるような気もしますが、動くのでOKということで。
rt2 <- rt %>%
flatten() %>%
filter(retweet_count > 0) %>%
mutate(RT_status = if_else(retweet_count > 5, true = "RT5+", false = "RT1-4"),
tran = paste(!!!rlang::syms(c("hashtags", "RT_status")), sep = " ")) %>%
mutate(tran = str_split(.$tran, pattern = " ")) %>%
select(tran)
l <- map(rt2$tran, base::list())
tran <- as(l, "transactions")
同じハッシュタグを2重に登録した人がいるのか、以下のエラーが出ることがありますが分析には特に問題なさそうです。
Warning message:
In asMethod(object) : removing duplicated items in transactions
●アソシエーション分析
# 幅優先apriori
rules <- apriori(tran, parameter=list(support=0.061, confidence=0.8, maxlen=6))
supportとconfidenceを調整して出てくるルールが多すぎないようにしてやります。
maxlenは増やしすぎるとPCが落ちます。
うまく分析できると下のようなアソシエーション分析結果が出力されます。
Apriori
Parameter specification:
confidence minval smax arem aval originalSupport maxtime support minlen maxlen target ext
0.8 0.1 1 none FALSE TRUE 5 0.061 1 6 rules TRUE
Algorithmic control:
filter tree heap memopt load sort verbose
0.1 TRUE TRUE FALSE TRUE 2 TRUE
Absolute minimum support count: 42
set item appearances ...[0 item(s)] done [0.00s].
set transactions ...[1274 item(s), 701 transaction(s)] done [0.00s].
sorting and recoding items ... [15 item(s)] done [0.00s].
creating transaction tree ... done [0.00s].
checking subsets of size 1 2 3 4 5 6 done [0.00s].
writing ... [3814 rule(s)] done [0.00s].
creating S4 object ... done [0.00s].
Warning message:
In apriori(tran, parameter = list(support = 0.061, confidence = 0.8, :
Mining stopped (maxlen reached). Only patterns up to a length of 6 returned!
3814個のルールが抽出されました。
●可視化
arules::itemFrequencyPlot(tran,
topN=20,
col=brewer.pal(8,'Pastel2'),
main='Relative Item Frequency Plot',
type="relative",
ylab="Item Frequency (Relative)")
supportを高めに設定したためバーベキュー関連が出てきました。
# liftで抽出
rules2 <- head(rules, n = 50, by = "lift")
plot(rules2, method="graph", control=list(engine = "visNetwork", max = 25))
plot(rules2, method = "paracoord")
# 深さ優先eclat
itemsets <- eclat(tran, parameter = list(support = 0.04))
plot(itemsets, method="graph",
control=list(engine = "htmlwidget", max = 25))
おうちごはんハッシュタグは個人の方がつけているためRTが少ない傾向、みんなのきょうの料理ハッシュタグはNHKの番組なのでRTが高いようです。BBQ関連は固まっていますね。
Twitter以外にもタグで分類するようなものに使ってみると面白そうです。
以上です。ありがとうございました。