青の統計学-DS Playground-

データ品質チェック: NULL、重複、外れ値を確認する

Stage 4 — 第5章 | データ分析基礎カリキュラム 推定学習時間:30〜40分 | 難易度:★★★☆☆


この章で学ぶこと

分析結果は、元データの品質に大きく左右されます。 NULLが多い、IDが重複している、ありえない金額が入っている、といった状態を見逃すと、集計結果の解釈を誤ることがあります。

この章では、SQLで行う基本的な データ品質チェック を学びます。

この章を終えると、こんなことができるようになります:

  • NULLの件数を確認できる
  • IDの重複を調べられる
  • 極端な値や不自然な値を見つけられる
  • 分析前に確認すべき品質観点を説明できる

1. データ品質チェックは分析の前処理

分析SQLを書く前に、まずデータが想定どおりかを確認します。 ECデータでは、次のようなチェックが考えられます。

テーブル 確認したいこと
customers customer_id が重複していないか
orders order_datetotal_amount がNULLでないか
order_items 数量や単価が0以下になっていないか
products 商品価格やカテゴリが欠けていないか

データ品質チェックは、分析結果を信頼するための準備です。


2. NULLを確認する

まず、重要な列にNULLがどれだけあるかを数えます。

SELECT
            COUNT(*) AS total_rows,
            COUNT(CASE WHEN order_date IS NULL THEN 1 END) AS null_order_date_count,
            COUNT(CASE WHEN total_amount IS NULL THEN 1 END) AS null_total_amount_count,
            COUNT(CASE WHEN customer_id IS NULL THEN 1 END) AS null_customer_id_count
          FROM orders;
          

NULLがあること自体が必ず問題とは限りません。 ただし、注文日や顧客IDのような分析の軸になる列にNULLが多い場合は、集計前に原因を確認します。


3. 重複を確認する

マスタ系のテーブルでは、IDが重複していないか確認します。

SELECT
            customer_id,
            COUNT(*) AS row_count
          FROM customers
          GROUP BY customer_id
          HAVING COUNT(*) > 1;
          

customers.customer_id は顧客を一意に表すIDのはずです。 同じIDが複数行ある場合、結合したときに注文が二重に増えて見えることがあります。

商品マスタでも同じように確認できます。

SELECT
            product_id,
            COUNT(*) AS row_count
          FROM products
          GROUP BY product_id
          HAVING COUNT(*) > 1;
          

4. 外れ値や不自然な値を確認する

数値列では、極端に大きい値や、ありえない値を確認します。

SELECT
            MIN(total_amount) AS min_amount,
            MAX(total_amount) AS max_amount,
            AVG(total_amount) AS avg_amount
          FROM orders
          WHERE status = 'completed';
          

最小値がマイナスなら、返品や補正データなのか、入力ミスなのかを確認します。 最大値が極端に大きい場合も、実際の大口注文なのか、桁間違いなのかを見ます。

明細では、数量と単価も確認します。

SELECT
            order_id,
            product_id,
            quantity,
            unit_price
          FROM order_items
          WHERE quantity <= 0
             OR unit_price < 0;
          

不自然な行を見つけたら、すぐに削除するのではなく、まず意味を確認します。


5. 結合前後の件数を確認する

実務では、結合によって行数が意図せず増えることがあります。 たとえば、注文と顧客を結合する前後の件数を確認します。

SELECT COUNT(*) AS order_rows
          FROM orders;
          
SELECT COUNT(*) AS joined_rows
          FROM orders AS o
          JOIN customers AS c
            ON o.customer_id = c.customer_id;
          

customers に重複IDがあると、結合後の行数が注文数より増える可能性があります。 集計がおかしいと感じたら、まず結合前後の件数を見ましょう。


実務での使いどころ: 分析前に信頼できるデータか確認する

データ品質チェックは、分析結果を守るための工程です。 SQLが正しくても、元データにNULL、重複、異常値、JOIN漏れがあると、結論がずれることがあります。

分析前には、最低限次のチェックをします。

チェック SQLで見るもの
件数 COUNT(*)
NULL COUNT(*) - COUNT(column)
重複 GROUP BY ... HAVING COUNT(*) > 1
外れ値 MIN, MAX, 上位/下位の確認
JOIN漏れ LEFT JOIN後のNULL

たとえば、商品マスタと注文明細をJOINしたときに商品名がNULLになる行があれば、マスタ未登録の商品があるかもしれません。 これは売上集計の前に確認すべき問題です。

データ品質チェックは、すべての問題を完璧に直す作業ではありません。 分析結果に影響するリスクを見つけ、前提として説明できる状態にする作業です。

ミニ演習

次の品質チェックSQLの目的を説明してください。

  1. 注文テーブルの総件数を数える。
  2. total_amount がNULLの注文数を数える。
  3. 同じ order_id が複数行あるか確認する。
  4. 商品マスタに存在しない product_id を注文明細から探す。

まとめ

チェック SQLでの考え方
NULL IS NULL で件数を数える
重複 GROUP BYHAVING COUNT(*) > 1
外れ値 MIN, MAX, 条件抽出で確認する
結合増殖 結合前後の行数を比べる

この章のキーメッセージ: データ品質チェックは、分析の信頼性を守るための基本です。NULL、重複、外れ値、結合後の行数を確認してから、分析結果を解釈しましょう。


この章の確認

  1. 分析前にデータ品質チェックを行う理由を説明してください。
  2. customers.customer_id の重複を確認するSQLを書いてください。
  3. 注文金額の外れ値を確認するには、どのようなSQLを書けますか?
  4. 結合後に行数が増える原因の例を説明してください。

関連演習