okpy

Pythonエンジニア兼テックリーダーが、多くのプロジェクトとチーム運営から得た実践的な知識を共有するブログです。

Pythonでデータ品質、まだ「目視」で確認していますか?信頼性を劇的に高める『Great Expectations』入門

Pythonでデータ品質、まだ「目視」で確認していますか?信頼性を劇的に高める『Great Expectations』入門

📝 TL;DR (3行要約)

  1. データの「あるべき姿」を定義し、入力データがその基準を満たしているかを自動で検証するライブラリです。
  2. データ分析や機械学習のパイプラインにおいて、予期せぬ欠損値や異常値によるエラーを未然に防ぐために使われます。
  3. 検証結果を美しいHTMLレポート(Data Docs)として自動生成し、チーム内でのデータ品質の共有を劇的に楽にします。

1. 🤔 一体Great Expectationsとは何?(核心的な役割と主な使用例)

核心的な役割:データの「健康診断」と「契約書」

プログラミングの世界には、コードが正しく動くかを確認する「ユニットテスト」という概念があります。しかし、データ分析やAI開発においては、コードが正しくても「中身のデータ」が汚れているせいで、結果がめちゃくちゃになることが多々あります。

Great Expectations(グレート・エクスペクテーションズ)は、一言で言えば「データの健康診断」を自動化するツールです。

比喩で考えてみましょう。あなたはレストランのシェフです。素晴らしいレシピ(コード)を持っていても、仕入れた野菜(データ)が腐っていたら、美味しい料理は作れませんよね? Great Expectationsは、野菜が届いた瞬間に「サイズは適切か?」「鮮度は良いか?」「泥は落ちているか?」をチェックする検品担当者のような役割を果たします。

このライブラリを使うことで、「このカラムにはNULLが含まれていないはずだ」「この数値は0から100の間であるはずだ」という期待(Expectations)を定義し、それをデータにぶつけることで品質を保証します。

主な使用例:いつ、どこで使うのか?

このライブラリが真価を発揮するのは、以下のような「データが動いている」場面です。

  1. データパイプラインの入り口(ETLプロセス) 外部APIや別の部署から送られてくるCSVファイル。昨日までは正常だったのに、今日から急にフォーマットが変わっていた…という経験はありませんか?Great Expectationsをパイプラインの最初に組み込めば、異常なデータがシステムに入り込む前に検知してストップをかけることができます。

  2. 機械学習モデルの学習前チェック AIモデルは、学習データに異常値が混ざると簡単に精度が崩壊します。モデルを学習させる直前に「特徴量の分布が以前と大きく変わっていないか」をチェックすることで、モデルの品質を一定に保つことができます。

  3. データ仕様のドキュメント化 「このテーブルのこの項目って、何が入るのが正解なの?」という疑問に対し、Great Expectationsの定義ファイルそのものが「最新の仕様書」として機能します。さらに、その仕様に基づいたテスト結果がブラウザで閲覧できるレポートとして出力されるため、非エンジニアの担当者とも「データの状態」を正確に共有できます。


2. 💻 インストール方法

Great Expectationsは、Pythonのパッケージ管理ツールであるpipを使って簡単にインストールできます。データ処理に広く使われるpandasと一緒にインストールするのが一般的です。

pip install great_expectations pandas

3. 🛠️ 実際に動作するサンプルコード

ここでは、初心者の方でもすぐに試せるように、Pandasのデータフレームに対して「期待(Expectations)」を設定し、検証を行う最もシンプルな流れを紹介します。

import pandas as pd
import great_expectations as ge

# 1. サンプルデータの作成(例えば、ユーザー情報のリスト)
data = {
    "user_id": [1, 2, 3, 4, 5],
    "age": [25, 30, 22, 45, 150],  # 150歳は異常値かもしれない?
    "email": ["test1@example.com", "test2@example.com", None, "test4@example.com", "test5@example.com"], # 欠損値あり
    "status": ["active", "active", "inactive", "active", "pending"]
}

df = pd.DataFrame(data)

# 2. PandasのDataFrameをGreat Expectationsの形式に変換
# これにより、強力な検証メソッドが使えるようになります
ge_df = ge.from_pandas(df)

# 3. 「期待(Expectations)」を定義して検証を実行
print("--- データ検証開始 ---")

# A. user_idカラムには欠損値(NULL)がないことを期待する
result_id = ge_df.expect_column_values_to_not_be_null("user_id")
print(f"Check NULL (user_id): {'成功' if result_id['success'] else '失敗'}")

# B. ageカラムの値は 0 から 120 の間であることを期待する
result_age = ge_df.expect_column_values_to_be_between("age", min_value=0, max_value=120)
print(f"Check Range (age): {'成功' if result_age['success'] else '失敗'}")

# C. emailカラムにはNULLが含まれないことを期待する(あえて失敗させてみる)
result_email = ge_df.expect_column_values_to_not_be_null("email")
print(f"Check NULL (email): {'成功' if result_email['success'] else '失敗'}")

# D. statusカラムの値は指定したリストのいずれかであることを期待する
result_status = ge_df.expect_column_values_to_be_in_set("status", ["active", "inactive"])
print(f"Check Set (status): {'成功' if result_status['success'] else '失敗'}")

# 4. 全体の結果を確認
print("\n--- 詳細レポート(一部) ---")
if not result_age["success"]:
    # 期待に外れた具体的な値(異常値)を取得して表示
    unexpected_list = result_age["result"]["partial_unexpected_list"]
    print(f"【警告】ageに異常な値が見つかりました: {unexpected_list}")

4. 🔍 コードの詳細説明

上記のコードで行っていることを、いくつかのブロックに分けて解説します。

① データの準備と変換

まず、通常のPandas DataFrameを作成した後、ge.from_pandas(df)を実行しています。これが魔法のステップです。これにより、通常のDataFrameにGreat Expectationsの「検証用メソッド」が追加された、特殊なオブジェクト(PandasDataset)が生成されます。

② Expectations(期待)の定義と実行

expect_column_values_to_not_be_nullexpect_column_values_to_be_between といったメソッドを呼び出すことで、検証が即座に実行されます。 * 名前の分かりやすさ: メソッド名が「expect(期待する)」「column values(カラムの値が)」「to be between(〜の間であることを)」と、英語の文章のようになっているため、何を確認しているのかが一目で分かります。 * 豊富な検証ルール: 数値の範囲、NULLの有無、ユニーク(重複なし)かどうか、特定の文字列パターン(正規表現)に一致するかなど、数百種類のルールが標準で用意されています。

③ 検証結果(Resultオブジェクト)の活用

各検証メソッドは、単に TrueFalse を返すだけでなく、詳細な情報を含む辞書形式のオブジェクトを返します。 * success: 検証が成功したかどうか。 * result: 失敗した場合、「どの値が原因で失敗したのか(unexpected_list)」や「失敗した割合」などの統計情報が含まれます。これにより、「エラーだ!」と騒ぐだけでなく、「5件のうち、この1件が原因でエラーになった」という具体的な原因究明が瞬時に行えます。


5. ⚠️ 注意点またはヒント

初心者が陥りやすい罠:検証のやりすぎに注意!

Great Expectationsを使い始めると、その便利さに感動して、あらゆるカラムに何十個もの「期待」を設定したくなります。しかし、あまりに厳格すぎるルール(例えば「売上は1円単位で昨日と同じであるべき」など)を作ってしまうと、正常なデータの変化まで「エラー」として検知され、運用が回らなくなってしまいます。 ヒント: まずは「絶対にNULLであってはいけない項目」や「データの型(数値か文字列か)」など、最低限の品質を守るためのルールからスモールスタートするのが成功のコツです。

非常に役立つヒント:Data Docs(データドキュメント)

サンプルコードではコンソールに出力しましたが、Great Expectationsの真の力は「Data Docs」という機能にあります。コマンド一つで、これまでの検証結果を整理した美しいHTMLサイトを作成してくれます。「どのデータが、いつ、どのような理由でテストに落ちたのか」をグラフや表で確認できるため、エンジニアではないビジネスサイドの人とも「データの品質」について共通言語で話せるようになります。本格的に使う際は、ぜひ checkpoint という機能を調べてみてください。


6. 🔗 一緒に見ておくと良いライブラリ

Pandas

Great Expectationsを使いこなす上で、Pandasの知識は欠かせません。Great Expectationsの内部ではPandasがフル活用されており、データの読み込みや前処理、そして今回紹介したような検証の土台となります。もし「データの型を変換したい」「特定の条件でデータを抽出したい」といった操作が必要になったら、Pandasの学習に戻ってみると、Great Expectationsの理解もより一層深まるはずです。


7. 🎉 まとめ

データ分析の世界には「Garbage In, Garbage Out(ゴミを入れれば、ゴミが出てくる)」という有名な言葉があります。どんなに高度なAIモデルを作っても、元となるデータが汚れていれば意味がありません。

Great Expectationsは、その「データの汚れ」を自動で見つけ出し、私たちのプロジェクトの信頼性を守ってくれる強力な味方です。

🚀 今日の挑戦課題: お手元にある適当なCSVファイルをPandasで読み込み、expect_column_values_to_not_be_null を使って、「絶対に値が入っているはずのカラム」に本当にNULLがないかをチェックしてみてください。意外な発見があるかもしれませんよ!

データの品質をコントロール下に置き、自信を持って分析を進められるエンジニアを目指しましょう!