本文へ移動

ホーム / Data / 第5部 品質・ガバナンス

第5部 品質・ガバナンス・第11章

データ品質と可観測性

★★★ 必須10トピック・面接 5問

間違ったデータで判断しないように、品質を測って守る方法を押さえる。

別のページで開く →

障害対応の演習を読み込んでいます…

11.1データ品質の観点

用語★★★ 必須
ひとことで

完全性・一意性・正確性・一貫性・妥当性・鮮度などの観点に分けて、測れる形にする。

「データの品質が悪い」と言うだけでは、何を直せばよいか分かりません。品質はいくつかの観点に分けて、それぞれ測れる形にします。

観点問い測り方の例
完全性欠けていないか必須の列の NULL の割合、件数が平常どおりか
一意性重複していないか主キーの重複の件数
正確性現実と合っているか元のシステムや会計の数字との突き合わせ
一貫性テーブルの間で矛盾しないか注文の合計と明細の合計が合うか、参照先があるか
妥当性決まった形・範囲か金額が 0 以上、状態が決まった値、メールの形
鮮度十分に新しいか最終の更新の時刻、何時までに揃ったか

全部を同じ厳しさで見る必要はありません。そのデータを何に使うか(請求か、傾向を見るだけか)で、どの観点をどこまで守るかを決めます。

面接ではこう答える

データの品質は、欠けていないかの完全性、重複がないかの一意性、現実と合っているかの正確性、テーブルの間で矛盾しないかの一貫性、決まった形や範囲かの妥当性、十分に新しいかの鮮度、のように観点に分けて測ります。観点ごとにテストや監視の指標にできるので、どこが悪いのかを具体的に話せます。どこまで厳しく守るかは、そのデータを何に使うかで決めます。

11.2データのテスト

用語★★★ 必須
ひとことで

NULL・重複・参照先・値の範囲・鮮度を自動でチェックする。

データのテストは、コードのテストと違い「今日届いたデータが正しいか」を毎回の実行ごとに確かめるものです。ダッシュボードの数字が間違っていると利用者に言われる前に、自分たちで気づくための仕組みです。

見ること例よくある原因
NULLorder_id が空でない上流の不具合、JOIN の取りこぼし
一意主キーが重複しない再送・CDC の重複、JOIN で行が増えた
参照先注文の customer_id が顧客にある取り込みの順番のずれ、削除
値の範囲・種類金額が 0 以上、状態が決まった値仕様の変更、単位の変更(円→銭)
件数・鮮度昨日の注文が平常の半分以下でない、最終の更新が 2時間以内取り込みの停止、上流の障害

道具:dbt を使っているなら、まず dbt test です。unique・not_null などを YAML に書くだけで使え、自分で SQL を書けば何でもテストにできます(「0行返れば合格」の SELECT を書く)。元のテーブルの鮮度は dbt source freshness で見られます。Great Expectations は Python のライブラリで、「この列は NULL でない」のような期待(expectation)を並べて、DWH に限らずファイルや DataFrame も検査できます。

-- 単独のテスト:返った行が不合格。1週間前の同じ曜日より 50% 以上減った日を見つける
SELECT d.order_date, d.cnt
FROM daily_order_count d
JOIN daily_order_count p ON p.order_date = d.order_date - 7
WHERE d.cnt < p.cnt * 0.5;

止めるか、知らせるか

面接ではこう答える

データのテストは、コードのテストと違い、今日届いたデータが正しいかを毎回の実行ごとに確かめるものです。NULL、主キーの一意、参照先の存在、値の範囲や種類、件数と鮮度を見ます。dbt を使っていれば、unique や not_null を YAML に書く dbt test と、元のテーブルの鮮度を見る source freshness から始め、0行返れば合格という SQL を書けば何でもテストにできます。

別のページで開く →

DBラボを読み込んでいます…

入口で早く、出口で確実に元データrawstagingmartBI鮮度・件数・スキーマ知らせる一意・NULL止める参照先・値の範囲止める業務ルール・急変知らせる止める(error):下流の数字が確実に間違うもの。知らせる(warn):人の判断が要るもの
データ品質のチェックを置く位置と、止めるか知らせるか(例)

どこで止めるかが設計の肝です。すべてのテストで止めると、ささいな異常で毎日パイプラインが止まり、結局テストが無視されるようになります。

  • 止める(error):主キーの重複・NULL など、下流の数字が確実に間違うもの。取り込み直後や mart の手前で止めて、壊れたデータを公開しない。
  • 知らせるだけ(warn):件数の変動、まれな値など、判断が要るもの。dbt では severity: warn にできる。
  • 隔離する:おかしな行だけ別のテーブルに分けて、残りは流す。

テストは入口(取り込み直後)で早く、出口(mart)で確実にが基本です。上流に近いほど原因が分かりやすく、出口のテストは利用者が見る数字を守ります。失敗の通知には、どのテーブル・どの行が悪いかを確かめる SQL を添えると、対応が速くなります。

テスト置き場所失敗したら
主キーの一意・NULL取り込み直後と mart止める
参照先の存在mart の手前止める、または不明の行につないで知らせる
件数の急変取り込み直後知らせる(人が判断)
まれな値・形の崩れた行staging隔離して、残りは流す

テストが全部通っても、元のシステムと数字が合っていないことがあります。取り込みの取りこぼしや、変換の条件の間違いは、テーブルの中だけを見ても分かりません。元のシステムと DWH で、同じ条件の件数と合計を比べます。

元のシステムと DWH の件数・合計を毎日比べる元のシステム注文 DB・会計件数と合計日ごとに数えるDWH同じ条件で数える差を記録許容を超えたら知らせる
差がゼロでなくても、理由を説明できる範囲か(遅れ・キャンセル)を見る
-- 日ごとの件数と金額を、元(レプリカから取った集計)と DWH で比べる
SELECT s.order_date,
       s.cnt AS src_cnt, d.cnt AS dwh_cnt,
       s.amount AS src_amount, d.amount AS dwh_amount
FROM src_daily s
FULL OUTER JOIN dwh_daily d USING (order_date)
WHERE s.cnt IS DISTINCT FROM d.cnt
   OR ABS(COALESCE(s.amount, 0) - COALESCE(d.amount, 0)) > 0;

会計や請求に使う数字は、経理が持っている数字とも突き合わせます。「データ基盤の売上」と「会計の売上」の差を毎月説明できる状態にしておくと、利用者の信頼が大きく上がります。

「件数が平常の半分」「NULL の割合が急に増えた」のような異常は、決まった値のテストでは書きにくいので、過去と比べる形で見張ります。

日別の注文数(前週の同じ曜日と比べる)月(先週)1,000月(今週)980土(先週)1,600土(今週)700 ← 半分以下
曜日で件数が変わるので、前日ではなく前週の同じ曜日と比べる
見張るもの比べ方よく見つかる原因
件数前週の同じ曜日、直近数週の平均と幅取り込みの停止、上流の障害、二重の取り込み
NULL の割合直近の割合と比べるアプリの変更で項目が送られなくなった
値の分布(平均・最大)直近の範囲と比べる単位の変更(円→銭)、テストのデータの混入
種類の数新しい値が出たか新しい状態・新しい商品カテゴリの追加

祝日・セール・月末は普段と違って当然なので、知らせが来すぎないように幅を調整し、予定されたイベントの日は除外できるようにしておきます。データの可観測性の製品は、こうした比べ方を自動で学習して知らせてくれます。

ひとことで

どのデータがどこから来てどこで使われているか(リネージ)を把握し、異常の影響範囲を知る。

テストは「書いたルール」しか見張れません。データの可観測性は、ルールを書いていない異常にも気づけるように、データの状態をいつも計測しておく考え方です。よく見るのは次の5つです。

見るもの異常の例
鮮度毎時更新のテーブルが 3時間更新されていない
量(件数)昨日の件数が、いつもの曜日の半分
分布NULL の割合が 1% から 40% に、平均金額が 100倍に
スキーマ列が消えた・型が変わった
リネージどのテーブルがどこから作られ、どのダッシュボードで使われているか

スキーマの変化とデータ契約

面接ではこう答える

データの可観測性は、テストのように書いたルールだけでなく、ルールを書いていない異常にも気づけるように、データの状態をいつも計測しておく考え方です。よく見るのは、鮮度、件数、値の分布、スキーマの変化、そしてどのデータがどこから来てどこで使われているかのリネージの5つです。異常に早く気づき、影響範囲をすぐに知れるようにするのが目的です。

ひとことで

どのデータがどこから作られ、どこで使われているかのつながり。壊れたときの影響範囲と原因をたどれる。

リネージ(データの系譜)があると、「この元テーブルが壊れたら、どのダッシュボードと誰に影響するか」がすぐ分かります。dbt は依存関係からリネージを作れますし、データカタログの製品や OpenLineage という共通の形式もあります。

壊れた元から、どこまで影響が広がるかsrc.orderssrc.usersstg_ordersstg_usersfct_ordersdim_customers売上ダッシュボード営業レポートML の特徴量赤:原因 黄:影響を受けるもの → 利用者に先に知らせる
リネージで影響範囲を知る(orders が壊れた例)
リネージの細かさ分かること作り方の例
テーブル単位どのテーブルからどのテーブルが作られるかdbt の依存関係、OpenLineage 形式のイベント
列単位この列がどの元の列から計算されているかSQL を解析するデータカタログの製品
利用先までどのダッシュボード・誰が使っているかBI ツールの情報をカタログに取り込む

面接ではこう答える

リネージはデータの系譜で、どのテーブルがどの元のテーブルから作られ、どのダッシュボードで使われているかのつながりです。これがあると、元のテーブルが壊れたときに影響を受ける下流と利用者がすぐ分かり、逆にダッシュボードの数字がおかしいときは上流へたどって原因を探せます。dbt の依存関係や、OpenLineage という共通の形式、データカタログの製品で作ります。

ひとことで

利用者と、データを何時までに・どの品質で届けるかを約束し、守れた割合を測る。

「データは新しいほうがよい」だけでは、どこまで頑張ればよいか決まりません。利用者と何時までに・どの品質で届けるかを約束し、守れた割合を測ります。考え方は SRE の SLO と同じです。

鮮度の約束:毎朝 8:00 までに前日分が揃う2:005:008:0011:00取り込み完了変換・テスト完了約束の時刻
約束の時刻に間に合った日の割合を SLI として測る
約束の例(SLO)測る指標(SLI)
経営のダッシュボードは、毎朝 8時までに前日分が揃う(月に 95% の日)8時の時点で前日分が揃っていた日の割合
注文のテーブルは、元の DB から 15分以内に反映される元の最新の時刻と DWH の最新の時刻の差
売上の mart は、主キーの重複がないテストが通った日の割合

約束があると、優先順位も決めやすくなります。約束のないテーブルの失敗は翌営業日に直し、約束のあるテーブルは朝のうちに直す、という具合です。

面接ではこう答える

データの SLA や SLO は、利用者と「経営のダッシュボードは毎朝 8時までに前日分が揃う」のように、鮮度や完全性を約束することです。守れた日の割合を SLI として測り、目標を下回りそうなら改善を優先します。約束があると、どのテーブルの失敗を急いで直すべきかがはっきりし、全部を同じ緊急度で扱わずに済みます。

11.9データの障害の対応

用語★★★ 必須
ひとことで

検知・影響の把握と連絡・止血・原因と修正・振り返りの順で進め、壊れた数字を広げないことを優先する。

データの障害の対応は、SRE のインシデント対応と同じ考え方で進めます。

  • 検知:テスト・監視・利用者からの報告。
  • 影響の把握と連絡:リネージで下流を調べ、利用者に「このダッシュボードは今おかしい、いつ直る見込み」を先に知らせる。ダッシュボードに注意書きを出す。
  • 止血:壊れたデータを下流に流さない(パイプラインの停止、前日の正しい版に戻す)。
  • 原因と修正:上流へたどって原因を見つけ、直してからバックフィルで正しい値に作り直す。
  • 振り返り:同じ異常を捕まえるテストを足す。上流の変更が原因ならデータ契約を結ぶ。
データの障害の対応の流れ検知テスト・監視・報告影響の把握リネージで下流を止血流さない・戻す原因と修正上流へたどる振り返りテストを足す
原因の究明より先に、利用者への連絡と、壊れた数字を広げないことを優先する

利用者への最初の連絡は「どの数字が・いつから・どのくらいおかしいか、次にいつ知らせるか」を短く伝えます。原因が分かるのを待ってから連絡すると、その間に間違った数字で判断されてしまいます。

面接ではこう答える

データの障害は、SRE のインシデント対応と同じ考え方で進めます。テストや監視、利用者の報告で検知したら、まずリネージで影響する下流を調べて利用者に先に知らせ、壊れたデータを下流に流さないように止めるか前日の正しい版に戻します。そのあと上流へたどって原因を直し、バックフィルで正しい値に作り直し、同じ異常を捕まえるテストを足します。

症状よくある原因捕まえるテスト・監視
数字が急に2倍二重の取り込み、ファンアウト、再送の重複主キーの一意、件数の急変
数字が急に減る・0取り込みの停止、上流の障害、条件の変更件数の急変、鮮度
一部の日だけおかしい遅れて届いたデータ、バックフィルの漏れ、タイムゾーン日別の件数の比較
NULL が急に増えるアプリの変更で項目が送られない、JOIN のキーの不一致NULL の割合
値が桁違い単位の変更(円→銭、秒→ミリ秒)値の範囲・分布
前に見た数字が変わった遅れて届いた分の反映、定義の変更、SCD の扱い確定の日の取り決め、変更の告知

過去の障害を表にしておくと、新しいテーブルを作るときに「どのテストを入れるか」のチェックリストになります。

この章のまとめ

🖨 まとめシート(印刷・PDF)
  • 品質の観点と、テスト(NULL・一意・参照・範囲・鮮度)
  • 突き合わせと、件数・分布の変化の監視
  • リネージ・データの SLO・障害の対応

この章のクイズ

面接ではこう聞かれる

まず答えを見ずに声に出して答え、そのあと開いて比べる。

Q1ダッシュボードの数字がおかしいと言われたらどう調べますか?

模範回答

まず「どの数字が、いつから、何と比べておかしいのか」を具体的に聞き、本当に間違いか、定義の違い(キャンセルを含むか等)かを切り分けます。そのうえで下流から上流へたどります。ダッシュボードのクエリ、mart、intermediate、staging、元のテーブルの順に同じ条件で数字を出し、どこで値が変わったかを見つけます。

リネージがあれば、この順番と、同じ元テーブルを使う他のダッシュボードへの影響もすぐ分かります。途中で、鮮度・件数・重複のテストや最近のデプロイの履歴も見ます。原因が分かったら利用者に影響と見込みを伝え、直してから作り直し、同じことを捕まえるテストを足します。

深掘りされたら

  • 原因が上流のアプリの変更だったら、どうしますか?

見られているポイント下流から上流へ・リネージ・品質チェック

Q2データのテストでは、どんなことをチェックしていますか?

模範回答

基本は5つです。主キーが重複していないか(unique)、必須の列が空でないか(not_null)、参照先に存在するか(relationships)、値が決まった範囲・種類に入っているか(accepted_values や範囲のチェック)、そして件数と鮮度です。dbt なら YAML に書くだけで使え、業務のルールは「0行返れば合格」の SQL を自分で書きます。

例えば注文の mart なら、注文 ID の unique と not_null、顧客 ID が顧客のディメンションにあること、状態が決まった値だけであること、金額が0以上であること、昨日の件数が先週の同じ曜日の半分を下回っていないことを見ています。元のテーブルには鮮度のチェックも入れています。

深掘りされたら

  • テストが多すぎて、失敗が無視されるようになったら?

見られているポイントテストの種類と、具体的な使い方

Q3テストが失敗したら、パイプラインを止めますか?

模範回答

テストの種類で分けています。主キーの重複や必須の列の NULL のように、下流の数字が確実に間違うものは止めます。dbt の dbt build なら、テストが失敗するとその下流のモデルを作らないので、壊れたデータがダッシュボードに出ません。利用者には、前日の正しい数字のままであることを知らせます。

件数の変動やまれな値のように、本当に問題かどうか人の判断が要るものは、止めずに知らせるだけ(warn)にします。全部で止めると、ささいな異常で毎日止まり、テストが無視されるようになるからです。おかしな行だけを別のテーブルに分けて、残りは流す、という方法も使います。

深掘りされたら

  • 止めたことで、かえって困るのはどんなときですか?

見られているポイント止める・知らせる・隔離するの判断

Q4テストを書いていない種類の異常には、どう気づきますか?

模範回答

データの状態をいつも計測して、普段との違いで気づくようにします。見るのは、鮮度(更新が止まっていないか)、量(件数がいつもの曜日と比べて急に増減していないか)、分布(NULL の割合や平均値が急に変わっていないか)、スキーマ(列が消えた・型が変わった)の4つです。

これに、どのテーブルがどこから作られ、どのダッシュボードで使われているかというリネージを組み合わせると、異常に気づいたときに影響する範囲と利用者がすぐ分かります。例えば NULL の割合が急に増えたら、上流のアプリのリリースを疑って、その時刻の前後を比べます。気づいた異常は、次からはテストとして書き足します。

深掘りされたら

  • アラートが多すぎるときは、どう減らしますか?

見られているポイントデータの可観測性とリネージ

Q5データの障害の対応で、うまくいった経験を教えてください。

模範回答

例えば、次のような経験なら話せます。ある朝、売上のダッシュボードの数字が前日の半分になっていると営業から連絡が来ました。リネージで下流から上流へたどったところ、注文の取り込みの件数が半分に減っていて、上流のアプリが一部の注文を別のテーブルに書くように変わっていたことが分かりました。

まず利用者に「数字が誤っていて、昼までに直す見込み」と伝え、ダッシュボードに注意書きを出しました。新しいテーブルも取り込むように直してから、影響した3日分をバックフィルで作り直しました。振り返りでは、件数の急変を知らせるテストを足し、上流のチームとはテーブルを変えるときに事前に知らせるデータ契約を結びました。

深掘りされたら

  • 利用者への連絡で気をつけたことは?
  • 同じことが起きないと言える根拠は?

見られているポイント検知・連絡・修正・再発防止の流れ