RのimputeTSパッケージを使った時系列データの欠測値補完

RのimputeTSパッケージを使った時系列データの欠測値補完

ビジネスの世界では、売上やPV数などの時系列データがたくさんあります。

このような時系列データは、いつも完璧なコンディションで存在するわけではありません。

例えば、データの一部が欠損、つまり、欠測値の状態になっていることがあります。

その欠測値を補完するためのパッケージがRにはあります。imputeTSです。

今回は、「RのimputeTSパッケージを使った時系列データの欠測値補完」についてお話しします。

利用データ

今回利用する時系列データのデータセットは、Airline Passengers(飛行機乗客数)です。Box and Jenkins (1976) の有名な時系列データです。サンプルデータとして、よく利用されます。

1955年5月から10月まで(背景が薄い青色の部分)を欠測させます。

欠測させると、以下のようになります。

欠測した1955年5月から10月まで(背景が薄い青色の部分)欠測値補完してみます。

 

imputeTSのインストール

imputeTSパッケージを利用するには、インストールする必要があります。

以下、コードです。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
install.packages('imputeTS')
install.packages('imputeTS')
install.packages('imputeTS')

 

今回は、Rでのデータ分析ではお馴染みのtidyverseパッケージも利用しますので、まだインストールシていない方は、インストールしておいてください。

 

紹介する時系列の欠測値補完法

以下の記事で、いくつかの時系列データ欠測値補完法を紹介しました。

この中で、今回はimputeTSで実施可能な以下の欠測値補完法の実行例を説明します。

  • LOCF法
  • 平均値代入法
  • 中央値代入法
  • 線形補間法
  • スプライン補間法
  • 移動平均補間法
  • カルマン平滑化補間法

 

 必要なパッケージの読み込み

先ずは、必要なパッケージを読み込みます。

以下、コードです。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
library(tidyverse)
library(imputeTS)
library(tidyverse) library(imputeTS)
library(tidyverse)
library(imputeTS)

 

 データセットの読み込み

次に、データセットを読み込みます。

以下からダウンロードできます。

AirPassengers_IMP.csv
https://www.salesanalytics.co.jp/pf7x

 

このURLから直接データセットを読み込めます。

以下、コードです。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
AirPassengers <- read_csv("https://www.salesanalytics.co.jp/pf7x")
AirPassengers$Month <- as.Date(AirPassengers$Month) #日付型に変換
Passengers <- AirPassengers$Passengers
AirPassengers <- read_csv("https://www.salesanalytics.co.jp/pf7x") AirPassengers$Month <- as.Date(AirPassengers$Month) #日付型に変換 Passengers <- AirPassengers$Passengers
AirPassengers <- read_csv("https://www.salesanalytics.co.jp/pf7x")

AirPassengers$Month <- as.Date(AirPassengers$Month) #日付型に変換

Passengers <- AirPassengers$Passengers

 

データの状況を、要約統計量で確認してみます。

以下、コードです。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
summary(Passengers)
summary(Passengers)
summary(Passengers)

 

以下、実行結果です。

 

NAが欠測値を意味します。欠測値が6箇所あることが分かります。

グラフ化してみます。

以下、コードです。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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)
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)
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には、欠測値の状況をグラフ化し見える化するための機能(関数)があります。こちらの方が簡単にグラフ化できます。

以下、コードです。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
ggplot_na_distribution(Passengers)
ggplot_na_distribution(Passengers)
ggplot_na_distribution(Passengers)

 

以下、実行結果です。

 

では、色々な手法を使い欠測値補完してきたいと思います。

 

 LOCF法

LOCF法欠測値補完します。

以下、コードです。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
imp <- na_locf(Passengers, option = 'locf')
imp <- na_locf(Passengers, option = 'locf')
imp <- na_locf(Passengers, option = 'locf')

 

グラフ化しどのように補完したのかを確認します。

以下、コードです。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
ggplot_na_imputations(Passengers, imp)
ggplot_na_imputations(Passengers, imp)
ggplot_na_imputations(Passengers, imp)

 

以下、実行結果です。

 

赤いところが欠測値補完した箇所です。

 

 平均値代入法

平均代入法欠測値補完します。

以下、コードです。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
imp <- na_mean(Passengers, option = 'mean')
imp <- na_mean(Passengers, option = 'mean')
imp <- na_mean(Passengers, option = 'mean')

 

グラフ化しどのように補完したのかを確認します。

以下、コードです。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
ggplot_na_imputations(Passengers, imp)
ggplot_na_imputations(Passengers, imp)
ggplot_na_imputations(Passengers, imp)

 

以下、実行結果です。

 

赤いところが欠測値補完した箇所です。

 

 中央値代入法

中央値代入法欠測値補完します。

以下、コードです。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
imp <- na_mean(Passengers, option = 'median')
imp <- na_mean(Passengers, option = 'median')
imp <- na_mean(Passengers, option = 'median')

 

グラフ化しどのように補完したのかを確認します。

以下、コードです。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
ggplot_na_imputations(Passengers, imp)
ggplot_na_imputations(Passengers, imp)
ggplot_na_imputations(Passengers, imp)

 

以下、実行結果です。

 

赤いところが欠測値補完した箇所です。

 

 線形補間法

線形補間法欠測値補完します。

以下、コードです。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
imp <- na_interpolation(Passengers, option = 'linear')
imp <- na_interpolation(Passengers, option = 'linear')
imp <- na_interpolation(Passengers, option = 'linear')

 

グラフ化しどのように補完したのかを確認します。

以下、コードです。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
ggplot_na_imputations(Passengers, imp)
ggplot_na_imputations(Passengers, imp)
ggplot_na_imputations(Passengers, imp)

 

以下、実行結果です。

 

赤いところが欠測値補完した箇所です。

 

 スプライン補間法

スプライン補間法欠測値補完します。

以下、コードです。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
imp <- na_interpolation(Passengers, option = 'spline')
imp <- na_interpolation(Passengers, option = 'spline')
imp <- na_interpolation(Passengers, option = 'spline')

 

グラフ化しどのように補完したのかを確認します。

以下、コードです。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
ggplot_na_imputations(Passengers, imp)
ggplot_na_imputations(Passengers, imp)
ggplot_na_imputations(Passengers, imp)

 

以下、実行結果です。

 

赤いところが欠測値補完した箇所です。

 

 移動平均補間法

移動平均補間法欠測値補完します。

以下、コードです。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
imp <- na_ma(Passengers, k = 3)
imp <- na_ma(Passengers, k = 3)
imp <- na_ma(Passengers, k = 3)

 

グラフ化しどのように補完したのかを確認します。

以下、コードです。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
ggplot_na_imputations(Passengers, imp)
ggplot_na_imputations(Passengers, imp)
ggplot_na_imputations(Passengers, imp)

 

以下、実行結果です。

 

赤いところが欠測値補完した箇所です。

 

 カルマン平滑化補間法

カルマン平滑化補間法欠測値補完します。

以下、コードです。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
imp <- na_kalman(Passengers, model ='auto.arima')
imp <- na_kalman(Passengers, model ='auto.arima')
imp <- na_kalman(Passengers, model ='auto.arima')

 

グラフ化しどのように補完したのかを確認します。

以下、コードです。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
ggplot_na_imputations(Passengers, imp)
ggplot_na_imputations(Passengers, imp)
ggplot_na_imputations(Passengers, imp)

 

以下、実行結果です。

 

赤いところが欠測値補完した箇所です。

 

まとめ

今回は、「RのimputeTSパッケージを使った時系列データの欠測値補完」についてお話ししました。

Pythonで実施するときどうすればいいのか、ということで、別途Python版も紹介します。

残念ながらPythonにはimputeTSのような便利なパッケージがないので、PythonからRimputeTSを呼び出して利用する、という方法を紹介します。

Pythonでの時系列データに対する欠測値補完方法