はじめに
昨今、BIツールによるデータの可視化、民主化が非常に重要になってきているかと思います。
自分も Redash
等BIツール自体は使ったことがありますが、
ちょっと前より話題になっていた Metabase
については触れたことがなかったので、どんなものかと一度触ってみようと思います。
DBについては、 MySQL8
を使用しています。
環境について
Dockerで構築します。
下記の 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
実際に立ち上げる
下記のコマンドで立ち上げます。
[inagacky@macbook] ~/workspace/metabase_sample
% docker-compose up -d
その後、 http://localhost:3000
にアクセスし、下記画面が立ち上がっていれば成功です。
初期設定
ガイドに沿って、 言語
, ユーザー設定
, データソース設定
を行なっていきます。
非常に丁寧なので、困ることはないです。
設定が完了すると、下記のような画面が起動します。
初期として Sample Dataset
がありますが、今回は独自のDBで、検証します。
DB設定
Dockerで立ち上がっているDBについて、テーブル作成、データを流し込みます。
弊社は不動産業を営んでいるので、それっぽい構造で簡単なテーブルを作ります。
今回は、 顧客情報
, 物件情報
, 契約情報
を作ります。
(マスタ化すべきフィールド等もありますが、面倒だったのでそのまま作っています。)
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
;
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
;
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
;
データは、下記を流し込みます。
-- 顧客情報
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をちょっといじってみようと思います。
テーブル結合
グラフ
グラフについても、色々な種類があります。
(データが少ないので、見栄えしなかったです。。。)
ダッシュボード
まとめ
metabase、初めて触りましたが直感的に色々わかりました。
思った以上に環境構築等で記事が長くなってしまったので、metabaseの各機能に関して、
色々な指標でのグラフ作成は、別記事でもう少し触ってみようと思います。。
(環境構築編ということで、ご承知おきください・・・。)
以上です、ありがとうございました。