2025-05-10
観光客の人数の時系列変化は基本データ
金沢市への観光来訪者数がどのように変化しているのか
全般的な傾向
能登半島地震の影響
季節によるパターン
ランダムウオークでもだいたい有意(p<0.05)になる
時系列データをあつかうモデルのひとつ
観測値は、直接観測することのできない「状態」から生成されると考える
状態は、時系列に沿って変化する
x[t]: 時間tにおける状態, y: 時間tにおける観測値
ダウンロードしたCSVファイルを読み込み、1つのデータフレームにまとめる
データの出典: デジタル観光統計オープンデータ(https://www.nihon-kankou.or.jp/home/jigyou/research/d-toukei/)(2025年3月11日ダウンロード)
金沢市のデータを抽出
> print(data_Kanazawa)
# A tibble: 48 × 9
年 月 地域区分 データ区分 都道府県コード 都道府県名 地域コード 地域名称
<dbl> <dbl> <chr> <chr> <dbl> <chr> <dbl> <chr>
1 2021 1 市区町村 観光来訪者数…… 17 石川県 17201 金沢市
2 2021 2 市区町村 観光来訪者数…… 17 石川県 17201 金沢市
3 2021 3 市区町村 観光来訪者数…… 17 石川県 17201 金沢市
4 2021 4 市区町村 観光来訪者数…… 17 石川県 17201 金沢市
5 2021 5 市区町村 観光来訪者数…… 17 石川県 17201 金沢市
6 2021 6 市区町村 観光来訪者数…… 17 石川県 17201 金沢市
7 2021 7 市区町村 観光来訪者数…… 17 石川県 17201 金沢市
8 2021 8 市区町村 観光来訪者数…… 17 石川県 17201 金沢市
9 2021 9 市区町村 観光来訪者数…… 17 石川県 17201 金沢市
10 2021 10 市区町村 観光来訪者数…… 17 石川県 17201 金沢市
# ℹ 38 more rows
# ℹ 1 more variable: 人数 <dbl>
あとの可視化と解析のためデータを加工する
年
と月
から、“年/月”となる文字列変数YM
をつくるMonths
にNum
にシステムモデル
観測モデル
以下の3つの成分からなるモデル
それぞれ、あるノイズの値が加わって前の月から変化
今回のデータでは観測値はもともとは計数値だが、数が大きく、1万人単位としているので、観測モデルのノイズは正規分布するものとして扱う
Rで状態空間モデルをあつかうパッケージはいくつかあるが、今回はKFASを使用
状態空間モデルの定義と観測データへのあてはめ
カルマンフィルタによるフィルタリング・平滑化・予測
正規分布以外(ポアソン分布など)の観測データにも対応
SSModel
関数でモデルを定義する。引数のQ
とH
はそれぞれシステムモデルと観測モデルのノイズの分散。fitSSM
関数であてはめを実行。
> quake <- c(rep(0, 36), rep(1, 12)) # 地震発生以降を示すダミー変数
> model <- SSModel(
+ Num ~ SSMregression(~ quake, Q = NA) + # 回帰成分
+ SSMtrend(degree = 2, # レベル成分(トレンドも)
+ Q = list(matrix(NA), matrix(NA))) +
+ SSMseasonal(period = 12, Q = NA, # 季節成分
+ sea.type = "dummy"),
+ H = NA,
+ data = data_Kanazawa)
> fit <- fitSSM(model, inits = c(0, 0, 0, 0, 0))
KFS
関数によりカルマンフィルタを適用し、平滑化した状態の値を取得
地震の影響と季節成分を除いた数に対応
1か月あたりの増加数
地震の影響はなくなったものとして12か月先までを予測