ビジネスの世界では、売上やPV数などの時系列データがたくさんあります。
このような時系列データは、いつも完璧なコンディションで存在するわけではありません。
例えば、データの一部が欠損、つまり、欠測値の状態になっていることがあります。
その欠測値を補完するためのパッケージがRにはあります。imputeTSです。
今回は、「RのimputeTSパッケージを使った時系列データの欠測値補完」についてお話しします。
Contents
利用データ
今回利用する時系列データのデータセットは、Airline Passengers(飛行機乗客数)です。Box and Jenkins (1976) の有名な時系列データです。サンプルデータとして、よく利用されます。
1955年5月から10月まで(背景が薄い青色の部分)を欠測させます。
欠測させると、以下のようになります。
欠測した1955年5月から10月まで(背景が薄い青色の部分)を欠測値補完してみます。
imputeTSのインストール
imputeTSパッケージを利用するには、インストールする必要があります。
以下、コードです。
install.packages('imputeTS')
今回は、Rでのデータ分析ではお馴染みのtidyverseパッケージも利用しますので、まだインストールシていない方は、インストールしておいてください。
紹介する時系列の欠測値補完法
以下の記事で、いくつかの時系列データの欠測値補完法を紹介しました。
この中で、今回はimputeTSで実施可能な以下の欠測値補完法の実行例を説明します。
- LOCF法
- 平均値代入法
- 中央値代入法
- 線形補間法
- スプライン補間法
- 移動平均補間法
- カルマン平滑化補間法
必要なパッケージの読み込み
先ずは、必要なパッケージを読み込みます。
以下、コードです。
library(tidyverse) library(imputeTS)
データセットの読み込み
次に、データセットを読み込みます。
以下からダウンロードできます。
AirPassengers_IMP.csv
https://www.salesanalytics.co.jp/pf7x
このURLから直接データセットを読み込めます。
以下、コードです。
AirPassengers <- read_csv("https://www.salesanalytics.co.jp/pf7x") AirPassengers$Month <- as.Date(AirPassengers$Month) #日付型に変換 Passengers <- AirPassengers$Passengers
データの状況を、要約統計量で確認してみます。
以下、コードです。
summary(Passengers)
以下、実行結果です。
NAが欠測値を意味します。欠測値が6箇所あることが分かります。
グラフ化してみます。
以下、コードです。
AirPassengers %>% ggplot() + geom_line(aes(x = Month, y = Passengers, group = 1)) + annotate("rect", xmin = as.Date("1955-05-01"), xmax = as.Date("1955-10-01"), ymin = -Inf, ymax = Inf, fill = "blue", alpha=.1)
以下、実行結果です。
imputeTSには、欠測値の状況をグラフ化し見える化するための機能(関数)があります。こちらの方が簡単にグラフ化できます。
以下、コードです。
ggplot_na_distribution(Passengers)
以下、実行結果です。
では、色々な手法を使い欠測値補完してきたいと思います。
LOCF法
LOCF法で欠測値補完します。
以下、コードです。
imp <- na_locf(Passengers, option = 'locf')
グラフ化しどのように補完したのかを確認します。
以下、コードです。
ggplot_na_imputations(Passengers, imp)
以下、実行結果です。
赤いところが欠測値補完した箇所です。
平均値代入法
平均代入法で欠測値補完します。
以下、コードです。
imp <- na_mean(Passengers, option = 'mean')
グラフ化しどのように補完したのかを確認します。
以下、コードです。
ggplot_na_imputations(Passengers, imp)
以下、実行結果です。
赤いところが欠測値補完した箇所です。
中央値代入法
中央値代入法で欠測値補完します。
以下、コードです。
imp <- na_mean(Passengers, option = 'median')
グラフ化しどのように補完したのかを確認します。
以下、コードです。
ggplot_na_imputations(Passengers, imp)
以下、実行結果です。
赤いところが欠測値補完した箇所です。
線形補間法
線形補間法で欠測値補完します。
以下、コードです。
imp <- na_interpolation(Passengers, option = 'linear')
グラフ化しどのように補完したのかを確認します。
以下、コードです。
ggplot_na_imputations(Passengers, imp)
以下、実行結果です。
赤いところが欠測値補完した箇所です。
スプライン補間法
スプライン補間法で欠測値補完します。
以下、コードです。
imp <- na_interpolation(Passengers, option = 'spline')
グラフ化しどのように補完したのかを確認します。
以下、コードです。
ggplot_na_imputations(Passengers, imp)
以下、実行結果です。
赤いところが欠測値補完した箇所です。
移動平均補間法
移動平均補間法で欠測値補完します。
以下、コードです。
imp <- na_ma(Passengers, k = 3)
グラフ化しどのように補完したのかを確認します。
以下、コードです。
ggplot_na_imputations(Passengers, imp)
以下、実行結果です。
赤いところが欠測値補完した箇所です。
カルマン平滑化補間法
カルマン平滑化補間法で欠測値補完します。
以下、コードです。
imp <- na_kalman(Passengers, model ='auto.arima')
グラフ化しどのように補完したのかを確認します。
以下、コードです。
ggplot_na_imputations(Passengers, imp)
以下、実行結果です。
赤いところが欠測値補完した箇所です。
まとめ
今回は、「RのimputeTSパッケージを使った時系列データの欠測値補完」についてお話ししました。
Pythonで実施するときどうすればいいのか、ということで、別途Python版も紹介します。
残念ながらPythonにはimputeTSのような便利なパッケージがないので、PythonからRのimputeTSを呼び出して利用する、という方法を紹介します。