期間比較: 前月比・前年差を見る
Stage 4 — 第4章 | データ分析基礎カリキュラム 推定学習時間:30〜40分 | 難易度:★★★☆☆
この章で学ぶこと
売上や注文件数は、単月の数字だけを見ても良いのか悪いのか判断しにくいことがあります。 前月より増えたのか、前年同月より伸びているのかを見ることで、変化を読み取れるようになります。
この章では、SQLで 期間比較 を行う考え方を学びます。
この章を終えると、こんなことができるようになります:
- 月別売上を集計できる
- 前月比を計算する考え方を理解できる
- 前年同月比較の見方を説明できる
- 期間比較で注意すべき前提を確認できる
1. まず月別に集計する
期間比較の出発点は、日付を月単位にそろえることです。
ここでは order_month という月の列を作る例として書きます。
SELECT
DATE_TRUNC('month', order_date) AS order_month,
COUNT(*) AS order_count,
SUM(total_amount) AS sales
FROM orders
WHERE status = 'completed'
GROUP BY DATE_TRUNC('month', order_date)
ORDER BY order_month;
DATE_TRUNC の書き方はデータベースによって少し異なります。
重要なのは、「注文日を月単位に丸めてから集計する」という考え方です。
2. 前月比を計算する
月別売上を作ったら、前月の売上を横に並べます。
ここではウィンドウ関数の LAG を使います。
WITH monthly_sales AS (
SELECT
DATE_TRUNC('month', order_date) AS order_month,
SUM(total_amount) AS sales
FROM orders
WHERE status = 'completed'
GROUP BY DATE_TRUNC('month', order_date)
)
SELECT
order_month,
sales,
LAG(sales) OVER (ORDER BY order_month) AS previous_month_sales,
sales - LAG(sales) OVER (ORDER BY order_month) AS sales_diff
FROM monthly_sales
ORDER BY order_month;
LAG(sales) は、1つ前の月の売上を取り出します。
差分を見ることで、増減額を確認できます。
3. 前月比率を見る
増減額だけでなく、何%増えたのかを見たい場合があります。
WITH monthly_sales AS (
SELECT
DATE_TRUNC('month', order_date) AS order_month,
SUM(total_amount) AS sales
FROM orders
WHERE status = 'completed'
GROUP BY DATE_TRUNC('month', order_date)
),
with_previous AS (
SELECT
order_month,
sales,
LAG(sales) OVER (ORDER BY order_month) AS previous_month_sales
FROM monthly_sales
)
SELECT
order_month,
sales,
previous_month_sales,
sales * 1.0 / previous_month_sales - 1 AS month_over_month_rate
FROM with_previous
WHERE previous_month_sales IS NOT NULL;
前月売上がNULLの最初の月は、前月比を計算できません。 また、前月売上が0の場合は割り算できないため、実務では0除算にも注意します。
4. 前年同月と比べる
前年同月比較では、12か月前の値と比べます。
月別データが毎月そろっている場合、LAG(sales, 12) のように考えられます。
WITH monthly_sales AS (
SELECT
DATE_TRUNC('month', order_date) AS order_month,
SUM(total_amount) AS sales
FROM orders
WHERE status = 'completed'
GROUP BY DATE_TRUNC('month', order_date)
)
SELECT
order_month,
sales,
LAG(sales, 12) OVER (ORDER BY order_month) AS previous_year_sales,
sales * 1.0 / LAG(sales, 12) OVER (ORDER BY order_month) - 1 AS year_over_year_rate
FROM monthly_sales
ORDER BY order_month;
前年同月比較は、季節性があるビジネスで役立ちます。 たとえば年末商戦や新生活シーズンの影響がある場合、前月より前年同月と比べるほうが自然なことがあります。
5. 期間比較の注意点
期間比較では、数字の増減だけで判断しないようにします。
| 注意点 | 例 |
|---|---|
| 期間の長さ | 2月は日数が少ない |
| 季節性 | 12月だけ売上が伸びやすい |
| キャンペーン | セール期間の有無で変わる |
| データ欠損 | 一部の日付の注文が取り込まれていない |
SQLで前月比を出すことはできますが、その変化の理由は別途確認が必要です。 数値を見た後に、商品カテゴリ、顧客層、キャンペーンなどへ分解していきます。
実務での使いどころ: 比較条件をそろえる
前月比や前年比は、変化を説明するためによく使います。 ただし、比較する期間や条件がそろっていないと、変化の理由を誤解することがあります。
| 比較 | 注意点 |
|---|---|
| 前月比 | 月の日数、キャンペーン有無、休日数 |
| 前年同月比 | 季節性、曜日構成、商品構成の変化 |
| 施策前後比較 | 施策以外の外部要因 |
| 週次比較 | 祝日や曜日の偏り |
たとえば、5月の売上が4月より高くても、5月の方が日数が多いだけかもしれません。 必要に応じて、1日あたり売上や営業日あたり売上も確認します。
SELECT
DATE_TRUNC('month', order_date) AS order_month,
SUM(total_amount) AS sales,
COUNT(*) AS order_count
FROM orders
WHERE status = 'completed'
GROUP BY DATE_TRUNC('month', order_date)
ORDER BY order_month;
期間比較では、差分だけでなく、件数や対象条件も一緒に見ましょう。
ミニ演習
次の比較で注意すべき条件を考えてください。
- 今月売上と前月売上を比較する。
- 今年5月と前年5月を比較する。
- キャンペーン前後の購入率を比較する。
- 前月比が上がっていても安心できないケースを説明する。
まとめ
| 分析 | SQLでの考え方 |
|---|---|
| 月別売上 | 注文日を月単位にして集計する |
| 前月比 | LAG で1つ前の月を参照する |
| 前年同月比 | 12か月前の値と比較する |
| 注意点 | 期間、季節性、欠損を確認する |
この章のキーメッセージ: 期間比較は、売上や注文数の変化を読むための基本です。SQLで前月や前年の値を並べ、増減の理由を考える入口にしましょう。
この章の確認
- 月別売上を作るとき、なぜ注文日を月単位にそろえる必要がありますか?
- 前月売上を取り出すには、どのウィンドウ関数を使いますか?
- 前年同月比較が前月比より適している場面を説明してください。
- 期間比較で確認すべき注意点を2つ挙げてください。