データで観るBリーグ

Bリーグをデータから楽しむブログです。

日本人ビッグマンと外国籍ビッグマンの体格とプレータイムを比較する

今回は小ネタです。

相変わらずビッグマンに関する議論が盛んです。もちろんいわゆるオンザコート2、つまり外国籍選手が常時ふたりコートに立てるようになった制度変更がきっかけですが、そこから派生してビッグマンの育て方や、日本人ビッグマンの体格に関することなど、色々な議論が交わされています。

今回はそんなビッグマンのデータを少しだけ見てみましょう。ちなみにここで「ビッグマン」と呼ぶのは、Bリーグの公式ページに記載されている選手の中から、ポジションにPF、またはCの記述がある選手を指しています(よって190cmのSF/PF表記でもここではビッグマンです。)

また、同ページにある国籍の情報を使い、選手を日本、帰化、外国籍の3グループに分けています。2018年11月6日時点のデータを使っています。

体格

まずは体格を見てみましょう。x軸を体重、y軸を身長としてプロットしてみました。B1とB2で図を分けています。

f:id:rintaromasuda:20181108070723p:plain f:id:rintaromasuda:20181108070738p:plain

B1の日本人ビッグマンは195~200cmがボリュームゾーンのようですが、B2になると195cm以下がボリュームゾーンのようです。正直B2は日本人ビッグマンと外国籍ビッグマンの差が大きいようで、B2はおそらくインサイドの争いはほぼ外国籍選手同士の争いのみという状況になっているのではないでしょうか。

また、これもB2の方で傾向が明らかですが、体重においても外国籍選手との間にはかなりの差があるようです。富山のジョシュア・スミス(ちなみにリーグで最も重い選手)のプレーを見ていると分かりますが、体重があることはインサイドで大きなアドバンテージになります。身長と違いウエイトトレーニング等で育てられる部分ですので、日本のインサイド陣には頑張ってもらいたいところです。

総プレータイム

ここまでの総プレータイムを見てみましょう。総プレータイムなので、属するチームの試合数や、その選手の参加時期にも影響されますが、全体を見れば傾向を理解することは出来ると思います。

各グループ間で人数が違うので密度プロットにしてみました。ちなみに帰化選手は数が少ないため、ここでは対象から外しました。

f:id:rintaromasuda:20181108070752p:plain f:id:rintaromasuda:20181108070815p:plain

まずB1もB2も、明らかに外国籍選手の方がプレー時間が長いという、皆さんご存知の傾向があります。またB1の方は、いわゆる3人目の外国籍選手、つまり選手登録はされているけれどベンチには入れない選手の存在もデータに表れているように思います。

B1、B2どちらのデータを見ても、日本人ビッグマンで最もプレーしている選手でも、外国籍選手の標準のプレータイム程度という構図になっているようです。

1試合平均のプレータイム

1試合平均のプレータイムも見てみましょう。こちらは「出場した試合におけるプレータイムの平均」です。よって出場した試合数の多い少ないにはあまり影響はされていないはずです。

f:id:rintaromasuda:20181108070831p:plain f:id:rintaromasuda:20181108070847p:plain

先ほどの傾向、「日本人ビッグマンで一番長くプレーしている選手が、外国籍選手の標準と同程度」はここでも見られるようです。B2ではほとんどの外国籍選手ビッグマンが平均30分以上プレーしているようで、最頻値(山が一番高い所)は35分程度となっています。皆さん出ずっぱりと言っても良さそうです。一方で日本人ビッグマンの最頻値はどちらのリーグも平均で10分程度のようです。

ちなみにプレー時間の長い日本人ビッグマンには以下のような選手がいるようです。身長を見るとどちらかというとSFとして外国籍ビッグマンと併用して起用されている選手が多いような気がしますね。実質のトップは熊本の中西、A東京の竹内でしょうか。

チーム 名前 身長 総プレータイム 試合平均プレータイム
愛媛 笠原 太志 188cm 385:25 29:38
東京Z 高山 師門 188cm 347:49 26:45
熊本 中西 良太 200cm 284:03 25:49
千葉 小野 龍猛 197cm 178:19 25:28
A東京 竹内 譲次 207cm 297:07 24:45
大阪 熊谷 尚也 195cm 162:18 23:11
A東京 ザック・バランスキー 193cm 268:25 22:22
香川 高田 秀一 195cm 263:50 21:59
西宮 谷口 淳 192cm 281:59 21:41
青森 臼井 弘樹 193cm 258:15 19:51
栃木 竹内 公輔 206cm 192:27 19:14
名古屋D 張本 天傑 197cm 216:42 18:03
福島 前田 陽介 188cm 234:28 18:02
金沢 井上 裕介 195cm 227:25 17:29
渋谷 満原 優樹 198cm 209:03 17:25
福島 武藤 修平 192cm 225:08 17:19
三遠 太田 敦也 206cm 207:02 17:15
滋賀 荒尾 岳 198cm 187:36 15:38
東京Z 村越 圭佑 195cm 193:39 14:53
福岡 加納 誠也 196cm 173:21 14:26

Bリーグではどれくらいまで「あきらめたら試合終了ですよ」と言えるのか

第4節で横浜がQ4開始時点で16点差あったリードをひっくり返し大逆転するというドラマがありました。いまハイライト動画を観ても横浜ブースターの興奮と、そして滋賀ブースターの落胆が伝わってくるようです。このような大逆転はスポーツの醍醐味のひとつですよね。

特にバスケットの場合は一度のゴールで2-3点取ることができるので、いわゆるブザービーターにおける大大大逆転までありえることは大きな魅力ではないかと思います。


横浜ビー・コルセアーズvs滋賀レイクスターズ|B.LEAGUE第4節 GAME2Highlights|10.21.2018 プロバスケ (Bリーグ)

さてこのときに横浜は16点をひとつのクォーターでひっくり返した訳ですが、どれくらいまでの点差なら逆転は可能なのでしょうか?

もちろん「あきらめたらそこで試合終了だよ」のごとく最後まで諦めないことからしかドラマは生まれませんが、一方で長いリーグ戦を勝ち抜くためには、ときに目の前の勝敗の優先順位を下げることも重要です。

この記事では昨シーズンのレギュラーシーズンの全試合のデータを元に、勝利したチームが各Qの終了時にどのくらいの得失点差にあったのかを見てみたいと思います。

まずは1Q終了時を見てみましょう。

f:id:rintaromasuda:20181102230418p:plain

やはりまだ1Qが終わったばかりなので、さすがに得失点差0が真ん中ではないですが、そんなに分布が右側にずれていないません。1Q終了時に少しビハインドだからってまだまだ勝利は掴めそうです。

でも実は計算をしてみると得失点差0(図の赤線)より左側の部分は26.1%ほどです。逆に言うと最終的に勝ったチームの73.9%は1Q終了時にリードしていたということになります。簡単には因果関係は結論できませんが、1Qが勝敗に重要なクォーターであることは疑いはないと思います。

また分布の左端を見てみると、1Q終了時に16点以上離されていたのに逆転した例はなかったということが分かります。実は今日アルバルク東京琉球ゴールデンキングスの試合があったのですが、琉球が1Q終了時点で16点の差をつけてリードし、アルバルク東京の猛反撃に期待したのですが結局そのまま追いつくことができませんでした。

続いて2Q終了時です。

f:id:rintaromasuda:20181102231135p:plain

まず分布がちょっと右側に伸びたことが分かると思います。クォーターがひとつ進むに連れて少しずつ勝利が決まりつつあるように見えます。そしてここで面白いのが左端です。なんと2Q終了時に20点差をつけられていたのにも関わらず逆転した例があったのが分かります

これは先ほどの1Qのデータと矛盾するようですが、1Q終了時点では15点以下の点差で負けており、2Q終了時点でその差は20点まで離れたが、後半に一気に逆転したということです。諦めなければなんとなるものですね。

ちなみにその逆転はこの試合で起こっています。


三遠ネオフェニックスvs名古屋ダイヤモンドドルフィンズ|B.LEAGUE第18節 GAME2Highlights|02.04.2017 プロバスケ (Bリーグ)

ちなみに以前のブログでも別の試合で名古屋ダイヤモンドドルフィンズの大逆転について取り上げました。逆転に強みのある、諦めない素晴らしいチームだと思います。

最後に3Q終了時の得失点差を見てみましょう。

f:id:rintaromasuda:20181102232448p:plain

さらに分布がぐっと右側に寄りましたね。そして左端を見ると、なんと4Q開始時点で18点もの差があったのに逆転したゲームが見つかりました。それはこのゲームです。


富山グラウジーズvsレバンガ北海道|B.LEAGUE第1節 GAME2Highlights|10.01.2017 プロバスケ (Bリーグ)

とんでもない逆転劇ですよね。4Qの得点が14-34で北海道が一気に追いついたようです。分布を見ると上述の横浜の逆転も16点差をひっくり返したのはかなり珍しいものだったことが分かります。

最後に3つの分布を重ねてみてみましょう。

f:id:rintaromasuda:20181102233305p:plain

繰り返しになりますが、クォーターが進むごとにどんどんと分布が右にずれていっているのが分かると思います。

本題に戻ると、あくまで2017-18シーズンのデータだけを見てということですが、各クォーター終了時に21点以上離されていなければまだイケるとざっくり理解していいと思います。もちろん色々な状況には左右されますが、それくらいの点差までであれば、安西先生の言葉を信じて頑張ってみてもいいのではないでしょうか。

2018-19シーズンB2定点観測 - 第5節(8-9ゲーム)終了時点

B2のゲームをまったく観られていません!正確に言うとB1のゲームもあまり観られていないのですが、B2はもっと観られていません。シーズン前は茨城ロボッツが面白そうなのでゲームを観ようかなと思っていたのですが、気が付けばB1が始まってからというもの一度もB2のゲームを観ていません。やはりなんだかんだで後回しになってしまっておりまして。

今後もB2のゲームを観る時間を設けるのもなかなか難しそうなので、ときどきデータを見て何となくB2で起きていることを掴むことを目指したいと思います。前回の記事ではB1のデータを見ましたが、B1は各種メディア(と言ってもバスケット専用のメディアですが)で戦況がカバーされますから、むしろこういうネタはB2の方が向いているかもしれません。

手元ではプログラムを組んであるので、今後同じ内容のデータを取得するのにあまり手間はかかりません。なのでこの2018-19シーズンは、ときどき定点観測ネタをB2についてお届けしてみようかと思っています。

では第5節、各チーム8ないし9ゲームが終わった時点のデータを見てみたいと思います。

得点、失点、得失点差

まずは得点と失点、そしてその差を見てみましょう。図にある点の大きさが得失点差を表現していますので、例えば小さい点ばかりであれば、そのチームは接戦ばかりであったと推測できます。

f:id:rintaromasuda:20181025212905j:plain

f:id:rintaromasuda:20181025212915j:plain

実はデータを見るまで知りませんでしたが、信州は今のところ全勝だったのですね。そしてほとんどの試合で結構な差を付けて勝っているようです。強いですね。広島、熊本、群馬、東京Zあたりも今のところ勝ち越しているようですが、接戦の中で掴んだ白星も含まれているのが分かります。

奈良、八王子、香川、青森、金沢、西宮あたりは苦戦中しているようです。特に奈良はあまり点数が取れていないようで、今のところ80点以上取れた試合がないようです。青森はけっこう失点が嵩んでいるようですね。試合のペースが早かった結果かもしれませんが、気になる部分ではあります。

FE名古屋は既に100点ゲームでの勝利を2回も達成していますね。リーグナンバー1シューターだった福澤が茨城ロボッツに移籍してしまいましたが、それでも今シーズンも高いオフェンス力を保っているように見えます。

FG%、被FG%

ここまでのフィールドゴール%(2点も3点も含みます)と、被フィールドゴール%、つまり相手チームのフィールドゴール%を見てみましょう。オフェンスとディフェンスの調子を掴むためには良い指標だと思います。

まずはフィールドゴール%です。

f:id:rintaromasuda:20181025212924j:plain

FE名古屋はオフェンスが波に乗ると爆発する感じのチームではないでしょうか。仙台もとても高い%を記録したゲームがありますね。一方で広島、島根、信州あたりは安定して良い値が出ていると思います。東京Zも悪くはないようです。これらのチームのオフェンス力は良いと言えると思います。

一方で西宮や八王子のフィールドゴール%は低めとなっています。西宮ストークスはどうしてしまったのでしょうか。あまり調子が出ていないようです。昨シーズンはB1でプレーしていたわけですし、主要な選手は残っているように見えるので、何で今シーズンはここまで不調なのか、ちょっと気になるところではあります。

次に被フィールドゴール%を見てみましょう。各チームのディフェンスはどうでしょうか。

f:id:rintaromasuda:20181025212933j:plain

ここでもやはり西宮ストークスの様子が気になってしまいます。オフェンスだけではなく、ディフェンスに大きな課題が潜んでいるように思えます。奈良、八王子、山形あたりも同様に課題がありそうですが、繰り返しになりますが元B1チームらしくない値が気になります。

信州、熊本、FE名古屋は勝ち越しているだけあり、相手のシュートの%を落としているようです。実際にどのチームのディフェンスもこの目で見ていないのですが、きちんと相手にタフショットを打たせるよう、タイトなディフェンスを心掛けていると想像します。

ディフェンスリバウンド取得率、オフェンスリバウンド取得率

では最後にリバウンドの取得率について見てみましょう。ちなみに取得率の計算の仕方は(と言っても簡単ですが)、この記事の中で解説しています。

まずはオフェンスリバウンドの取得率です。簡単に言えば、自軍のゴールから落ちてきたこぼれ球の総数を100として、その内のどれだけをリバウンドすることができたのか、という指標です。相手にオフェンスリバウンドを取られるとどんどん下がっていきます。

f:id:rintaromasuda:20181025212943j:plain

広島や茨城はディフェンスリバウンドをよく取っていますね。B1だと王者アルバルクがきちんとディフェンスリバウンドを取っているというデータがあるのですが、B2だと今のところ絶好調の信州はさほどでもないです。これは意外でした。

またもや西宮の話題ですが、ディフェンスリバウンドもちょっと課題のようです。熊本も勝っている割にはあまりディフェンスリバウンドを取れていないですね。八王子や香川などもディフェンスリバウンドには課題があるようです。奈良はここでは頑張っているようです。

続いてオフェンスリバウンドです。

f:id:rintaromasuda:20181025213002j:plain

広島はここでも存在感がありますね。全体的にリバウンドの強いチームだと言えそうです。リバウンドやディフェンスはリーグが進むにつれてどんどんボディーブロー的に効いてくると思いますから、今後も広島ドラゴンフライズは白星を挙げ続けそうです。島根、仙台、東京Zもオフェンスリバウンドに関して悪くないようです。

総評

B2の第5節までの数字から、今の戦況について色々と想像してみました。信州の全勝ぶりは見事ですが、例えば広島やFE名古屋、熊本、島根なんかも今後さらに白星を挙げてくると思います。繰り返しになりますが、西宮ストークスの不調振りもかなり気になっています。

あとあまり目立ちませんでしたが、金沢武士団の値はそんなに悪くありません。今のところ勝ち越せていないものの、これから徐々に白星を挙げてくるのでは、と思いました。同チームの選手は今のところひとりも知らないので、今度勉強しておきたいと思います。

では今回はこの辺で。次は20ゲームくらい終わったところで定点観測ができるといいです。

2018-19シーズンB1定点観測 - 第4節(7ゲーム)終了時点

データをネタにしてコンテンツを作っているとひとつ弱点がありまして、それはデータが集まるまではしばらく何もできないということです。新シーズンがはじまって大盛り上がりしているのに、私はひとり昨シーズンの話ばかりをしていて寂しく感じていたりしてました(笑)

そういうわけで2018-19シーズンも第4節、つまり7ゲームまで終わりましたので、ここらで新シーズンの話を書いてみたいと思います。

得点、失点、得失点差

まずは各チームのここまでの得点と失点を見てみましょう。まだデータサイズが7ゲームと少ないので、このブログではおなじみの箱ひげ図は使わず、普通に点で各ゲームを表しています。試合の結果で色分けをしてみました。

あとこれは導入するかどうか迷ったのですが、点の大きさで得失点差が分かるようにしてみました。点が小さいほど最終的な得失点差が小さかったことを表していますので、例えばあるチームに小さい点ばかり並んでいるようでしたら、そのチームのゲームは接戦ばかりだったことが想像されます。

f:id:rintaromasuda:20181023232712j:plain

f:id:rintaromasuda:20181023232723j:plain

アルバルク東京はさすがという感じで、得点を多く取らなくても勝てるディフェンスのバスケットを確立してきている気がします。ディフェンスはオフェンスほど調子に左右されませんから、長いシーズンを勝ち続けるためにはこれはとても好ましいことです。

琉球はディフェンスもさすがですが、かなりの差を付けて相手に勝利してきているようで、今シーズンはオフェンス力も相当なものではないかと思われます。滋賀、三河、新潟あたりは接戦が続いてますね。富山、千葉、京都はさすがの攻撃力といったところでしょうか。三遠と福岡は今のところかなり苦戦しているようですね。

フィールドゴール%

各チームのシュートの調子はどうでしょうか。今シーズンは制度変更の影響で外国人選手が出ずっぱりなチームもあり、インサイドを使ったオフェンスが増えて、フィールドゴール%は高めのシーズンになるかもしれませんね。

下の図はフィールドゴール%と、2点シュートのみに絞ったフィールドゴール%をプロットしたものです。

f:id:rintaromasuda:20181023234214j:plain

f:id:rintaromasuda:20181023234221j:plain

今シーズンの京都は今のところえらいシュートが決まっていますね。琉球もとてもよくシュートが決まっています。並里効果でしょうか。富山もスミスがアタックしまくっている関係か、かなり高い数字が出てきます。秋田やSR渋谷はちょっと2点シュートには苦戦している様子が見受けられます。福岡はシュートが入っていないわけではなさそうですね。今のところ白星がない原因はやはりディフェンスなのでしょうか。

リバウンド

以下のブログ記事で説明しましたディフェンスリバウンドとオフェンスリバウンドの取得率を見てみましょう。

記事の中でも書きましたが、オフェンスリバウンドについては値が小さくてもそれがチームの方針、つまりあまり積極的にオフェンスリバウンドに行かないようにしている、という可能性もあります。

f:id:rintaromasuda:20181023235206j:plain

f:id:rintaromasuda:20181023235218j:plain

まずはやはりアルバルク東京のディフェンスリバウンドですね。本当にきっちりとディフェンスリバウンドを拾っているのだな、という値です。千葉、栃木、三河あたりも良いのですが、王者がやはり一歩抜け出した形のようです。

京都、新潟、福岡、北海道、名古屋Dあたりはディフェンスリバウンドで苦労しているようですね。ここは必ず対策が必要な部分でしょう。

オフェンスリバウンドでは富山と栃木が存在感を示しています。富山と栃木と言うか、スミスとギブスなんじゃないかという気がしますが(笑)ふたりともセカンドチャンス、サードチャンスと次々とボールを毟りとりますからね。あと琉球もすごいですね。ブラウンでしょうか。

上の記事では三遠はオフェンスリバウンドを意図的に取りにいってない説を展開したのですが、このシーズンは今のところ目立って他のチームより低い訳ではないようです。その代わりと言ってはなんですが、京都と名古屋Dが低いですね。あと川崎が低いのも目立ちます。ファジーカスの完全復活が望まれるところです。

タイムシェアを指標化して、常時オンザコート2の影響を視覚化する

今シーズンからいわゆる常時オンザコート2となり、外国人選手が常に2人コートに立てることになりました(ベンチ入りは2人まで、選手登録は3人までです。)これに伴い外国人選手のプレータイムにファンの注目が集まっています。この記事ではタイムシェアを指標化し、視覚化することで、制度変更がプレータイムに与える影響を見てみたいと思います。

あと私の個人的なファン心理として、全員バスケットを応援したいという気持ちがあります。プレータイムがもらえていない選手に気が付くと気になってしまう質なのです。昨シーズンだと千葉の阿部(現富山)なんか気になっていました。今シーズンだとA東京の斎藤あたりも。タイムシェアに指標を設けることで、各チーム感での比較も可能になります。そうするとよりタイムシェアをしているチームがどこなのか、していないチームがどこなのかに着目することもできます。

それにBリーグさんだって今シーズンの終わりには制度変更の影響を振り返らなければならないはずです。感覚のみで是非を判断しない為にも、何某かの指標は必要ではないかと思います。私は普段の仕事で定量的に仕事の結果を表現する役目になることが多く、ちょっとそういうのも気になってしまいます。もしBリーグさんの参考にもなれば幸いです。

どのようにタイムシェアを指標化するのか

タイムシェアの指標として、よく経済の分野で使われる「ジニ係数」というものを導入したいと思います。経済の分野は小難しい内容も多いですが、ジニ係数の概念は簡単ですのでお付き合い下さい。

ジニ係数とは?

ここに子供が50人がいて、キャンディが100個あるとします。このキャンディを子供たちに自由に分配させるとします。

みんなで相談してひとり2個ずつ平等に分けるかもしれませんし、ある一部の子供たちが他の子供たちよりも多くキャンディを手にするかもしれません。最悪ひとりのガキ大将が100個すべて独占するかもしれません。

この分配の結果を以下のような正方形の図にします。

f:id:rintaromasuda:20181018232604p:plain

すべての子供にキャンディが平等に行き渡れば、図に引かれる累計の個数を表す線は真っ直ぐな対角線になります。しかし一部の子供たちによる独占があればあるほど、累計の線が徐々に右下に向かって拡がって行きます。ひとりによってすべてが独占された場合、この線は下辺と右辺に沿うものになってしまいます。

こうすることで、この対角線と引かれた線の間にある領域の面積が大きければ大きいほど不平等、という性質が出来上がります。簡単に言うと、この面積の大きさがジニ係数です。正確に言うと、この面積が三角形の面積と比べてどのくらいか、というのがジニ係数です。

完全に平等(みんな2個ずつ)だとジニ係数は0、完全に不平等(ひとりが100個を独占)だとジニ係数は1になります。よってジニ係数は0か1かその間の値になります

バスケットボールのプレイタイムの場合

バスケットボールは5人で行うスポーツなので、ひとりでプレイタイムを独占することは出来ません。最低でも5人で独占です。なのでジニ係数は絶対に1にはなりません。

Bリーグではベンチに入れる最大の人数は12人ですが、全部で12人の選手がいるのにスタメンの5人が交代なしで最後までプレー(つまりすべてのプレイタイムを独占)した場合、ジニ係数は約0.583となりますBリーグにおいてはこれがジニ係数の最大値だと思って良いでしょう。

2017-18のB1レギュラーシーズンのジニ係数を見てみる

ではまずは昨シーズンのB1レギュラーシーズン全試合分のジニ係数を見てみましょう。皆さんのお気に入りのチームはタイムシェアをしていたチームでしょうか、それともそうでないチームでしょうか?繰り返しになりますが、値が小さいほどタイムシェアが出来ているという指標です。プロットはいつも通り箱ひげ図にて行いました(そのうち箱ひげ図の説明もブログに書きたいと思います。)

ではどうぞ!

f:id:rintaromasuda:20181018233742j:plain

頑張れレバンガ!

レバンガ北海道の全員バスケット素晴らしいです!シーズンを通してタイムシェアを行っていた様子が分かりますね。アットホームな雰囲気のあるレバンガ北海道にぴったりだと思うのは私だけでしょうか。レバンガはこういう部分をさらに積極的に売り出してもいいかもしれませんね。

この分析を行うまでは実は全員バスケットと言ったら名古屋ダイヤモンドドルフィンズというイメージがあったのですが、どうやら名古屋は次点のようです。SR渋谷と、あと小憎らしいことに王者アルバルク東京もタイムシェアがされていたようです。

タイムシェアがあまりされていなかったのは三河や富山です。富山のプレイタイムの偏りはこのブログでも何度か取り上げていますが、実は三河はノーマークでした。中央値(箱の中の線)や75パーセンタイル(箱の上辺)を見ると頭ひとつ抜けてタイムシェアがされていなかったようです。これ見ると改めて比江島と橋本が抜けた穴の大きさを感じます。それだけたくさんプレーをしていた選手がふたり抜けてしまった訳ですから。

昨シーズン1番タイムシェアされたケースと、1番されなかったケースを見てみる

さて、少し実例を見てみましょう。レバンガ北海道ジニ係数が0.1に迫る試合があったのが図から分かりますが、こちらでスタッツが見られます。各選手のプレイ時間はこのようになっています。

f:id:rintaromasuda:20181018234940p:plain

見事ではないでしょうか?思わず「美しい…」と呟いたほどの全員バスケット振りでした。

次に三河ジニ係数が0.55くらいまでいった試合のプレイタイムを見てみましょう。上述しましたが理論上の最高値は0.583くらいのはずなので、かなりの独占ぶりであることが想像されます。この試合のスタッツはこちらから見られますが、プレイタイムは以下のようになっていました。

f:id:rintaromasuda:20181018235353p:plain

どうでしょうか、かなりの独占ぶりではないでしょうか?かろうじて西川と松井がプレイタイムを得ている以外はほぼスタメンだけで試合をこなしたような形だったようです。

常時オンザコート2の影響は?

さてでは今シーズンの値を見て、昨シーズンの値と比較してみましょう。この執筆時点では2018-19シーズンは5試合しか終わっておりませんので、その5試合をプロットしたいと思います。このサイズだと箱ひげ図にしてもしょうがないので、先ほどの昨シーズンの箱ひげ図の上に重ねて赤色の点で今年の値をプロットします。

このようになりました。

f:id:rintaromasuda:20181019000653j:plain

これはどうでしょう。なかなか一言では表し辛いです。

全体的にはやはりプレイタイムの独占が進んだように見えます。京都、栃木、北海道なんかは軒並み昨シーズンと比べると高い数値が出ていますね。北海道はHCが変わったなどの影響も強くあると思いますが、今のところ全員バスケットの雰囲気はないようです。京都は確かロスターが他のチームより少なかったと思いますが、それでもこれだけ高い数値が出るということは、かなり交代を抑えているのではないでしょうか

一方で三河、川崎、大阪あたりはかなり数値が落ちています。川崎はファジーカスが出場しなかったなども影響していると思いますが、一方でセカンドチームがうまく機能するようになってきた感じもありました。かなり良い兆候ではないかと思います。三河の値が下がったのは、これも結局は比江島、橋本が去ったことによるものでしょう。大阪については今シーズンのことはまだよく知らないので、今度ゲームを観るときの楽しみにしておきます。

チームを全部まとめて今シーズンと昨シーズンを比較したらこうなりました。

f:id:rintaromasuda:20181019002019j:plain

まあまだ語るには早すぎる面は否めませんが、どうやらぐっとジニ係数が高めのところにまとまった感があります。比較的どのチームも似たような割合でプレイタイムを分配するようになってきたのかもしれません。今後これがどう変化してくるのかはすごく興味深いです。

まとめ

プレイタイムのタイムシェア具合をジニ係数を用いて指標化しました。昨シーズンを見ると北海道や名古屋は全員バスケットで挑んでいた様子が分かりますが、三河や富山はかなりプレイタイムに偏りがあった様子が分かります。また今シーズンに導入された常時オンコート2の影響は一部のチームには強く出ている気配はありますが、チームによってはタイムシェアが進んでいる場合もありました。いずれにせよまだ今シーズンは5試合を消化しただけなので、もう少しシーズンが進むのを待ちたいと思います。

バスケットボールは交代が自由なスポーツなので、その他の交代に制限があるスポーツとはまた違った交代の戦略が求められます。別にプレイタイムを平等にシェアすることが正解だと言いたい訳ではないのですが、どのようなプレイタイムの分配がどのような結果につながったか、そういう分析の一助になれば幸いです。

Bリーガーの身長データを使ってRの初歩的な集計と可視化をやってみる

今回はバスケットボールの話ではなく技術系のネタです。

はじめに

実際のBリーグの選手データ(名前、所属チーム、身長、体重など)を使ってRの使い方やデータ分析の考え方の初歩に触れてみたいと思います。ちなみに以下の記事はその選手データを用いて書いたものです(データを取得したタイミングは違いますが。)

ひとつ注意事項です。この選手データは2018/10/13時点で私がBリーグの公式ページから取得してきたものですが、Bリーグさんはもちろん私も内容の正誤については責任を持てませんので、あくまで練習用のデータだとご理解頂ければと思います。

この記事で必要なもの

この記事ではRを使います。またRのプログラムを書き実行するのにはR Studioというソフトウェアが便利なので、それも使用します。

この記事でやること

この記事で以下のことをしたいと思います。

  • Rに選手データを読み込む
  • 選手データを確認のために閲覧する
  • dplyrというパッケージを使ってデータの集計を行う(チームの身長について集計する)
  • ggplot2というパッケージを使ってデータを視覚化する

ではやってみましょう。まずはR Studioを起動して下さい。R Studioの細かい操作についてはここでは説明しませんが、下記画像の赤枠のテキストエリアにコマンドを書き、テキストエリアの該当行にカーソルがある状態でCtrl + ENTERと押すと青枠のコンソールエリアでそのコマンドが実行されます。それが唯一の使い方ではありませんが、私はそれを繰り返すことで分析作業をすることが多いです。

f:id:rintaromasuda:20181015053753j:plain

データを読み込む

データはgithub上に上げてあります。以下のようにするとそのデータをR上に読み込むことが可能なはずです。

url <- "https://github.com/rintaromasuda/bleaguebydata/raw/master/blog/2018101301/bleaguers_20181013.csv"
df <- read.csv(url)

read.csvというのはその名の通りCSVファイルを読み込むためのものです。読み込んだ後にdata.frameというすごく便利な型にデータを変換してくれます。data.frame型というのは、イメージとしてはExcelのテーブルみたいなもので、行(Row)があり、列(Column)があり、列には名前が付いていたりします。

データを見てみる

データを読み込んだら、ざっとそのデータを見てみることが多いです。*1

dim(df)

dimを使うとそのdata.frameの行数と列数が表示できます。

str(df)

strを使うとそのdata.frameの各列の名前と、その列自体の型、そしてそこにどんな値が存在しているのかを一部表示できます。今回のデータを上記のコマンドで読み込んだ場合、列はint型(整数)かFactor型のいずれかになっていると思います。

Factor型というのは「選択肢が限定された文字列」のようなものです。例えばチーム名であればB1、B2合わせて36個の選択肢しかないのでFactor型に適しています。その意味では選手の名前はFactor型に適したものではないのですが、ここではそのまま進みます。

summary(df)

strと似ていますが、こちらは各列に格納されている数値型の値の統計値を表示してくれます。例えば選手の身長が入っているHeightという列がありますが、最小値、最大値、中央値、平均などの値が表示されるはずです。

View(df)

これはデータをそれこそExcelのように別のタブで表示してくれます。実際に目で見て確認したいときに便利です。

head(df)

データ量が多い場合はheadで最初の数行を表示するのも便利です。ちなみに正確に言うのであれば、headはdata.frame型のデータの最初の数行を別のdata.frame型として返してくれるものです。

tail(df)

headと同じですが、こちらは最後の数行を返してくれます。

どうでしょうか。ざっと見た感じでB1とB2のチームに属する選手データが入っていたのが分かったのではないかと思います。

集計をしてみる(チームごとに人数を数える)

まずは各チームの選手の人数を見てみましょう。ここはいくつか新しい概念が同時に出てきますが、頑張ってひと通り説明した糸思います。

まずはdplyrというパッケージを読み込みます。パッケージというのはRの拡張機能のことで実に様々なものがあるのですが、このdplyrや後で出てくるggplot2というパッケージはもはやRの標準機能であるかのごとくよく使われていると思います。

if (!require(dplyr)) {
  install.packages("dplyr")
  library(dplyr)
}

これは日本語で言うと「dplyrパッケージが既にインストールされていたら読み込んでね。なかったらインストールした後に読み込んでね。」ということをやっています。Rのバージョンなどによっては警告など出るかもしれませんが、エラーでなければ問題なく使えると思います。

では各チームの人数を見てみましょう。まずは説明の前に以下のコマンドを実行してみて下さい。

df %>%
  group_by(Team) %>%
  summarise(NumOfPlayers = n()) %>%
  as.data.frame()

そうするとこんな感じのアウトプットがあったはずです。なんとなく各チームの選手の数が数えられていそうですね。

       Team NumOfPlayers
1     A東京           12
2  FE名古屋           13
3    SR渋谷           13
4      愛媛           11
5      茨城           12
6      横浜           14
...

順を追って説明します。

まず%>%という記号が出てきましたが、これはdplyrをロードすると使えるようになるパイプと呼ばれる機能です。意味は簡単で、「この記号の左のものを右のものに入力してね」という意味になります。改行して書いていますけれど、左から右にデータが流れていく感じで理解してもらえればと思います。例えば先ほどhead(df)というコマンドを書きましたが、パイプを使ってdf %>% head()と書けます。さらにdf %>% head() %>% summary()と書くと最初の数行だけに対してsummary()が実行されます。

お察しの通り別にパイプを使わなくても書けるのですが、dplyrを使ってやりがちなことはこのパイプを使うときれいに整理できるため、使うことが多いです。

続いてgroup_byです。これはSQLの知識がある人にはお馴染みかと思いますが、要するに集計する際の束ね方を指定しています。今は「各チームの」人数を集計しようとしているのでTeam列を指定していますが、例えばポジションごとに集計したいならPosition列を指定しますし、B1、B2ごとにしたければLeague列を指定します。

続いてsummarise()です。ここでは具体的な集計方法と、集計結果を格納する列の名前を指定しています。n()というのは「数を数えてね」という意味の、集計の中ではもっとも単純な関数です。ここで例えばチームごとの平均身長を求めたい場合はMeanHeight = mean(Height)などのようにHeight列に対して``mean()```を実行したりします。他にも最大値、最小値を求める、中央値を求める等々、要件によって色々な集計関数を使用します。

as.data.frame()というのは、summarise()の時点では結果がdata.frame型ではないため、冒頭に述べた通りdata.frame型が便利なのでそれに変換している処理です。

集計をしてみる(チームごとの最低身長、最高身長、平均身長、身長の中央値を求める)

では以上を応用して、チームごとに身長の最低、最高、平均(mean)、中央値(median)をそれぞれ求めてみましょう。あとおまけとして、今回はB2のチームは除いてみましょう。その為にはこのように書きます。

df %>%
  filter(League == "B1") %>%
  group_by(Team) %>%
  summarise(MinHeight = min(Height),
            MaxHeight = max(Height),
            MeanHeight = mean(Height),
            MedianHeight = median(Height)) %>%
  as.data.frame()

こんなアウトプットになったと思います。

      Team MinHeight MaxHeight MeanHeight MedianHeight
1    A東京       171       211   193.0000        192.5
2   SR渋谷       174       213   192.6154        193.0
3     横浜       173       208   192.3571        190.5
4     京都       173       208   188.4545        188.0
5     三遠       169       206   189.2308        187.0
...

まずfilter(Leauge == "B1"というのが出てきましたが、これは想像の通り「この条件に当てはまるデータだけしかいりません」という意味です。当てはまらないデータは以降の処理からは除外されます。

またご覧の通りsummarise()にはこうしていくつもの集計関数を一気に指定することが可能です。

データを可視化する(身長のヒストグラムを作ってみる)

さて最後に身長のヒストグラムを作ってみましょう。でもその前にデータを扱う人のちょっとした小言です。

世の中「平均」が多く使われます。平均身長や平均年収など、データが「集計」されるときは大抵の場合に平均を使ってデータが集計され、説明されることがほとんどです。平均は世の中の人のほとんどが理解しているという意味では大変便利なものですが、集計されるもとになったデータを正しく、というか誤解なく表しているかというとそうでない場合も多いです。

有名な例、でかつバスケットの例なんでちょうどいいのですが、アメリカのノースカロライナ大学で卒業生の平均年収を学部ごとに集計していたところ、ある年に地理学の平均年収がすさまじく上がったことがあったらしいのです。でもそれは地理学の学生の年収がすべからく上昇したわけではなく、実はマイケル・ジョーダンが地理学専攻だった、というオチだったと。中央値を集計していればこのようなことはないですが、平均だととんでもない人に引きずられてしまうことになります。

収入を語るときに平均は上記の理由で適切ではない場合がほとんどですが、世の中ではまだまだ年収と言えば平均で集計されており、ジョーダンのときの問題はいまだに残っていることになります。

はい、小言は終わりです。何が言いたかったかというと、集計するのであれば適切なものを選ぶべきであるし、データ担当者はなるべく集計する前のデータそのままを扱ってそのデータを理解するように努めるべきだということです。そしてその為の有効な手段のひとつがグラフを作ることです。

私はこのブログで箱ひげ図を多用しているのでそのうち箱ひげ図についても説明を書きたいと思っているのですが、今回はヒストグラムを作りたいと思います。

ggplot2

Rにはデフォルトで可視化の為の関数が色々と用意されていますが、上述の通りこのggplot2というパッケージが広く使われていて、もはや標準機能くらいの存在感があると思います。今回はこれを使いたいと思います。

ggplot2もdplyrと一緒でちょっと書き方が特殊に感じる部分はあるのですが、慣れてくるとすごくよくデザインされていると感じるようになります。ではまずは単純にヒストグラムを作成します。さっきまで%>%でしたが、ここでは+を使っていることに注意してください。

if (!require(ggplot2)) {
  install.packages("ggplot2")
  library(ggplot2)
}

ggplot() +
  geom_histogram(data = df, binwidth = 2, aes(x = Height))

パッケージのロードについては先ほどと一緒です。

ggplot()というのはggplotを使う前のおまじないみたいなものです。ggplotはグラフをいくつも重ねて描いたりできるのですが、このggplot()+を使って表示したいグラフやその他の装飾処理をどんどん追加していくイメージで使います。

今回の場合はヒストグラムをひとつだけ追加したいので、geom_histogram()というヒストグラム描画用の関数を使い、dfデータを使うこと、棒の一本の幅が2(つまり身長2cm分)を表すこと、x軸に使う列は何であるかなどを指定しています。これを実行すると以下のようなヒストグラムが描かれたはずです。

f:id:rintaromasuda:20181015225729j:plain

先ほど平均が正しく元のデータを表さないときがあると言いましたが、このデータの平均身長はmean(df$Height)と書くと求められますが190cmくらいなんですね。しかしヒストグラムを見ると、190台後半の選手は少ないけれど、206-8cmくらいの選手はかなりたくさんいるなということが分かります。これはご存知の通り外国人ビッグマンによるものですが、例えばこういう感覚は平均身長だけ見ていれば分からなかったものです。

ではこの記事の最後にB1とB2の身長ヒストグラムを別々に作り、一緒にプロットしてみたいと思います。

ggplot() +
  geom_histogram(data = subset(df, League == "B1"), binwidth = 2, aes(x = Height, fill = League, alpha = 0.5)) +
  geom_histogram(data = subset(df, League == "B2"), binwidth = 2, aes(x = Height, fill = League, alpha = 0.5))

するとこんなヒストグラムができるはずです。

f:id:rintaromasuda:20181015230527j:plain

なんとなくいつもこのブログに載っているようなものに見た目が近くなってきました。このヒストグラムは色分けや透明化など見やすくするために少しだけ努力をしていますが、ここでは細かく説明することはやめておきたいと思います。実際この部分はケースバイケースで対応しなければならないことも多く、本質的ではなかったりするのですが、人に誤解なく伝わるように結構な時間がかかる部分だったりします。毎回少し違う要件があったりするので、いつもウェブを検索しては対応していたりします。

さて、今回はこの辺にしておきたいと思います。コードもすべてGitHubに上がっていますので、必要があれば参照してみてください。

*1:ちなみに、データの分析を担当することになった場合、このようにいきなり分析を対象するデータが用意されていてそれを分析する、ということはあまりないと思います。このデータそのものを用意することから仕事である場合がほとんどで、かつそこが一番の労力がかかる部分だったりします。この選手データも公式サイトから取得した後に、分析しやすいように少し加工などしています。

「カワサキ・スリーポイント・チャレンジ」にデータを使って挑む

川崎ブレイブサンダースのこんな興味深いイベントを発見しました。

来週10/17(水)の川崎ブレイブサンダースシーホース三河戦において、川崎が何本のスリーポイントを成功させるのかを当ててみようというイベントです。半分ネタのノリっぽくはあるのですが、過去のデータを見ながら当ブログも挑戦したいと思います!

過去のスリーポイント成功数

2017-18、2016-17のそれぞれレギュラーシーズン60試合にて、川崎がどれくらいのスリーポイントを成功させたのかの分布を見てみましょう。

f:id:rintaromasuda:20181013005628j:plain

どちらのシーズンも7本が標準的な本数だったようですが、そこからの拡がり方をみると2017-18シーズンの方が若干本数が少なめだったと言えそうです。川崎は2016-17からの3シーズンそこまで主力選手に変更はないですし、この程度なら有意差は無さそうなので、まあ同じくらいと見ておいて良いでしょう。

時系列でも見てみる

昨シーズンの成功数を時系列でも見てみましょう。ちなみに参考になるように三河戦は青い点で表示しています。

f:id:rintaromasuda:20181013010137j:plain

まあ標準的な7本の試合が2つあり、上にも下にもブレた試合がもう2試合という感じです。シーズンの出だし、あまり調子よくありませんね。今シーズンもまだ出だしですので、参考になるかもしれません。

またチームとして本数が多い試合が連続する、というのはあまりないみたいですね。これもヒントになりそうな発見です。

三河の被スリーポイント成功数も見てみる

三河スリーポイントに対するディフェンスも気になります。三河が昨シーズンどれくらいスリーポイントを決められたのかも見てみましょう。ちなみに先ほどと逆で、川崎戦を赤で表示しています。

f:id:rintaromasuda:20181013010325j:plain

結構スリーポイントを決められていますね。実は他のB1チームに比べて三河は被スリーポイント成功数が多めです。ディフェンスの方法でも影響しているのでしょうか。

f:id:rintaromasuda:20181009074906j:plain

これを勘案すると、三河のディフェンスが変わっていないとすれば、少し多めに見積もってもいいかもしれません。

今シーズンの両チームのスリーポイント

この記事を書いている時点で川崎は3試合、三河は2試合消化しています。川崎のスリーポイント成功数は6、10、5と推移していて、三河は被スリーポイント成功数は6、15だったようです。三河はGame 2では随分と名古屋ダイヤモンドドルフィンズにスリーを決められたようですね。

結論は?

以上のデータを踏まえまして、まだ序盤で川崎もチームとしてのまとまりにまだ課題があるであろうこと、川崎の外国籍選手が変わっていること、三河は主力のガード選手が抜けたこと、後は自分のバスケットファン的希望、山勘などを色々練り合わせまして、来週の水曜日のスリーポイント成功数を9本と予想させて頂きたいと思います!標準よりはちょっと多く決めるけれど、爆発という程ではないという数字にしたつもりです。

皆さんも是非イベントに一緒に参加して盛り上がりましょう!