見出し画像

もうすぐプロ野球が開幕!各球団の選手が何年残っているか調べてみた!

球春到来!

いよいよ明日、プロ野球が開幕です。日本時間の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年でベイスターズ以外にありませんでした。

よろしければサポートをお願いします。いただいたサポートは今後のスキルアップに使います。