13.9 外れ値と欠損値の扱い

実際のデータには外れ値や欠損値、その他の厄介な特徴が含まれているのが普通です。これらの扱いはときに面倒なことになり得ます。

外れ値

外れ値は、時系列内の大半の観測値とかけ離れた観測値のことです。間違いかもしれないし、単に異常な値なだけかもしれません。(回帰の文脈での外れ値の議論は7.3節を参照。)本書で検討してきた手法のどれも、データの中に極端な外れ値があると上手く機能しません。その場合、欠損値か、データの大半とより同質な推計値に、外れ値を入れ替えたくなるかもしれません。

ただ、外れ値がどうして生じたのか考えることなく、単に置き換えてしまうのは危険な行いです。そこに、データ生成過程について、予測の際考慮すべき役立つ情報があるかもしれないからです。それでも、外れ値は純粋な間違いか、予測期間に起きることはない、と想定できるのなら、外れ値を置き換えて予測業務をより容易にできます。

13.11は、南オーストラリア州のAdelaide Hills地域の訪問目的の宿泊客数です。2002 Q4に異常な観測値があるようです。

tourism %>%
  filter(
    Region == "Adelaide Hills", Purpose == "Visiting"
  ) %>%
  autoplot(Trips) +
  labs(title = "Adelaide Hills地域への訪問目的の四半期宿泊客数",
       y = "宿泊客数 (千人)")
南オーストラリア州のAdelaide Hills地域の訪問目的の宿泊客数

図 13.11: 南オーストラリア州のAdelaide Hills地域の訪問目的の宿泊客数

外れ値を見つけるのに役立つ方法の一つは、STL()を引数robust=TRUEとして系列に適用することです。すると、外れ値は残差系列に浮かび上がるはずです。図13.11のデータには目に付く季節性はほとんどないので、period=1と設定して季節成分のないSTLを適用します。

ah_decomp <- tourism %>%
  filter(
    Region == "Adelaide Hills", Purpose == "Visiting"
  ) %>%
  # 非季節性STL分解を適合
  model(
    stl = STL(Trips ~ season(period = 1), robust = TRUE)
  ) %>%
  components()
ah_decomp %>% autoplot()
南オーストラリア州のAdelaide Hills地域の訪問目的の宿泊客数の季節成分のないSTL分解

図 13.12: 南オーストラリア州のAdelaide Hills地域の訪問目的の宿泊客数の季節成分のないSTL分解

上の例では、外れ値は容易に特定できました。より難しいケースでは、残差系列のボックスプロットを使うと役に立ちます。データの中央50%から四分位範囲(IQR)の1.5倍超離れているものを外れ値と特定できます。残差が正規分布なら、1000個の観測値中7個を「外れ値」と示すでしょう。より厳密なルールはデータの中央50%から四分位範囲(IQR)の3倍超離れているものを外れ値と定義することで、それだと500,000個の正規分布観測値中1個だけを外れ値とするでしょう。こちらのルールを使うことにします。

outliers <- ah_decomp %>%
  filter(
    remainder < quantile(remainder, 0.25) - 3*IQR(remainder) |
    remainder > quantile(remainder, 0.75) + 3*IQR(remainder)
  )
outliers
#> # A dable: 1 x 9 [1Q]
#> # Key:     Region, State, Purpose, .model [1]
#> # :        Trips = trend + remainder
#>   Region      State Purpose .model Quarter Trips trend remainder season_adjust
#>   <chr>       <chr> <chr>   <chr>    <qtr> <dbl> <dbl>     <dbl>         <dbl>
#> 1 Adelaide H… SA    Visiti… stl    2002 Q4  81.1  11.1      70.0          81.1

これで、図13.11から疑っていた1つの外れ値を見つけます。似たようなことをデータセットの全てに適用すれば、他の系列での異常値も特定できるでしょう。

欠損値

欠損データの発生理由は多くあり得るので、欠損があることが予測モデルにバイアスをもたらさないか、検討に値します。例えば、ある店の売上高データを研究していて、閉店している祝日に欠損値が生じている、とします。結果として、祝日の翌日に売上高は増えていたかもしれません。このことを予測モデルに取り込まないと、祝日の翌日での売上高を過小推計、それ以降の日での売上高を過大推計することになるでしょう。こうした類の状況に対処する一つの方法は、その日が祝日か、祝日の翌日かを指すダミー変数を持つ動学的回帰モデルを使うことです。こうした影響は、特定の予測上の文脈によるので、自動化手法では扱えません。

他の状況では、欠損があるのは本質的にランダムかもしれません。例えば、誰かが売上数値の記録を忘れてしまった、あるいは、データを記録する機械が壊れていた、のかもしれません。欠損データのタイミングに予測問題にとっての情報がないのなら、欠損値はより容易に扱えます。

最後に、いくつかの異常値を除去した結果、系列に欠損値を作ったのかもしれません。

欠損値があっても問題なく機能する手法もあります。例えば、ナイーブ予測手法は、最近の欠損していない値を将来の期間での予測とするので、機能できます。同様に、5.2節で紹介した他のベンチマークとなる手法も全て、過去のデータに欠損値がある場合も予測を生成できます。fableの関数のうち、ARIMAモデル、動学的回帰モデル、NNARモデルは、エラーを発生させることなく正しく機能します。しかし、ETS()STL()を含む他のモデル化関数は欠損値を扱えず、エラーが発生します。

欠損値がエラーを発生させる場合、問題を処理する方法が少なくとも2つあります。一つの方法は、最後の欠損値以降のデータだけを、そうしても意味のある予測を生成できるほど長い一連の観測値が残ると想定して、使うことです。もう一つの方法は、欠損値を推計値に置き換えることです。そうするために、欠損値を含むデータにまずARIMAモデルを適合させ、次にそのモデルを使って欠損値を補間します。

13.12で特定された外れ値を、ARIMAモデルを使った推計値に置き換えてみましょう。

ah_miss <- tourism %>%
  filter(
    Region == "Adelaide Hills",
    Purpose == "Visiting"
  ) %>%
  # 外れ値を除去
  anti_join(outliers) %>%
  # 欠損値に置き換え
  fill_gaps()
ah_fill <- ah_miss %>%
  # 欠損値を含むデータにARIMAモデルを適合
  model(ARIMA(Trips)) %>%
  # 全期間の宿泊客数を推計
  interpolate(ah_miss)
ah_fill %>%
  # 外れ値だった期間だけを表示
  right_join(outliers %>% select(-Trips))
#> # A tsibble: 1 x 9 [?]
#> # Key:       Region, State, Purpose [1]
#>   Region      State Purpose Quarter Trips .model trend remainder season_adjust
#>   <chr>       <chr> <chr>     <qtr> <dbl> <chr>  <dbl>     <dbl>         <dbl>
#> 1 Adelaide H… SA    Visiti… 2002 Q4  8.50 stl     11.1      70.0          81.1

interpolate()関数は、ARIMAモデルを使って系列内のどの欠損値も推計します。このケースでは、外れ値81.1は8.5に置き換えられました。図13.13が結果の系列です。

ah_fillデータは、今や欠損値を扱えない関数でもモデル化できるでしょう。

ah_fill %>%
  autoplot(Trips) +
  autolayer(ah_fill %>% filter_index("2002 Q3"~"2003 Q1"),
    Trips, colour="#D55E00") +
  labs(title = "Adelaide Hills地域への訪問目的の四半期宿泊客数",
       y = "宿泊客数 (千人)")
2002Q4の外れ値をARIMAモデルを使った補間値に置き換えた、南オーストラリア州のAdelaide Hills地域の訪問目的の宿泊客数

図 13.13: 2002Q4の外れ値をARIMAモデルを使った補間値に置き換えた、南オーストラリア州のAdelaide Hills地域の訪問目的の宿泊客数