データクレンジングとは

データクレンジングとは、分析や機械学習に利用できない「汚れたデータ」を特定し、修正・除去・補完する工程です。ETLの「変換(Transform)」フェーズの核心部分であり、重複排除・名寄せ・欠損値処理・外れ値対処・型変換・フォーマット統一を含みます。

データサイエンティストが業務時間の60〜80%をデータ準備に費やすという調査結果が示すように、クレンジングは地味ながら最も工数がかかる工程です。しかし、クレンジングを自動化・パターン化することで、この負荷を大幅に削減できます。本記事ではMDM(A-11)品質管理(D-03)と連携した実践的なクレンジング手法をSQLコード例とともに解説します。

重複排除の手法

重複データはCRM・ERP・ECシステムなどで日常的に発生します。同一顧客が異なるメールアドレスで複数登録されているケース、バッチ処理の重複実行でデータが二重挿入されるケース、複数ソースのデータを結合した際に生じるケースなど、原因は様々です。

ROW_NUMBER()による重複排除(最新レコードを残す)

-- ROW_NUMBER()で重複排除: customer_idが重複する場合、updated_at最新を残す
WITH ranked AS (
    SELECT
        *,
        ROW_NUMBER() OVER (
            PARTITION BY customer_id
            ORDER BY updated_at DESC
        ) AS rn
    FROM raw_customers
)
SELECT * EXCEPT(rn) FROM ranked WHERE rn = 1;

このパターンは最も汎用性が高く、PostgreSQL・BigQuery・Snowflake・Redshiftすべてで動作します。PARTITION BYに重複判定キーを、ORDER BYに優先基準(最新日時・主キーの大小等)を指定します。

QUALIFY句による重複排除(BigQuery/Snowflake)

-- QUALIFY句: サブクエリなしで記述が短縮できる
SELECT *
FROM raw_customers
QUALIFY ROW_NUMBER() OVER (
    PARTITION BY customer_id ORDER BY updated_at DESC
) = 1;

QUALIFY句はBigQueryとSnowflakeで利用可能で、CTEを使わずに1クエリで重複排除が完結します。可読性が高くdbtのモデルに直接記述することが多い構文です。

名寄せの手法

名寄せ(Entity Resolution)は、異なるシステムや表記ゆれで記録された「同一エンティティ」を特定・統合する処理です。「株式会社ABC」と「(株)ABC」と「ABC株式会社」が同一企業であると判定するのが典型例です。MDM(マスターデータ管理)の実装にも密接に関連します。

段階的名寄せSQL例(完全一致→あいまい一致)

-- 段階的名寄せ: メール完全一致 → 電話 → SOUNDEX社名あいまい一致
SELECT
    a.id           AS master_id,
    b.id           AS duplicate_id,
    a.email,
    SOUNDEX(a.company_name) AS soundex_a,
    SOUNDEX(b.company_name) AS soundex_b,
    CASE
        WHEN a.email = b.email THEN 'email_match'
        WHEN a.phone = b.phone THEN 'phone_match'
        ELSE 'fuzzy_name_match'
    END AS match_type
FROM customers a
JOIN customers b ON a.id < b.id
WHERE a.email = b.email
   OR a.phone = b.phone
   OR (a.postal_code = b.postal_code AND SOUNDEX(a.company_name) = SOUNDEX(b.company_name));

名寄せ手法比較

手法仕組み精度速度適するケース
完全一致メール・ID等の完全一致高速多くの重複はこれで解決
SOUNDEX/あいまい一致発音・編集距離ベース氏名・社名の表記ゆれ
ルールベース組み合わせ複数フィールドの条件組み合わせ中〜高ドメイン知識がある場合
機械学習(Record Linkage)特徴量を学習しスコア化低〜中大規模・複雑な名寄せ

実務では「完全一致→あいまい一致→機械学習」の3段階で精度を上げるアプローチが効果的です。まずメールアドレス・電話番号などの一意キーで完全一致から始め、残った未名寄せレコードにあいまい一致を適用します。それでも残るケースに機械学習や人手確認を適用する段階的アプローチが実践的です。

欠損値処理の手法

欠損パターン処理方法適するケース
ビジネス上NULLが許容NULLのまま保持未設定項目、オプション項目
デフォルト値が存在するCOALESCE(col, default)割引率0、地域「Unknown」等
前回値で補完したいLAST_VALUE IGNORE NULLS時系列データの欠損補完
データ収集失敗による欠損レコードを除外必須フィールドが欠損
外れ値扱いで発生した欠損中央値・平均値で補完数値データの異常欠損

COALESCEを使った欠損値デフォルト補完

-- COALESCE: 複数候補から最初のNULLでない値を使う
SELECT
    customer_id,
    COALESCE(mobile_phone, office_phone, '')  AS contact_phone,
    COALESCE(region, country, 'Unknown')      AS region,
    COALESCE(discount_rate, 0.0)              AS discount_rate
FROM raw_customers;

NULLの扱いはビジネスルールに基づいて判断します。「NULLのままにしておく」「デフォルト値で埋める」「前回値で補完する(フォワードフィル)」のどれが適切かは、データの意味と利用目的によって異なります。画一的な処理は避け、カラムごとに処理方針を文書化することを推奨します。

外れ値・異常値の検出と対処

外れ値は統計的に極端な値を持つレコードで、データ入力ミス・センサー誤作動・詐欺データなど様々な原因で発生します。ビジネス上の意味のある外れ値(高額購入顧客等)を誤って除外しないよう、機械的な除外ではなく検出と確認が基本方針です。

主な検出手法として、IQR法(Q1 − 1.5×IQR〜Q3 + 1.5×IQR の範囲外を外れ値とする)、Z-score法(平均から標準偏差3倍以上の乖離)、ドメインルールベース(「注文金額が0以下」「年齢が150以上」等の論理的なあり得ない値)があります。

対処方針は「除外・キャップ処理(上下限クリッピング)・NaN化してから補完・フラグを立てて分析に活用」の4つです。機械学習用途ではキャップ処理が、BIレポート用途ではフラグ付きで保持が一般的です。

クレンジングの自動化パイプライン設計

ソースデータ(raw層)
    │
    ▼ Step 1: 重複排除
    │  ROW_NUMBER() / QUALIFYで最新レコードを特定
    │
    ▼ Step 2: 名寄せ
    │  完全一致 → SOUNDEX → ルールベース → ML
    │
    ▼ Step 3: 欠損値処理
    │  COALESCEでデフォルト補完 / フォワードフィル
    │
    ▼ Step 4: 外れ値検出・対処
    │  IQR / Z-score / ドメインルール
    │
    ▼ Step 5: 型変換・フォーマット統一
    │  DATE型統一 / 電話番号正規化 / 住所表記統一
    │
クレンジング済みデータ(staging / cleaned層)
    │
    ▼ dbt test で品質確認
    │
marts層 → BI・分析

このフローはdbtのstagingモデルとして実装するのが推奨です。各ステップをSQL変換として記述し、dbt tests(D-04)でアウトプットの品質を自動確認します。クレンジングロジックはバージョン管理されたSQLとして保存するため、ロジックの変更追跡と再現性が確保されます。

まとめ

データクレンジングは地道ですが、データ活用の品質を左右する最重要工程です。SQL中心の自動化で工数を大幅に削減できます。

  • 重複排除はROW_NUMBER()かQUALIFY句で「最新1件を残す」パターンが基本
  • 名寄せは完全一致→あいまい一致→機械学習の3段階で精度を上げる
  • 欠損値処理はビジネスルールに基づき、カラムごとに方針を定める
  • 外れ値は機械的に除外せず、検出→確認→方針決定のフローを踏む
  • dbt stagingモデルとして実装し、テスト自動化で品質を担保する

よくある質問(FAQ)

Q. データクレンジングとETLの違いは?

A. ETLはデータの抽出・変換・格納の全体プロセスで、クレンジングはETLの「変換(Transform)」工程の一部です。具体的には重複排除・名寄せ・欠損値処理・型変換を含みます。クレンジングはパイプラインの変換ステップとして自動化します。

Q. 名寄せの精度を上げるにはどうすればよいですか?

A. 完全一致→あいまい一致→機械学習の3段階で精度を上げるアプローチが効果的です。まずメールアドレスなどの一意キーで完全一致から始め、残った未名寄せレコードにSOUNDEXやLevenshtein距離を適用します。大規模な名寄せにはpython-record-linkageやSpark MLが活用できます。

Q. 欠損値はどう処理すべきですか?

A. ビジネスルールに基づいて判断します。NULLのまま保持・デフォルト値で埋める・前回値で補完(フォワードフィル)など、データの意味に応じて使い分けます。「一律0で埋める」などの機械的な処理は分析結果を歪める可能性があるため、カラムごとに方針を決めて文書化することが重要です。