元ネタが手作業で大変そうです。
折角なので、全自動化してみました。
library(rvest)
## Loading required package: xml2
library(dplyr)
##
## Attaching package: 'dplyr'
##
## 以下のオブジェクトは 'package:stats' からマスクされています:
##
## filter, lag
##
## 以下のオブジェクトは 'package:base' からマスクされています:
##
## intersect, setdiff, setequal, union
library(tidyr)
library(stringi)
library(readr)
library(ggplot2)
monthGameBaseLink = "http://baseball.yahoo.co.jp/npb/teams/4/schedule?date=2015"
monthList = formatC(3:10, width=2, flag="0")
monthGameLinkList = paste(monthGameBaseLink, monthList, sep="")
monthGameLinkList %>% head
## [1] "http://baseball.yahoo.co.jp/npb/teams/4/schedule?date=201503"
## [2] "http://baseball.yahoo.co.jp/npb/teams/4/schedule?date=201504"
## [3] "http://baseball.yahoo.co.jp/npb/teams/4/schedule?date=201505"
## [4] "http://baseball.yahoo.co.jp/npb/teams/4/schedule?date=201506"
## [5] "http://baseball.yahoo.co.jp/npb/teams/4/schedule?date=201507"
## [6] "http://baseball.yahoo.co.jp/npb/teams/4/schedule?date=201508"
カレンダーから試合結果へのリンクを取得。
GameResultLinkList = NULL
for (monthGameLink in monthGameLinkList) {
html = read_html(monthGameLink)
gameResultLink = html %>%
html_nodes(xpath='//*[@id="tm_clnd"]/table/tr/td/table/tr[1]/td/span/a') %>%
html_attr("href")
GameResultLink = paste("http://baseball.yahoo.co.jp", gameResultLink, sep="")
GameResultLinkList = c(GameResultLinkList, GameResultLink)
}
GameResultLinkList %>% head
## [1] "http://baseball.yahoo.co.jp/npb/game/2015032702/"
## [2] "http://baseball.yahoo.co.jp/npb/game/2015032802/"
## [3] "http://baseball.yahoo.co.jp/npb/game/2015032902/"
## [4] "http://baseball.yahoo.co.jp/npb/game/2015033103/"
## [5] "http://baseball.yahoo.co.jp/npb/game/2015040103/"
## [6] "http://baseball.yahoo.co.jp/npb/game/2015040203/"
## 打席結果のページヘのリンクにする
GameStatsLinkList = paste(GameResultLinkList, "stats", sep="")
全試合で打席結果を取得して保存します。
for (GameStatsLink in GameStatsLinkList) {
html = read_html(GameStatsLink)
## 試合のID
gameId =
GameStatsLink %>%
strsplit(split = "/") %>>% (.[[1]][6])
gameId %>% print
## 試合結果
home_table = html %>% html_nodes(xpath = '//*[@id="st_batth"]/table') %>% html_table()
visitor_table = html %>% html_nodes(xpath = '//*[@id="st_battv"]/table') %>% html_table()
home_df =
home_table %>% as.data.frame
## 雨天中止の場合を除く
if(dim(home_df)[1] > 10){
home_df = home_df %>%
gather("回", "結果", -(位置:本塁打)) %>%
mutate(回 = stri_extract_first_regex(回, "[0-9]+")) %>%
mutate(gameId = gameId)
visitor_df =
visitor_table %>% as.data.frame %>%
gather("回", "結果", -(位置:本塁打)) %>%
mutate(回 = stri_extract_first_regex(回, "[0-9]+")) %>%
mutate(gameId = gameId)
fileName = paste(gameId, ".csv", sep="")
rbind(home_df, visitor_df) %>%
write.csv(paste("data/", fileName, sep=""), row.names=FALSE)
}
}
全部結合する。bashで。
[ -e ./all2015.csv] && rm ./all2015.csv
for file in $(./data)
do
cat "./data/$file" >> ./all2015.csv
done
## bash: 1 行: [: `]'がありません
## bash: 行 3: ./data: Is a directory
試合結果から大島のデータだけ抽出してグラフに。
dat = read_csv("all2015.csv")
## Warning: 1680 problems parsing 'all2015.csv'. See problems(...) for more
## details.
oshima_result =
dat %>%
filter(選手 == "大島 洋平") %>%
filter(結果 != "") %>%
group_by(結果) %>%
summarise(count = n()) %>%
mutate(result = 結果) %>%
select(result, count)
oshima_result %>% arrange(desc(count)) %>% head
## Source: local data frame [6 x 2]
##
## result count
## (chr) (int)
## 1 二ゴロ 85
## 2 左飛 48
## 3 遊ゴロ 47
## 4 空三振 45
## 5 中安 39
## 6 四球 38
oshima_result %>%
filter(count > 10) %>%
ggplot() +
geom_bar(aes(x=reorder(result, -count), y = count), stat="identity") +
theme_bw(base_family = "HiraKakuProN-W3") +
theme(axis.text.x = element_text(angle = 90, hjust = 1)) +
ggtitle("2015年 大島の全打席結果") +
xlab("打席結果")
セカンドゴロ多いですね。
最後に全結果。
oshima_result %>% as.data.frame %>%
arrange(desc(count))
## result count
## 1 二ゴロ 85
## 2 左飛 48
## 3 遊ゴロ 47
## 4 空三振 45
## 5 中安 39
## 6 四球 38
## 7 一ゴロ 37
## 8 左安 29
## 9 中飛 27
## 10 右安 24
## 11 投ゴロ 24
## 12 見三振 20
## 13 右飛 14
## 14 三ゴロ 13
## 15 遊飛 13
## 16 遊安 12
## 17 右2 9
## 18 左2 8
## 19 左邪飛 8
## 20 右本 6
## 21 投犠打 6
## 22 一安 5
## 23 死球 5
## 24 三直 4
## 25 中2 3
## 26 投安 3
## 27 二安 3
## 28 捕邪飛 3
## 29 遊併打 3
## 30 一飛 2
## 31 三安 2
## 32 三犠打 2
## 33 三飛 2
## 34 中3 2
## 35 一邪飛 1
## 36 一直 1
## 37 右3 1
## 38 敬遠 1
## 39 左3 1
## 40 左犠飛 1
## 41 三邪飛 1
## 42 投犠野 1
## 43 投失 1
## 44 投飛 1
## 45 二失 1
## 46 二邪飛 1
## 47 二直 1
## 48 二飛 1
## 49 二併打 1
## 50 捕ゴロ 1
## 51 捕犠打 1
## 52 捕飛 1
## 53 遊失 1
## 54 遊邪飛 1
## 55 遊直 1
以上です。