第4回 DAGとウィンドウ関数¶
本日の到達目標¶
- DAG(有向非巡回グラフ)の概念を理解し、分析パイプラインを依存関係として表現できる
- バッチ処理とストリーム処理の違いを説明できる
- ウィンドウ関数の種類を整理し、時間窓特徴量(移動平均・直近値・頻度等)を設計できる
1. DAG とは何か¶
1.1 グラフの基礎用語¶
- グラフ:ノード(頂点)とエッジ(辺)からなる構造
- 有向グラフ(Directed Graph):エッジに向きがある
- 非巡回(Acyclic):ループが存在しない → DAG = 有向非巡回グラフ
1.2 DAGが「循環しない」意味¶
循環がないため、処理の実行順序が一意に決まる(トポロジカルソート)
1.3 なぜ分析パイプラインにDAGを使うか¶
データ分析の処理は互いに依存関係を持つ:
→ この依存関係を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 ウィンドウ(窓)の概念¶
ウィンドウ:各観測点に対して「参照する過去データの範囲」を定義する枠
3.2 ウィンドウの種類¶
① タンブリングウィンドウ(Tumbling Window)¶
重なりなし、固定幅で区切る
例:毎日0時〜23:59の日次集計② スライディングウィンドウ(Sliding Window)¶
重なりあり、スライドして移動する
例:過去7日間の移動平均(毎日更新)③ セッションウィンドウ(Session Window)¶
一定のギャップ(無活動期間)で区切る
例:ユーザーのセッション中の行動集計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 特徴量設計の注意点¶
①ウィンドウの境界問題
先頭N-1行は計算不能 → 欠測処理が必要(除外 or 別値で補完)②二重計上の防止
バッチとストリームが混在する環境では、同じイベントが2回処理されないよう、べき等性(Idempotency) を確保する設計が必要。
③予測時点での「未来漏れ」を防ぐ
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. 本日のまとめ¶
- DAGは処理の依存関係を可視化し、順序保証・差分更新・再現性を実現する
- バッチ処理(周期・大量)とストリーム処理(即時・逐次)は補完的な関係
- ウィンドウ関数の3種(タンブリング・スライディング・セッション)でデータの時間的範囲を定義する
- 時間窓特徴量の設計では未来漏れと二重計上に注意する
次回予告¶
第5回では 近似アルゴリズム(Bloom Filter / Count-Min Sketch / HyperLogLog) を扱う。
大規模データの特性を「厳密には計算しないが、ほぼ正確に素早く知る」方法を学ぶ。
事後課題¶
以下を調べ、A4半枚程度でまとめること: 1. Apache Airflow の DAG の概念を調べ、本回の説明と対応させて説明する 2. 「未来漏れ(data leakage / lookahead bias)」が実際の機械学習コンペで問題となった事例を1つ見つけて説明する