昨日の投稿で次のような内容を本で読んだと紹介しました。
平均回帰傾向にあるBABIPというセイバーメトリクスが、イチロー選手に限って言えばMLB平均に収束しない
せっかくなので実際を求めてみたくなり、MLBの成績をスクレイピングしてみようと思います。初心者なのでコードの内容は突っ込まないでください。
使用したツール
- pandas
- 実行環境:jupyter notebook
実行した結果
実際やってみた結果が下記
さて、ここからどうしたら良いのやら。
昨日の投稿で次のような内容を本で読んだと紹介しました。
平均回帰傾向にあるBABIPというセイバーメトリクスが、イチロー選手に限って言えばMLB平均に収束しない
せっかくなので実際を求めてみたくなり、MLBの成績をスクレイピングしてみようと思います。初心者なのでコードの内容は突っ込まないでください。
実際やってみた結果が下記
さて、ここからどうしたら良いのやら。
野球好きで統計を学ぼうと思っている人には最適です。統計学的に学んだ内容については今後書いていこうと思います。
野球の成績に運は影響するというセイバーメトリクスの指標として、BABIPという指標があるそうです。フェアグラウンドに飛んだ打球がヒットになった割合を表す数字です。
MLBではどの選手もBABIPは0.300に収束するという平均回帰傾向という性質があるのだそうです。フェアグラウンドに飛んだ打球が野手の正面に行くかどうかは運次第ということなんでしょう。
しかし、驚くことに、イチロー選手だけが最低のシーズンでも0.316で収束するはずの0.300よりずっと高いそうです。イチロー選手だけに、MLBに移籍して10年もの間幸運が続くとは考えにくいので何か能力があると考えるのが妥当ですが、それが数字として立証されていないようです。
イチロー選手がインタビューなどで「打ち損じると思ったらわざと空振りする」「野手の間に落ちるようにわざと詰まらせている」というような話をされているのを聞いた記憶がありますが、このセイバーメトリクス値を見ると、実際にそういう技術があるのかもしれませんね。
実際に試してみたいと思います。
理系でしたが、数学は大の苦手で、大学時代にあまり勉強した記憶のない私ですが、読みました。すごく平易な表現、解説で読みやすいし、各章の末尾には練習問題があって、その章の理解を確認しながら読み進めていくことができます。タイトルにあるように、「完全独習」に向いていると思います。
いまや多くのテクノロジーで使われている技術ですね。たとえば、スパムを見つける方法とか、ノイズを修正する仕組みとか、検索エンジンの自動翻訳システムでも使われている学問です。データが少なくても推測でき、データが多くなればなるほど正確になり、入ってくる情報に応じて自動的に推測をアップデートできるという学習機能がベイズ統計の強みです。 本書にも書かれていましたが、「今世紀のビジネスに従事をする上で、使いこなせれば最強になれる」今旬の学問ということで学んでみました。まだまだ初心者ですが、数式などは最後の最後でしか出てこず、最初のとっかかりとしては非常にわかりやすい入門書でした!
本書の中でも圧倒的に面白かったのが、「3囚人の問題」 というパラドクスに関する解説です。 自分を含む3人の囚人のうち2人は処刑されて、1人は助かるという状況だと、自分が助かる確率は1/3ですよね。しかし、看守に、3人のうち2人は処刑されるんだから、自分以外の2人のうちどちらは処刑されるはずだ。それを聞いても自分の処遇は変わらないから教えてくれとたずねた際、看守が1人の名前を答えた。その瞬間に自分が助かる確率は、1/3から、1/2に上がるという話です。 この話、すごく興味深くないですか?どこかに矛盾があるの?とか考えてしまいますよね。
書籍の中では、 環境準備としてWindows環境へのセットアップ手順が紹介されています。 私はMac OS上へインストールしました。 下記サイトから自分のOSバージョンにあったファイルをダウンロードしてクリックして進めるだけです。
https://cran.r-project.org/bin/macosx/
本書にはRがどんなものかを体感できるようにサンプルデータが用意されています。まずはターミナルからRを起動してみます。
下記リンクからサンプルデータをダウンロードします。
楽しいR ビジネスに役立つデータの扱い方・読み解き方を知りたい人のためのR統計分析入門 ダウンロード | 翔泳社の本
ダウンロードしたファイルを、Rの作業用ディレクトリに配置して実行します。
> sample<-read.table("sample.txt",header=T)
実際に読み込んだデータを表示してみます。
> sample
DATE Jyunkou Listing CV_Jyunkou CV_Listing
1 2014/1/6 122067 373 11 15
2 2014/1/7 114137 364 17 13
3 2014/1/8 128640 357 16 13
4 2014/1/9 113522 352 15 15
こんな感じで出力されます。
ここからは本格的に統計学を学びながらRを使っていきたいと思います。
データに異常値がないかどうかを確認するには、平均や中央値を使う、あるいはヒストグラムを作成するというのが有効ですね。Rを使ってやってみます。
先ほどロードしたサンプルデータのうち、例えば2列目の変数を出力する場合には次のように実行すれば良いようです。
> sample[,2:2]
sample[,2:3]とすれば2列目と3列目を表示できます。そして平均を出したければ、meanという関数が使えます。
> mean(sample[,2:2])
[1] 80358.31
もっとまとめて、最大値、最小値や、平均、中央値をまとめて出力してくれるsummaryという関数もあるようです。
> summary( sample[,2:2])
Min. 1st Qu. Median Mean 3rd Qu. Max.
48510 69610 76630 80360 91460 128600
ヒストグラムを出力してみます。
hist(sample[,2:2])
なにやら110000から120000あたりに山が来ているのがわかりますね。
日付データに曜日データを追加する
> sample$DATE
[1] 2014/1/6 2014/1/7 2014/1/8 2014/1/9 2014/1/10 2014/1/11 2014/1/12 2014/1/13 2014/1/14(省略)
> as.Date(sample$DATE)
[1] "2014-01-06" "2014-01-07" "2014-01-08" "2014-01-09" "2014-01-10" "2014-01-11" "2014-01-12"
[8] "2014-01-13" "2014-01-14" "2014-01-15" "2014-01-16" "2014-01-17" "2014-01-18" "2014-01-19"(省略)
> weekdays(as.Date(sample$DATE))
[1] "月曜日" "火曜日" "水曜日" "木曜日" "金曜日" "土曜日" "日曜日" "月曜日" "火曜日" "水曜日"
この weekdays(as.Date(sample$DATE)) という列を追加するということをすれば良いようですね。追加するには次の通り。youbiという列に値を追加しています。
> sample2<-transform(sample,youbi=weekdays(as.Date(sample$DATE)))
確認してみます。
> sample2
DATE Jyunkou Listing CV_Jyunkou CV_Listing youbi
1 2014/1/6 122067 373 11 15 月曜日
2 2014/1/7 114137 364 17 13 火曜日
3 2014/1/8 128640 357 16 13 水曜日
4 2014/1/9 113522 352 15 15 木曜日
5 2014/1/10 100794 308 8 7 金曜日
6 2014/1/11 88473 303 7 15 土曜日
7 2014/1/12 87768 312 8 7 日曜日
8 2014/1/13 98202 346 7 17 月曜日
9 2014/1/14 112450 378 8 11 火曜日
10 2014/1/15 110696 374 11 12 水曜日
jupyter notebook起動時にブラウザが自動起動しません。URLをブラウザにコピペすれば良いのですが、なんとも面倒臭い。
$ jupyter notebook
[I 23:10:34.677 NotebookApp] Serving notebooks from local directory: /Users/xxxxxx
[I 23:10:34.677 NotebookApp] 0 active kernels
[I 23:10:34.677 NotebookApp] The Jupyter Notebook is running at: http://localhost:8888/?token=8e86b5c64450be83201c907a6d804851efd31782242137d2
[I 23:10:34.677 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
[C 23:10:34.678 NotebookApp]Copy/paste this URL into your browser when you connect for the first time,
to login with a token:
http://localhost:8888/?token=8e86b5c64450be83201c907a6d804851efd31782242137d2
0:97: execution error: "http://localhost:8888/tree?token=bac8117483e4ba991b7c04f0a46c8c6e7e171171e95e8dc2"は“open location”メッセージを認識できません。 (-1708)
$ cd .jupyter/
$ ls migrated
原因としては、どうやら jupyter_notebook_config.py の設定ファイルが存在しないようです。根本原因はわからないですが、Mac OS をアップグレードすると発生するというような報告があるようです。
解決策については、下記はSafariの例ですが、次のように書けば起動するようになります。
$ touch jupyter_notebook_config.py
$ vi jupyter_notebook_config.py
c.NotebookApp.browser = u'Safari'
保存して終了です。なお、u'Safari' の u というのは、後ろの文字列がUnicode文字列であることを指定しています。上記ファイルを作成後、再度、jupyter notebook を実行すると、無事ブラウザも起動してきました。
これを機にちゃんと勉強してみようと購入。