Rで解析:時系列の季節性やパターンを可視化する「ggtime」パッケージの紹介
時系列データを扱うとき、全体の傾向だけでなく、季節ごとの繰り返しや周期の乱れを図から読み取りたい場面があります。しかし、季節性の重ね描きやラグごとの散布図、モデル残差の診断図をggplot2だけで組み立てるには、データの整形とパネルの割り付けに手間がかかります。
「ggtime」パッケージは、tsibble形式の時系列データを対象に、ggplot2の文法に沿った作図の補助関数をまとめています。季節性プロットや季節サブシリーズプロット、ラグプロット、原系列と自己相関を並べた複合表示の作成が可能です。また、fableで推定したモデルの残差診断や、ARIMAモデルの特性根の描画も可能です。本パッケージの利用で、時系列データのパターンを複数の視点から見比べる作業を、少ない記述で進められるのではないかと考えます。
パッケージバージョンは1.0.0。Windows 11 x64 (build 26200)のR version 4.6.1で確認しています。
<おすすめのRに関する書籍です>
パッケージのインストール
下記コマンドを実行してください。
# パッケージのインストール
install.packages("ggtime")
# パッケージの読み込み
library("ggtime")
# コマンド例実行で必要なパッケージを読み込み
library("tsibble")
Attaching package: 'tsibble'
The following objects are masked from 'package:base':
intersect, setdiff, union
library("fable")
Loading required package: fabletoolsコマンド例
詳細はコメント、パッケージのヘルプを確認してください。
ggtimeの作図関数は、tsibbleパッケージの時系列オブジェクト(tsibble)を入力に取ります。tsibbleは、時点を表す列をindexに指定したデータフレームで、観測間隔が一定であることを前提とします。gg_tsresidualsとgg_armaは、これに加えてfableで推定したモデルの一覧表(mable)を入力に取ります。
ここでは、京都・嵐山の月別推計来訪者数(万人)を模した擬似データを共通データとして使用します。2019年1月から2023年12月までの60か月分を、桜と紅葉の時期に増える季節変動、ゆるやかな増加傾向、月ごとの変動を合わせて生成します。
# 乱数シードの固定
set.seed(1234)
# 2019年1月から2023年12月までの月次の年月を作成
対象月 <- tsibble::yearmonth("2019-01") + 0:59
# 各観測の月番号(1〜12)
月番号 <- rep(1:12, length.out = 60)
# 桜(4月)と紅葉(11月)の時期に増える月別の季節変動(万人)
季節変動 <- c(-13, -11, 3, 22, 8, -4, -7, -5, 5, 12, 26, -9)
# 嵐山の月別来訪者数を模したtsibbleの作成(基準値+増加傾向+季節変動+変動)
嵐山来訪 <- tsibble::tsibble(
年月 = 対象月,
来訪者数 = round(32 + 0.12 * (0:59) + 季節変動[月番号] + rnorm(60, 0, 2.5), 1),
index = 年月
)
<おすすめのRに関する書籍です>
[季節性プロットの描画]:gg_seasonコマンド
季節性プロットは、周期ごとにデータを区切り、同じ季節軸の上に各周期の推移を重ねて描きます。月次データでは年ごとの折れ線が重なり、例年並みの月と外れた月を見分けられます。polarに TRUE を渡すと極座標になり、labelsで周期を示すラベルの位置を指定できます。
| オプション | 意味 | 初期値 |
|---|---|---|
| data | 整然形式の時系列オブジェクト(tsibble) | なし |
| y | プロットする変数のベア表現。NULL のとき data から自動で選択される | NULL |
| period | 表示する季節周期。NULL のとき最大の周期、数値なら観測間隔の倍数、”1y” や “3m” などの文字列なら lubridate の Period に変換される | NULL |
| facet_period | ファセットに用いる二次的な季節周期。通常は period より短い値を指定する | NULL |
| max_col | 線を色分けする季節周期数の上限。0 で常に色なし、Inf で常に色付け。labels 指定時は無視される | Inf |
| max_col_discrete | 離散的な色スケールで表示する色数の上限 | 7 |
| pal | 使用する配色パレット | (scales::hue_pal())(9) |
| polar | TRUE のとき季節プロットを極座標で描く | FALSE |
| labels | 季節周期を識別するラベルの表示位置 | c(“none”, “left”, “right”, “both”) |
| labels_repel | TRUE のとき ggrepel パッケージでラベルの重なりを回避する | FALSE |
| labels_left_nudge | 季節周期を識別するラベルを既定位置から左右へずらす量 | 0 |
| labels_right_nudge | 季節周期を識別するラベルを既定位置から左右へずらす量 | 0 |
| … | geom_line() へ渡す追加の引数 | なし |
# 年ごとの折れ線を重ねた季節性プロット
gg_season(嵐山来訪, 来訪者数)
# ラベルを両端に置き、極座標で表示
gg_season(嵐山来訪, 来訪者数, labels = "both", polar = TRUE)

[季節サブシリーズプロットの描画]:gg_subseriesコマンド
季節サブシリーズプロットは、季節(月次データなら1月から12月)ごとにパネルを分け、各パネルに年を追った推移と、平均を示す横線を描きます。季節ごとの水準の違いと、季節内での変化の向きを同時に確認できます。
| オプション | 意味 | 初期値 |
|---|---|---|
| data | 整然形式の時系列オブジェクト(tsibble) | なし |
| y | プロットする変数のベア表現。NULL のとき data から自動で選択される | NULL |
| period | 表示する季節周期。NULL のとき最大の周期、数値なら観測間隔の倍数、文字列なら lubridate の Period に変換される | NULL |
| … | geom_line() へ渡す追加の引数 | なし |
# 月ごとにパネルを分けた季節サブシリーズプロット
gg_subseries(嵐山来訪, 来訪者数)
<おすすめのRに関する書籍です>
[ラグプロットの描画]:gg_lagコマンド
ラグプロットは、系列を指定したラグ数だけずらした値との散布図を、ラグごとにパネルで並べます。周期と一致するラグで点が対角線付近に集まり、季節性の強さを目で確認できます。arrowに TRUE を渡すと、観測の順序を矢印で結びます。
| オプション | 意味 | 初期値 |
|---|---|---|
| data | 整然形式の時系列オブジェクト(tsibble) | なし |
| y | プロットする変数のベア表現。NULL のとき data から自動で選択される | NULL |
| period | 表示する季節周期。NULL のとき最大の周期が使われる | NULL |
| lags | ファセットとして表示するラグの値のベクトル | 1:9 |
| geom | データの表示に用いる図形 | c(“path”, “point”) |
| arrow | ラグの経路に進行方向を示す矢印を付けるか。TRUE で既定の矢印、grid::arrow() で作成した矢印も指定できる | FALSE |
| … | 図形へ渡す追加の引数 | なし |
# ラグ1〜12を並べたラグプロット
gg_lag(嵐山来訪, 来訪者数, lags = 1:12)
# ラグ1・6・12を経路で結び、矢印で時間の進む向きを示す
gg_lag(嵐山来訪, 来訪者数, lags = c(1, 6, 12), arrow = TRUE)

[原系列と自己相関の複合表示]:gg_tsdisplayコマンド
時系列の複合表示は、原系列のプロットと自己相関、およびplot_typeで選んだ図を1枚に配置します。系列の形と自己相関の減衰を並べて確認でき、モデルの次数を検討する際の下調べに使えます。lag_maxで自己相関を計算する最大ラグを指定します。
| オプション | 意味 | 初期値 |
|---|---|---|
| data | 整然形式の時系列オブジェクト(tsibble) | なし |
| y | プロットする変数のベア表現。NULL のとき data から自動で選択される | NULL |
| plot_type | 右下に配置する図の種類。”auto” のとき季節データは季節プロット、欠測のない非季節データはスペクトル、それ以外は偏自己相関を表示する | c(“auto”, “partial”, “season”, “histogram”, “scatter”, “spectrum”) |
| lag_max | 自己相関を計算する最大ラグ。既定は 10*log10(N/m)(N は観測数、m は系列数) | NULL |
# 原系列・自己相関・季節性プロットをまとめて表示
gg_tsdisplay(嵐山来訪, 来訪者数)
# 右下を偏自己相関に変更し、最大ラグを24に指定
gg_tsdisplay(嵐山来訪, 来訪者数, plot_type = "partial", lag_max = 24)

[モデル残差の診断プロット]:gg_tsresidualsコマンド
残差診断の複合表示は、fableで推定したモデルの残差について、時系列プロット・自己相関・ヒストグラムをまとめて描きます。残差に自己相関や偏りが残っていないかを一度に確認できます。mableには1つのモデルだけを含めます。
| オプション | 意味 | 初期値 |
|---|---|---|
| data | 残差を持つモデル1つを含む mable | なし |
| type | 計算する残差の種類。”response” のとき逆変換後のデータで残差を求める | “innovation” |
| plot_type | 右下に配置する図の種類 | “histogram” |
| … | gg_tsdisplay() へ渡す追加の引数 | なし |
# ETSモデルを当てはめてmableを作成
当てはめ <- model(嵐山来訪, ETS(来訪者数))
# モデル残差の時系列プロット・自己相関・ヒストグラム
gg_tsresiduals(当てはめ)
# 右下を偏自己相関に変更
gg_tsresiduals(当てはめ, plot_type = "partial")

[ARMAモデルの特性根の描画]:gg_armaコマンド
特性根のプロットは、ARIMAモデルの反転したAR根とMA根を複素平面の単位円上に描きます。単位円の外に出た根は赤で示され、定常性や反転可能性を確認する目安になります。glance()にar_rootsとma_rootsを持つモデルだけが対象です。
| オプション | 意味 | 初期値 |
|---|---|---|
| data | AR または MA の特性根を持つモデルを含む mable | なし |
# ARIMAモデルを当てはめてmableを作成
ARIMA当てはめ <- model(嵐山来訪, ARIMA(来訪者数))
# 反転したAR根・MA根を単位円上に描画
gg_arma(ARIMA当てはめ)
<おすすめのRに関する書籍です>
この記事が誰かの役に立ちますように。