Time Series Analysis
時系列分析では、時間順に並んだデータを調べ、トレンド、季節性、異常を見つけ、統計モデルやディープモデルで将来の値を予測します。
時系列分析とは、時間順に記録されたデータポイントを調べることで、通常は一定間隔で取得された1時間ごとのセンサー読み取り値、日次売上、交通カメラが毎分捉えた車両数などが対象です。他のデータ分析と異なるのは、順序自体に情報が含まれている点です。各観測値はその前の値に依存するため、データをシャッフルすると重要なパターンが失われます。主な目的は、トレンドや季節パターンを通じて系列を記述すること、将来の値を予測すること、異常を検出すること、ECGの心拍リズムのような系列全体を分類することです。
トレンド、季節性、定常性#
多くの系列はいくつかの要素から成ります。トレンドは長期的な方向性、季節性は日、週、年など固定周期で繰り返すパターン、周期性は固定周期を持たない長期的な上昇と下降、残差はそれ以外の要素です。古典的には移動平均を使い、より頑健な方法ではSTLを使ってこれらを分解します。STLは局所回帰に基づく季節・トレンド分解法で、Robert Clevelandらが1990年に発表しました。
自己相関、つまり系列と時間をずらした系列との相関は、こうした構造を明らかにします。時間単位のデータでラグ24の値が高い場合、各時刻は1日前の同じ時刻とよく似ています。多くの統計モデルは定常性も仮定します。これは平均、分散、自己相関が時間とともに変化しない性質です。拡張ディッキー・フラー検定は、一般的な非定常性の形式を検定します。また、系列の水準ではなく、ある時点から次の時点への変化をモデル化する差分を使うと、トレンドを取り除けます。
この例では、日周期、緩やかな上昇トレンド、ノイズを含む4週間分の時間単位の車両数をシミュレートし、自己相関を測定して、最終日の予測を2つの方法で行います。
import numpy as np
import pandas as pd
# Four weeks of hourly vehicle counts: a daily cycle, a slow upward trend, and noise
rng = np.random.default_rng(0)
hours = pd.date_range("2026-03-01", periods=24 * 28, freq="h")
daily_cycle = 40 + 30 * np.sin(2 * np.pi * (hours.hour - 9) / 24)
counts = pd.Series(daily_cycle + 0.02 * np.arange(len(hours)) + rng.normal(0, 5, len(hours)), index=hours)
# Autocorrelation: how strongly each count resembles the count 1, 12, and 24 hours earlier
for lag in [1, 12, 24]:
print(f"Autocorrelation at lag {lag}: {counts.autocorr(lag):.2f}")
# Forecast the final day from the 27 days before it
history, actual = counts[:-24], counts[-24:].to_numpy()
naive = np.full(24, history.iloc[-1]) # repeat the last observed count
seasonal_naive = history.iloc[-24:].to_numpy() # repeat the same hour of the previous day
print(f"Naive MAE: {np.abs(actual - naive).mean():.1f} vehicles")
print(f"Seasonal naive MAE: {np.abs(actual - seasonal_naive).mean():.1f} vehicles")自己相関はラグ1で0.92、午後のピークと夜間の谷が一致するラグ12で-0.89、ラグ24で0.95です。最後に観測した車両数を繰り返すと、平均で毎時24.5台の誤差が生じます。一方、前日の車両数を繰り返す場合の誤差は5.6台です。そのため、季節ナイーブ予測が、予測モデルが上回るべきベースラインとなります。
予測手法#
統計的手法は、特に短い系列に対して今なお有効です。Charles HoltとPeter Wintersが1960年頃に開発した指数平滑法は、直近の観測値を最も重視し、トレンド項と季節項を追加します。George BoxとGwilym Jenkinsが1970年に広めたARIMAモデルは、自己回帰、差分、過去の誤差の移動平均を組み合わせます。MetaのProphetは、ビジネスデータのトレンド、季節性、祝日の影響を適合させます。
機械学習モデルは、ラグ値やカレンダー特徴量を使った予測モデリングとして予測を扱います。LightGBMなどの勾配ブースティングツリーは、Walmartの売上を対象とした2020年のM5コンペティションを席巻しました。一方、10万系列を扱った2018年のM4コンペティションでは、Slawek Smylによる指数平滑法とリカレントニューラルネットワークのハイブリッドが優勝しました。ディープラーニングモデルには、LSTM、状態空間モデル、Transformerがあります。また、AmazonのChronosやGoogleのTimesFMなどの事前学習済み基盤モデルは、新しい系列をゼロショットで予測します。カルマンフィルターは、ノイズの多い測定値から物体の位置などの隠れた状態をリアルタイムで推定する関連タスクに使われます。
評価では時間順序を守る必要があります。ランダムな交差検証ではモデルが未来の情報を参照できてしまい、これはデータリークに当たります。そのため、ローリングオリジン評価を使って予測をテストします。この方法では、カットオフより前のすべてのデータで学習してその後の期間を予測し、カットオフを先に進めながらこれを繰り返します。
動画から得られる時系列#
コンピュータービジョンは、動画を時系列に変換します。交通カメラの物体カウントからは毎分の車両数が得られ、物体追跡からはフレームごとの位置と速度が得られ、店舗のカメラからは毎時の占有数が得られます。これらの系列には、ラッシュアワーや必要な人員の予測、事故後の交通量急減を検出する異常検知など、同じ手法を適用できます。Ultralyticsの分析ソリューションでは、analytics_type="line"がYOLO26モデルで物体を追跡し、30フレームごと、30 fpsの動画では約1秒ごとに、視野内の物体数をプロットします。そのため、カメラ映像を再生しながらカウント系列に変換できます。
時系列分析は自然言語処理における系列モデリングと重なります。テキストは位置順に並びますが、サンプリング間隔はありません。検出、追跡、動画理解モデルで動画から抽出した数や速度は、フレームよりはるかにデータ量が小さいため、何年分ものデータを保存し、カメラ間で比較できます。










