データ品質チェック: NULL、重複、外れ値を確認する
Stage 4 — 第5章 | データ分析基礎カリキュラム 推定学習時間:30〜40分 | 難易度:★★★☆☆
この章で学ぶこと
分析結果は、元データの品質に大きく左右されます。 NULLが多い、IDが重複している、ありえない金額が入っている、といった状態を見逃すと、集計結果の解釈を誤ることがあります。
この章では、SQLで行う基本的な データ品質チェック を学びます。
この章を終えると、こんなことができるようになります:
- NULLの件数を確認できる
- IDの重複を調べられる
- 極端な値や不自然な値を見つけられる
- 分析前に確認すべき品質観点を説明できる
1. データ品質チェックは分析の前処理
分析SQLを書く前に、まずデータが想定どおりかを確認します。 ECデータでは、次のようなチェックが考えられます。
| テーブル | 確認したいこと |
|---|---|
customers |
customer_id が重複していないか |
orders |
order_date や total_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の目的を説明してください。
- 注文テーブルの総件数を数える。
total_amountがNULLの注文数を数える。- 同じ
order_idが複数行あるか確認する。 - 商品マスタに存在しない
product_idを注文明細から探す。
まとめ
| チェック | SQLでの考え方 |
|---|---|
| NULL | IS NULL で件数を数える |
| 重複 | GROUP BY と HAVING COUNT(*) > 1 |
| 外れ値 | MIN, MAX, 条件抽出で確認する |
| 結合増殖 | 結合前後の行数を比べる |
この章のキーメッセージ: データ品質チェックは、分析の信頼性を守るための基本です。NULL、重複、外れ値、結合後の行数を確認してから、分析結果を解釈しましょう。
この章の確認
- 分析前にデータ品質チェックを行う理由を説明してください。
customers.customer_idの重複を確認するSQLを書いてください。- 注文金額の外れ値を確認するには、どのようなSQLを書けますか?
- 結合後に行数が増える原因の例を説明してください。