大島は本当にセカンドゴロマシーンなのか

元ネタが手作業で大変そうです。

折角なので、全自動化してみました。

試合結果のURLを作る

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("打席結果")

plot of chunk unnamed-chunk-5

セカンドゴロ多いですね。

最後に全結果。

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

以上です。