Yuigo・ん・・・湿っぽい

モルック、システムエンジニア、その他趣味。大学生のころから使っているので、昔の記事は恥ずかしいし今の思想とは異なっていることが多いです。

モルックの練習データをMetabaseで可視化する

概要

  • Metabaseを使ってみたかった
  • モルックというマイナーだけど面白いスポーツの練習をデータに残しているので、それを可視化できればと思っています

2019-12-16時点で以下のようなダッシュボードを作ってみました。そんな深くまで調べずに使ってみたので、基本中の基本までしか触れられていないと思います

参考

環境

ProductName:    Mac OS X
ProductVersion: 10.15.1
BuildVersion:   19B88

MetabaseとMySQLはDocker for Macでイメージを落として使っています

作業メモ

環境構築(Docker)

docker-compose.ymlとかを書く。以前作ったサンプルからMySQLの設定をコピったのでいろいろめちゃくちゃだと思う

docker-compose create
docker-compose up -d

docker-compose images

  Container         Repository        Tag       Image Id      Size 
-------------------------------------------------------------------
Metabase         Metabase/Metabase   latest   3e5e484c4aa7   515 MB
Metabase_mysql   mysql               5.7.22   6bb891430fb6   355 MB

# mysql接続
mysql --host=127.0.0.1 --port=3306 --user=molkky --password

以下にアクセス

http://localhost:3000/

初期設定

docker-compose.ymlに書いた接続情報に応じて入力する

ダッシュボードが表示される。まだデータを突っ込んでいなのでなにもみれないけど、サンプルのデータセットがあるので遊んだりなんとなくの使い方を把握できると思います

データの格納

予め記録しておいた練習データのスプレッドシートからcsvファイルをエクスポートする

本当はもっとテーブルを正規化すべきだが、面倒だったので使用するモルック棒(重さが違うので練習ごとに返るようにしています)のテーブルのみ別出しする

-- 複数のモルック棒を所持しているので、それぞれの重さや色(テープを貼って判別している)などを管理するマスタ
CREATE TABLE color (
    id INT NOT NULL,
    color VARCHAR(32) NOT NULL,
    `name` VARCHAR(32) NOT NULL,
    kind VARCHAR(32) NOT NULL,
    `weight` INT NOT NULL,
    PRIMARY KEY (id)
);

-- ゲーム単位で記録しているので、そのデータテーブル
CREATE TABLE games (
    id INT NOT NULL,
    `date` DATETIME,
    `match` INT,
    teams INT,
    rule VARCHAR(32),
    win_point INT,
    place VARCHAR(128),
    `condition` VARCHAR(32),
    weather VARCHAR(32),
    temperature INT,
    color VARCHAR(32),
    game_num INT,
    shot_count INT,
    ace_count INT,
    mistake_count INT,
    first_shot_score INT,
    finished_turn INT,
    three_mistake_count INT,
    fifty_over_count INT,
    vertical_shot_count INT,
    vertical_ace_count INT,
    back_shot_count INT,
    back_ace_count INT,
    lob_shot_count INT,
    lob_ace_count INT,
    step_shot_count INT,
    step_ace_count INT,
    attempt_shot_count INT,
    attempt_ace_count INT,
    comment VARCHAR(1000),
    won_team_num INT,
    photo_url VARCHAR(1000),
    PRIMARY KEY (id)
);

上のように、先にテーブルを作成しておく。

MySQLCSVインポート機能を使ってデータをインストールする。

# ./docker/log/mysql 内に games.csv というファイル名でcsvを保存しておく

docker exec -it Metabase_mysql bash

mysql -u molkky -p

mysql> use molkky;
# MySQLコンテナ内でMySQLコンソールを起動し、以下を実行
# CSVが空欄の場合はNULLをINSERTする、などの条件分岐もできるようですが、
# 今回は手っ取り早く元データのスプレッドシートに `\N` と入力しておくことで
# NULLを書き込んでもらうことにしました
mysql> LOAD DATA LOCAL INFILE "/var/log/mysql/games.csv " INTO TABLE games FIELDS TERMINATED BY ',' ignore 1 lines;

適当にSELECTなどでデータが入っているか確認(csvの中身によってWARNINGが発生することがあるのでshow warningで見て修正、WARNINGが発生しなくなるまで繰り返す)

INSERTしたデータの確認

データが追加されていることをMetabaseで確認する(表形式で閲覧できる)。

見てみる Games テーブルから、Metabaseが自動的に作成したチャートを見ることができる。

自分でチャートを作成する

当然、上の自動走査(X-RAY)ではほしいチャートはすべて見つからないので、自分で作成していく。

ヘッダーの「照会する」を選択、作り方を選ぶ(大抵はカスタム質問かネイティブクエリ)

カスタム質問の場合は、以下のようにGUIで編集できる

プレビューしながらいい感じに作れたら、「ビジュアライズ」でグラフや表など、どういう形で見せたいのかを決める

見せ方が決まったら「保存」して、ダッシュボードに配置などする

補足など

テーブルのスキーマ変更をMetabaseに反映する

カラム追加をしたときなど、すぐにはMetabase上に反映されなかったので、設定 -> 管理者 -> データベース -> {変更したデータベース名}に進み、今すぐデータベーススキーマと同期するを選択することで反映される模様(ということは、しばらく待っていれば自動的に反映されるのか?ということについては未検証)。