セールスエンジニアの勉強ノート

日々成長を目指す40目前ダメダメセールスエンジニアが日々の勉強の記録を残します

イチロー選手のMLBでのBABIPの推移をグラフにしてみた

jupyter notebook + pandas + seaborn でやってみました。

f:id:otosan22:20170629232115p:plain

グラフはこちら。なんと、2012年のところのデータがおかしい。

f:id:otosan22:20170629232054p:plain

元データを見てみると、2012年は球団を移籍した年ですね。3行データがありましたが、マリナーズヤンキースと、合計の行のようです。トータルが.305なのでグラフ中の真ん中のポイントを見れば良さそうです。

 

f:id:otosan22:20170629232853p:plain

 

マリナーズヤンキースの行を消して再度グラフを描画してみると次のようになりました。成功です。

f:id:otosan22:20170629233309p:plain

こうやってみると、2010年までは0.360 くらいに収束する値をキープしていましたが、2011年から悪化してますね。

初心者が見よう見真似でイチロー選手のMLBでの成績をスクレイピングしてみた

昨日の投稿で次のような内容を本で読んだと紹介しました。

平均回帰傾向にあるBABIPというセイバーメトリクスが、イチロー選手に限って言えばMLB平均に収束しない

せっかくなので実際を求めてみたくなり、MLBの成績をスクレイピングしてみようと思います。初心者なのでコードの内容は突っ込まないでください。

otosan22.hatenablog.jp

 

使用したツール

  • pandas
  • 実行環境:jupyter notebook

実行した結果

実際やってみた結果が下記

f:id:otosan22:20170614014325p:plain

 

さて、ここからどうしたら良いのやら。

プロ野球でわかる!はじめての統計学

統計学を学ぼうとしている野球好きには最適

野球好きで統計を学ぼうと思っている人には最適です。統計学的に学んだ内容については今後書いていこうと思います。

今後調べてみたいこと

野球の成績に運は影響するというセイバーメトリクスの指標として、BABIPという指標があるそうです。フェアグラウンドに飛んだ打球がヒットになった割合を表す数字です。

MLBではどの選手もBABIPは0.300に収束するという平均回帰傾向という性質があるのだそうです。フェアグラウンドに飛んだ打球が野手の正面に行くかどうかは運次第ということなんでしょう。

しかし、驚くことに、イチロー選手だけが最低のシーズンでも0.316なんだそうです。イチロー選手だけに、MLBに移籍して10年もの間幸運が続くとは考えにくいので何か能力があると考えるのが妥当ですが、それが数字として立証されていないようです。

イチロー選手は「打ち損じると思ったらわざと空振りする」「野手の間に落ちるようにわざと詰まらせている」というような話をされている記憶がありますが実際にそういう技術があるのかもしれませんね。

初心者がベイズ統計学を学ぶ

ベイズ統計学入門

理系でしたが、数学は大の苦手で、大学時代にあまり勉強した記憶のない私ですが、読みました。すごく平易な表現、解説で読みやすいし、各章の末尾には練習問題があって、その章の理解を確認しながら読み進めていくことができます。タイトルにあるように、「完全独習」に向いていると思います。

 

そもそもベイズ統計学って何?

いまや多くのテクノロジーで使われている技術ですね。たとえば、スパムを見つける方法とか、ノイズを修正する仕組みとか、検索エンジンの自動翻訳システムでも使われている学問です。データが少なくても推測でき、データが多くなればなるほど正確になり、入ってくる情報に応じて自動的に推測をアップデートできるという学習機能がベイズ統計の強みです。 本書にも書かれていましたが、「今世紀のビジネスに従事をする上で、使いこなせれば最強になれる」今旬の学問ということで学んでみました。まだまだ初心者ですが、数式などは最後の最後でしか出てこず、最初のとっかかりとしては非常にわかりやすい入門書でした!

看守に尋ねるだけで自分の助かる確率が上がる「3囚人の問題」

本書の中でも圧倒的に面白かったのが、「3囚人の問題」 というパラドクスに関する解説です。 自分を含む3人の囚人のうち2人は処刑されて、1人は助かるという状況だと、自分が助かる確率は1/3ですよね。しかし、看守に、3人のうち2人は処刑されるんだから、自分以外の2人のうちどちらは処刑されるはずだ。それを聞いても自分の処遇は変わらないから教えてくれとたずねた際、看守が1人の名前を答えた。その瞬間に自分が助かる確率は、1/3から、1/2に上がるという話です。 この話、すごく興味深くないですか?どこかに矛盾があるの?とか考えてしまいますよね。  

初心者がデータを使って統計分析する第一歩「楽しいR」

環境セットアップ

書籍の中では、 環境準備としてWindows環境へのセットアップ手順が紹介されています。 私はMac OS上へインストールしました。 下記サイトから自分のOSバージョンにあったファイルをダウンロードしてクリックして進めるだけです。

https://cran.r-project.org/bin/macosx/ 

 

起動

本書にはRがどんなものかを体感できるようにサンプルデータが用意されています。まずはターミナルからRを起動してみます。

f:id:otosan22:20170611005625p:plain

 

サンプルデータのロード

下記リンクからサンプルデータをダウンロードします。

楽しい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])

f:id:otosan22:20170611203844p:plain

なにやら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 起動時にブラウザが起動しない

発生した事象

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)

 

環境

MacOS 10.12.5

Safari 10.1.1

python 2.7.13

jupyter 4.3.0

解決方法

~/.jupyter/jupyter_notebook_config.pyの設定

$ 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 を実行すると、無事ブラウザも起動してきました。 

f:id:otosan22:20170611005550p:plain