時系列データを扱う
Text Update: 11/08, 2018 (JST)

lubridateパッケージの登場で日時データの扱いは格段に楽になりましたが、時系列データの扱いは意外と厄介です。 R では時系列データ(Time Series)に特化したデータ型があり、可視化にはdygraphsパッケージのような便利なパッケージがあり、これを使わない手はありません。そこで、 R での時系列データ型であるxtsクラスについて簡単に説明します。

Packages and Datasets

本ページではR version 3.4.4 (2018-03-15)の標準パッケージ以外に以下の追加パッケージを用いています。
 

Package Version Description
dygraphs 1.1.1.6 Interface to ‘Dygraphs’ Interactive Time Series Charting Library
lubridate 1.7.4 Make Dealing with Dates a Little Easier
tidyverse 1.2.1 Easily Install and Load the ‘Tidyverse’
xts 0.11.2 eXtensible Time Series
zoo 1.8.4 S3 Infrastructure for Regular and Irregular Time Series (Z’s Ordered Observations)

 
また、本ページでは以下のデータセットを用いています。
 

Dataset Package Version Description
nhtemp datasets 3.4.4 Average Yearly Temperatures in New Haven
sample_matrix xts 0.11.2 data file for examples, tests, and vignette(s)

 

xtsクラス

xtsクラスとは“eXtensible Time Series”名前の通り時系列データ型であるtsクラス(Time Seriesクラス)を拡張したものです。xtsパッケージ自体のベースはzooパッケージです。tsクラスは金融の時系列データを扱うために考案された下記のような形式のデータです。
 

##  Time-Series [1:60] from 1912 to 1971: 49.9 52.3 49.4 51.1 49.4 47.9 49.8 50.9 49.3 51.9 ...

 
一方、xtsクラスは下記のような形式のデータです。
 

## An 'xts' object on 1912-01-01/1971-01-01 containing:
##   Data: num [1:60, 1] 49.9 52.3 49.4 51.1 49.4 47.9 49.8 50.9 49.3 51.9 ...
##   Indexed by objects of class: [Date] TZ: UTC
##   xts Attributes:  
##  NULL

 

xtsクラスへの変換

tsクラスをxtsクラスに変換するにはxts::as.xts関数を用います。
 

以下のxtsパッケージのサンプルデータ(ヘルプに記載があるが最新版のxtsパッケージにはなぜか同梱されていないためGitHubから入手)を用いて変換前後を確認してみます。なお、このサンプルデータは単なるシミュレーションデータです。
 

sample_matrix %>% class()
## [1] "matrix"
sample_matrix %>% str()
##  num [1:180, 1:4] 50 50.2 50.4 50.4 50.2 ...
##  - attr(*, "dimnames")=List of 2
##   ..$ : chr [1:180] "2007-01-02" "2007-01-03" "2007-01-04" "2007-01-05" ...
##   ..$ : chr [1:4] "Open" "High" "Low" "Close"

 

sample_matrix %>% head()
##                Open     High      Low    Close
## 2007-01-02 50.03978 50.11778 49.95041 50.11778
## 2007-01-03 50.23050 50.42188 50.23050 50.39767
## 2007-01-04 50.42096 50.42096 50.26414 50.33236
## 2007-01-05 50.37347 50.37347 50.22103 50.33459
## 2007-01-06 50.24433 50.24433 50.11121 50.18112
## 2007-01-07 50.13211 50.21561 49.99185 49.99185

 
このデータをxtsクラスに変換すると
 

(sample_xts <- sample_matrix %>% xts::as.xts()) %>% str()
## An 'xts' object on 2007-01-02/2007-06-30 containing:
##   Data: num [1:180, 1:4] 50 50.2 50.4 50.4 50.2 ...
##  - attr(*, "dimnames")=List of 2
##   ..$ : NULL
##   ..$ : chr [1:4] "Open" "High" "Low" "Close"
##   Indexed by objects of class: [POSIXct,POSIXt] TZ: 
##   xts Attributes:  
##  NULL

 

sample_xts %>% head()
##                Open     High      Low    Close
## 2007-01-02 50.03978 50.11778 49.95041 50.11778
## 2007-01-03 50.23050 50.42188 50.23050 50.39767
## 2007-01-04 50.42096 50.42096 50.26414 50.33236
## 2007-01-05 50.37347 50.37347 50.22103 50.33459
## 2007-01-06 50.24433 50.24433 50.11121 50.18112
## 2007-01-07 50.13211 50.21561 49.99185 49.99185

 
データの見た目は全く変わりませんが、構造が異なっていることが分かります。
 

xtsクラスの可視化

xtsクラスのデータを可視化するにはdygraphsパッケージが便利です。
 

sample_xts %>% 
  dygraphs::dygraph(main = "Sample Data Matrix For xts Example and Unit Testing") %>% 
  dygraphs::dyRangeSelector()

データフレームをxtsクラスに変換する

データフレーム型(data.frameクラス)をxtsクラスに変換するには一工夫が必要な場合があります。例えば、以下のようなチケットデータの集計データを変換してみます。

Table 1: Redmine issues
date n
2013-04-01 0
2013-04-02 0
2013-04-03 0
2013-04-04 0
2013-04-05 0
2013-04-06 0
2013-04-07 0
2013-04-08 4
2013-04-09 6
2013-04-10 4
issues %>% str()
## 'data.frame':    1894 obs. of  2 variables:
##  $ date: Date, format: "2013-04-01" "2013-04-02" ...
##  $ n   : num  0 0 0 0 0 0 0 4 6 4 ...

 

issues %>% xts::as.xts()
## Error in as.POSIXlt.character(x, tz, ...):  文字列は標準的な曖昧さのない書式にはなっていません

 
エラーになってしまいます。このような場合は、一度、zooクラスに変換してからxtsクラスに変換します。

issues %>% 
  zoo::read.zoo() %>% 
  xts::as.xts() %>% str()
## An 'xts' object on 2013-04-01/2018-06-07 containing:
##   Data: num [1:1894, 1] 0 0 0 0 0 0 0 4 6 4 ...
##   Indexed by objects of class: [Date] TZ: UTC
##   xts Attributes:  
##  NULL

 
エラーなく変換できましたので、先ほどと同様に可視化してみます。
 

issues %>% 
  zoo::read.zoo() %>% 
  xts::as.xts() %>% 
  dygraphs::dygraph(main = "Redmine Ticket Open") %>% 
  dygraphs::dyRangeSelector()

 
データフレーム型は変換によりxtsクラスに変換できますので、データを整理する間はデータフレーム型で、時系列データとして扱う際にはxtsクラスでと使い分けることで柔軟な分析が可能になります。