日付集計: 日次・月次・曜日別に見る
Stage 2 — 第4章 | データ分析基礎カリキュラム 推定学習時間:35〜45分 | 難易度:★★★☆☆
この章で学ぶこと
ECデータの分析では、時間の変化を見ることがとても重要です。 売上が伸びているのか、週末に注文が増えるのか、月ごとの季節性があるのかは、1件ずつ注文を見るだけではわかりません。
この章では、注文日を使って日次・月次・曜日別に集計する考え方を学びます。
この章を終えると、こんなことができるようになります:
- 日付ごとの売上や注文件数を集計できる
- 月次集計で大きな傾向を確認できる
- 曜日別集計で行動パターンを見られる
- 日付集計で注意すべき粒度と期間条件を説明できる
1. 日付集計は「いつ」を分析する入口
注文データには、多くの場合 order_date のような日付列があります。
この列を使うと、売上や注文数を時間軸で見ることができます。
たとえば、次のような問いに答えられます。
- 日別の売上は安定しているか
- 月ごとの売上は伸びているか
- 注文が多い曜日はあるか
- キャンペーン後に注文数は増えたか
日付集計では、まず「どの日付列を使うのか」を確認します。 注文日、決済日、発送日では、同じ売上でも見え方が変わることがあります。
2. 日次で集計する
日別の注文件数と売上を出す基本形です。
SELECT
order_date,
COUNT(*) AS order_count,
SUM(total_amount) AS sales
FROM orders
WHERE status = 'completed'
GROUP BY order_date
ORDER BY order_date;
このSQLは、完了注文を注文日ごとにまとめます。 結果の1行は「1日」を表します。
日次集計は、直近の変化やキャンペーンの影響を見るときに便利です。 ただし、日ごとの変動は大きくなりやすいため、1日だけで判断しすぎないようにします。
3. 月次で集計する
月ごとの傾向を見るには、日付から年月を取り出して集計します。
データベースによって関数名は異なりますが、ここでは DATE_TRUNC を使う例で考えます。
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;
このSQLは、注文日を月単位に丸めて、月ごとの注文件数と売上を出します。
月次集計は、日次よりも変動がならされるため、中長期の傾向を見やすくなります。 売上が伸びているか、繁忙期があるか、施策後に変化が続いているかを確認できます。
4. 関数の書き方はデータベースによって違う
日付から月や曜日を取り出す関数は、SQLの種類によって書き方が違います。
| 目的 | 例 |
|---|---|
| 月単位に丸める | DATE_TRUNC('month', order_date) |
| 年月文字列にする | TO_CHAR(order_date, 'YYYY-MM') |
| 曜日を取り出す | EXTRACT(DOW FROM order_date) |
学習では、まず「日付を月や曜日に変換してから GROUP BY する」と理解しましょう。
実務では、使っているデータベースの関数に合わせて書き換えます。
5. 曜日別に集計する
曜日別の注文傾向を見る例です。
SELECT
EXTRACT(DOW FROM order_date) AS day_of_week,
COUNT(*) AS order_count,
SUM(total_amount) AS sales,
AVG(total_amount) AS average_order_amount
FROM orders
WHERE status = 'completed'
GROUP BY EXTRACT(DOW FROM order_date)
ORDER BY day_of_week;
曜日別集計では、週末に注文が多いのか、平日の昼に強いのかといった行動パターンを見られます。 広告配信やメール配信のタイミングを考える材料にもなります。
ただし、曜日番号が何曜日を表すかはデータベースによって異なることがあります。 結果を読む前に、0が日曜なのか月曜なのかを確認しましょう。
6. 日付集計と期間条件を組み合わせる
日付集計では、対象期間を明確にすることが重要です。 たとえば、2026年1月から3月までの月次売上を見るSQLです。
SELECT
DATE_TRUNC('month', order_date) AS order_month,
COUNT(*) AS order_count,
SUM(total_amount) AS sales
FROM orders
WHERE status = 'completed'
AND order_date >= '2026-01-01'
AND order_date < '2026-04-01'
GROUP BY DATE_TRUNC('month', order_date)
ORDER BY order_month;
日付時刻型で時刻まで入っている場合、BETWEEN '2026-01-01' AND '2026-03-31' では3月31日の夜のデータを取りこぼすことがあります。
そのため、実務では「開始日以上、翌期間の開始日未満」と書くことがよくあります。
7. ゼロの日をどう扱うか
日次集計では、注文が1件もない日は結果に出ないことがあります。
SELECT
order_date,
COUNT(*) AS order_count
FROM orders
WHERE status = 'completed'
GROUP BY order_date
ORDER BY order_date;
このSQLは、orders に存在する日付だけを返します。
注文がゼロの日も表に出したい場合は、日付カレンダーと全組み合わせの土台 を先に作ります。
ここで使うのが CROSS JOIN です。
3行"] --> C["CROSS JOIN"] B["calendar_dates
7日分"] --> C C --> D["customer_date_grid
3 × 7 = 21行"]
CROSS JOINは「危険なJOIN」ではなく、実務ではかなり使えます。
全顧客 × 全日付のグリッドを作り、実績データを LEFT JOIN で足すと、0件の日も0として扱える 分析土台ができます。
WITH customer_date AS (
SELECT
c.customer_id,
d.date
FROM customers AS c
CROSS JOIN calendar_dates AS d
),
daily_orders AS (
SELECT
customer_id,
order_date AS date,
COUNT(*) AS order_count
FROM orders
WHERE status = 'completed'
GROUP BY customer_id, order_date
)
SELECT
cd.customer_id,
cd.date,
COALESCE(do.order_count, 0) AS order_count
FROM customer_date AS cd
LEFT JOIN daily_orders AS do
ON cd.customer_id = do.customer_id
AND cd.date = do.date;
この形は、次のような分析にそのままつながります。
- ログインしていない日も0として扱う
- 継続率を日次で見る
- 学習履歴がない日を欠損ではなく0にする
- コホート分析の土台を作る
日付集計では「データがない日」と「ゼロだった日」の違いを意識しましょう。 グラフや継続率の計算では、この違いが結果を大きく変えます。
8. 日次・月次・曜日別の使い分け
| 集計単位 | 向いている分析 | 注意点 |
|---|---|---|
| 日次 | 直近変化、キャンペーン影響、異常検知 | 変動が大きい |
| 月次 | 中長期トレンド、売上成長、季節性 | 細かい変化は見えにくい |
| 曜日別 | 行動パターン、配信タイミング検討 | 祝日やセール日の影響を受ける |
同じ売上データでも、集計単位を変えると見えるものが変わります。 分析目的に合わせて、日次・週次・月次・曜日別を使い分けましょう。
実務での使いどころ: 時間軸で変化を見る
日付集計は、売上や利用状況の変化を見るための基本です。 同じ売上100万円でも、毎日安定して売れているのか、特定の日だけ大きく売れたのかで判断は変わります。
SELECT
DATE_TRUNC('day', order_date) AS order_day,
COUNT(*) AS order_count,
SUM(total_amount) AS sales
FROM orders
WHERE status = 'completed'
GROUP BY DATE_TRUNC('day', order_date)
ORDER BY order_day;
日次、週次、月次はそれぞれ向いている用途が違います。
| 集計単位 | 向いている用途 |
|---|---|
| 日次 | キャンペーン直後、障害、曜日差を見る |
| 週次 | 日々のばらつきを少しならして見る |
| 月次 | 事業全体のトレンドを見る |
| 曜日別 | 曜日による行動差を見る |
期間比較では、対象期間の長さもそろえます。 31日ある月と28日ある月を単純比較すると、日数差の影響を受けることがあります。
ミニ演習
次の目的に合う日付集計を考えてください。
- キャンペーン開始後3日間の注文数を見たい。
- 半年間の売上トレンドを見たい。
- 曜日によって注文数が違うか見たい。
- 月次売上を比較するとき、日数差に注意すべき理由を説明する。
まとめ
| 構文・考え方 | 意味 | 例 |
|---|---|---|
| 日次集計 | 日付ごとに集計する | GROUP BY order_date |
| 月次集計 | 月ごとに集計する | DATE_TRUNC('month', order_date) |
| 曜日別集計 | 曜日ごとに集計する | EXTRACT(DOW FROM order_date) |
| 期間条件 | 集計対象期間を決める | order_date >= ... AND order_date < ... |
この章のキーメッセージ: 日付集計は、データを時間軸で見るための基本です。どの日付列を使うか、どの粒度で見るか、どの期間を対象にするかを明確にしましょう。
この章の確認
- 日次集計と月次集計では、それぞれ何を見るのに向いていますか?
- 完了注文の日別売上を出すSQLを書いてください。
- 月次集計で
DATE_TRUNC('month', order_date)のような処理を使う理由を説明してください。 - 注文がゼロの日が結果に出ない場合、どのような点に注意が必要ですか?