📑

dbt(Data Build Tool)を使ったデータの品質管理方法

2021/05/06に公開

このドキュメントは?

dbtを利用してデータの品質管理を継続的に行えるような仕組みが備わっています。それを利用し、目的別にどのようなやり方で対応できるのか調査してみました。

データ品質管理とは?

まずデータの分析や機械学習をする際に必要最低限だと思われる品質の管理項目に関して次のように定義してあったので拝借しました。

- 正確性、妥当性、有効性
  - 意図に合う内容・形式のデータか
- 完全性
  - 欠損のないデータか
- 一貫性、整合性
  - データ間の関係に矛盾がないか
- 最新性
  - 求めている期間(の最新)のデータか

こんなデータじゃ機械学習できねぇよ MLにおけるデータマネジメントの重要性 - ログミーTech

dbtを利用したデータのテスト方法の基本

dbtにはSchemaTestsData Testsと呼ばれるデータをテストする仕組みがあります。

dbtではモデルという概念でテーブルを管理しており、モデルの定義ファイル(.sql)とは別にYAMLファイルでデータのスキーマを定義することが可能です。このスキーマはデータの「ドキュメントの生成」及び「テストケース」の管理に使用されます。

dbtのCloudサービスではCIサービスを提供しており、dbtのtestコマンドを実行することにより「データのテスト」→「失敗時にSlackで通知」といったデータの継続的インテグレーション環境を構築することが可能です。

SchemaTests

スキーマテストは各モデルが生成したテーブルのデータを所定のテストケースで実際に適合できるかテストを行える仕組みです

version: 2

models:
  - name: orders
    columns:
      - name: order_id
        tests:
          - unique
          - not_null
      - name: status
        tests:
          - accepted_values:
              values: ['placed', 'shipped', 'completed', 'returned']
      - name: customer_id
        tests:
          - relationships:
              to: ref('customers')
              field: id
  • unique
    • カラムのデータがすべてユニークの値になっているかのテストを行います
  • not_null
    • カラムのデータにnullがないことのテストを行います
  • accepted_values
    • 配列のデータでカラムに含まれて良いデータを定義します。含まれていけないデータがある場合エラーになります
  • relationships
    • カラムのデータが指定した外部のテーブルデータの所定のカラムに存在する(結合できる)状態になっているか確認するテストを行います

DataTests

前述のスキーマテストとは別にselectの返却行数が0行になるテスト(成功ケース)をsqlで定義し、そのテストケースを実行しデータを確認することが可能です。

-- tests/assert_total_payment_amount_is_positive.sql
select
    order_id,
    sum(amount) as total_amount
from {{ ref('fct_payments' )}}
group by 1
having not(total_amount >= 0)

上記の例ではorder_id毎に会計金額をまとめ、会計金額の合計が0以上でない行がないかのテストになります。
上記のテストケースはtestsというディレクトリ以下に初期設定では格納する必要があります。

項目 対応方法 利用例
正確性、妥当性、有効性 SchemaTests、DataTests 年齢を管理するカラムに異常値が含まれていたりしないか
完全性 SchemaTests ユーザーIDのカラムデータがすべてデータがあるか
一貫性、整合性 SchemaTests 会計データに含まれるユーザーIDは実存するIDか
最新性 DataTests 所定の時刻までに所定の期間までのデータが取り込まれているか

Discussion