今週も特にありません

進捗どうですか?

rvestを使って、東証時価総額上位銘柄をグラフ化

Japan.Rで「Rでスクレイピングするなら、rvestがいいよ」ということを聞いて、やってみた記録

時価総額上位:株式ランキング - Yahoo!ファイナンスからrvestで情報を取得して、良い感じにグラフ化する

一度に上位100銘柄を表示するようなGETパラメータを見つけられなかったので、50銘柄づつスクレイプする

library(rvest)

ranking.HTML <- list()
ranking.tables <- list()
for (i in 1:2) {
  ranking.URL <- paste0("http://info.finance.yahoo.co.jp/ranking/?kd=4&tm=d&vl=a&mk=1&p=", i)
  ranking.HTML[[i]] <- html(ranking.URL)
  ranking.tables[[i]] <- ranking.HTML[[i]] %>% html_table()
}

分析中に何度もスクレイプすると良くないので、ranking.HTMLに一旦ページの情報をとっておく

ページの情報からhtml_nodes("td.txtright.bgyellow01") %>% html_text()のようにしても時価総額は取れるが、ここでは、html_tableを使って、表部分をデータフレームとして取ってくる

ここから、証券コード時価総額の値を取り出す。データフレームの51行目と時価総額の値の「,」が不要なので、取り除いておく

stock.code <- NULL
market.value <- NULL
for (i in 1:2) {
  stock.code <- c(stock.code, as.vector(ranking.tables[[i]][[1]][-51, "コード"]))
  market.value <- c(market.value, as.vector(ranking.tables[[i]][[1]][-51, "時価総額(百万円)"])) %>%
    gsub(",", "", .) %>% as.numeric()
}

そして、ggplot2でグラフ化する

library(ggplot2)
library(ggthemes)

qplot(stock.code, market.value / 1e+06, geom = "bar", stat = "identity") +
theme_economist() + theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
ggtitle("Market Cap Top 100 (Tokyo Stock Exchange)") + ylab("market cap (trillion)") +
scale_y_continuous(breaks = seq(0, 25, by = 5))

2014年12月29日の市場終了時点での実行例

f:id:masaqol:20141229234952p:plain

トヨタが約26兆円で圧倒的に時価総額が大きく、次にメガバンクソフトバンク等の通信会社が続く。証券コードがちょっと見にくいが良い感じにグラフ化できた