LESSON 30分

ストーリー

田中VPoE
データパイプラインを設計しても、流れるデータの品質が低ければ意味がない。「Garbage In, Garbage Out」だ
あなた
データ品質の問題は、気づくのが遅れると影響が大きいですよね。誤ったデータで意思決定してしまう
田中VPoE
その通り。データ品質の問題は、放置すると「データチームへの信頼崩壊」を引き起こす。一度信頼を失うと、どんなに良いダッシュボードを作っても「その数字、合ってるの?」と疑われる
あなた
データ品質を自動的にチェックする仕組みが必要ですね
田中VPoE
そうだ。今回はデータ品質を体系的に管理するフレームワークを学ぶ。テストの自動化、品質スコアの算出、アラートの設計まで一貫した仕組みを構築する

データ品質の6次元

品質の測定軸

次元定義チェック方法
正確性(Accuracy)データが現実を正しく反映しているか外部データとのクロスチェック売上金額がStripeの明細と一致
完全性(Completeness)必要なデータが欠損していないかNULL率、レコード数チェックメールアドレスのNULL率 < 1%
一貫性(Consistency)複数のデータソース間で整合しているかクロスデータベースの突合DWHの売上 = Stripeの売上
適時性(Timeliness)データが期待されるタイミングで利用可能か鮮度モニタリング日次バッチが朝8時までに完了
一意性(Uniqueness)重複データがないか重複チェックorder_idの重複がゼロ
妥当性(Validity)データが定義されたルールに従っているかドメインルールチェックstatusが定義済みの値のみ

データ品質テストの設計

テストピラミッド

データ品質テストピラミッド:

               ┌──────────┐
               │ ビジネス   │  ← 少数だが重要
               │ ルール検証  │    KPI整合性、クロスチェック
               ├──────────┤
               │ 統計的     │  ← 異常検知
               │ テスト     │    分布の変化、外れ値
               ├──────────┤
               │ スキーマ   │  ← 中程度
               │ テスト     │    型、NULL、値域
               ├──────────┤
               │ 基本テスト  │  ← 多数、自動化
               │           │    not_null, unique, freshness
               └──────────┘

dbt testsによる品質チェック

# models/silver/schema.yml
models:
  - name: slv_orders
    description: "クレンジング済み注文データ"
    config:
      tags: ['quality-critical']
    columns:
      - name: order_id
        description: "注文の一意識別子"
        tests:
          - not_null
          - unique
      - name: total_amount
        tests:
          - not_null
          - dbt_utils.expression_is_true:
              expression: ">= 0"
          - dbt_utils.expression_is_true:
              expression: "< 10000000"  # 1000万円以上は異常値
      - name: status
        tests:
          - not_null
          - accepted_values:
              values: ['PENDING', 'COMPLETED', 'CANCELLED', 'REFUNDED']
      - name: order_date
        tests:
          - not_null
          - dbt_utils.expression_is_true:
              expression: "> '2020-01-01'"
          - dbt_utils.expression_is_true:
              expression: "<= CURRENT_DATE()"

    tests:
      # テーブルレベルのテスト
      - dbt_utils.equal_rowcount:
          compare_model: ref('brz_orders')  # Bronze と Silver のレコード数が一致

Great Expectationsによる品質チェック

Expectation Suite

# Great Expectations: 注文データの品質チェック
import great_expectations as gx

context = gx.get_context()

# Expectation Suite の定義
suite = context.add_expectation_suite("orders_quality")

# 基本チェック
suite.add_expectation(
    gx.expectations.ExpectColumnValuesToNotBeNull(column="order_id")
)
suite.add_expectation(
    gx.expectations.ExpectColumnValuesToBeUnique(column="order_id")
)

# 値域チェック
suite.add_expectation(
    gx.expectations.ExpectColumnValuesToBeBetween(
        column="total_amount",
        min_value=0,
        max_value=10000000
    )
)

# 統計チェック(異常検知)
suite.add_expectation(
    gx.expectations.ExpectTableRowCountToBeBetween(
        min_value=1000,  # 日次で最低1000件
        max_value=100000  # 日次で最大10万件
    )
)

# 鮮度チェック
suite.add_expectation(
    gx.expectations.ExpectColumnMaxToBeBetween(
        column="order_date",
        min_value={"$PARAMETER": "yesterday"},
        max_value={"$PARAMETER": "today"}
    )
)

データ品質スコアの算出

スコアリングモデル

カテゴリ重み計算方法
完全性30%(1 - NULL率) × 100
正確性25%クロスチェック一致率 × 100
一貫性20%ソース間整合率 × 100
適時性15%SLA遵守率 × 100
一意性10%(1 - 重複率) × 100
品質スコアの例:

テーブル: slv_orders
  完全性:  98.5% × 0.30 = 29.55
  正確性:  99.2% × 0.25 = 24.80
  一貫性:  97.0% × 0.20 = 19.40
  適時性: 100.0% × 0.15 = 15.00
  一意性:  99.9% × 0.10 =  9.99
  ────────────────────────
  総合スコア: 98.74 / 100

  判定基準:
    95-100: 優良(Green)
    85-94:  注意(Yellow)
    0-84:   問題あり(Red)

「データ品質スコアをダッシュボードに表示し、全社に公開する。『このテーブルのスコアは98点』とわかれば、そのデータを信頼して意思決定できる。スコアが下がったら即座にアラートを発報する」 — 田中VPoE


まとめ

ポイント内容
6次元正確性、完全性、一貫性、適時性、一意性、妥当性
テストピラミッド基本テスト → スキーマ → 統計 → ビジネスルールの4層
ツールdbt tests(SQL)、Great Expectations(Python)
品質スコア重み付きスコアで品質を定量化し、ダッシュボードで可視化

チェックリスト

  • データ品質の6次元を説明できる
  • dbt testsで基本的な品質チェックを実装できる
  • Great Expectationsの基本的な使い方を理解した
  • データ品質スコアの算出方法を理解した

次のステップへ

次は「データリネージ」を学びます。データがどこから来て、どう変換され、どこに行くのかを追跡する仕組みを身につけましょう。


推定読了時間: 30分