3.1 変換と調整

過去のデータを調整するとより単純な時系列になることがしばしばあります。ここでは、4種類の調整:暦調整、人口調整、インフレ調整、算術変換を扱います。これら調整と変換の目的は、既知の変動源を取り除いたり、全データセットにわたってより一貫性のあるパターンを持たせることで、過去のデータ中のパターンを簡素化することです。パターンが簡素であるほど、モデル化が容易になり、より正確な予測につながるのが通常だからです。

暦調整

季節性データに見られる変動のいくつかは、単純な暦効果によるものかもしれません。そうしたケースでは、分析を進める前に変動を除去した方が、通常ずっと分析が容易になります。

例えば、ある小売店の月次売上高を研究しているとしましょう。このデータには年間の季節変動に加えて、各月の営業日数が異なることによる変動が含まれています。このような場合、月次売上高ではなく、一営業日当たり平均売上高を各月について計算することで、この変動を除去することは容易です。こうして、暦による変動を効果的に除去できます。

人口調整

人口変化から影響を受けるデータは一人当たりデータにすることで調整できます。つまり、総計ではなく、一人当たり(もしくは、千人当たり、あるいは、百万人当たり)のデータを考えるわけです。例えば、ある地域の病院ベッド数の経時変化を研究する場合、千人当たりのベッド数で考えて人口変化の影響を除去すれば、結果はずっと解釈しやすくなります。ベッド数は実質的に増えたのか、単に人口変化で増えただけなのか、分かるようになります。総ベッド数は増えているが、千人当たりベッド数は減っていることもあり得ます。病院のベッド数よりも人口の増加スピードが速い場合、そうなります。人口変化の影響を受けるデータでは、ほとんど場合、総計よりも一人当たりデータを使った方が良いです。

そのことは、global_economyデータセットで確認できます。GDPの場合、一人当たりGDPに変換するのが一般的です。

global_economy %>%
  filter(Country == "Australia") %>%
  autoplot(GDP/Population) +
  labs(title= "一人当たりGDP", y = "米ドル")
オーストラリアの一人当たりGDP

図 3.1: オーストラリアの一人当たりGDP

インフレ調整

貨幣価値の影響を受けるデータも、モデル化の前に調整する方が良いでしょう。例えば、新築住宅の平均コストは過去数十年間にインフレのため上昇してきました。今年の20万ドル住宅は、20年前の20万ドル住宅と同じではありません。このため、金融時系列は、全ての値が特定年のドル価値で表記されるよう調整するのが普通です。例えば、住宅価格データを2000年ドル表記するという具合です。

この調整には、物価指数を用います。\(z_{t}\)が物価指数で、\(y_{t}\)\(t\)年時点の元の住宅価格だとすると、\(x_{t} = y_{t}/z_{t} * z_{2000}\)が2000年ドル表記に調整した住宅価格になります。物価指数はしばしば政府機関が作成しています。消費財で一般的な物価指数は、消費者物価指数(CPI)です.

インフレ調整することで、一般価格水準と比較して産業が成長しているか衰退しているか、比較することができます。例えば、aus_retailから新聞・書籍小売業の売上高の年間合計を得て、global_economyのCPIを使ってインフレ調整することで、経時変化を理解することができます。

print_retail <- aus_retail %>%
  filter(Industry == "Newspaper and book retailing") %>%
  group_by(Industry) %>%
  index_by(Year = year(Month)) %>%
  summarise(Turnover = sum(Turnover))
aus_economy <- global_economy %>%
  filter(Code == "AUS")
print_retail %>%
  left_join(aus_economy, by = "Year") %>%
  mutate(Adjusted_turnover = Turnover / CPI * 100) %>%
  pivot_longer(c(Turnover, Adjusted_turnover),
               values_to = "Turnover") %>%
  mutate(name = factor(name,
         levels=c("Turnover","Adjusted_turnover")),
         name = recode(name,
                       "Turnover" = "売上高",
                       "Adjusted_turnover" = "調整後売上高")) %>%
  ggplot(aes(x = Year, y = Turnover)) +
  geom_line() +
  facet_grid(name ~ ., scales = "free_y") +
  labs(title = "売上高: オーストラリア新聞・書籍小売業",
       y = "オーストラリア・ドル")
オーストラリア新聞・書籍小売業の売上高、オーストラリア・ドル建て。「調整後売上高」はCPIで調整した売上高。

図 3.2: オーストラリア新聞・書籍小売業の売上高、オーストラリア・ドル建て。「調整後売上高」はCPIで調整した売上高。

CPIでインフレ調整することで、オーストラリアの新聞・書籍小売業の衰退は、調整前のデータが示していたのよりずっと前から始まっていたことが分かります。CPIはこのデータセットでは2010年の値が100なので、インフレ調整後売上高は2010年オーストラリア・ドル表記になります。

算術変換

変動幅が時系列の水準に連れて増加もしくは減少するデータの場合、変換が役立つことがあります。例えば、対数変換はしばしば役に立ちます。元の観測値を\(y_{1},\dots,y_{T}\)と表し、変換後の観測値を\(w_{1}, \dots, w_{T}\)で表すとすると、\(w_t = \log(y_t)\)となります。対数値の変化が元の尺度では相対(あるいは、パーセント)変化になるように、対数は解釈可能なので有用です。ですから、対数の底が10なら、対数尺度での1単位の増加は元の尺度で10倍になることに相当します。ただ、元の系列にゼロや負値がある場合は、対数は計算できません。

他の変換も(解釈は容易でなくなりますが)使われることがあります。例えば、平方根や三乗根も使えます。これらは、\(w_{t} = y_{t}^p\)と書けるので、べき乗変換と呼ばれます。

対数変換とべき乗変換の両方を含む有益な変換に、Box-Cox変換があります。 (Box & Cox, 1964) パラメータ\(\lambda\)によって変換は変わりますが、以下のように定義されます。 \[\begin{equation} w_t = \begin{cases} \log(y_t) & \text{$\lambda=0$の場合} \\ (\text{sign}(y_t)|y_t|^\lambda-1)/\lambda & \text{それ以外} \end{cases} \tag{3.1} \end{equation}\] これは、Bickel & Doksum (1981) による修正Box-Cox変換です。\(\lambda > 0\)であれば、\(y_t\)に負値があっても構いません。

Box-Cox変換での対数は常に自然対数(底が\(e\))です。ですから、\(\lambda=0\)なら自然対数、\(\lambda\ne0\)ならべき乗変換の後に単純な拡大・縮小変換されます。

\(\lambda=1\)の場合、\(w_t = y_t-1\)なので、変換後のデータは元のデータから下方シフトしますが、時系列の形状は変わりません。\(\lambda\)が1以外の場合、時系列の形は変わります。

下のスライダーを使って\(\lambda\)の値を変更することで、オーストラリア四半期ガス生産量の形状がどのように変換されるか確かめてみてください。

図 3.3: Box-Cox変換をオーストラリア四半期ガス生産量に適用

期間全体を通して季節変動の幅がほぼ同じになるような\(\lambda\)値が良い値です。そうすることで、予測モデルをより簡素にできるからです。このケースでは、\(\lambda\)が0.0と0.2の間では似た結果になりますが、\(\lambda=0.10\)で大体良いようです。

\(\lambda\)値の選択には、guerrero特徴量 (Guerrero, 1993)が使えます。このケースでは、\(\lambda=0.11\)が選ばれます。(features()関数については次章で議論します。)

lambda <- aus_production %>%
  features(Gas, features = guerrero) %>%
  pull(lambda_guerrero)
aus_production %>%
  autoplot(box_cox(Gas, lambda)) +
  labs(y = "",
       title = latex2exp::TeX(paste0(
         "$\\lambda$ = ",
         round(lambda,2),
         "で変換後のガス生産量")))
Guerreroの手法で選んだパラメータ$\lambda$を使って変換したオーストラリア四半期ガス生産量

図 3.4: Guerreroの手法で選んだパラメータ\(\lambda\)を使って変換したオーストラリア四半期ガス生産量

参考文献

Bickel, P. J., & Doksum, K. A. (1981). An analysis of transformations revisited. Journal of the American Statistical Association, 76(374), 296–311. [DOI]
Box, G. E. P., & Cox, D. R. (1964). An analysis of transformations. Journal of the Royal Statistical Society. Series B, Statistical Methodology, 26(2), 211–252. [DOI]
Guerrero, V. M. (1993). Time-series analysis supported by power transformations. Journal of Forecasting, 12(1), 37–48. [DOI]