JOURNALについて

データアナリティクスラボ株式会社では、ITやデータサイエンスに関する技術の研究活動を行っています。このブログでは、研究活動で得られた知見や検証結果についての情報を発信します。

本ブログで提供される情報は、可能な限り正確かつ最新の情報であるように努めますが、必ずしもその正確性を保証することはできません。場合によっては誤情報が含まれたり、最新の情報ではない可能性もあります。予めご了承いただけますようお願い申し上げます。

journal

状態空間モデルを用いた東京都の月次宿泊者数予測:Prophetおよび時系列基盤モデルChronosとの比較評価

1. はじめに

観光産業は日本経済において重要な役割を果たしており、特に東京都は国内外から多くの観光客を受け入れている。宿泊者数の正確な予測は、観光業界における価格戦略や人員配置などの意思決定において極めて重要である。

本研究では、東京都の月次宿泊者数データを使用し、状態空間モデルでの宿泊者者数の予測を実施する。状態空間モデルの他に、Prophetおよび時系列基盤モデルの一種であるChronosの3パターンで実装し、それぞれの予測精度を比較検証する。

状態空間モデルを基軸とする理由として宿泊者数のデータ特性にある。宿泊者数は以下のような複数の要因によって変動する。

  • 季節性:春の観光シーズン、夏休み、年末年始など、季節による明確な変動パターンがある
  • 長期トレンド:訪日外国人の増加、観光政策の変化による中長期的な需要水準が変動する
  • 一時的な変動:気象、連休配置、大規模イベント、社会情勢によって需要が短期的に変動する

このような宿泊者数の変動は、一定のトレンドや季節性だけでなく、背後にある需要水準や季節効果の強さ自体が時点ごとに変化していると考えれる。

一方、状態空間モデルの特徴として以下があげられる。

  • 需要水準やトレンド、季節効果を潜在的な状態として表現できる
  • 潜在的な状態が時間とともに変化することを前提にモデル化することができる
  • 観測データに基づき、その時点の状態を逐次推定しながら予測に反映できる

よって、宿泊者数のように需要構造が時間とともに刻々と変化しうる時系列に対しては状態空間モデルが有効であると考えられる。

2. データの概要

2.1. データソース

  • 提供元: 東京都の月次宿泊者数統計データ
  • データ形式: CSV形式
  • データ構造
    • 年: 観測年(2008〜2024)
    • 月: 観測月(1〜12)
    • 延べ宿泊者数: 東京都内の月次延べ宿泊者数(目的変数)

2.2. 対象期間

  • 全体期間: 2008年1月〜2024年12月(205ヶ月分)
  • 学習期間: 2008年1月〜2023年12月(異常期間を除外)
    • 除外期間1: 2011年3月〜2011年8月(東日本大震災の影響)
    • 除外期間2: 2020年3月〜2022年10月(COVID-19の影響)
  • テスト期間: 2024年1月〜2024年12月(12ヶ月分)

2.3. データの特徴

  • 構造変化
    • 2011年: 東日本大震災により一時的な落ち込み(2011年3-8月)
    • 2020年: COVID-19により大幅な落ち込み(2020年3月〜)
    • 2021-2022年: 緩やかな回復傾向
    • 2023年以降: ほぼコロナ禍前の水準に回復、さらに増加
図1. 東京都の月次延べ宿泊者数の推移
  • 長期トレンド
    • 2008年から2019年まで、緩やかな増加傾向
    • インバウンド観光の増加により、特に2018年以降の伸びが顕著
    • 2023-2024年は過去最高水準まで回復
  • 季節性
    • 12ヶ月周期の季節パターンが存在
図2. 宿泊者数の自己相関プロット
  • 繁忙期: 8月、10月~12月
  • 閑散期: 1~2月、6月
図3. 宿泊者数の年別・月別推移
図4. 月別の平均宿泊者数

2.4. データの前処理

2.4.1. 対数変換

# 対数変換
df["log_y"] = np.log(df["延べ宿泊者数"])
  • 目的: データの変動を割合ベースで捉える
  • 効果: 分散の安定化、正規性の改善
  • 解釈: 対数変換後の値は、宿泊者数の変化率として解釈可能
図5. 宿泊者数の対数変換前と対数変換後のヒストグラム

2.4.2. 標準化

# 標準化(mask_train=学習データのみ)
log_y = df["log_y"].to_numpy()
log_y_mean = log_y[mask_train].mean()
log_y_sd   = log_y[mask_train].std()
y_scaled = (log_y - log_y_mean) / log_y_sd
  • 目的: サンプリングの数値安定性を向上
  • 手法: 平均0、標準偏差1に変換
  • 効果: MCMCサンプリングの収束性向上、パラメータの事前分布設定を容易化

2.4.3. 震災、コロナ期間の除外

本研究では大災害やパンデミックなどのイレギュラーが起きないと仮定した場合での精度検証を目的としているため、モデルの学習時に以下の期間をデータから除外した。

  • 東日本大震災期間: 2011年3月〜2011年8月(6ヶ月間)
# 震災期間フラグ(2011年3月〜8月)
earthquake_start = pd.Timestamp("2011-03-01")
earthquake_end   = pd.Timestamp("2011-08-01")
df["earthquake_flag"] = df["date"].between(earthquake_start, earthquake_end)
  • コロナ期間: 2020年3月〜2022年10月(32ヶ月間)
# コロナ期間フラグ(2020年3月〜2022年10月)
covid_start = pd.Timestamp("2020-03-01")
covid_end   = pd.Timestamp("2022-10-01")
df["covid_flag"] = df["date"].between(covid_start, covid_end)

2.4.4. 訓練・テストデータの分割

  • 訓練データ: 2008年1月〜2023年12月(異常期間除外後
  • テストデータ: 2024年1月〜2024年12月(12ヶ月分)
  • 評価指標: MAPE

3. 状態空間モデルの理論

3.1. 状態空間モデルの概要

状態空間モデルは、観測された時系列データの背後に「直接観測できない状態」が存在すると仮定し、その状態が時間とともに推移することで観測値が生成される、と考える枠組みである。

状態空間モデルの特徴は、時系列を長期的なトレンドや季節性といった要素に分けて解釈しやすい点にある。

図6. 状態空間モデルの基本構造

3.2. 観測方程式

観測方程式は、「直接観測できない状態から観測値がどのように生成されるか」を表す。

  • 観測方程式:\(y_t = Z_t\alpha_t + \varepsilon_t\)

各記号の意味は以下のとおりである。

  • \(y_t\):観測値
  • \(\alpha_t\):状態ベクトル
  • \(Z_t\):観測行列
  • \(\varepsilon_t\):観測ノイズ

なお今回は、外れ値に対する頑健性を高めるため、観測ノイズ \(\varepsilon_t\) の分布として裾の厚い分布であるStudent-t分布を採用している。

3.3. 状態方程式

状態方程式は、「状態ベクトルが時間とともにどのようなルールで変化するか」を表す。

  • 状態方程式:\(\alpha_{t+1} = T_t\alpha_t + R_t\eta_t\)

各記号の意味は以下のとおりである。

  • \(T_t\):状態遷移行列(前時点の状態が次時点へどのように受け継がれるかを表す)
  • \(R_t\):状態ノイズの入力行列
  • \(\eta_t\):状態ノイズ

本研究で用いたモデル(トレンド・季節性・自己相関の加法構造)は、上式の \(\alpha_t\) の中身としてそれらの成分を含むように設計した状態空間モデルと解釈できる。

3.4. 時系列分析手法の比較

観点 状態空間モデル ARIMA Prophet Chronos(時系列基盤モデル)
モデルについて 「潜在状態」が時間発展し、観測は状態から生成される 差分系列に対する自己回帰+移動平均 加法分解を前提にした回帰的モデル 大量データで事前学習したニューラルネットで系列を直接モデリング
予測区間の出し方 状態・観測の確率モデルとして自然に扱える 仮定(線形・誤差分布など)の下で区間推定可能 区間推定可能(設定や仮定に依存) 手法・実装に依存
欠損・不規則間隔への強さ 比較的得意(観測方程式の扱いで自然に対応しやすい) 前処理が必要(欠損補完や等間隔化) 日次などの規則データを前提に扱うことが多い(欠損は扱えるが設計次第) モデル次第。等間隔前提の実装が多いが、工夫可能
トレンド・季節性の表現 構造化しやすい(ローカルレベル、ローカルトレンド、季節モデルなどを自由に組む) 差分や季節ARIMA等で表現するが、成分として分解表示する用途には不向きなこともある 得意(トレンドと季節性を扱いやすい) 明示的な成分としては持たないことが多い
外生変数 入れやすい(観測方程式に回帰項を追加、状態として係数を時間変化させる等も可能) 外生変数を回帰式に取り込む形で可能(ARIMAX) 回帰項(休日・追加回帰)として可能 モデル次第(プロンプトや付加情報の入れ方が実装依存)
推論のアルゴリズム カルマンフィルタ/平滑化(線形ガウス)や、粒子フィルタ、MCMC、ベイズ推定など 最尤推定や条件付き最尤など(統計的推定) 最適化ベースの推定(実装の推定器に依存) 学習済み重みを用いた推論。ニューラルネットの推論手順
解釈性 高いことが多い(状態=成分なので説明しやすい) 中(係数の解釈はできるが、分解として直感的でない場合あり) 高め(トレンド・季節性・休日効果の寄与が説明しやすい) 低〜中(高性能だがブラックボックスになりやすい)
モデル設計の自由度 非常に高い(構造を足し引きして問題に合わせられる) 比較的定型(次数の選択が中心) 用意された枠組みの中で調整(使いやすいが自由度はSSMほどではない) 学習済みモデルに依存(自由度は「使い方・追加学習」側に寄る)
データ量と適性 小〜中規模でも成立しやすい(構造仮定で学習を支える) 小規模でもよく使える 小〜中規模で扱いやすい(ビジネス時系列で定番) 事前学習は大規模。利用時は小規模でも動くが、ドメイン適合はデータ次第

4. モデルの構築

本研究では、東京都の月次の「延べ宿泊者数」を対象に、長期的な推移(トレンド)と月次の規則的な変動(季節性)、および直近月の影響が残る短期的な自己相関(AR成分)を同時に扱えるよう、状態空間モデルを設計し、パラメータや潜在状態をベイズ推定した。観測値には外れ値が混入し得ることを踏まえ、観測誤差分布は正規分布ではなく Student-t 分布を採用し、ロバスト性を高めた。

4.1. モデリングの前処理と学習・評価設計

まず目的変数である延べ宿泊者数は、分散の安定化と加法構造での解釈をしやすくするため 対数変換を実施した。さらに、MCMC による推定を安定させるため、学習データ期間のみから平均・標準偏差を算出して標準化をおこなった。

また、構造変化が大きく通常期と異なる期間として、コード上で以下をフラグ化して学習から除外した。

  • 震災影響期間:2011年3月〜2011年8月
  • コロナ影響期間:2020年3月〜2022年10月

加えて、2024年をテスト期間としてモデル学習には用いず、評価期間としてモデルの予測値と実績から誤差率を算出し、精度評価を実施した。

4.2. モデルの仕様

今回構築した状態空間モデルは、標準化スケールにおける観測が、トレンド+季節性+ARの和で表される潜在平均に従って生成される。

潜在平均とは直接観測できない潜在的な変数の平均値のことである。例えば、テストの点数は観測できるが、学力は直接観測できない潜在変数となる。このとき学力の分布の平均が潜在平均となる。

構造は以下の通りである。

4.2.1. 潜在平均

  • レベル成分
    長期的な緩やかな増減を表すため、ガウス型ランダムウォークで表現した。これにより「前年差」のような滑らかな変化を許容しつつ、急変もし過度に排除しない柔軟性を確保する。
# レベル成分
sigma_level = pm.Exponential("sigma_level", 1.0)
level = pm.GaussianRandomWalk("level", sigma=sigma_level, shape=len(df))
  • 季節成分
    月ごとの規則的変動を12次元の係数として持たせ、月インデックス で参照する設計とした。さらに、季節成分が全体の平均を勝手に持ち上げたり下げたりしないよう、sum-to-zero 制約を入れている。
# 季節性成分
sigma_season = pm.Exponential("sigma_season", 1.0)
seasonal_raw = pm.Normal("seasonal_raw", 0, sigma_season, shape=12)
seasonal = pm.Deterministic("seasonal", seasonal_raw - pm.math.mean(seasonal_raw))
seasonal_effect = seasonal[month_idx]
  • AR成分
    宿泊需要には「前月の水準が当月にも残る」短期的な惰性があると考えられるため、AR成分を追加した。これにより、トレンドと季節性だけでは説明しきれない連続的なズレを吸収し、残差の自己相関を低減することを狙った。
 # AR成分
rho = pm.Uniform("rho", -0.99, 0.99)
sigma_ar = pm.Exponential("sigma_ar", 1.0)
ar = pm.AR("ar", rho=rho, sigma=sigma_ar, shape=len(df))

    4.2.2. 観測モデル

    観測は潜在平均を中心として、Student-t 分布に従うとした。

    Student-t を採用することで、正規分布よりも裾が厚くなり、突発的な外れ値が出た場合でも推定が過度に引っ張られにくい構造となる。

    # 観測誤差
    sigma_obs = pm.Exponential("sigma_obs", 1.0)
    nu = pm.Exponential("nu", 1 / 30)

    自由度 nu は Student-t 分布の裾の厚さを決め、nu が大きいほど正規分布に近づき、nu が小さいほど外れ値に頑健になる。nu ∼ Exponential(1/30)nu の事前平均を30と置くことで、概ね正規に近い誤差とし、データが外れ値を含む場合には nu が小さく推定され、裾の厚い誤差分布として適応できるようにするための弱情報事前分布である。

    4.2.3. 説明変数について

    本分析では、外生説明変数は投入していない。代わりに、トレンド・季節性・ARの内部構造で、需要の主要な変動要因を分解・吸収する方針とした。当初は繁忙期フラグと為替データを説明変数としてモデルを構築したが、いずれの変数も95%信用区間に0を含まなかったことから、有意な影響が確認されなかったため、モデルから除外した。

    4.3. 仮説

    本モデルを構築するにあたり、以下の仮説に基づいている。

    1. 宿泊需要には滑らかな長期トレンドが存在する その変化は月次で連続的に推移しやすく、ランダムウォークで表現できる。
    2. 月次の季節性(12か月周期)が安定的に存在する 繁忙期・閑散期など、月固有の効果が繰り返し現れる。
    3. 短期的には自己相関が残る トレンドと季節性だけでは表現できない「前月の影響」が、月次データには存在する。

    4.4. 使用した主なライブラリ

    • PyMC:ベイズモデルの記述とMCMCサンプリング
    • ArviZ:推定結果の要約(az.summary)、トレースプロット(az.plot_trace
    • scikit-learn:RMSE/MAE の計算

    4.5. パラメータの推定方法(ベイズ推定・MCMC)

    パラメータ推定は PyMCによるMCMCで実施した。

    MCMCはサンプリングが困難な複雑な確率分布から、近似的にサンプルを生成する手法である。詳細については今回の記事では説明は省略する。

    具体的には以下の設定でサンプリングを行っている。

    • chains=4
    • tune=2000
    • draws=2000
    • target_accept=0.95
    # サンプリング
    idata = pm.sample(
    	draws=2000, 
    	tune=2000, 
    	chains=4, 
    	target_accept=0.95, 
    	random_seed=42
    )

    推定後は az.summary を用いて主要パラメータ(sigma_level, sigma_season, sigma_ar, rho, sigma_obs, nu)の事後要約を確認し、必要に応じてrhatや有効サンプルサイズなどの収束診断指標を参照する設計としている。

    # 収束統計量
    az.summary(idata, var_names=["sigma_level", "sigma_season", "sigma_obs", "nu"])

    5. 予測結果

    5.1. 予測精度の評価

    テスト期間における平均絶対誤差率は以下の通りである。

    モデル MAPE
    状態空間モデル 3.41%
    Chronos 4.19%
    Prophet 9.72%

    強い季節性と水準変動を含む今回のデータに対して、状態空間モデルとChronosが実績の変動に比較的よく追随した。一方でProphetは水準の過小評価が継続し、誤差が大きい結果となった。

    5.2. モデルごとの予測結果

    状態空間モデル、Prophet、Chronosの3手法について、2024年1から12月の延べ宿泊者数に対する予測の当てはまりを比較した。

    図7. 各モデルの予測と実績

    月別の予測値から以下の傾向が確認された。

    • 状態空間モデルは上半期は上振れが多い一方、10〜12月で下振れが連続し、年後半の需要増局面で保守的になった。
    • Prophetは、2024年はほぼ全月で下振れとなり、ピークの大きさや水準を控えめに見積もる方向が強かった。
    • Chronosは上振れが多いが、月によって下振れも発生し、局面により方向が入れ替わる挙動が見られた。

    2024年の実績は、単なる季節性だけではなく、観光需要の増加による水準そのものが上方にシフトしている。 そのため過去の平均的パターンを踏襲するProphetは外れやすく、直近の勢いを反映しやすいChronosや、構造を柔軟に組める状態空間モデルが優位となった。

    5.3. 考察

    5.3.1. 状態空間モデル

    • 状態空間モデルは今回比較したモデルの中で誤差が最小であり、2024年の実績変動に対して最も整合的だった。
    • 一方で2024年後半の下振れは、急激な需要増に対して、モデルが保守的になった可能性を示す。

    5.3.2. Prophet

    • 予測が一貫して下振れし、信頼区間上限でも実績に届かない月が多いことは、モデルが2024年の水準に追いついていない。
    • Prophetはトレンドを平滑化しやすく、急な成長を取り込みにくい局面では弱気な予測になりやすい。

    5.3.3. Chronos

    • 予測精度は状態空間モデルに近い水準で、実績への追随性が高い。
    • ただし区間は広めになりやすく、「外さない」一方で意思決定に必要なレンジ情報として粗くなる場合がある。
    • 説明可能性の観点では、状態空間モデルほど要因分解を自然に提示しにくいため、運用上は精度(当てにいく)と説明(納得性)を分担する設計が現実的である。

    6. 今後の展望とまとめ

    6.1. モデルの高度化

    年々の増加傾向と季節パターンの変化可能性をより適切に扱うため、状態空間モデルを次の二点で高度化の余地があると考えた。

    6.1.1. ローカル線形トレンドへの拡張

    トレンド成分については「レベル」のみではなく「傾き(成長率)」も状態として持つローカル線形トレンドへ拡張する。これにより、長期的な増加を単一の滑らかな水準変化として扱うのではなく、成長の加速・減速といった中長期の変化をモデル内で表現できるようになり、直近の需要拡大局面への追随性向上が期待される。

    6.1.2. 時変季節性の導入

    季節性については毎年同一の月次パターンである固定季節性を前提とせず、季節成分が時間とともに緩やかに変化し得る時変季節性を導入する。観光需要はインバウンド構成、気候、供給制約等により、繁忙期の強さや閑散期の底が年ごとに変化し得るため、季節パターンの変動を許容することは合理的であると考える。一方で、季節性を過度に自由にするとノイズを吸収して過学習を招く恐れがあるため、季節成分の変化量には強めの正則化を課す設計とする。

    6.2 まとめ

    本研究では、東京都の月次宿泊者数に対して、トレンド・季節性を分解して扱える状態空間モデルを中心に検討し、予測と解釈性の両立を確認した。今後の展望としては、年々の増加傾向をより現実的に捉えるためにトレンド成分を「レベル+傾き」へ拡張し、成長の加速・減速をモデル内で表現できるようにする。また、観光需要の季節パターンは年ごとに変化し得るため、固定季節性に加えて時変季節性を導入し、ただし過学習を避ける目的で季節成分の変化量には強めの正則化を課す。これらの高度化により、長期的な水準上昇と季節形状の変化を分離して推定でき、将来予測における追随性と説明可能性をさらに高めることを目指す。

    7. 参考文献

    • 北川 源四郎(2019)「時系列解析における状態空間モデルの利用」、統計数理(2019)第 67 巻 第 2 号 181–192
    • 馬場真哉(2018)「時系列分析と状態空間モデルの基礎: RとStanで学ぶ理論と実装」、プレアデス出版
    • 山野 秀哲, 津田 博史(2016)「状態空間モデルを用いた宿泊施設の稼働率の推定」、同志社大学ハリス理化学研究報告 57 (4), 244-253
    • Ansari, Abdul Fatir.; Stella, Lorenzo.; et al. Chronos: Learning the Language of Time Series. arXiv. 2024, 2403.07815. https://arxiv.org/abs/2403.07815
    • Taylor, Sean J.; Letham, Benjamin. Forecasting at scale. The American Statistician. 2018, vol. 72, no. 1, p. 37-45 https://facebook.github.io/prophet/

    オウンドメディアも運営しています