kun432's blog

Alexaなどスマートスピーカーの話題中心に、Voiceflowの日本語情報を発信してます。たまにAWSやkubernetesなど。

〜スマートスピーカーやVoiceflowの記事は右メニューのカテゴリからどうぞ。〜

MetabaseでBIことはじめ②

Metabaseの続きです。

前回はデータソースの追加までやりました。今回は追加したデータソースを使って可視化していきたいと思います。

目次

サンプルデータベースについて&可視化のお題

サンプルデータベースの詳細は以下。

元をたどるとこちらですね。

知らなかったんですが、サンプルで用意したDVDレンタルのデータベース、これMySQLもPostgreSQLも同じものなのですね。見た感じ元々MySQL用が最初っぽい。MetabaseはMySQLも使えるのでMySQLでいきたい人は参考までに。

で、なにか練習用にお題ないかなーと思って探してたら、こういう記事がありました。

ありがたいですね。ではこの記事と同じことをMetabaseでやっていきたいと思います。

お題1: 特定の俳優が出演する映画

Qiitaの記事にある通り、

  • Actorテーブルは映画のタイトル情報を持っていない
  • Filmテーブルは出演者の情報を持っていない
  • 出演者IDとタイトルを多対多で紐付けているのはFilm Actorテーブル

ということで、Film ActorテーブルにActorテーブル、FilmテーブルをJOINさせれば良さそうです。

右上の「+New」をクリックします。

SQLクエリを直接叩いてもいいのですが、SQLさっぱりわからんマンなので、GUIでやりましょう。「質問」をクリックします。

開始するデータとしてDVD Rentalデータベースを選択。

そしてFilm Actorテーブルを選択します。

Film Actorテーブルが選択された状態になります。ここで右の方にある再生ボタンのようなものをクリックしてみます。

Film Actorテーブルの内容が表示されましたね。再生ボタンのようなものをクリックするとこのようにプレビューが表示されます。まだ何も条件を設定していないので、選択したテーブルの内容がそのまま表示されているだけですね。あくまでもプレビューなので「✕」をクリックして消しておきます。

ではJOINしましょう。「結合」をクリックします。

Film ActorテーブルとJOINするテーブルを選択します。まずはActorテーブル。

次に、テーブル間で結合させるカラムの組み合わせを選択するのですが、Film ActorテーブルとActorテーブルの各Actor IDがもう選択されていますよね。Metabaseではこのあたりもある程度類推して設定してくれるようです。もちろん自分で個別に設定することも出来ます。プレビューしてみましょう。

結合されたテーブルが表示されていますね。

JOINで重複している項目がありますね。これを表示しないようにも出来ます。開始となるテーブル側でもJOINさせたテーブル側でもどちらでも設定できますが、今回は結合させたテーブル側のActor IDを表示しないようにしてみましょう。「結合」のところにあるActorテーブルの右の下向きのアイコンをクリックします。

ここで表示しない項目のチェックを外せばOKです。

プレビューが消えましたね。「更新」をクリックしてみましょう。

チェックを外した項目が消えていますね。

また、JOINの種類を変更することも出来ます。Film ActorテーブルとActorテーブルが結合されているところのアイコンをクリックします。

現在はLEFT JOINになっていますが、これをINNER JOINにしてみましょう。

変更するとアイコンが変わっているのがわかりますね。変更後のプレビューを更新しましょう。Actor IDはActorテーブルでユニークなのであまり意味はないですけどね。

このようにして結合していけばOKです。ということで、再度「結合」からFilmテーブルも結合します。わかりやすくするためにいろいろ非表示にしました。こんな感じになります。

次に特定の俳優で絞り込んでみましょう。「フィルター」をクリックします。

First Nameが"Nick"なレコードを絞り込みたいので、JOINされているActorテーブルのFirst Nameを選択します。

First Nameカラムのすべての値が表示されていますので"Nick"を選択すればOKです。絞り込み検索もできますね。「フィルターを追加する」をクリックします。

プレビューしてみるとこんな感じで絞り込みが出来ていますね。

ではプレビューではなく最終形としてビジュアライズしましょう。「ビジュアライズ」をクリックします。

はい、これで表のビジュアルができましたね。

とはいえプレビューとはそんなに変わらないですよね。少し表をカスタマイズしましょう。下のほうにある「設定」をクリックします。

左に各カラムが表示されていますね。ここで順番を変えたり、表示・非常時を切り替えたり、また表示上のカラム名を変更することが出来ます。

少しいじってみました。カラムの名前が変わっていて、あといくつか非表示になっているのがわかりますでしょうか。

あと下の「設定」の横にある「ビジュアライゼーション」をクリックすると、他の表示形式に切り替えることが出来ます。ただし切り替えれるのはデータをどのように抽出したか?に依ります。今回のデータだと表敬式以外を選択するためにはいろいろ設定が足りないので選択できないということですね。

では最後にこれを保存していつでも呼び出せるようにしましょう。右の上の「保存」をクリックします。

呼び出すときにわかりやすい質問の「名前」を設定します。説明は必要なら入力します。コレクションはフォルダのようなものですね。ここではデフォルトの「分析」にしておきます。最後に「保存」をクリック。

質問が保存されると、ダッシュボードに追加するかを聞いてきます。ダッシュボードは質問で作成した複数のビジュアルをひとまとめにして見やすくするためのものですね。せっかくなので追加してみましょう。「追加する」をクリックします。

どのダッシュボードに質問のビジュアルを追加するかを聞いてきます。今回は新しく作ってみましょう。「新ダッシュボードを作成する」をクリック。

ダッシュボードの名前と保存先のコレクションを選択します。適当に設定して「作成する」をクリックします。

ダッシュボードが表示されます。作成した質問のビジュアルの場所や表示サイズなどを変更できます。質問を作成してビジュアル化、ダッシュボードに追加していくことで、ひと目でデータを確認することができるというわけですね。

最後に保存を忘れず。

保存した質問やダッシュボードはトップページからコレクションをたどるといつでも参照・編集できます。元のデータを更新したり、質問を編集すれば、ダッシュボード内の表示も自動で変わります。

とりあえず今日はここまで。次回は別のお題もやりつつ、ダッシュボード上で条件を選択しやすくしたり、他のビジュアライズについても試してみたいと思います。

MetabaseでBIことはじめ①

年末年始は故あってずっとBIツールいじってたので一旦まとめ。

BIツールっていろいろありますよね。

  • Amazon QuickSight
  • Google Looker Studio
  • Microsoft Power BI
  • Tableau

で、どれもだいたい有料だったりして、初心者が個人で使ってみる分にはちょっと敷居があるかなーって感じです。

上記の中には無料で利用できるものもありますが、公開するには有償 or 公開が前提(クローズドなものはできない)だったりして、限られた人にだけ見せたい、みたいな用途だとちょっと使いにくいと思いました。

ということで、まずはOSSでできるものを試してみようということで、Metabaseがなかなか良さげなようです。

早速試していきます。

目次

インストール

Metabaseはクラウド版(有料)もありますが、ローカルで動かす場合はjarファイルを直接実行する方法とDockerで起動する方法があります。今回はjarファイルを直接起動する方法にしました。

ということでJREが必要です。

$ java -version
openjdk version "11.0.8" 2020-07-14 LTS
OpenJDK Runtime Environment Corretto-11.0.8.10.1 (build 11.0.8+10-LTS)
OpenJDK 64-Bit Server VM Corretto-11.0.8.10.1 (build 11.0.8+10-LTS, mixed mode)

Metabaseをダウンロードします。以下のURLにアクセスすると自動でjarファイルがダウンロードされます。

jarファイルを適当なディレクトリに移動して実行します。

$ java -jar metabase.jar

起動時のメッセージがズラズラ出力されますが、以下のように表示されればとりあえずOKっぽいです。

2023-01-02 15:48:26,803 INFO metabase.core :: Metabase Initialization COMPLETE

ブラウザでhttp://localhost:3000/にアクセスすると初期設定画面が開きますので進めていきます。「開始しましょう」をクリック。

上から順番に設定していきましょう。

まず言語設定。デフォルトで多分日本語になってると思いますので、そのまま次に。

次にユーザ設定。ローカルのMetabaseにログインするための設定っぽいので特に気にすることはなさそうです。必要事項を入力して次へ。

BIで使用するデータソースの設定です。ここはとりあえず後でいいと思うので、「後でデータを追加する」で。

よくある統計情報の収集確認です。気になる人はトグルをオフにすればいいでしょう。「フィニッシュ」をクリック。これで完了です。

最後にMetabaseのニュースリリースを購読するかを聞かれますが、まあ後でもいいかなと思います。「Metabaseを使い始める」をクリック。

Metabaseのトップ画面が表示されました。データの解析はここから始めます。

データソースの追加

予めMetabaseが用意したサンプルのデータも用意されていますが、せっかくなので自分のデータを使う流れをやってみましょう。

ちょうどこういう記事がありますので、PostgreSQLにこのサンプルデータベースをデータソースとして使うことにします。DVDレンタルのトランザクションっぽいデータのようですね。

PostgreSQLが予めローカルにインストールされているものとして上記のサンプルDBを用意します。詳細は割愛。

$ mkdir pg_sample_db && cd pg_sample_db
$ wget https://www.postgresqltutorial.com/wp-content/uploads/2019/05/dvdrental.zip
$ unzip dvdrental.zip
$ ls
dvdrental.tar   dvdrental.zip
$ createuser postgres     # Macの場合、OSユーザがsuper userになっていてpostgresユーザがいないので追加
$ createdb dvdrental
$ pg_restore -h localhost -U postgres -d dvdrental ./dvdrental.tar
$ psql -h localhost -U postgres dvdrental -c "\dt;"
             List of relations
 Schema |     Name      | Type  |  Owner
--------+---------------+-------+----------
 public | actor         | table | postgres
 public | address       | table | postgres
 public | category      | table | postgres
 public | city          | table | postgres
 public | country       | table | postgres
 public | customer      | table | postgres
 public | film          | table | postgres
 public | film_actor    | table | postgres
 public | film_category | table | postgres
 public | inventory     | table | postgres
 public | language      | table | postgres
 public | payment       | table | postgres
 public | rental        | table | postgres
 public | staff         | table | postgres
 public | store         | table | postgres
(15 rows)

ではMetabaseから接続します。「独自データの追加」をクリック。

データベースの設定画面が表示されます。

ちなみに、データソースとして選択できるタイプの一覧はこんな感じです。ここにはないですが、プラグインでCSVも使えるようです。

今回はPostgreSQLを使うので、こんな感じで設定して「保存」をクリック。

エラー等なく設定が追加されると、こういう画面が表示されますが、ここの「サンプルデータ」はMetabaseのデフォルトで用意されたものを指していて追加したデータベースではないです。クリックして「あれー、追加したものと違う?」となりそうですね。なので迷わないようにベタに戻っていきましょう。右上の「✕」をクリックします。

右上の「管理画面から離れる」をクリック。

トップ画面に戻りました。よく見るとさっき追加したデータベースに関連するような表示が見えますね。Metabaseには、データベースのスキーマから「こういうデータが見たいよな―」というのを自動で解析してグラフ化してくれる「X-Ray」という機能があり、どうやらそれが表示されているようです。

これを使ってもいいんですが、今回はウォークスルー的に使い方を学ぶためにX-Rayは使わずにベタにやっていきたいと思います。いったん先ほどのデータベースが追加されているか確認だけしておきましょう。

「データの閲覧」をクリック。

追加した「DVD Rental」をクリック。

テーブル一覧が表示されます。どれでもいいのですが、DVDタイトルのテーブルっぽい「Film」をクリックしてみます。

ちゃんと追加できているようですね。

では次回はこれらのデータを使ってグラフを作っていきます。

SQLite3のデータベースをPostgreSQLに移行する

メモです。あ、あけましておめでとうございます。今年もよろしくおねがいします。

故あって、SQLite3のデータベースをPostgreSQLに移行する必要が出ました。いろいろ調べてみるとダンプして取り込むよりはsequelを使うほうが楽、ということでやってみました。

本来はORMやDBI的に使うみたいですが、コマンドラインからも使えるようです。Ruby製のツールということでうちの環境はこんな感じです。

$ ruby -v
ruby 3.1.2p20 (2022-04-12 revision 4491bb740a) [x86_64-darwin21]

gemでインストールします。SQLite3とPostgreSQLにつなぐためのgemも必要です。

$ gem install sequel
$ gem install pg
$ gem install sqlite3

では移行します。あらかじめPostgreSQL側にはデータベースを作成しておいてください。

$ sequel -C sqlite://sample.db postgres://kun432@localhost/sample

実行中はこんな感じ。

Databases connections successful
Migrations dumped successfully
Tables created
Begin copying data
Begin copying records for table: sample1
Status: 5402 records copied
Status: 10865 records copied
Status: 16396 records copied
Status: 21604 records copied
Status: 26834 records copied
Status: 31849 records copied
Status: 35739 records copied
Finished copying 39718 records for table: sample1
Begin copying records for table: sample2
Status: 6587 records copied
Status: 13316 records copied
Status: 19638 records copied
Status: 26111 records copied
Status: 33362 records copied
(snip)
Finished copying data
Begin creating indexes
Finished creating indexes
Begin adding foreign key constraints
Finished adding foreign key constraints
Primary key sequences reset successfully
Database copy finished in 1624.627201 seconds

これでOKです。

ためしにMetabaseからつないでみたけど、SQLite3だと非常に重たかったのがクイックに使えてやっぱりRDBはいいなと再認識。