300億円欲しい

メジャーリーグのデータ解析します

ノーヒットでも勝てます

序論

5月2日, 西武の岸選手がノーヒットノーランを達成しました.

【超速報】西武、岸、ノーヒットノーラン達成!!!! :日刊やきう速報

イケメンです.
ノーヒットノーランは, 漢字だと無安打無得点.
ヒットを打たれずに, かつ点を取られないことが条件です.

...無安打有得点試合ってあるんですかね?
つまり, 全ての得点が, 安打以外の方法で生まれた試合です.
ノーヒッターだけどノーランじゃない試合. 四死球やエラーと犠打だけでも点は取れますし.

もしかしたら, ノーヒットで勝った試合もあるかもしれません.
メジャーリーグの試合結果データがあるので, 調べてみました.

ノーヒットで勝った試合

1922年から2013年までの, メジャーリーグの全打席結果データを, retrosheetからダウンロードします.
http://www.retrosheet.org/game.htm
試合ごとに安打数と得点を集計, ノーヒットの試合をチェックします.

無安打試合

まずは, 最近のノーヒット試合からチェックします.
2013年のノーヒット試合です.

id year team hit score_team
1 CIN201307020 2013 SFN 0 0
2 MIA201309290 2013 DET 0 0
3 SDN201307130 2013 SDN 0 0

2013年には, ノーヒットゲームが3試合ありました.
scoreの列に, 得点が書いてありますが, 全て0点です.
つまり, 無安打無得点試合です.

無安打有得点試合

次に, 無安打有得点試合を見てみます.
1922年から2013年までの間に, 全部で12試合ありました.

id year team hit score_team
1 CLE201107270 2011 CLE 0 1
2 LAN200806280 2008 LAN 0 1
3 HOU199309080 1993 NYN 0 1
4 CLE199204121 1992 CLE 0 2
5 CHA199007010 1990 CHA 0 4
6 CAL198609190 1986 CAL 0 1
7 OAK197607280 1976 OAK 0 1
8 PHI196807292 1968 PHI 0 1
9 BAL196704301 1967 DET 0 2
10 CLE196708252 1967 CLE 0 1
11 HOU196404230 1964 CIN 0 1
12 HOU196305170 1963 PHI 0 1

無安打で4点もとれるんですね...

無安打有得点勝利試合

最後に, 無安打有得点勝利試合をチェックします.
全部で5試合ありました.

id team hit opponent year score_team score_opponent
1 LAN200806280 LAN 0 ANA 2008 1 0
2 CLE199204121 CLE 0 BOS 1992 2 1
3 CHA199007010 CHA 0 NYA 1990 4 0
4 BAL196704301 DET 0 BAL 1967 2 1
5 HOU196404230 CIN 0 HOU 1964 1 0

最近だと, 2008年6月28日. アスレチックスとドジャースの試合ですね.

無安打有得点勝利試合の内容

詳しい試合結果です.

f:id:gg_hatano:20140505200500p:plain

Boxscore: LA Angels vs. LA Dodgers - June 28, 2008 | MLB.com: News

ドジャースは無安打1得点.
アスレチックスは5安打無得点.

ドジャースが3投手が投げて完封, 勝利しています. 9回は斎藤が投げていますね.
アスレチックスは3投手が無安打に抑えているのに, エラー絡みで1点取られて負けました.

何が起こったのか. 確認します.
Baseball Referenceで探します. アメリカのメジャーリーグファンサイトです.
June 28, 2008 Los Angeles Angels of Anaheim at Los Angeles Dodgers Play by Play and Box Score - Baseball-Reference.com


0-0で迎えた5回裏. ドジャースの攻撃.
先頭のマット・ケンプが投手のエラーで出塁して1塁.
次打者, デウィットの打席で, マット・ケンプは2塁へ盗塁成功. さらに捕手の送球エラーで3塁へ.
そしてデウィットのライトフライが犠牲フライになって, 得点.

この1点を守り切って, ドジャースが勝利しました.
最終回は斎藤隆が投げて, しっかり抑えていますね. すげえ.

まとめ

ノーヒットでも勝てます

メジャーリーグで開幕5試合のチーム安打数を集計したい

開幕5試合のチーム安打数

ネタが古いのですが, こんな記事を見つけました.
あしたへホームラン : 巨人、ホームラン3連発、日本新記録の開幕5戦77安打!

f:id:gg_hatano:20140430214817j:plain

2014年, 巨人の開幕5試合のヒット数は77本.
これは, 日本プロ野球史上で最多の記録だったみたいです.

開幕戦から, 安打数と得点は,

第1戦 14安打(12得点)
第2戦 16安打( 3得点)
第3戦 17安打(12得点)
第4戦  9安打( 2得点)
第5戦 21安打(15得点)

でした. 最高でした.

...メジャーリーグだとどうなんですかね?
手元に1922年から2013年までの試合結果データがあるので, 集計してみました.

メジャーリーグで開幕5試合のチーム安打数記録

Rのdata.tableとdplyrでサクッと集計します.

結果は, 下表の通りです.
安打数上位10チームとその年度.

team year hit_5game
1 SFN 1990 72
2 BRO 1952 70
3 MIN 1970 70
4 BOS 2005 69
5 CIN 1976 69
6 PIT 1960 68
7 TBA 1998 68
8 CIN 1938 67
9 CLE 1922 67
10 COL 1995 67

1990年のSFNが72安打が最多みたいです.
SFN. サンフランシスコ・ジャイアンツです.

メジャーリーグの史上最多記録も, ジャイアンツが保持していました.
ジャイアンツ最高です.

1990年, ジャイアンツの開幕5試合の, 安打数と得点はこんな感じでした.

id team hit score
1 ATL199004111 SFN 13 8
2 ATL199004112 SFN 9 3
3 ATL199004120 SFN 14 13
4 ATL199006080 SFN 27 23
5 ATL199006090 SFN 9 3

27安打で23得点. 半端ないですね.

メジャーリーグで連続5試合のチーム安打数記録

気になったので, 開幕5試合, という条件を緩めて集計します.
全ての連続5試合でチーム安打数を集計して, ランキングを作ります.
上位10チームとその年度, 日付です.

id team hit_5game
1 BSN192208050 PIT 100
2 PHI192208070 PIT 96
3 BSN192208040 PIT 95
4 BOS195006040 BOS 90
5 BSN192208030 PIT 87
6 BAL201007240 MIN 86
7 PHI192208081 PIT 86
8 ATL199307210 ATL 85
9 BOS195006070 BOS 85
10 NYA199605150 SEA 85

PIT.
ピッツバーグ・パイレーツですかね.
1922年. 8月5日から, 5試合で100安打.....?????

その5試合の, 安打数と得点を見てみます.

id team hit score
1 BSN192208050 PIT 16 9
2 PHI192208070 PIT 22 17
3 PHI192208081 PIT 27 19
4 PHI192208082 PIT 19 7
5 PHI192208100 PIT 16 14

以上です.

ソースコード

ここにあります.
gghatano/analyze_mlbdata_with_R · GitHub

連続5試合の安打数を集計を, dplyrの中で行なう際に困りました.
Twitterで呟いたら, おじさんたちが助けてくれました.

Rで,長さ100の数列があって,連続する5個の数の和を全て(96個)欲しいとき,どうすれば賢いかな - My Life as a Mock Quant

ありがとうございました.

野球のスコアで一番多いのは何対何だと思う?

野球のスコア

こんなツイートを見つけました.

知りませんでした.
手元にMLBのデータがあるので, 調べてみました.

データの取得

http://retrosheet.orgからデータをダウンロードします.
メジャーリーグの試合の, 全てのイベントに関するデータが取得できます. 下記参照.
Rで野球データを取得したい - 300億円欲しい
とりあえず, 1921年から2013年までのデータを取得しました.
全部で2GBくらいです.

準備は整いました. 早速調査しましょう.

2013年のスコア別試合数を調べたい

結構なサイズのデータになりますので, 工夫しないと扱いづらいです.

Rのdata.tableとdplyrを使えば, 手早く簡単に処理できます.

解析に用いたコードは, ここからダウンロードできます.
analyze_mlbdata_with_R/batting_data/game_analysis at master · gghatano/analyze_mlbdata_with_R · GitHub

試しに, 2013年だけで試合結果を集計してみました.

試合数が多かった上位10試合.

  score game
1  4-3  118
2  3-2  113
3  4-2  109
4  2-1  100
5  3-1   99
6  5-4   75
7  5-2   73
8  6-2   72
9  5-1   62
10 4-1   61

2013年だけだと, 4-3の試合が最も多かったらしいです.
図がないと淋しいので, 棒グラフにしました.
f:id:gg_hatano:20140424220625p:plain
よく分かりません.

1921年から2013年までのスコア別試合数

ここからが本番です.
1921年から2013年までのすべての試合のデータでやってみます.
ちなみに, 全部で134,448試合が行われたみたいです.

どの試合結果が最も多いのでしょうか.

上位10パターンをあげます.

rank score game
1 3-2 5964
2 4-3 5575
3 2-1 4951
4 4-2 4880
5 3-1 4464
6 5-3 4320
7 5-4 4303
8 5-2 4011
9 4-1 3825
10 6-3 3293
3-2の試合が最も多いみたいですね.

...あれ?

以上です.

ソースコード

githubに全部アップロードしてあります.
dplyrとdata.tableでゴリゴリやれば速く簡単に処理できます. こんな感じです.

gist11254803

ホームチームとアウェイチームの得点

x軸にホームの得点,
y軸にアウェイの得点,
z軸に試合数, とした3次元プロットを作りました.

f:id:gg_hatano:20140428101436p:plain


3次元だと見づらいので, 2次元ヒートマップにします.
f:id:gg_hatano:20140428101525p:plain

どうですかね

Shinyで作ったWebアプリを公開したい

RでWebアプリを作って公開する

RでWebアプリを作るパッケージとして, shinyがあります.

RStudio - Shiny

これを利用して, 自分でもWebアプリを作ってみた, という記事が前々回でした.
RでWebアプリを作りたい - 300億円欲しい

shinyアプリの公開方法は, 色々あります.
前々回は, Gistに公開したコードをRで利用して, ローカルで実行してもらう形をとりました.

しかしそれだと, Rを経由しないとアプリが動かせません.
Webアプリなので, ブラウザから使えるようにしたいです.

そこで, 自前のサーバーで公開することにしました.
PCA (Gaussian kernel)

リンク先で, 前々回記事のアプリが動きます.
こんな感じです.
f:id:gg_hatano:20140411233851p:plain
カーネル主成分分析について, ガウシアンカーネルに与えるパラメータの値を変えながら,
irisデータに適用して実行結果のグラフを作成しています.
スライダーで, パラメータの値を変えることができます.

shiny-serverを使う

さくらVPSを利用, shiny-serverを起動して, shinyアプリの公開を行っています.
RStudio - Installing Shiny Server Open Source

それだけです.
適当なサーバーにshiny-serverを入れて,
configに合わせてui.Rとserver.Rを適当なところにおいて,
shiny-serverを起動してブラウザでアドレスを叩けば, shinyアプリが開けます.
私の場合は,
/opt/shiny-server/config/default.config を見ながら,
site_dirに設定した場所に, ui.R と server.Rの入ったディレクトリを置くだけでした.

これで好きなshinyアプリを自由に公開できますね.
enjoy!

Vimのneosnippetで自分用snippetファイルを追加したい

neosnippetが凄いので使いましょう.

Shougo/neosnippet.vim · GitHub

Luaを有効にしたVimのインストール

luaが有効になっているvimを導入します.
» luaを有効にしてVimをインストールする TECHSCORE BLOG
ここを参考にして, Luaを有効にしたVimをインストールしましょう.

NeoBundleでneosnippetをインストール

vimrcに

" 補完プラグイン
NeoBundle 'Shougo/neocomplete'
" スニペット補完プラグイン
NeoBundle 'Shougo/neosnippet'
" 各種スニペット
NeoBundle 'Shougo/neosnippet-snippets'

と書けば, neocompleteとneosnippetと各種スニペットが入ります.

スニペットの展開をC-kにマップします

" Plugin key-mappings.  " <C-k>でsnippetの展開
imap <C-k> <Plug>(neosnippet_expand_or_jump)
smap <C-k> <Plug>(neosnippet_expand_or_jump)

としておけば, C-kでスニペット補完してくれます

スニペットの記法を見てみます.
デフォルトのスニペットは, 僕の場合
$HOME/.vim/bundle/neosnippet-snippets/neosnippets/
にありました.

以前はneosnippetにデフォルトで入っていたスニペットが削除されて,
別のプラグイン扱いになったみたいです.
neosnippet.vim からデフォルトのスニペットが削除された - C++でゲームプログラミング
今までは, NeoBundle neosnippetだけでOKでしたが,
今後は NeoBundle neosnippet-snippetsをする必要があります.

中身を除いてみます.

snippet mathexpression
alias       $
abbr        $ expression $
	$${1:#:expression}$${2}

# ========== ENVIRONMENT ==========

snippet     begin
alias       \begin
	\begin{${1:#:type}}
		${2:TARGET}
	\end{$1}


snippet list
alias   \begin{list} \list
	\begin{list}
		${1:TARGET}
	\end{list}

よく分かりました.
$数字のところに書き込んで, C-kで次の番号に飛ぶんですかね.

自分用スニペット

自分でスニペットを定義して読み込ませたいです.
vimrcに

" 自分用 snippet ファイルの場所
let s:my_snippet = '~/snippet/'
let g:neosnippet#snippets_directory = s:my_snippet

として, $HOME/snippet/に自分用snippet定義ファイルを置けば,
自分で定義したsnippetが利用できます.

texスニペットを作りました. tex.snipとして, 中に書き込みます.
デフォルトだと, align環境とalign*環境, そしてeqrefに関するスニペットが見つからなかったので,
自分で書いてみました.

# ==== User definition ====
snippet eqref
alias \eqref
 \eqref{${1}}${0}

snippet salign
alias   \begin{align*} \align*
 \begin{align*}
  ${1:TARGET}
 \end{align*}

snippet align
alias   \begin{align} \align
\begin{align}
 ${1:TARGET}
\end{align}

最初は$\$\text{1}$に飛んで, 書き込んだらC-kで次の番号に飛んで,

最後は$\${0}$の位置に飛ぶ...と理解しています.
これで好きなだけスニペットが書けます.

enjoy!

rChartsでグラフを作りたかった

いろいろ作りました

rChartsで野球データのグラフを作った

3000本安打以上のバッターについて, 通算成績推移をグラフにしました.
RPubs - rChartsでレジェンドプレーヤーの成績を可視化したい


250勝以上の投手について, 通算成績推移をグラフにしました.
RPubs - rChartsを使ってレジェンドプレーヤーの成績を可視化したい

速球系ボール投げ率を集計してグラフにしました.
RPubs - MLB Scouting Report: Fastball-Count (2013)

Rpubsとは

今回の資料はRpubsで公開しています.

Rpubsとは.
RStudioからknitrでレポートを自動作成してみた - Take a Risk:林岳彦の研究メモ
knitrというパッケージでHTMLのドキュメントが作れます.
作成したHTMLドキュメントを, 世の中に見せびらかしたいです.
どこで公開しましょうか.

HTMLをそのままアップロードしたいです.
サーバー立てますか? これは面倒です.

こういう時に, Rpubsです.
Rstudioから作成したドキュメントを, ボタン1つでネット上に公開できます.

やり方.
RPubs
なるほど. よく分かりました. これでドキュメントは公開できますね.

shinyでインタラクティブに可視化

もっとカッコイイwebアプリを公開したいです.
そこでshinyを使います.
shinyで歴代3000本安打以上の打者の成績推移グラフをインタラクティブに作れるようにしました.

library(shiny)
runGist(9778490)

項目はヒット, 三振, ホームラン, 打点から選択して,
調べたい期間をスライダーを使って自由に選びます.

こんな感じです.
f:id:gg_hatano:20140326165912p:plain

ここでもrChartsを使いたかったのですが,
うまくいかないためggplotしています.

感想

グラフの作成には, rChartsを使っています.
javascriptの描画系ライブラリをRから使う, というものです.
扱いが簡単ではなく, また動作が不安定のものもあります.
ggplot2で十分な気がしてきました.