サッカーのヒートマップをQGISで作ってみる

  • 9
    いいね
  • 0
    コメント

サッカーのヒートマップをQGISで作ってみる

Kobito.dcEkpU.png

はじめに

年末オープンジオかくし芸大会 でおなじみの、FOSS4GAdventカレンダー2016の4日目です。

学生さんや一般の方などにGIS的な事例を持ってくる場合、カーナビとかFlightRadar24とかをネタにすると、つかみとしてわかりやすく伝わります。
もちろん最近では最近ではPokémon GOなどが実位置とイベントと大規模処理という面でとても良い例ですよね、

あと、GIS的な表現方法として、スポーツのヒートマップが最近よく見られます。これはスポーツにおけるボールやプレーヤーの位置や統計をわかりやすく表現するやりかたで、あたらしいデータジャーナリズム的観点からも、大変興味深いです(経験則だけでドヤリングされる解説者についてのボヤキは以下略)。

これをQGISで作れたら面白いなーと考えていまして、今回はちょっとやってみましょう。

データどこよ

それな。データ探し大変なのよ。

けっこうデータを探している人がいて、
回答に
http://home.ifi.uio.no/paalh/dataset/alfheim/
というありがたいサイトが紹介されていました。

こちらは、画像解析の論文で作成されたcsvのデータペーパーで、下記のような出典明示で使用可能です。オープンサイエンスGJ。

Soccer video and player position dataset": S. A. Pettersen, D. Johansen, H. Johansen, V. Berg-Johansen, V. R. Gaddam, A. Mortensen, R. Langseth, C. Griwodz, H. K. Stensland, and P. Halvorsen, in Proceedings of the International Conference on Multimedia Systems (MMSys), Singapore, March 2014

なお、処理にかかわる論文はこちら

Kobito.dorgEF.png
S. A. Pettersen et al.(2014)

この研究では1〜3台のカメラを使ってプロサッカーチームの試合ビデオを解析し、ボールとプレイヤーの位置関係を算出しました。このデーターペーパではノルウェーの一部リーグの所属しているトロムソIL(Tromsø IL)の3試合分の選手やボールの動きなどに関するデータセットが配布されています。

データセット内のCSVは前半・後半別のものもありますが、原点を(0,0)mとして、ピッチ内の(105,68)mまでの範囲内での、主に20Hz(0.05秒間隔)と1Hz(1秒間隔)における選手やボールの位置となっています。

全部の試合データ処理をやってると面白くて元旦の天皇杯までかかりそうなので、今回は、2013/11/28に開かれたヨーロッパリーグ2013−2014でのトロムソIL -トッテナム・ホットスパーFCの試合でとられた20Hzデータを用います。50万レコードくらいなので、おためしにはちょうどいいぐらいかもしれません。(1秒間隔でもやってみましたが、すぐフィールド定義が把握できなかったので追々)

なお、参考までにこの試合の結果やスタッツはこちらです。こういうのもさくっと出てくるの素敵。
※てか雪ふってるし

QGISにとりこむ

CSVをダウンロード後、ちょこっとみますとなんかもうえらいことに
Kobito.8Ryq1l.png

ここは落ち着いてQGISを起動し、デリミッドテキストレイヤの追加ボタンKobito.1Pa7oh.pngを押しましょう。
その後、ダイアログがでてきますので、一行目にはフィールド名がないため、「最初のレコードはフィールド名を保持している」をオフにして、[Field_3]をX、[Field_4]をYとしてCSVデータを取り込んでみましょう

Kobito.oGqm8W.png

なお、取り込み後に投影法とか聞いてきますが、今回はお試しなので、メートル単位のよく使われるEPSG3857:WGS 84 / Pseudo Mercatorにしておきます。

さすれば
Kobito.BVCt6R.png

どーん、スチールウールですやんこれ…
落ち着いて、レイヤプロバティの凡例から、TagIDの指定となっている[Field_2]で凡例をわけてみます
Kobito.Aoq6Vz.png

これでみるとIDは1〜14でわけられており、試合記録と比較をすると両チームとも3人交代を行っていますから、14人のプレーヤーなのかしらと思いましたが、背番号やチームとの対応情報は見当たりませんでした。
もしくは、このデータは45分しかないので、片方のチーム選手11人と審判3人なのかもしれません(もうすこし真面目に精査したらどこかに載ってるかもしれませんが、まあこのまますすめちゃいます)。
http://uk.soccerway.com/matches/2013/11/28/europe/uefa-cup/tromso-idrettslag/tottenham-hotspur-football-club/1584818/

QGISでCSVを整理

仕方ないのでIDの2だけでみてみるとけっこうよさげなのでこのデータをつかっていきます。2番さん頑張ってんな!
Kobito.CVxLUf.png

やり方はいろいろあるでしょうが、とりあえず各IDごとにSHPを分割します。

まず、CSVのレイヤのままだとうまくいかないと思うので、CSVレイヤを右クリックして「名前をつけて保存」を選び、SHPにエクスポートします。

Kobito.k4r7WI.png

Kobito.qIfwQY.png

エクスポートしたSHPをIDごと、分割してみます。
ベクタメニュー→データマネージメントツール→ベクタレイヤの分割を選び、

Kobito.WFyByI.png

分割の基準となるユニークIDを[Field_2]に指定、あと出力フォルダは任意に(たくさんデータがつくられるので、新しいフォルダを準備したほうがベターです)

Kobito.ciAWGy.png

んで、フォルダをみるとこのように14セットのSHPファイル群が生成されているはずです

Kobito.5Lz3bi.png

QGISでヒートマップをつくる

では番号ごとにデータが分割できたので、2番くんのデータからヒートマップをつくってみます。ヒートマップは統計ソフトR通したりいろいろ細かいやり方はありますが、QGISでは定番のヒートマッププラグインをつかって表現してみましょう。
ラスタメニュー→ヒートマップ→ヒートマップ
Kobito.V8cjSz.png

ほぼデフォルトで検索半径を10レイヤ単位(今回はmと読み替え可能)とします
Kobito.3loUBw.png

さすれば、どーん
Kobito.PMkAqL.png

つぶれたイカスミちくわの断面みたいでなんかよくわかんないので、
作成したラスタのプロバティ
Kobito.w40Hwn.png
から、
下記のような設定にして、分類ボタンを押して、OKを押すと
Kobito.zhhIjM.png

お、なんかすごいものができつつある…
Kobito.asE6OL.png

しかしこのままでは、サッカーのヒートマップなのか、雨の日に拾ってきた子猫ちゃんをふところに隠して、ママハハロボのサーモカメラでチェックを受けているときの画像なのかわからないですよね…

背景つくる

なぜよくわからないのか?
どんなに素晴らしいデータでも、背景がないと意味がわからないのですよね、背景地図重要。ということで、サッカーフィールドのSHPとかGeoJOSNとかあったらとても嬉しいのですが、ちょっと見当たらないので、作ってみます。
素材はwikimediacommonsさんからいただきます、
image
(C) NielsF CC BY-SA 3.0

WTKとかで書いてもいいんですが、とりあえずこのsvgをTIFFにして最大68X105mになるようにジオリファレンスして重ねてみます
Kobito.c1PbE2.png

お、なんかそれっぽくなってきた

Kobito.FpwaSK.png

ここまで来るともうベクタでも欲しくなってきちゃったので、ラスタからベクタに変換します
※SVGをラスタにしてベクタにしてるがwまあいいや(別名:餅から米をつくる作業)

Kobito.FLBwTm.png

うむ、それっぽい。

データと合わせるつくる

背景もそれっぽくなってみたので、2番くんのヒートマップ透過かけたりして調整してみます。
Kobito.9HXrts.png

おお、いいですねえ。
ほかにも、4mメッシュを作成して
Kobito.Piafft.png

メッシュ内のカウントを行うと
Kobito.Y1gIGA.png

このような表現にもなります

Kobito.OxaDzR.png

3Dにしてやろう

もうここまで来たら、みんなだいすきQgis2threejsプラグインを使って3D化しちゃうとワクワクが止まらないですよね

まず、ヒートマップやカウントの値をそのままZに持っていくと、富士山くらいの高さになってしまうので、world設定から高さを0.001倍にしておきましょう。

Kobito.otB030.png

これで2番さんのヒートマップラスタを処理するとこんなふうに

Kobito.dcEkpU.png

メッシュをオーバレイにしてもOK

Kobito.a2HuQV.png

メッシュを浮かせてみることもできる
Kobito.V6luPf.png

おお、なんかいいですね

まとめ

ということで、なんかここまでやってD3とかやったらすぐおわりそうな事に気づいたのですが()、それはまあさておき、QGISでそれっぽい絵や表現もいろいろできそうで楽しいです。

ほかにもCARTOにぶっこむとか、山手線をプレーヤー全員で競争させるとかやってみたかったんですが、きょうはこの辺にしておきます。

もうこれでサッカーのビジュアライゼーションはおれのものだぜ! と息巻くところですが、いいデータがないとちょっと今回のお遊びはできないのです…

まあ他力本願もアレなので、考えられることとして

  1. 野球のストライクゾーンとかでやってみる
  2. 上のデータペーパーをいじりまくる
  3. 論文に従って自分で試合会場にいって3台カメラを設置して処理
  4. プロサッカー選手になって、からだにGPSと加速度センサーを内蔵させてだいかつやくする

…ぐらいしか思いつきませんがいまのところ2が妥当なところでしょうか(もしほかに使い勝手の良いデータあればお教えください)。
もちろん4もたいへん夢があってわたしはだいすきです。

プロサッカーなどのこのようなデータはOPTAといった会社があるように、各チームの戦略分析にはなくてはならないものですし、視聴者へのコンテンツ素材としても非常に価値が高いデータですから、そう簡単にでてくるものではないのでしょう。

最新のデータではなく、たとえば1986年のワールドカップとかのデータでもいいので、CSVなどでちょろっと公開していただけるといろいろ楽しいのにな、と思っています;)。

とはいえ、QGISを使った可視化レクチャーなどで、AEDや避難所といったややお硬めのデータ以外にも、こんなデータを使うのもよいかもしれませんね。

この投稿は FOSS4G Advent Calendar 20164日目の記事です。