青の統計学-DS Playground-

CASE WHEN: 条件でラベルを作る

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


この章で学ぶこと

データ分析では、元データにない「見やすい分類」をSQL上で作りたい場面があります。 たとえば、注文金額から「高額注文」「通常注文」を分けたり、商品価格から価格帯を作ったりします。

このような条件付きのラベル作成に使うのが CASE WHEN です。

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

  • 条件に応じて表示値を切り替えられる
  • 数値を価格帯や注文ランクに変換できる
  • ステータスコードを読みやすいラベルに変換できる
  • 分析前の特徴量づくりの入口を理解できる

1. CASE WHENはSQLの条件分岐

CASE WHEN は、条件に応じて返す値を変える構文です。 基本形は次の通りです。

CASE
            WHEN 条件1 THEN 値1
            WHEN 条件2 THEN 値2
            ELSE それ以外の値
          END
          

たとえば、注文金額が10,000円以上なら「高額注文」、それ以外なら「通常注文」と表示します。

SELECT
            order_id,
            total_amount,
            CASE
              WHEN total_amount >= 10000 THEN '高額注文'
              ELSE '通常注文'
            END AS order_rank
          FROM orders;
          

CASE で始まり、END で終わります。 作った結果には AS order_rank のように別名をつけると読みやすくなります。


2. なぜラベルを作るのか

元データの数値をそのまま見るだけでは、全体像をつかみにくいことがあります。

たとえば total_amount を1件ずつ見ても、注文の傾向は見えにくいです。 しかし、次のように分類すると、分析しやすくなります。

total_amount order_rank
2500 少額注文
8200 通常注文
18000 高額注文

このような分類は、後の集計で役立ちます。 「高額注文は何件あるか」「価格帯ごとの購入率は違うか」といった分析につながります。


3. 複数条件で価格帯を作る

WHEN は複数書けます。 上から順に条件が評価され、最初に当てはまった結果が返ります。

SELECT
            order_id,
            total_amount,
            CASE
              WHEN total_amount >= 20000 THEN '20,000円以上'
              WHEN total_amount >= 10000 THEN '10,000円以上20,000円未満'
              WHEN total_amount >= 5000 THEN '5,000円以上10,000円未満'
              ELSE '5,000円未満'
            END AS amount_band
          FROM orders;
          

このSQLでは、20,000円以上の注文は最初の条件で分類されます。 そのため、次の条件には進みません。

CASE WHEN では、条件の順番が重要です。 大きい金額から判定するのか、小さい金額から判定するのかで、結果が変わることがあります。


4. ELSEを書いて想定外を受け止める

ELSE は、どの WHEN にも当てはまらなかった場合の値です。

SELECT
            order_id,
            status,
            CASE
              WHEN status = 'completed' THEN '完了'
              WHEN status = 'cancelled' THEN 'キャンセル'
              WHEN status = 'pending' THEN '保留'
              ELSE 'その他'
            END AS status_label
          FROM orders;
          

ELSE を書いておくと、想定外のステータスがあっても結果に表示できます。 もし ELSE を書かず、どの条件にも当てはまらない場合、結果はNULLになります。

分析用のSQLでは、想定外を見逃さないためにも ELSE 'その他'ELSE '要確認' を入れることがあります。


5. NULLを含む場合のCASE WHEN

NULLを判定するときは、第5章と同じく IS NULL を使います。

SELECT
            customer_id,
            customer_name,
            prefecture,
            CASE
              WHEN prefecture IS NULL THEN '都道府県未入力'
              ELSE '都道府県入力済み'
            END AS prefecture_status
          FROM customers;
          

prefecture = NULL とは書きません。 NULLの条件分岐でも、IS NULL / IS NOT NULL を使います。

商品価格が未設定の商品を別ラベルにする例です。

SELECT
            product_id,
            product_name,
            price,
            CASE
              WHEN price IS NULL THEN '価格未設定'
              WHEN price >= 10000 THEN '高価格帯'
              WHEN price >= 3000 THEN '中価格帯'
              ELSE '低価格帯'
            END AS price_band
          FROM products;
          

NULLを先に判定しておくと、価格帯の分類で欠損を見落としにくくなります。


6. CASE WHENは集計の準備になる

このStageでは集計の詳しい構文は扱いませんが、CASE WHEN は集計と組み合わせるとさらに強力です。

たとえば、注文に金額帯ラベルをつけておけば、次のStageで金額帯ごとの注文数や平均金額を集計できます。

SELECT
            order_id,
            customer_id,
            total_amount,
            CASE
              WHEN total_amount >= 10000 THEN '高額注文'
              ELSE '通常注文'
            END AS order_rank
          FROM orders;
          

このように、元データから分析しやすい分類を作る作業は、実務では「特徴量を作る」作業の入口でもあります。 機械学習に進む前のデータ準備でも、同じ考え方がよく使われます。


7. 実務でよく使うラベル作成例

顧客の地域ラベル

SELECT
            customer_id,
            customer_name,
            prefecture,
            CASE
              WHEN prefecture IN ('東京都', '神奈川県', '千葉県', '埼玉県') THEN '首都圏'
              WHEN prefecture IS NULL THEN '未入力'
              ELSE 'その他地域'
            END AS area_group
          FROM customers;
          

地域別分析の前処理として使えます。

商品の価格帯

SELECT
            product_id,
            product_name,
            price,
            CASE
              WHEN price >= 10000 THEN '高価格帯'
              WHEN price >= 3000 THEN '中価格帯'
              WHEN price IS NULL THEN '価格未設定'
              ELSE '低価格帯'
            END AS price_band
          FROM products;
          

この例では、条件順序に注意が必要です。 price IS NULL を先に書くほうが、欠損を明示的に扱っていることが伝わりやすくなります。

SELECT
            product_id,
            product_name,
            price,
            CASE
              WHEN price IS NULL THEN '価格未設定'
              WHEN price >= 10000 THEN '高価格帯'
              WHEN price >= 3000 THEN '中価格帯'
              ELSE '低価格帯'
            END AS price_band
          FROM products;
          

注文ステータスの読み替え

SELECT
            order_id,
            status,
            CASE
              WHEN status = 'completed' THEN '売上計上対象'
              WHEN status = 'cancelled' THEN '除外対象'
              ELSE '確認対象'
            END AS sales_scope
          FROM orders;
          

集計に含めるかどうかを確認するラベルとして使えます。


8. CASE WHENを書くときの注意点

条件の順番を確認する

次のSQLは、一見よさそうに見えますが問題があります。

CASE
            WHEN total_amount >= 5000 THEN '5,000円以上'
            WHEN total_amount >= 10000 THEN '10,000円以上'
            ELSE '5,000円未満'
          END
          

10,000円以上の注文も、最初の total_amount >= 5000 に当てはまってしまいます。 そのため、10,000円以上 には分類されません。

金額帯のような範囲分類では、条件の順番を慎重に決めましょう。

ラベルの意味を明確にする

高い, 低い, 良い, 悪い のようなラベルは、基準が曖昧になりがちです。 できれば、条件とラベルの対応がわかる名前にします。

  • 10,000円以上
  • 5,000円以上10,000円未満
  • 都道府県未入力
  • 売上計上対象

分析結果を共有する相手が、SQLを見なくても意味を理解できるラベルを目指しましょう。


実務での使いどころ: 分析用のラベルを作る

CASE WHEN は、データを分析しやすいカテゴリへ変換するときによく使います。 たとえば、注文金額を「低単価」「中単価」「高単価」に分けると、金額帯ごとの購買傾向を見やすくなります。

SELECT
            order_id,
            total_amount,
            CASE
              WHEN total_amount >= 10000 THEN 'high'
              WHEN total_amount >= 5000 THEN 'middle'
              ELSE 'low'
            END AS amount_segment
          FROM orders;
          

CASE WHENで作ったラベルは、後続のGROUP BYやダッシュボードで使われます。 そのため、ラベルの境界や意味をチームで説明できることが重要です。

ラベル設計で確認すること 理由
境界値 5,000円以上をどちらに含めるか迷わないため
ELSE 想定外の値を落とさないため
NULLの扱い 未設定値を誤分類しないため
ラベル名 ダッシュボード利用者が意味を理解できるため

ラベルは分析者の判断を含みます。 SQLに書いた条件を、自然言語でも説明できるようにしましょう。

ミニ演習

次のラベルをCASE WHENで作るとしたら、条件を考えてください。

  1. 注文金額を low, middle, high に分ける。
  2. 顧客の都道府県を 首都圏その他 に分ける。
  3. 注文ステータスを 完了, 未完了, 確認必要 に分ける。
  4. ELSEを書かない場合に起きるリスクを説明する。

まとめ

構文 意味
CASE WHEN 条件で返す値を変える WHEN amount >= 10000 THEN '高額'
ELSE どの条件にも当てはまらない場合 ELSE 'その他'
END CASE式の終了 END AS label
IS NULL NULLの判定 WHEN price IS NULL THEN '未設定'

この章のキーメッセージ: CASE WHEN は、元データを分析しやすいラベルに変換するための基本技術です。条件の順番とラベルの意味を明確にし、後の集計やレポートにつながる形で使いましょう。


この章の確認

  1. CASE WHEN の基本構文を説明してください。
  2. total_amount が10,000円以上なら「高額注文」、それ以外なら「通常注文」と表示するSQLを書いてください。
  3. 複数条件の CASE WHEN で、条件の順番が重要になる理由を説明してください。
  4. NULLを含む列で条件分岐するとき、どのような書き方を使いますか?

関連演習