Lightdashを使ってみた ~データ可視化編

2022/11/04に公開約7,900字


OSS BIツールのLightdashをローカル環境で使ってみたので、実際にデータを可視化してみました。
https://www.lightdash.com/


Lightdashはdbtと接続して使用するBIツールで、dbtで定義したmetricsを可視化することができるという特徴があります。昨今、dbtが流行してきていることを踏まえると、このようなdbtとシームレスに繋がるBIツールがどんどん出てくるのではと思っており、その筆頭として非常に注目しています。


今回の記事では、実際にデータを可視化するところからの紹介となります。
Lightdashをセットアップして、GitHub上のdbtプロジェクトと連携するところまでは別の記事に書いたので、セットアップから始めたいという方はこちらをお読み頂ければと思います。

https://zenn.dev/ikki/articles/aba98c1af9fea6



使用するデータ

今回は、自分のツイートに関するデータを可視化に使いました。

自分のツイートデータはTwitter Developer PlatformのTwitter APIから取得することができます。今回はとりあえず可視化を試すだけなので、dbtプロジェクト配下に持ってきていればどんなデータでもokです。

https://developer.twitter.com/ja/docs



ツイートデータを少し整形して、

・ツイートID
・文字数
・引用ツイート数
・返信数
・いいね数
・リツイート数
・ツイート日

上記のカラムを持ったテーブルを使用したいと思います。


こんなテーブル



dbtでスキーマを定義する

dbtプロジェクトに上記のツイート情報のモデルを作成してありますが、これだけだとLightdashで使用できるようにはなっていません。

Lightdash側から、dbt配下のTable, Dimension, Metricsを認識するためには、dbtでスキーマを定義する必要があります。Lightdashではそのスキーマを基にして、データを読み込むという流れになります。



Table & Dimensionを定義する

まず、dbtモデルとして定義されているテーブルを、Lightdashで使えるようにしていきます。

Lightdashで上述のツイート情報に関するテーブルを使用するには、dbt上でスキーマを定義する必要があります。
https://docs.lightdash.com/guides/how-to-create-dimensions


以下のように、一般的なスキーマ定義をdbt上で行うだけで、Lightdashですぐに使用することが可能です。

schema.yml
version: 2
models:
  - name: mart__twitter
    columns:
      - name: id
        description: "ツイートID"
      - name: number_of_text
        description: "ツイートの文字数"
      - name: quote_count
        description: "引用ツイート数"
      - name: reply_count
        description: "返信数"
      - name: like_count
        description: "いいね数"
      - name: retweet_count
        description: "リツイート数"
      - name: tweet_date
        description: "ツイート日"



これで、Lightdashを見ると、Mart twitterというTableが使用可能になっています


また、テーブルを選択すると、スキーマで定義したカラムがDimensionsとして定義されています


Metricsの定義はまだ行っていないので、「No metrics defined in your dbt project」と表示されています。続いて、Metricsを定義していきましょう。



Metricsの定義

dbt上でMetricsを定義する方法は2つあります。

  1. スキーマの最上位の階層で、metrics:と定義する形
  2. 各カラム定義の階層で、meta: metrics:と定義する形


Lightdashの公式ドキュメントでは、1つ目のmetricsタグを使用する方法にはいくつかの制限が存在しているため、2つ目のmetaタグを使用する方法が推奨されています。

https://docs.lightdash.com/references/metrics

Using the metrics tag has a couple of limitations (a.k.a. "features" 😉) in Lightdash we think are worth pointing out. Read more about them below.


ただ、最近dbt Semantic Layer関連の話題を見ていると、1つ目のmetricsタグを使用する方法が主流になる予感がしているので、1つ目の方法も試してみたいと思います。Lightdashにdbtを最適化するのは避けたいですよね。

https://docs.getdbt.com/docs/build/metrics



ということで、再びschema.ymlを編集して、metricsの定義を行います。

設定するプロパティは公式ドキュメントに記載されています。ここでは、必須となっているプロパティのみ設定を行います。

schema.yml
version: 2
metrics:
  - name: total_reply_count
    model: ref('mart__twitter')
    description: "合計返信数"
    calculation_method: sum
    expression: reply_count
    timestamp: tweet_date
    time_grains: [day, week, month, quarter, year]

models:
  - name: mart__twitter
    columns:
    
-- <略> --



dbt上でtotal_reply_countというmetricsが定義されていることが分かります。


Lightdash上でも、Metricsが使用できるようになっています🎉




念のため、metaタグを使用したmetrics定義も試しておきます。(長いのでトグルで隠します)

schema.yml
schema.yml
version: 2
metrics:
  - name: total_reply_count
    model: ref('mart__twitter')
    description: "合計返信数"
    calculation_method: sum
    expression: reply_count
    timestamp: tweet_date
    time_grains: [day, week, month, year]

models:
  - name: mart__twitter
    columns:
      - name: id
        description: "ツイートID"
        meta:
          dimension:
            type: number
          metrics:
            total_tweet_count:
              type: count_distinct
      - name: number_of_text
        description: "ツイートの文字数"
        meta:
          dimension:
            type: number
          metrics:
            total_number_of_text:
              type: sum
      - name: quote_count
        description: "引用ツイート数"
        meta:
          metrics:
            total_quote_count:
              type: sum
      - name: reply_count
        description: "返信数" -- metricsタグで定義したのでここでは定義しない
      - name: like_count
        description: "いいね数"
        meta:
          metrics:
            total_like_count:
              type: sum
      - name: retweet_count
        description: "リツイート数"
        meta:
          metrics:
            total_retweet_count:
              type: sum
      - name: tweet_date
        description: "ツイート日"



この方法でも、Lightdash上で正しく定義できていることが確認できました。🎉


ちなみに、この方法ではdbt上ではmetricsとして認識はされません。




可視化してみる

とりあえず実行

それでは、dimensions & metricsの定義が完了したので、いよいよ可視化をしていきたいと思います。

使い方は超カンタンで、左サイドバーからDimensionとMetricsをそれぞれ選択して、「Run query」ボタンを押すだけです。


こんな感じ

Chartsというグラフが表示されるエリアと、Resultsという表形式で数値が表示されるエリアがあります。このあたりはかなりLookerを意識(パクリ?)した作りになっていると言えるでしょう。



グラフを色々触ってみる

まず、グラフの種類ですが、現時点では最低限の種類が存在しているという状態です。具体的には、以下の7種類のグラフ形式を選択することができます。


また、棒グラフと折れ線グラフ等、複数の形式を組み合わせたグラフを作成することも可能です。


その他、細かくグラフの設定をいじれるので、色々と整えてみました。

まだまだ、基本的な可視化に使える程度ですが、Metabaseよりもグラフの色・データラベル・軸ラベルなどのデザイン面に融通が利いた点は、良いかなと思いました。


日付フィルターもGUIでカレンダーから選択することが可能なので、SQLを書き換えるよりもハードルが低くてGoodな点です。



Moreなところ

一方で、「もっとここは改善してほしい!」という点もいくつかあったので、それも書いておきたいと思います。


ドリルダウンが上手くできない

日付Dimensionがday, week, monthなどドリルダウン的に存在しているので、ドリルダウンで日付の集計単位(day, week, month)を切り替えられることを期待しましたが、集計単位を切り替えるたびにグラフのデザインが初期化されることが分かりました。

デザインが初期化されるとなると、凝ったデザインのグラフでドリルダウンを使うことは現実的ではないので、ほとんど使えないということになりそうです。


dbt Metricsを使用する点のひとつに、日付のドリルダウンを可能にして、OLAP Cube状態を回避するという点があると思うので、ここは対応してもらいたいところです、、

https://analyticsengineers.club/whats-an-olap-cube/


可視化のバリエーションが少ない

やはり、現状の可視化のバリエーションでは、メインのダッシュボードとして乗り換えるにはまだまだ心許ないです。

個人的には、現職でMetabaseをメインで使用しているので、それと比べるとそれほど劣っている印象はないという印象を持ちますが、LookerやTableauなどをメインで使用している人からすると、まだまだオモチャの段階にあると思います。

可視化のバリエーションや表現力は、これからどんどん向上していってくれると思うので、暖かい目で見守りたいところです。


dbtとLightdashの接続もlineageで確認したい

現状、dbt上ではMetricsまでがlineageで確認できるという状態で、dbtとLightdashの接続状況を把握することはできません。

しかし、dbtで定義したMetricsがどのダッシュボードで使われているかが分かれば、Metricsを変更する際の影響範囲を把握することができるので、より良いんじゃないかと思っています。

これは、Mustではなく期待という感じです。



おわりに

以上、dbtでスキーマを定義して、Lightdashで色々可視化を試してみました。


現状では可視化の表現力がかなり心許ないという印象ですが、dbtのMetricsを使って可視化できるという点は大きいメリットだと思うので、今後に期待したいと思っています!

dbt Semantic Layerは今後どんどん進化していくと思うので、それに対応したBIツールは引き続きウォッチしていきたいです。

https://docs.getdbt.com/docs/use-dbt-semantic-layer/dbt-semantic-layer


最後まで読んで頂きありがとうございました。




Discussion

ログインするとコメントできます