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
クラスに変換するには一工夫が必要な場合があります。例えば、以下のようなチケットデータの集計データを変換してみます。
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
クラスでと使い分けることで柔軟な分析が可能になります。