データとバスケ

バスケをデータから楽しむブログです。

B.LEAGUEデータ分析用Rパッケージ「bleaguer」を公開しました

※「Bリーガー」ではなく「Bリーグアール」と読みます

※この記事は随時更新される予定です

bleaguerって何?

bleaguerはプログラミング言語Rのパッケージ(拡張機能)です。このパッケージを使うと、B.LEAGUEのデータ分析をするのに便利なデータと機能が簡単にRで利用できます。

bleaguerは私が普段分析作業に使っているデータや関数などを便利にまとめたもので、ここ最近の分析作業はこのパッケージを自分で使いながら行っています。少なくても私の効率はこれで大分上がりました。

何ができるの?

  • 各種B.LEAGUEのデータをRに簡単にロードできます。現時点でサポートされているデータは以下の様なものです。
    • ゲームの日付
    • 開催アリーナ名称
    • 観客動員数
    • ゲームの種類(レギュラーシーズン、プレシーズン、ポストシーズン)
    • ホームチームとアウェイチーム
    • チームごとのスタッツ(基本的にはこのページに載っているスタッツです。)
  • 上記の生データを分析に適した形に結合した形で取得することもできます。

何ができないの?

  • プレイヤーの個人スタッツは、試合ごとトータルのみサポートしており、クォーターごとは現在サポートされていません。
  • このブログに出てくるような図を作る部分はこのパッケージでサポートしません。そこは利用側で行うという設計になっています(図を作る例はこちらの記事に掲載予定です。)

免責事項は?

  • B.LEAGUEさんの公式プロジェクトではありません。
  • データの中身の正誤は保証しません。ただし間違いをご指摘頂ければ直せます。
  • 最新の結果を即座に反映する予定はありません。
  • 後方互換性は死守しません(序盤は特に)
  • B.LEAGUEさんの意向等により、公開を中止する可能性があります。

Python使ってるんだけど?

残念ながらもこのパッケージは使えませんが、生データファイルへのアクセスは可能です。そちらを読み込みの上、ご自分でデータの結合、加工などして下されば似たようなことはできます。ファイルの場所は後述します。

Excel使ってるんだけど?

上述のように生データファイルへのアクセスは可能ですが、Excelだと読み込みに問題があるかもしれません。Excelで分析したい方がいましたら、効率的な方法を相談しましょう。

セットアップのやり方は?

※Dockerによる環境構築に対応しました。詳しくは下記リンク先の記事を参照してください。

まずは当然ですがRの実行環境を整えて頂く必要があります。RR Studioのインストールをお勧めします。方法の詳述はこの記事ではしません*1

Rのインストールが終わりましたら、devtoolsというパッケージをインストールしてください。こちらは普通に以下のコマンドをR Studioのコンソールに打つことでインストールできるはずです。

※どうやらdevtoolsに含まれるremotesというパッケージだけインストールするだけでも良さそうです(追記 2020.1.10)

install.packages("devtools")

# 上記でうまく行かない場合
install.packages("devtools", type = 'binary')

ここまで来るとbleaguerパッケージをインストールすることが可能です。以下のコマンドでインストール(私のgithubリポジトリよりダウンロードされます)、及びロードすることができます。

devtools::install_github("rintaromasuda/bleaguer")
library(bleaguer)

インストールは基本的には一度やればいいものです。ただし新しいバージョンがgithubにアップロードされた場合、それを適用するためには再度行う必要があります。新しいバージョンというのは、新しいデータが追加された場合も含みます。

インストール時に関連するいくつかのパッケージのインストールが求められますので行ってください。パッケージのアップデートについて訊かれる場合もあると思いますが、それは必須ではないはずです。お任せします。

どんな生データがロードされるの?

bleaguerをロードした瞬間に、以下のデータがR上にロードされるはずです。これらが生データとなります。

b.teams
b.events
b.games
b.games.summary
b.games.boxscore

b.teamsとb.eventsはいわゆるマスターデータです。Bリーグの各チーム(B1とB2のみ)の名称などのデータと、ゲームの名称や種類のデータが含まれています。

b.gamesはひとつのゲームにつきひとつのレコードができるデータで、そのゲームの種類、日付、観客動員数、対戦したチームのIDなどの情報が入っています。HomeTeamId/AwayTeamIdがb.teamsとTeamIdと、EventIdがb.eventsのEventIdとそれぞれ対応しています。

b.games.summaryはひとつのゲームにつきふたつのレコードができるデータで、そのゲームで対戦した両チームのチームスタッツが入っています。ScheduleKey、TeamIdでb.gamesと結合できるはずです。

b.games.boxscoreはゲームごとの個人スタッツが入っているデータです。こちらはScheduleKey、TeamIdに加えて選手ごとにPlayerIdが振られています。

詳述すると長くなってしまいますので、Rのstr()やsummary()やView()を使って中身を覗き見て頂くとわかり易いのではないかと思います。下記のようなコマンドの実行をすると中身が見られます。

View(b.teams)
str(b.events)
summary(b.games)
View(b.games.summary)
View(b.games.boxscore)

生データを使わないといけないの?

生データを結合するとなるとデータ間の関係などを理解する必要がある為、とっつきやすいように既に結合済みのデータを提供する関数も用意しました。

GetGameSummary()という関数を使うと、チームのスタッツを分析するのに丁度いいデータが取得できます。こちらもstrなどを用いて返り値を確認して頂ければと思いますが、このデータもひとつのゲームにつきふたつのレコードがあるものです。

チームAとチームBがそのゲームを戦ったとして、そのゲームの結果をチームAから見た場合と、チームBから見た場合のふたつが存在するイメージです。

サンプルコードは?

以下のサンプルコードですが、dplyrというパッケージを使うことを前提としております。これもinstall.packages("dplyr")でインストールができます。

# %>%などを使用するためにdplyrパッケージのインストールとロード
if (!require(dplyr)) {
  install.packages("dplyr")
  library(dplyr)
}

df <- GetGameSummary()

# 富山グラウジーズの2018-19レギュラーシーズンの全得点を取得
subset(df, TeamName == "富山" & Season == "2018-19" & Category == "Regular")$PTS

# 富山グラウジーズの2017-18ポストシーズンの全得点を取得
subset(df, TeamName == "富山" & Season == "2017-18" & Category == "Post")$PTS

# 2018-19レギュラーシーズンのB1各チームの平均点と平均失点を取得する
df %>%
  filter(Season == "2018-19" & Category == "Regular" & League == "B1") %>%
  group_by(TeamName) %>%
  summarise(Points = mean(PTS),
            OppPoints = mean(Opp.PTS)) %>%
  as.data.frame()

# 栃木ブレックスのシーズンごと、アリーナごとの平均観客動員数と試合数を取得する
df %>%
  filter(Category == "Regular" & TeamName == "栃木" & HomeAway == "Home") %>%
  group_by(Season, Arena) %>%
  summarize(MeanAttendance = mean(Attendance),
            NumGames = n()) %>%
  as.data.frame()

# 描画に使うggplot2パッケージのインストールとロード
if (!require(ggplot2)) {
  install.packages("ggplot2")
  library(ggplot2)
}

# 横浜ビー・コルセアーズの2018-19シーズンの得点をホーム、アウェイに分けて箱ひげ図にする
ggplot() +
  geom_boxplot(data = subset(df, Category == "Regular" &
                              Season == "2018-19" &
                               TeamName == "横浜"),
               aes(x = HomeAway, y = PTS))

# 2018-19シーズンのB1各チームの失点を箱ひげ図にする
ggplot() +
  geom_boxplot(data = subset(df, Category == "Regular" &
                               Season == "2018-19" &
                               League == "B1"),
               aes(x = TeamName, y = Opp.PTS))

サンプルコードは必要に応じて随時追加する予定です。上記と同様のものですが、こちらにアップロードもしてあります。また今後ブログ記事の作成にbleaguerを使用した場合、そのコードもこちらのカテゴリにて随時シェアする予定です。

生データのファイルはどこに?

同じgithubリポジトリのここにCSV形式でアップロードされています。

質問がある場合は?

もし利用したいという方がいらして、利用方法で何かしら質問がありましたら私のTwitterまでお問合せ下さい。その用途にSlackグループを作成しましたので、そちらにてお話させて頂ければと思っております。

参照

追記(2020.1.19)

*1:Rのバージョンですが、3.5以降だとbleaguerのインストールに問題がある場合があるようです(Windowsで問題を確認。)現在3.4.xを推奨です。