コンテンツにスキップ

第4回 DAGとウィンドウ関数

本日の到達目標

  • DAG(有向非巡回グラフ)の概念を理解し、分析パイプラインを依存関係として表現できる
  • バッチ処理とストリーム処理の違いを説明できる
  • ウィンドウ関数の種類を整理し、時間窓特徴量(移動平均・直近値・頻度等)を設計できる

1. DAG とは何か

1.1 グラフの基礎用語

  • グラフ:ノード(頂点)とエッジ(辺)からなる構造
  • 有向グラフ(Directed Graph):エッジに向きがある
  • 非巡回(Acyclic):ループが存在しない → DAG = 有向非巡回グラフ

1.2 DAGが「循環しない」意味

OK(DAG):          NG(循環あり):
A → B → C → D       A → B → C
        ↑                ↑   |
        E                └───┘  ← 循環

循環がないため、処理の実行順序が一意に決まる(トポロジカルソート)

1.3 なぜ分析パイプラインにDAGを使うか

データ分析の処理は互いに依存関係を持つ:

生データ(CSV)
   ↓
欠測処理(imputation)
   ↓               ↘
標準化             カテゴリ変数のエンコーディング
   ↘               ↙
     特徴行列 X の結合
          ↓
     モデル学習
          ↓
     検証・評価

→ この依存関係をDAGとして表現することで: 1. 処理の自動実行順序が決まる 2. 変更があったノードから下流だけを再実行できる(差分更新) 3. パイプラインが文書化・再現可能になる


2. バッチ処理とストリーム処理

2.1 バッチ処理(Batch Processing)

定義:データを一定量または一定期間ごとにまとめて処理する

時刻: ────────────────────────────────→
      収集      収集      収集
      ↓日次     ↓日次     ↓日次
    [処理]    [処理]    [処理]

特性 - 処理は周期的(毎日0時、毎時等) - 大量データをまとめて扱える - レイテンシは許容(数分〜数時間) - 例:日次売上集計、月次レポート、モデルの週次再学習

代表フレームワーク:Apache Spark, Apache Hadoop MapReduce

2.2 ストリーム処理(Stream Processing)

定義:データが生成された直後にリアルタイムで処理する

時刻: ────────────────────────────────→
      →→→→→→→→→→→→→→→→→→ データが流れ続ける
      ↓  ↓  ↓  ↓  ↓  ↓  ↓  ↓  逐次処理

特性 - データは到着次第処理される - 低レイテンシが要件(ミリ秒〜秒単位) - 一度に処理するデータ量が少ない - 例:不正検知、リアルタイム推薦、センサー異常検知

代表フレームワーク:Apache Kafka, Apache Flink, Spark Structured Streaming

2.3 ラムダアーキテクチャ(参考)

バッチとストリームを組み合わせる設計パターン:

データ入力
  ├→ バッチレイヤー(正確・低速): 全履歴データで再計算
  └→ スピードレイヤー(近似・高速): 最新データをリアルタイム処理
          ↓               ↓
         サービングレイヤー(結果をマージして提供)

3. ウィンドウ関数

3.1 ウィンドウ(窓)の概念

ウィンドウ:各観測点に対して「参照する過去データの範囲」を定義する枠

時刻: t-4 t-3 t-2 t-1  t0  t+1 t+2
              ┌─────────┐
              │ window  │  ← t0 の時点で使える過去3時点のデータ
              └─────────┘

3.2 ウィンドウの種類

① タンブリングウィンドウ(Tumbling Window)

重なりなし、固定幅で区切る

|--W1--|--W2--|--W3--|--W4--|
例:毎日0時〜23:59の日次集計

② スライディングウィンドウ(Sliding Window)

重なりあり、スライドして移動する

|--W1--|
   |--W2--|
      |--W3--|
         |--W4--|
例:過去7日間の移動平均(毎日更新)

③ セッションウィンドウ(Session Window)

一定のギャップ(無活動期間)で区切る

|act--ガップ以内--act| ギャップ超え |act--act|
└────── Session 1 ──┘             └─Session2─┘
例:ユーザーのセッション中の行動集計


4. 時間窓特徴量の設計

4.1 後半の多変量解析で使う特徴量の例

シラバスで言及される「時間窓特徴量」とは、時系列データに対してウィンドウ集計を適用した説明変数のこと。

特徴量の種類 計算方法 SQL的な表現
移動平均 過去N日間の平均 AVG(y) OVER (ORDER BY date ROWS BETWEEN 6 PRECEDING AND CURRENT ROW)
直近値 前時点の値(ラグ) LAG(y, 1) OVER (ORDER BY date)
頻度 過去N日の件数 COUNT(*) OVER (ORDER BY date ROWS BETWEEN 29 PRECEDING AND CURRENT ROW)
累積和 開始からの合計 SUM(y) OVER (ORDER BY date ROWS UNBOUNDED PRECEDING)
変化量 前時点からの差分 y - LAG(y, 1) OVER (ORDER BY date)
最大・最小 過去N日の最大/最小 MAX(y) OVER (... ROWS BETWEEN ...)

4.2 特徴量設計の注意点

①ウィンドウの境界問題

時刻:  1日  2日  3日  4日  5日
       ↓    ↓    ↓    ↓    ↓
3日移動平均: NaN  NaN  avg(1-3)  avg(2-4)  avg(3-5)
先頭N-1行は計算不能 → 欠測処理が必要(除外 or 別値で補完)

②二重計上の防止

バッチとストリームが混在する環境では、同じイベントが2回処理されないよう、べき等性(Idempotency) を確保する設計が必要。

③予測時点での「未来漏れ」を防ぐ

NG: t0の目的変数を予測するのに t0〜t2のデータを含むウィンドウを使う
OK: t0の目的変数を予測するのに t-N〜t-1のデータだけを使う

4.3 後半の回との接続

後半の回 使用する時間窓特徴量
第6・7回(重回帰) 移動平均、直近値、頻度を説明変数として追加
第8・9回(PCA) 多数の時間窓特徴量を低次元に圧縮
第10・11回(k-means) PCA出力(時間窓特徴量由来)でクラスタ化
第12・13回(PLS) 時間窓特徴量間の共線性をPLSで対処

5. DAGによる特徴量パイプラインの設計

5.1 分析パイプラインのDAG例

生時系列データ (raw_sales.parquet)
   ↓
欠測補完 (imputed_sales.parquet)
   ├→ 移動平均7日 (ma7.parquet)
   ├→ 移動平均30日 (ma30.parquet)
   ├→ ラグ1 (lag1.parquet)
   └→ 頻度30日 (freq30.parquet)
            ↓ 結合
     特徴行列 X (features.parquet)
            ↓
     目的変数 y の結合
            ↓
     訓練/検証分割
            ↓
     モデル学習

利点: - どの特徴量を変えたかが明確 - 変更されたノードから下流のみ再実行 - Airflow, Prefect, DVC などのツールで自動化可能


6. 基盤リンクの整理

基盤概念 本回での役割 後半分析での意味
列指向 時系列特徴の計算に必要な列を効率供給 多数の特徴量列を低コストで生成・更新
整合性 ウィンドウ境界での二重計上・欠落防止 特徴量の「いつ」を統一する
DAG 核心:特徴量生成→学習→評価の依存を管理 再現可能な実験パイプライン
近似 ストリーム集約を近似で高速化 大規模時のウィンドウ統計を軽量に

7. 本日のまとめ

  1. DAGは処理の依存関係を可視化し、順序保証・差分更新・再現性を実現する
  2. バッチ処理(周期・大量)とストリーム処理(即時・逐次)は補完的な関係
  3. ウィンドウ関数の3種(タンブリング・スライディング・セッション)でデータの時間的範囲を定義する
  4. 時間窓特徴量の設計では未来漏れと二重計上に注意する

次回予告

第5回では 近似アルゴリズム(Bloom Filter / Count-Min Sketch / HyperLogLog) を扱う。
大規模データの特性を「厳密には計算しないが、ほぼ正確に素早く知る」方法を学ぶ。


事後課題

以下を調べ、A4半枚程度でまとめること: 1. Apache Airflow の DAG の概念を調べ、本回の説明と対応させて説明する 2. 「未来漏れ(data leakage / lookahead bias)」が実際の機械学習コンペで問題となった事例を1つ見つけて説明する