今週も特にありません

進捗どうですか?

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

医薬品、輸送用機器、電気機器・半導体関連が大きなクラスタのようになった。業種間をつなげるような銘柄は見当たらず…配当利回りの高い銘柄どうしを見ているなどの傾向は確認できず…