もうすぐプロ野球が開幕!各球団の選手が何年残っているか調べてみた!
球春到来!
いよいよ明日、プロ野球が開幕です。日本時間の30日に海の向こうメジャーリーグ(MLB)も開幕するので、日米(ほぼ)同時開幕ですね。
ということで、「Baseball Play Study 2018 春 NPB開幕スペシャル」というIT系の野球イベントで話してきました。この記事はその解説版です。
イチローがシアトルに帰ってきた!
今年のオフのビッグニュースがありました。大谷のエンゼルス入りや、上原・青木の日本復帰などいろいろありましたが、やはり何といっても
イチロー・シアトルマリナーズ復帰
が一番のニュースでしょう。個人的な話ですが、大学時代に1年休学してアメリカに留学してました。2011年9月~2012年8月のことです。その時、住んでいたのがシアトルで住んでた1年ぐらいは10回ぐらいセーフコフィールドに行きましたし、春休みにはアリゾナにキャンプを見に行きました。キャンプを見に行ったというより、キャンプ中のイチローを拝みに行ったという感じですね。野球観戦留学にいっていたと言っても過言ではないでしょう。
イチロー復帰記事からの疑問
そんな思い入れのあるイチロー選手が6年ぶりにシアトルに帰ってきました。日本でも大きなニュースになったのは記憶に新しいところです。復帰を報じる記事を見ていたらこんな記述がありました。
当時、一緒にプレーして残っているのは岩隈、フェルナンデス、シーガーだけである。 (出典探し中)
なんと、3人です!メジャーリーグは1球団あたり40~50人ぐらいの選手が1シーズンの間にプレーします。つまり6年立つと3/50しか残らないわけです。
なんと、6%!
僕はこの数字を直感的に「少ないな。マジで厳しい世界だな。」と思ったわけですが、この直感は正しいのか疑問でした。
ちなみに今年、同じような状況なのが7年ぶりに古巣、ヤクルトスワローズに帰ってきた青木宣親です。彼は2011年を最後にアメリカにいったのですが、2018年に帰ってきて、もともといたチームメートは14人にいます。
各球団選手の継続率を調べてみた
そこで各球団の選手が1年間にどれくらいの人数、試合に出場して、翌年以降どれくらい残っているのかをグラフにしてみました。
調べ方
1軍の試合に一瞬でも出場した選手を調べます。
データ元はMLBは baseball-reference 、 NPBは 日本野球機構公式HP です。
2008年から2017年の10年分、MLB30球団、NPB12球団あります。全てを目視でやっていくのはつらいのでスクレイピングしました。コードはこちら(これから修正あり。)
https://github.com/justin999/BbCohort
グラフ化
出てくるデータはこんな感じの表です。
表だとわかりにくいのでグラフにしました。
グラフの読み方
このグラフはコホートグラフと言われるもので、webサービスなどの運営の時に、ユーザの継続率を見るために用いることがあります。
上のグラフの例で言うと2008年の埼玉西武ライオンズは1軍の試合に48人が出場しました。2008年に出場していた選手のうち、2009年にも出場していたのは41人になり、さらに2010年には2008年とダブった選手は34人に減っていることがわかります。それをグラフに表すとオレンジ色のグラフになります。起点の年を1年ずつずらしていき、積み重ねたのが最終的にできたグラフです。
ということで早速、出力結果を見ていきます。
MLBの傾向
左上から
シアトル・マリナーズ
テキサス・レンジャーズ
オークランド・アスレチックス
ヒューストン・アストロズ
を並べてみました(アメリカンリーグ西地区)。
まず、2008~2009年の変化(オレンジ色)を見てみると、どの球団も大体半減していることがわかります。つまり、1年継続率は約50%です。
今年プレーした選手は来年は半分戻ってきません!なかなか厳しい世界であります。
NPBの傾向
翻ってNPBのパ・リーグを見てみましょう。
MLBと比べた時の、線の角度の違いがわかるでしょうか?
日本の場合、今年出た選手は来年も出てくる可能性が約80%あります。
NPBももちろん厳しい世界ではありますが、比べるとやさしい世界だなということがわかってきました。
ということで、最初の問、「イチローが6年ぶりにチームに戻ってきたら同僚が3人しか残っていなかったのが普通なのか?」の答えは
MLBなら普通
おまけ(コーディングのこととか)
文字化け
今回はPythonのBeautifulSoupというモジュールを使いました。当初、以下のような感じで日本語の選手名を取得していたのですが、文字化けします。
from bs4 import BeautifulSoup
url = 'http://npb.jp/bis/2008/stats/idb1_l.html'
html = response.text
soup = BeautifulSoup(html, 'lxml')
players = soup.find_all('td', attrs={'class': 'stplayer'})
日本語での情報取得は文字コードの問題がからんでくるので要注意です。次のコードなら文字化けしません。詳しいことは他記事で。
from bs4 import BeautifulSoup
url = 'http://npb.jp/bis/2008/stats/idb1_l.html'
html = response.content
soup = BeautifulSoup(html, 'html.parser')
players = soup.find_all('td', attrs={'class': 'stplayer'})
名前にアポストロフィー
MLBの選手名を取得していた時、思わぬところでエラーが起きました。"Shawn O'Malley"選手などですね。こういった細かい所の処理がスクレイピングではつきものです。
チームコードは変わる
420ページを解析するために、URLをある程度機械的につくります。NPBであれば、
'http://npb.jp/bis/[年の数字]/stats/idb1_[チームの記号].html'
といった感じです。ところが、いくつかのURLはアクセスしてもエラーになって返ってきました。例えば、2008年の横浜DeNAベイスターズのを調べようと思って、
http://npb.jp/bis/2008/stats/idb1_db.html
にアクセスしても「ページが見つかりません」と言われてしまいます。これは2011年まで「横浜ベイスターズ」であり、チームの記号は"yb"だったからです。このような球団の名称変更は日本では珍しく、この10年でベイスターズ以外にありませんでした。