Metabase入門 〜環境構築編〜

# はじめに
昨今、BIツールによるデータの可視化、民主化が非常に重要になってきているかと思います。
自分も `Redash` 等BIツール自体は使ったことがありますが、
ちょっと前より話題になっていた `Metabase` については触れたことがなかったので、どんなものかと一度触ってみようと思います。
DBについては、 `MySQL8` を使用しています。

# 環境について
Dockerで構築します。
下記の `docker-compose.yml` を用意しました。

```yml:docker-compose.yml

version: '3'
services:
  app:
    image: metabase/metabase:v0.37.0.2
    container_name: metabase
    ports:
      - 3000:3000
    volumes:
      - ./metabase/data:/mnt/data

  sample_db:
    build: ./db
    container_name: sample_db
    ports:
      - 33006:3306
    volumes:
      - mysql-sample-app-data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: sample
      MYSQL_APP_USER: sample
      MYSQL_APP_USER_PASSWORD: sample
      MYSQL_DATABASE: metabase_sample
    restart: unless-stopped

volumes:
  mysql-sample-app-data:
    driver: local

```
ディレクトリ階層に関しては、プロジェクトをGitHubに上げましたので、
こちらをご確認ください。
https://github.com/inagacky/metabase_sample


# 実際に立ち上げる

下記のコマンドで立ち上げます。

```zsh
[inagacky@macbook] ~/workspace/metabase_sample
% docker-compose up -d
```

その後、 `http://localhost:3000` にアクセスし、下記画面が立ち上がっていれば成功です。
![スクリーンショット 2020-10-29 9.47.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66330/ba4a9418-d41d-5ce8-1b15-4e96940c5865.png)

# 初期設定

ガイドに沿って、 `言語` , `ユーザー設定` , `データソース設定` を行なっていきます。
非常に丁寧なので、困ることはないです。
![スクリーンショット 2020-10-29 9.49.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66330/0d7bf4b8-6d14-5172-fda3-8b617948a525.png)

設定が完了すると、下記のような画面が起動します。
初期として `Sample Dataset` がありますが、今回は独自のDBで、検証します。
![スクリーンショット 2020-10-29 9.52.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66330/7eeba935-e719-5e85-50ea-7496a6d8ce37.png)

# DB設定
Dockerで立ち上がっているDBについて、テーブル作成、データを流し込みます。
弊社は不動産業を営んでいるので、それっぽい構造で簡単なテーブルを作ります。
今回は、 `顧客情報` , `物件情報` , `契約情報` を作ります。
(マスタ化すべきフィールド等もありますが、面倒だったのでそのまま作っています。)

```sql
CREATE TABLE IF NOT EXISTS `customers` (      -- 顧客情報
  `id` INT AUTO_INCREMENT,                    -- PK
  `name` VARCHAR(20) ,                        -- 氏名
  `age` INT,                                  -- 年齢
  PRIMARY KEY (`id`),
  KEY `idx_age`(`age`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
;
```

```sql
CREATE TABLE IF NOT EXISTS `property` (    -- 物件情報
  `id` INT AUTO_INCREMENT,                 -- PK
  `prefName` VARCHAR(20) ,                 -- 都道府県名
  `price` BIGINT,                          -- 価格
  `category` VARCHAR(20),                  -- カテゴリ(戸建/土地/マンション等)
  PRIMARY KEY (`id`),
  KEY `idx_prefName`(`prefName`),
  KEY `idx_price`(`price`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
;
```

```sql
CREATE TABLE IF NOT EXISTS `contracts` (  -- 契約情報
  `customer_id` INT NOT NULL,             -- 顧客ID
  `property_id` INT NOT NULL,             -- 物件ID
  CONSTRAINT fk_customer_id
    FOREIGN KEY (customer_id) 
    REFERENCES customers (id)
    ON DELETE RESTRICT,
  CONSTRAINT fk_property_id
    FOREIGN KEY (property_id) 
    REFERENCES property (id)
    ON DELETE RESTRICT
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
;
```

データは、下記を流し込みます。

```sql
-- 顧客情報
INSERT INTO `metabase_sample`.`customers` (`name`, `age`) VALUES ('山田一郎', '30');
INSERT INTO `metabase_sample`.`customers` (`name`, `age`) VALUES ('山田二郎', '31');
INSERT INTO `metabase_sample`.`customers` (`name`, `age`) VALUES ('田中一郎', '32');
INSERT INTO `metabase_sample`.`customers` (`name`, `age`) VALUES ('田中二郎', '45');
INSERT INTO `metabase_sample`.`customers` (`name`, `age`) VALUES ('田中三郎', '50');
INSERT INTO `metabase_sample`.`customers` (`name`, `age`) VALUES ('鈴木一郎', '47');
INSERT INTO `metabase_sample`.`customers` (`name`, `age`) VALUES ('鈴木二郎', '20');

-- 物件情報
INSERT INTO `metabase_sample`.`property` (`prefName`, `price`, `category`) VALUES ('愛知県', '32000000', '戸建');
INSERT INTO `metabase_sample`.`property` (`prefName`, `price`, `category`) VALUES ('愛知県', '40000000', '戸建');
INSERT INTO `metabase_sample`.`property` (`prefName`, `price`, `category`) VALUES ('東京都', '90000000', '戸建');
INSERT INTO `metabase_sample`.`property` (`prefName`, `price`, `category`) VALUES ('東京都', '120000000', 'マンション');
INSERT INTO `metabase_sample`.`property` (`prefName`, `price`, `category`) VALUES ('愛知県', '20000000', '土地');
INSERT INTO `metabase_sample`.`property` (`prefName`, `price`, `category`) VALUES ('東京都', '90000000', 'マンション');
INSERT INTO `metabase_sample`.`property` (`prefName`, `price`, `category`) VALUES ('愛知県', '24000000', 'マンション');

-- 契約情報
INSERT INTO `metabase_sample`.`contracts` (`customer_id`, `property_id`) VALUES ('1', '1');
INSERT INTO `metabase_sample`.`contracts` (`customer_id`, `property_id`) VALUES ('2', '2');
INSERT INTO `metabase_sample`.`contracts` (`customer_id`, `property_id`) VALUES ('3', '3');
INSERT INTO `metabase_sample`.`contracts` (`customer_id`, `property_id`) VALUES ('4', '4');
INSERT INTO `metabase_sample`.`contracts` (`customer_id`, `property_id`) VALUES ('5', '5');
INSERT INTO `metabase_sample`.`contracts` (`customer_id`, `property_id`) VALUES ('6', '6');
INSERT INTO `metabase_sample`.`contracts` (`customer_id`, `property_id`) VALUES ('7', '7');
```

# metabaseをいじってみる
前置きが長くなりましたが、metabaseをちょっといじってみようと思います。

## テーブル結合
テーブル結合に関しても、GUI上で行うことができます。
![スクリーンショット 2020-10-29 11.12.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66330/01ee5fb4-d753-6ef3-83c5-4693b2788835.png)

下記のように、テーブルを参照することができます。
![スクリーンショット 2020-10-29 11.13.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66330/970634a1-34fe-5d39-0161-a3199aab3fc3.png)

## グラフ
グラフについても、色々な種類があります。
(データが少ないので、見栄えしなかったです。。。)
![スクリーンショット 2020-10-29 11.18.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66330/4d5a0aa3-ed9a-ee51-cfc1-15833f6506f2.png)

## ダッシュボード
下記のように、ダッシュボードを作成することもできます。
![スクリーンショット 2020-10-29 11.24.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66330/07ebd2d5-92fe-52f0-7495-a6461a84abaa.png)

# まとめ
metabase、初めて触りましたが直感的に色々わかりました。
思った以上に環境構築等で記事が長くなってしまったので、metabaseの各機能に関して、
色々な指標でのグラフ作成は、別記事でもう少し触ってみようと思います。。
(環境構築編ということで、ご承知おきください・・・。)

以上です、ありがとうございました。