rvestを使って、投資家の傾向を探る
前回に続き、rvestを使ってみた記録になります。
ヤフーファイナンスの個別銘柄の詳細ページから「この銘柄を見た人はこんな銘柄も見ています」の情報を取得して、何か投資家の傾向が見られないかを探ってみます。
今回も時価総額上位100銘柄を対象とします。前回のプログラムをひと通り流して、時価総額上位100銘柄の証券コードを取得しておきます。
証券コードから個別銘柄の詳細ページをスクレイプします。
detail.HTML <- list() for (i in 1:100) { detail.URL <- paste0("http://stocks.finance.yahoo.co.jp/stocks/detail/?code=", stock.code[i] ,".t") detail.HTML[[i]] <- html(detail.URL) }
分析中に何度もスクレイプすると良くないので、ページの情報はdetail.HTMLに一旦入れておきます。
「この銘柄を見た人はこんな銘柄も見ています」は、html_nodes("ol.affirank li a")で指定すれば、上の方にある1位から5位と下の方にある6位から15位の銘柄が取り出せます。「もっと見る」の部分だけ不要なので、取り除きます。
library(dplyr) affinity.list <- list() for (i in 1:100) { affinity.list[[i]] <- detail.HTML[[i]] %>% html_nodes("ol.affirank li a") %>% html_text() %>% .[-which(. == "もっと見る")] }
これ以下の実行列は、2014年12月30日の市場終了時点
トヨタ自動車とファナックの「この銘柄を見た人はこんな銘柄も見ています」
> stock.code[1] [1] "7203" > affinity.list[[1]] [1] "トヨタグループ株式ファンド" [2] "トヨタグループ世界債券ファンド(年2回)" [3] "デンソー" [4] "ホンダ" [5] "DCトヨタグループ株式ファンド" [6] "豊田織" [7] "日産自" [8] "富士重" [9] "アイシン精" [10] "日野自" [11] "ソフバンク" [12] "マツダ" [13] "トヨタ紡" [14] "DIAMストラテジックJ-REITファンド" [15] "ファインシ" > stock.code[14] [1] "6954" > affinity.list[[14]] [1] "キーエンス" [2] "村田製" [3] "京セラ" [4] "SMC" [5] "Fリテイリ" [6] "日電産" [7] "信越化" [8] "ローム" [9] "シマノ" [10] "東エレク" [11] "いちよし証" [12] "ナブテスコ" [13] "安川電" [14] "グリコ" [15] "ヒロセ電"
関連ファンドやグループ企業、そして、同業他社が多く見られている
「この銘柄を見た人はこんな銘柄も見ています」によく登場する銘柄
> do.call("rbind", affinity.list) %>% + table() %>% + sort(dec = TRUE) %>% + head(50) TDK ダイキン工 京セラ 信越化 村田製 10 10 10 10 10 武田薬 ファナック ローム エーザイ コマツ 10 9 9 8 8 サントリ食 日電産 Fリテイリ ダイハツ工 KDDI 8 8 7 7 6 アステラ薬 オムロン カルビー キーエンス テルモ 6 6 6 6 6 トヨタ ブリヂスト ホンダ マツダ 塩野義薬 6 6 6 6 6 三井物 住友電設 大塚HLD 大日本住友 第一三共 6 6 6 6 6 東芝 日産自 日東電 日野自 豊田通商 6 6 6 6 6 NEC NTT NTT都市 アイシン精 カカクコム 5 5 5 5 5 キヤノン スズキ ソニーFH ライオン 科研薬 5 5 5 5 5 三井住友F 三菱UFJ 三菱自 三菱商 小野薬 5 5 5 5 5
順位に関係する情報は落ちてしまいますが、アソシエーション分析してみます。
library(arules) library(arulesViz) affinity.tran <- as(affinity.list, "transactions")
変換されたものを確認します。
> affinity.tran transactions in sparse format with 100 transactions (rows) and 801 items (columns)
> affinity.rules <- apriori(affinity.tran, parameter = list(support = 0.03, confidence = 0.8)) > affinity.rules set of 1102 rules
1102ルール見つけることができました。supportが0.04以上のものだけに絞ります。
subset.rules <- subset(sort(affinity.rules, by = "support"), support >= 0.04)
一部だけ確認します。
> inspect(subset.rules[1:30]) lhs rhs support confidence lift 1 {小野薬} => {塩野義薬} 0.05 1.0000000 16.666667 2 {塩野義薬} => {小野薬} 0.05 0.8333333 16.666667 3 {富士重} => {日産自} 0.05 1.0000000 16.666667 4 {日産自} => {富士重} 0.05 0.8333333 16.666667 5 {スズキ} => {ダイハツ工} 0.05 1.0000000 14.285714 6 {日野自} => {マツダ} 0.05 0.8333333 13.888889 7 {マツダ} => {日野自} 0.05 0.8333333 13.888889 8 {日野自} => {ダイハツ工} 0.05 0.8333333 11.904762 9 {第一三共} => {塩野義薬} 0.05 0.8333333 13.888889 10 {塩野義薬} => {第一三共} 0.05 0.8333333 13.888889 11 {第一三共} => {アステラ薬} 0.05 0.8333333 13.888889 12 {アステラ薬} => {第一三共} 0.05 0.8333333 13.888889 13 {第一三共} => {エーザイ} 0.05 0.8333333 10.416667 14 {塩野義薬} => {アステラ薬} 0.05 0.8333333 13.888889 15 {アステラ薬} => {塩野義薬} 0.05 0.8333333 13.888889 16 {塩野義薬} => {エーザイ} 0.05 0.8333333 10.416667 17 {アステラ薬} => {エーザイ} 0.05 0.8333333 10.416667 18 {マツダ} => {ダイハツ工} 0.05 0.8333333 11.904762 19 {TDK, ローム} => {村田製} 0.05 0.8333333 8.333333 20 {ローム, 村田製} => {TDK} 0.05 0.8333333 8.333333 21 {TDK, 村田製} => {ローム} 0.05 0.8333333 9.259259 22 {TDK, ローム} => {京セラ} 0.05 0.8333333 8.333333 23 {ローム, 京セラ} => {TDK} 0.05 0.8333333 8.333333 24 {TDK, ローム} => {信越化} 0.05 0.8333333 8.333333 25 {ローム, 信越化} => {TDK} 0.05 0.8333333 8.333333 26 {TDK, 信越化} => {ローム} 0.05 0.8333333 9.259259 27 {ローム, 村田製} => {京セラ} 0.05 0.8333333 8.333333 28 {ローム, 京セラ} => {村田製} 0.05 0.8333333 8.333333 29 {ローム, 村田製} => {信越化} 0.05 0.8333333 8.333333 30 {ローム, 信越化} => {村田製} 0.05 0.8333333 8.333333
最後にプロットします。
plot(subset.rules, method = "graph", control = list(type="items"))
医薬品、輸送用機器、電気機器・半導体関連が大きなクラスタのようになりました。業種間をつなげるような銘柄は見当たらず…明らかに配当利回りの高い銘柄どうしを比較しているわけでもなさそうです