見出し画像

Jリーグ勝ち点グラフができるまで

■前置き

私はサッカーを見るのが好きだ。特にJリーグが好きだ。セレッソ大阪が好きだ。別に自慢することでもなんでもないが、ファンクラブにも入っている。

私はプログラミングが好きだ。めっちゃ好きではないが、まあまあ好きだ。趣味にするほどではないので、休みの日に競技プログラミングをするとかはほぼないけど、なにか実現したいことが思いつけばプライベートの時間をプログラミングに使うくらいには好きだ。

ところで、Jリーグの各チームのサポーターは、試合が終わるたびに順位表を見て一喜一憂する習性がある。たぶん。あと何試合でこれだけ勝てば優勝(残留)や!、みたいな。何を隠そう私もその一人だ。ただ、その一喜一憂するための順位表が見づらいな、と思うことがあった。何かというと、チームによって試合数にばらつきがあると、勝ち点を単純比較できないということだ。
たとえば9/26現在、順位表はこんな感じ。新型コロナの影響もあり、試合数はチームによって15~20と大きなばらつきがある。試合数の一番少ないサガン鳥栖サポーターにしてみれば、15位というのは試合が少ないからであって俺たちの実力はこんなもんじゃないぜ、と思っていてもおかしくないだろう。

無題

それでなんの話かというと、単純な現時点での勝ち点の比較表ではなく、試合数も考慮したものが見たいなあと私は思ったわけである。ただ世の中にはそういうものはなかったので、じゃあ自分で作るかとなったわけである。

■プログラム作成

どんなものができればいいかと考えると、自然に出てきたのはグラフで表すこと。横軸を試合数、縦軸を勝ち点にすれば、試合数の多いチームが一目でわかるし、あの頃は順位低かったのにここで連勝してまとめて何チームも抜かしたなあ、なんてことが後から言えて楽しそうだと思い、そうすることにした。
そしてグラフといえばExcel。お手軽。なので、1. インターネットのどこかから試合結果一覧を引っ張ってきて、2. そこから各チームの各試合後の勝ち点を計算して、3. Excelシートに貼れる形式に成形して、4. それをExcelシートのグラフを作成する領域に貼る、というプログラムを作ることにした。

じゃあ何で作ろうかと考えると、ExcelなのでVBAという手がひとつ、あとは私が一番書きやすいC#。どっちでも作れるのだけど、当時(約2年前)はVBAを使ったことがなかったので、そっちでやることにした。(ちなみに当時から何度か手直ししており、その過程でC#に変わってます。実は一度最初から作り直さないといけなくなって、そのときにExcelのエディタよりVisual Studioのほうが書きやすいのと、Visual Studioで書くならVBAは使えないのでC#でええやんとなったからです)

そういうところから始まって、出来上がったのが200行ほどのプログラム。上の1. ~ 3. がそのままMain関数の中身になっている。4. は手動なんだけど、プログラムの最後でcsvをメモ帳で表示するようにしているので、コピペで済む。なのでそこは許容した。C#のプログラムからExcelシートに書き込ませるのがめんどくさそうだから、というのもあるけど。

        static void Main(string[] args)
       {
           var url = args[0];
           var matchsResultXml = GetMatchsResultData(url); // 1. urlのサイトから試合結果を引っ張ってくる

           var teamsMatchsResult = GetTeamsMatchsResult(matchsResultXml); // 2. 1.で得たデータから勝ち点計算

           OutputTeamsPoints(GetMatchYear(url), teamsMatchsResult); // 3. Excelシートに貼れるcsv形式に成形
       }

無題

作るときに一番気を付けたのは、どこから試合結果一覧を引っ張ってくるかということ。ここのフォーマットが変わってしまうとコードを修正する必要が出てくる(このときに「試合結果一覧から必要なデータを抜き出す処理」をひとつの関数にまとめていれば、もしそうなっても修正はその関数だけで済むので楽ちん)。なので、どんなに処理が簡単そうな試合結果一覧を貼ってあるページがあったとしても、個人サイトとかは無視して公式サイトから引っ張ってくるのが吉。公式サイトはなくならないし、そうそうフォーマットも変わらない。

■成果

というわけで、用意したシートにcsvをコピペすれば当初作りたかった「単純な現時点での勝ち点の比較表ではなく、試合数も考慮したもの」の出来上がり。勝ち点40ペースを基準にしているのは、単純に勝ち点をプロットすると右上にしか伸びないので見づらいのがひとつと、もうひとつはJリーグにおいて最も熱い競り合いが残留争いだと思っているから。だいたい最終的に勝ち点40あれば残留できると言われているので、そこを基準にした。
エンブレムが重なると見えなくなる問題はあるのだけど、大きな問題ではないと思うので、これがたぶんひとまずの完成形。

■余談

賢明な読者諸君のことだ、すでにお分かりのことと思うが、このプログラムは実行するごとに毎回、今年のJリーグの試合結果を全て一から処理している。前の処理結果を置いといたらいいのでは、という声も当然あると思う。ただ、そこそこ面倒だし処理時間1秒くらいだし週1とか週2でしか動かさないのでまあいいでしょ、ということでこうなっている。

あと、試合結果一覧はここ↓から引っ張ってきている。ここのソースをまるごとダウンロードして、必要なとこだけ切り取ってからXMLとして処理している。
https://data.j-league.or.jp/SFMS01/search?competition_years=2020&competition_frame_ids=1&competition_ids=477&tv_relay_station_name=

正直プログラム書き始めて最初のころは、どんなことができるのかよくわかってなかったのもあって、なかなか実現したいことが思いつかなかった。そこはいろいろやっていくうちにだんだんわかってきたんだと思う。思いつきさえすれば、それなりに動機があるのでググって調べて書いてみてを繰り返せる。それができれば、たぶん動くものはできる。ただし、読みやすい(≒修正しやすい)ものを作ろうと思うと、動かすことだけ考えていればいい、という話ではなくなる。
設計に時間をかけて修正のコストを下げるか、設計はあまり考えずにぱぱっとやって修正は頑張るのか、どちらの考え方もあるし、これに関しては私しか触らないのでどっちでもいい。ただ、お仕事関連のやつは修正コストを払うのが自分ではないことも多いし、修正するときに時間に余裕があるとも限らないので、設計に時間をかけておくのが普通かな。

だらだら書いてしまいそうなのでこのへんで。プログラミング関連のことは今までほとんど書かなかったけど、評判が良ければ(?)また何か書くかも。

■引用

・明治安田生命J1リーグ順位表:Jリーグ公式サイト
https://www.jleague.jp/standings/j1/

この記事が気に入ったらサポートをしてみませんか?