今週も特にありません

進捗どうですか?

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"))

f:id:masaqol:20141231145140p:plain

医薬品、輸送用機器、電気機器・半導体関連が大きなクラスタのようになりました。業種間をつなげるような銘柄は見当たらず…明らかに配当利回りの高い銘柄どうしを比較しているわけでもなさそうです