はじめに
センサーのログ、アクセス数、売上、株価、心拍。順番に意味があるデータは、現場のあらゆるところに転がっています。
『実践 時系列解析 ―統計と機械学習による予測』(Aileen Nielsen 著、山崎邦子・山崎康宏 訳、オライリー・ジャパン)は、そうしたデータを扱うときの「基本のき」から「本番運用の落とし穴」までを、統計モデルと機械学習の両面から一冊でつなげて解説した本です。
この記事では、設計・アーキテクチャに関心のあるエンジニアの視点で、本書の全体像と、読んで特に役に立った考え方をまとめます。
本記事は書評であり、本書の内容を自分の言葉で要約したものです。コードは理解のために書き下ろしたもので、本書のコードそのものではありません。詳細は書籍とGitHubリポジトリをご確認ください。
書籍情報
| 項目 | 内容 |
|---|---|
| 書名 | 実践 時系列解析 ―統計と機械学習による予測 |
| 著者 | Aileen Nielsen |
| 訳者 | 山崎 邦子、山崎 康宏 |
| 出版社 | オライリー・ジャパン |
| 初版 | 2021年9月16日 |
| ISBN | 978-4-87311-960-1 |
| 原書 | Practical Time Series Analysis(O'Reilly, 2020) |
この本の一言まとめ
モデルの前に、データと時間の扱いで勝負が決まる。
これが読み終えた後の率直な感想です。ARIMAやLSTMといったモデルの話は全体の半分ほどで、残りは データの探し方・前処理・保管・評価・本番性能 に割かれています。時系列に特有の落とし穴(とくに後述する「先読み」)を、章をまたいで繰り返し警告してくれる点が、この本の最大の価値だと感じました。
想定読者と前提知識
本書が想定している読者は大きく2種類です。
- 時系列データの経験が浅いデータサイエンティスト・アナリスト
- 社内に大量のデータがあり、分析部門を率いる立場の人
前提知識は次のとおりです。
- RとPythonの基本(NumPy、pandas、scikit-learn、Rの data.table)
- 分散・相関・確率分布などの統計の初歩
- クラスタリング、決定木、ニューラルネットワークの概念
コードはRとPythonを章ごとに行き来します。両方読めると楽ですが、どちらか片方でも概念は追えます。
全体構成
本書は17章で、大きく6つのブロックに分けて読むと見通しが良くなります。
| ブロック | 章 | 内容 |
|---|---|---|
| 歴史 | 1 | 医学・気象・経済・天文における時系列の歴史 |
| データ全般 | 2〜5 | 入手、前処理、探索、シミュレーション、保管 |
| 統計モデル | 6〜7 | AR/MA/ARIMA/VAR、状態空間モデル |
| 機械学習 | 8〜10 | 特徴量生成、木ベース手法、ディープラーニング |
| モデリング後 | 11〜12 | 誤差の測定、性能・提供時の考慮事項 |
| 実例と展望 | 13〜17 | ヘルスケア、金融、政府データ、大規模予測、今後 |
各章の要約
1章 時系列の概論と簡単な歴史
時系列解析が医学・気象・経済・天文という複数の分野で別々に育ってきた歴史を概観する章です。
- 17世紀の死亡表から生命表を作ったジョン・グラントが、医学における時系列的な発想の先駆けとして紹介されます
- 天気予報という言葉を作ったロバート・フィッツロイ、経済予測の出発点となった景気循環の研究など、分野ごとの背景が語られます
- ウドニー・ユールによる自己回帰モデルの実データ適用(1920年代)や、ボックス-ジェンキンス法(1970年)が、分野としての出発点として登場します
- 機械学習側では、予測の結合(アンサンブル)の発想が1969年にすでにあったことが紹介されます
歴史の章ですが、「データが手に入る形になったときに手法が進化する」という流れが一貫していて、後の章を読む動機づけになります。
2章 時系列データの見つけ方と前処理
個人的に、この本で最も実務に直結すると感じた章です。分量も最大級です。
データの入手先
- UCI機械学習リポジトリ、UEA & UCR 時系列分類リポジトリ、政府機関のデータ、CompEngine など
- 時間軸が「時間」でなくても、順序と等間隔さえあれば時系列として扱える(例:ワインのスペクトル)という視点
「発掘した時系列」という考え方
SQLデータベースの取引ログのように、元々は時系列用ではないデータから時系列を組み立てる作業が丁寧に解説されます。そこで出てくる実務上の注意点は次のとおりです。
- 欠けた週を埋める(何もなかった週も「0」というデータ点になる)
- 会員になる前など、意味のない期間は落とす
- 週ごとのような集計粒度を揃え、曜日の起点も揃える
- 差を取って件数を数えるときの「端点の+1」を忘れない
タイムスタンプは疑ってかかる
- そのタイムスタンプは「発生時刻」なのか「記録時刻」なのか「アップロード時刻」なのか
- ローカル時刻なのかUTCなのか
- データ入力が手動なら、記憶の偏り(時間割引)が入る
欠損値・サンプリング・平滑化・季節性
- 欠損値の扱いは、補完(前方埋め、移動平均)、補間(線形、スプライン)、期間の削除の3系統
- 前方埋めと「先読みなしの移動平均」は未来の情報を使わない手法、線形補間などは前後を使うので予測用途では注意
- アップサンプリングは情報を増やすわけではない、という釘の刺し方が的確です
- 指数平滑法の初期値の扱いなど、自作せずパッケージを使うべき理由も説明されます
- 季節性(固定周期)と循環性(周期が変動)の区別
タイムゾーンと先読みの回避
タイムゾーンは自分で解決しようとしない、というアドバイスが印象的です。そして章の最後に、先読みを避けるためのチェックリストが載っています。
3章 時系列の探索的データ解析
前半は、ヒストグラム・散布図・プロットといった定番の手法を時系列にどう使うか、後半は時系列に固有の概念を扱います。
- トレンドのある値そのものより、階差を見たほうが情報が多いことが多い
- 同時刻の相関だけでなく、ラグをとった相関を見ないと予測には使えない
- 後半の主役は、定常性、自己相関、偏自己相関、擬似相関
特に「見かけの強い相関が、ラグを入れた途端に消える」例は、株価予測の難しさを直感的に教えてくれます。
4章 時系列データのシミュレーション
シミュレーションを3つの型に整理しています。
| 型 | 考え方 |
|---|---|
| ヒューリスティック | 世界のルールを人間がコードに書き下す |
| 離散事象 | 個々のアクターを動かして全体の挙動を見る |
| 物理 | 物理法則で時間発展させる |
予測との違い(シミュレーションは大量のシナリオを試せる、リスクが低い、など)の整理も明快です。テスト用の合成データを作る場面でそのまま使えます。
5章 時間データの保管
保管方法を決める前に、次のような要件を自問するところから始まります。
- データ量と増加速度
- 更新が無期限か、終わりがあるか
- ランダムアクセスか順次アクセスか
- 古いデータをどう間引くか(ライフサイクル)
そのうえで、SQL、NoSQL、フラットファイルの長所短所を比較します。設計の観点では、「何を保存し、いつ捨てるか」を先に決めるという姿勢が参考になりました。
6章 時系列に使える統計モデル
- 線形回帰は「使えない」のではなく、仮定を満たせば使える。そのための条件が整理されています
- 自己回帰(AR)、移動平均(MA)、ARIMA、ベクトル自己回帰(VAR)
- GARCHや階層モデルといった特殊なモデル
ARモデルは代数で制約を導く丁寧な解説がありますが、数式が苦手な場合は流し読みでも流れは追えるように書かれています。
7章 時系列に使える状態空間モデル
「観測できるデータ」と「その背後の真の状態」を分けて考えるモデルです。
- カルマンフィルタ(線形ガウス型)
- 隠れマルコフモデル
- ベイズ構造時系列モデル
フィルタリング、予測、平滑化の3操作の違いが整理されている点が助かります。平滑化は前後のデータを使うため、予測用途では先読みになる、という点も明記されています。
8章 特徴量の生成と選択
時系列を数個の数値やカテゴリに要約し、通常の機械学習モデルに渡せる形にする章です。
- 平均、傾き、周期性といった素朴な特徴量から始める
- 定常性や時系列の長さによって、意味のある特徴量が変わる
- 自動生成パッケージを使い、そのあとで特徴量を選択する
ドメイン知識を特徴量に反映させること、センサーの誤差特性に引っ張られないことなど、実務的な指摘が多い章です。
9章 機械学習による時系列解析
脳波(EEG)データの分類を題材に、特徴量生成から決定木ベースの分類までを通しで実行します。
- 木ベースの手法は「時間を意識したモデル」ではないので、特徴量化が必須
- クラスタリングや距離ベースの分類では、特徴量を使う方法と、生の時系列に**動的時間伸縮法(DTW)**を使う方法がある
DTWは時間情報を圧縮せずに類似度を測れる手法で、波形の比較問題で威力を発揮します。
10章 ディープラーニングによる時系列解析
ディープラーニングのメリットとデメリットがバランス良く書かれています。
メリット
- 定常性の要件が不要
- 季節性の次数などのパラメータ選択に悩まなくて済む
- 系のダイナミクスに関する仮説が不要
- 不均一なデータや時間向けのアーキテクチャを柔軟に設計できる
デメリット・注意点
- 予測性能は、従来手法を常に上回るわけではない
- トレンドのあるデータは、そのままではうまく当てはまらない
- 入力を−1〜1付近にスケーリングする前処理が必要で、そこでも先読みに注意が要る
- 時間向けのネットワーク(RNN)のベストプラクティスは、画像向け(CNN)ほど整っていない
「万能薬ではないが、道具箱には入れておく価値がある」という温度感が、誠実で好感が持てます。
11章 誤差の測定
時系列では 通常の交差検証をそのまま使ってはいけない というのが核心です。
- ランダムに訓練・テストを分けると、未来の情報が過去のモデルに漏れる
- 代わりに、訓練期間を前へ進めていくバックテストを使う
- 訓練窓を広げていく方式と、窓をずらしていく方式があり、系列の性質に応じて選ぶ
- 平滑化のような前処理が、気づかないうちに訓練とテストの間で情報を漏らすこともある
12章 時系列モデルの当てはめと提供の性能に関する考慮事項
精度だけでなく、計算コストにも目を向ける章です。設計の視点で最も面白い章でもあります。
- 1本の長い系列から重複する窓を大量に切り出すと、情報は増えないのにデータ量だけが膨らむ
- 対策として、重複を避ける、あるいはジェネレータで必要なときに切り出す
- 全データが揃ってから予測するとレイテンシが大きくなる場合、事前計算できる部分を先に済ませる
13章 ヘルスケア分野への適用
2つの事例研究です。
- インフルエンザの予測とナウキャスト(フランスの地域別週次データ)
- 血糖値の予測
どちらも解決済みの問題ではなく、研究が続いているテーマだと明示されています。
14章 金融分野への適用
S&P 500の翌日の収益率の予測を通しで実行します。
- 時系列が非定常で、レジーム(局面)が変わっているように見える
- 年代ごとに平均で正規化すると、似た挙動が見える
- 「驚異的並列」(データ片同士が互いに依存せず並列化しやすい処理)かどうかで、計算の組み方が変わる
15章 政府機関が公表する時系列
ニューヨーク市の311番通報データを題材に、巨大データを扱う実践を学びます。
- 政府データは記録の規則に一貫性がないことがある
- 数ギガのCSVはメモリに載らないので、塊ごとに処理するオンライン・ローリング統計が必要になる
16章 時系列パッケージ
大企業が公開している、自動化された大規模予測の仕組みを紹介します。
- Googleの社内予測は、データのクリーニング、時間的集約と分割、シミュレーションによる不確実性の推定とアンサンブルで構成される
- 自動化の哲学は「完璧な予測を待つより、十分に良い予測がある方がよい」
- 異常値検出も扱われます
17章 予測の予測
今後の展望です。
- 予測サービス化の流れ
- 確率的な成分を持つディープラーニングの台頭
- 統計学に代わる機械学習の存在感の増加
- 統計と機械学習の組み合わせが主流になっていく兆し
高リスクな領域(人の健康など)では、透明性の高い従来手法が引き続き重要だという主張にも納得感があります。
特に刺さった3つの考え方
1. 先読み(ルックアヘッド)に常に警戒する
本書全体を貫くキーワードが「先読み」です。モデリングの時点で知り得なかった未来の情報が、データ処理を通じて紛れ込むことを指します。
- 平滑化や補完に、前後のデータを使ってしまう
- 状態変数(会員資格など)が、いつ付与された値なのか分からないまま使ってしまう
- ハイパーパラメータ探索で、時間を無視した分割をしてしまう
これを検出する統計的な診断はない、と本書ははっきり言い切っています。だからこそ、次のような人間側の習慣が重要になります。
- 各特徴量について「その時刻に本当に知り得たか」を問う
- 小さなデータで全処理を通し、各段階を抜き打ちで検査する
- 説明のつかない「良すぎる特徴量」は、まず先読みを疑う
2. 評価は「時間を進める」形で行う
時系列の評価は、概念としては次の形になります。
[A] で訓練 → [B] でテスト
[A B] で訓練 → [C] でテスト
[A B C] で訓練 → [D] でテスト
scikit-learn でも、この考え方に沿った分割が用意されています。
import numpy as np
from sklearn.model_selection import TimeSeriesSplit
y = np.arange(20) # 時間順に並んだデータを想定
tscv = TimeSeriesSplit(n_splits=4)
for train_idx, test_idx in tscv.split(y):
# 訓練は常にテストより過去のデータだけ
print(f"train: {train_idx.min()}-{train_idx.max()}, "
f"test: {test_idx.min()}-{test_idx.max()}")
ランダム分割との違いは「テストが常に訓練より未来」という一点だけですが、この一点が本番での性能を左右します。
3. 特徴量は「その時点までの情報」で作る
ラグ特徴量を作る場面では、ユーザーごとに系列を分けてからずらすのが基本です。全体に対してそのままずらすと、別のユーザーの値が混ざってしまいます。
import pandas as pd
df = pd.DataFrame({
"user": [1, 1, 1, 2, 2, 2],
"week": [1, 2, 3, 1, 2, 3],
"opened": [3, 0, 2, 1, 4, 0],
})
# ユーザー単位で前週の値を特徴量にする(未来の値は使わない)
df = df.sort_values(["user", "week"])
df["opened_prev_week"] = df.groupby("user")["opened"].shift(1)
print(df)
本書でも、集計値は「その週が終わるまで確定しない」ので、予測に使うなら前の週の値を使う、という趣旨の注意が出てきます。
実務での活かしどころ
読みながら、自分の仕事に引きつけてメモした点です。
- ログやイベントから時系列を作るときは、まずタイムスタンプの意味を確認する
- 欠けた期間は「データなし」ではなく「0」として明示的に埋める
- 平滑化・補完・正規化は、予測用途なら先読みなしの手法を選ぶ
- 評価は時間を進める分割で行い、ランダム分割は使わない
- 学習データの切り出しで、重複によるデータ膨張を避ける
- 精度だけでなく、予測のレイテンシと計算コストも設計時に考える
- 自分のデータで、先読みのチェックリストを一度通してみる
良かった点
- 前処理と評価に紙幅を割いているため、実務でつまずく箇所に直接効く
- 統計と機械学習を対立させず、組み合わせる前提で整理している
- 手法の限界や「うまくいかない場面」を正直に書いている
- 各章の最後に参考文献ガイドがあり、深掘りしやすい
- コードがGitHubで公開されており、手を動かして確認できる
気になった点
- 章によってRとPythonが入れ替わるため、片方しか使わない人は読み替えが必要
- ディープラーニングの章は入門者向けの導入が薄く、事前にニューラルネットワークの基礎が要る
- 刊行が2021年のため、その後に普及した新しいモデルや手法は扱われていない
どんな人におすすめか
| こんな人 | おすすめ度 | 理由 |
|---|---|---|
| 時系列データを初めて扱う人 | ★★★★★ | 前処理から評価まで一通りの流れがつかめる |
| 予測モデルを本番に載せる人 | ★★★★★ | 先読み・評価・性能の章が直接役に立つ |
| 統計か機械学習のどちらかしか知らない人 | ★★★★☆ | 両者の橋渡しになる |
| 最新モデルの手法を追いたい人 | ★★☆☆☆ | 基礎・実践の整理が中心 |
読み方のコツ
- まず 2章・3章・11章 を読んで、データと評価の作法を押さえる
- 次に、自分の課題に近いモデルの章(6〜10章)を読む
- 本番を意識する段階で 12章 に戻る
- 事例(13〜15章)は、手を動かしながら追体験する
本書は通読を前提に書かれていますが、各章はなるべく独立しているので、経験者は飛ばし読みでも構いません。
おわりに
時系列解析は、モデルの選択よりも先に、時間をどう扱うかで成否が分かれる分野です。本書は、その「時間の扱い方」を、歴史・前処理・探索・評価・運用まで一貫して教えてくれます。
特に「先読みを疑う」という習慣は、予測に限らず、ログ分析や特徴量設計をするすべてのエンジニアに役立つと感じました。時系列データを扱う機会がある方は、手元に置いておいて損のない一冊です。