青の統計学-DS Playground-

LEFT JOIN: 未購入・欠損も含めて見る

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


この章で学ぶこと

INNER JOINは、両方のテーブルに一致する行だけを残すJOINでした。 一方で分析では、「購入した人だけ」ではなく「購入していない人」も含めて見たいことがあります。

そのようなときに使うのが LEFT JOIN です。 LEFT JOINは、左側のテーブルの行をすべて残し、右側に一致する行があれば情報を付け足します。

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

  • LEFT JOINの基本形を書ける
  • 未購入顧客を含めた分析ができる理由を説明できる
  • JOIN後にNULLが出る理由を理解できる
  • WHERE の書き方でLEFT JOINの意味が変わることに注意できる

1. LEFT JOINは「左の表を残す」

LEFT JOINでは、FROM に書いた左側のテーブルを基準にします。 右側のテーブルに一致する行があればつなぎ、一致しなければ右側の列はNULLになります。

たとえば、顧客を基準に注文をつなぐとします。

SELECT
            c.customer_id,
            c.customer_name,
            o.order_id,
            o.order_date,
            o.total_amount
          FROM customers AS c
          LEFT JOIN orders AS o
            ON c.customer_id = o.customer_id;
          

このSQLでは、注文がない顧客も結果に残ります。 その場合、o.order_ido.total_amount はNULLになります。


2. 未購入顧客を見つける

LEFT JOINがよく使われる場面の1つが、未購入顧客の抽出です。

SELECT
            c.customer_id,
            c.customer_name,
            c.prefecture
          FROM customers AS c
          LEFT JOIN orders AS o
            ON c.customer_id = o.customer_id
          WHERE o.order_id IS NULL;
          

このSQLは、注文が1件もない顧客を取り出します。

考え方は次の通りです。

手順 内容
1 customers を全員残す
2 一致する注文があれば orders をつなぐ
3 注文がない顧客は o.order_id がNULLになる
4 WHERE o.order_id IS NULL で未購入だけに絞る

未購入者の分析は、施策を考えるうえで重要です。 購入者だけを見ていると、離脱や未反応の理由を見落とすことがあります。


3. 欠損や未対応のデータを確認する

LEFT JOINは、データの欠損確認にも使えます。 たとえば注文明細に入っている product_id が、商品マスタに存在するか確認したい場合です。

SELECT
            oi.order_id,
            oi.product_id,
            p.product_name
          FROM order_items AS oi
          LEFT JOIN products AS p
            ON oi.product_id = p.product_id
          WHERE p.product_id IS NULL;
          

このSQLは、注文明細には存在するのに、商品テーブルに見つからない商品IDを探します。

このような確認は、分析結果を出す前のデータ品質チェックとして重要です。 商品名やカテゴリが欠けたまま集計すると、分類できない売上が発生するためです。


4. WHEREの位置に注意する

LEFT JOINでは、右側のテーブルに対する条件の書き方に注意が必要です。 次のSQLを考えます。

SELECT
            c.customer_id,
            c.customer_name,
            o.order_id,
            o.status
          FROM customers AS c
          LEFT JOIN orders AS o
            ON c.customer_id = o.customer_id
          WHERE o.status = 'completed';
          

このSQLでは、注文がない顧客は結果から消えます。 なぜなら、注文がない顧客の o.status はNULLであり、o.status = 'completed' を満たさないからです。

未購入顧客も残したい場合は、条件を ON 側に入れる方法があります。

SELECT
            c.customer_id,
            c.customer_name,
            o.order_id,
            o.status
          FROM customers AS c
          LEFT JOIN orders AS o
            ON c.customer_id = o.customer_id
           AND o.status = 'completed';
          

このSQLでは、完了注文だけをつなぎますが、完了注文がない顧客も残ります。


5. INNER JOINとの使い分け

INNER JOINとLEFT JOINは、分析対象をどう定義するかで使い分けます。

目的 向いているJOIN
注文した顧客だけを見たい INNER JOIN
全顧客を基準に購入有無を見たい LEFT JOIN
未購入顧客を探したい LEFT JOIN
マスタに存在しないIDを探したい LEFT JOIN

「購入者の平均注文金額」を見たいならINNER JOINで十分なことがあります。 しかし「登録者のうち何人が購入したか」を見たいなら、未購入者も含める必要があります。

分析では、結果に含めたい母集団を先に決めることが大切です。


実務での使いどころ: まだ行動していない人も残す

LEFT JOINは、左側のテーブルを基準にして、右側に対応するデータがなくても行を残します。 実務では「未購入顧客」「未ログインユーザー」「まだ回答していない人」を見たいときに重要です。

SELECT
            c.customer_id,
            c.customer_name,
            COUNT(o.order_id) AS order_count
          FROM customers AS c
          LEFT JOIN orders AS o
            ON c.customer_id = o.customer_id
          GROUP BY
            c.customer_id,
            c.customer_name;
          

このSQLでは、注文がない顧客も order_count = 0 として残せます。 INNER JOINにすると、注文がない顧客は消えてしまいます。

分析したいこと LEFT JOINが役立つ理由
未購入顧客を探す 注文がない顧客も残る
施策未反応ユーザーを見る 行動ログがない人も残る
欠損マスタを探す 対応先がない行を検出できる
CVRを計算する 分母側を残せる

LEFT JOINでは、WHERE句の書き方にも注意が必要です。 右側テーブルの条件をWHEREに置くと、結果的にINNER JOINのようになることがあります。

ミニ演習

次の分析で、LEFT JOINを使う理由を説明してください。

  1. 登録顧客のうち購入していない人を探す。
  2. 全商品について販売数を確認する。
  3. 登録者全体を分母にした購入率を作る。
  4. 右側テーブルの条件をWHEREに書くと危険な場合を説明する。

まとめ

構文 意味
LEFT JOIN 左側のテーブルをすべて残してつなぐ customers LEFT JOIN orders
右側に一致なし 右側の列はNULLになる o.order_id IS NULL
未購入抽出 LEFT JOIN後にNULLを探す WHERE o.order_id IS NULL
条件の位置 WHEREON で結果が変わることがある AND o.status = 'completed'

この章のキーメッセージ: LEFT JOINは、購入者だけでなく未購入者や欠損も含めて分析するための重要な道具です。どのテーブルを基準にするかを意識して使いましょう。


この章の確認

  1. LEFT JOINで右側に一致する行がない場合、右側の列はどう表示されますか?
  2. 未購入顧客を抽出するSQLでは、なぜ o.order_id IS NULL を使うのですか?
  3. WHERE o.status = 'completed' を書くと、未購入顧客が消える理由を説明してください。
  4. INNER JOINとLEFT JOINを使い分ける基準を説明してください。

関連演習