R時間序列分析(4):季節性的視覺化探索
(本文首發於個人公眾號“資料與平行世界”,歡迎關注!)
在本系列的第一篇文章中,我們提到,時間序列資料往往具有如下特徵:趨勢性、週期性和季節性。如何識別這些特徵,並將它們作為獨立的成分從序列中分解出來,是時間序列分析的一個主要任務。本篇主要介紹兩個新的R包:
feasts
和
TSstudio
,並利用它們提供的圖形方法對季節性特徵進行探索。
1、季節性
單重季節模式:序列中只有一種佔主導的季節模式
多重季節模式:在序列中存在不止一種佔主導的季節模式(也就是說,在序列的多種頻率上都可以觀察到季節模式)
我們使用
TSstudio
包的
USgas
資料來說明單重季節模式,這個資料集記錄了2000-2019年間美國天然氣的月度消費資料:
###本篇用到的R包
library(TSstudio)
library(tidyverse)
library(UKgrid)
library(tsibble)
library(feasts)
library(lubridate)
##USgas資料集
data(USgas)
ts_info(USgas)
## The USgas series is a ts object with 1 variable and 238 observations
## Frequency: 12
## Start time: 2000 1
## End time: 2019 10
##轉換為tsibble
USgas_tsbl<-as_tsibble(USgas)
##視覺化:圖1-圖2
USgas%>%ts_plot()
USgas_tsbl%>%autoplot()
圖1
圖2
可以看到,
USgas
這個資料集是一個頻率為月的ts物件。我們可以將它轉換為tsibble物件
USgas_tsbl
。從圖1/圖2可見,這個序列中存在明顯的季節性:冬季是天然氣的消費高峰,夏季則是消費低谷。
繪製這個時間序列的圖形,我們給出了兩種方式:(1)來自
TSstudio
包的
ts_plot()
,它可以對ts、xts和資料框等物件進行操作,執行這個函式可以在瀏覽器中生成互動的時間序列影象。對於時間序列資料,互動式圖形起到的作用更為重要,可以讓我們觀察到時間隨發展變化的每一個過程。
TSstudio
包以視覺化工具plotly為基礎,提供了關於時間序列的多種互動視覺化方法。(2)
feasts
包的
autoplot()
函式,它對tsibble物件進行操作,執行這個函式可以生成ggplot2風格的時間序列影象。
feasts
的意思是“
Feature Extraction And Statistics for Time Series
”(時間序列的特徵提取和統計)。
feasts
、
tsibble
以及
fable
這三個R包組成了以tsibble物件為基礎的完整的時間序列分析系統,是我們這個系列文章主要使用的工具。
對於多重季節模式,我們使用的資料示例是
UKgrid
包的
UKgrid
資料集。這個資料集記錄了英國高壓電輸電網路網路全國需求,資料自2011年起,以半小時為頻率。這個資料集是個資料框:
data(UKgrid)
head(UKgrid)###結果略
###轉換為tsibble
UKgrid_tsbl1<-as_tsibble(UKgrid)
###圖3
UKgrid_tsbl1%>%
select(TIMESTAMP,ND)%>%
ts_plot()
###下圖略
UKgrid_tsbl1%>%autoplot(ND)
圖3
這個資料集總共有254592個觀測和9個變數(其中
TIMESTAMP
是半小時頻率的時間戳),我們選取其中的變數
ND
(全國需求)。由圖3可見,在月的頻率上,
UKgrid
存在著明顯的季節性(冬季高峰,夏季低谷)。事實上,後面我們可以看到,
UKgrid
在小時、星期和月的頻率上都存在季節性。
2、feasts::gg_season()
feasts
包提供了一個用於描繪序列季節性的函式
gg_season()
。這種季節圖是ggplot2風格的,與常見的時間序列圖相似,只是x軸顯示的是每個季節內的資料。這種型別的圖可以更清楚地看到潛在的季節性格局,特別有助於確定格局變化的年份:
###圖4
USgas_tsbl%>%
gg_season(value,labels=“both”)
###圖5
UKgrid_tsbl1%>%
gg_season(ND, period=“week”) +
theme(legend。position = “none”)
圖4
圖5
gg_season()
按指定的時期(引數
period
,預設為
year
,對應頻率為月)繪製時間序列圖,不同年份用不同的顏色表示。
labels
引數確定年份的標記方式,
labels=both
會在圖中標記年份。從圖四可見,
USgas
的季節性:冬季高峰,夏季低谷。圖五將時期限定為一週,可以看到
UKgrid
在一週內也存在季節性:工作日需求高,週末需求低。
feasts
包還提供了函式
gg_subseries()
,採用分片的方式,對每個季節繪製一個子圖:
###圖6
USgas_tsbl%>%
gg_subseries(value)
###圖7
UKgrid_tsbl1%>%
index_by(year_month=~yearmonth(。))%>%
summarise(ND_avg=mean(ND,na。rm=T))%>%
gg_subseries(ND_avg,label=“both”)
圖6
圖7
分別對兩個資料集繪製了按月分片季節子圖。圖6和圖7表達的含義是相同的,即對應分片的每個月的資料在各個年份的表現。由於UKgrid的觀測過多,我們採用了按月彙總取均值的方式(
index_by()+summarise()
)得到每個月的資料(該月的半小時平均電力需求)。除了季節性之外,這兩個圖也表現出了趨勢性:美國的天然氣需求是持續增加的(圖6),英國高壓電網的電力需求是在持續下降的(圖7)。
3、TSstudio::ts_seasonal()
TSstudio
包中有多個描繪季節性的互動圖形。
ts_seasonal()
給出了季節圖。
ts_heatmap()
給出了日曆熱圖。
ts_quantile()
給出了時間序列的分位數圖(25%/50%/75%的分位數)。所有這些圖,都是在瀏覽器中互動展示的。
TSstudio
目前還不支援tsibble物件,可以透過的
tsibble
包的
as。ts()
將tsibble物件轉換為ts物件:
###ts_seasonal-圖8
ts_seasonal(USgas,type=“all”)
###ts_seasonal-圖略
UKgrid_tsbl1%>%
index_by(year_month=~yearmonth(。))%>%
summarise(ND_avg=mean(ND,na。rm=T))%>%
as。ts()%>%
ts_seasonal()
###ts_heatmap()-圖9
ts_heatmap(USgas,color=“Reds”)
###ts_quantile-圖10
UKgrid%>%
ts_quantile(period=“monthly”,n=2)
圖8
圖9
圖10
我們可以看到,
ts_seasonal()
的表現效果比
gg_season()
要好(圖8)。這個函式提供了三種圖形,根據引數
type
進行選擇,
type=all
就是將三種圖形同時畫出來。
ts_seasonal()
支援展示日、月和季度頻率。
4、密度圖
季節模式可以直接透過觀測資料來體現,也可以透過對觀測資料進行適當的聚合或彙總統計進行體現。比如說,透過密度圖(或直方圖)以分片的方式將時間頻率單元的機率分佈展示出來,可以直觀地觀察這些分佈的異同,這也是一種探索時間序列資料季節性模式的方法。
ggplot2
包的
geom_density()
是一種常用的繪製密度圖的方法:
###圖11
USgas_tsbl%>%
mutate(month=month(index,label=T))%>%
ggplot(aes(x =value)) +
geom_density(aes(fill = month)) +
facet_grid(month~。)+
#facet_grid(rows = vars(as。factor(month)))+
theme(legend。position = “none”,
axis。text。y=element_blank())
###將UKgrid資料集按小時聚合,並繪製密度圖(圖略)
UKgrid_tsbl2<-UKgrid%>%
as_tsibble()%>%
index_by(hour=~floor_date(。,“hour”))%>%
summarise(ND_hour=sum(ND,na。rm=T))
UKgrid_tsbl2%>%
mutate(hour1=hour(hour))%>%
ggplot(aes(x =ND_hour)) +
geom_density(aes(fill = hour1)) +
scale_fill_viridis_c()+
facet_grid(hour1~。)+
theme(legend。position = “none”,
axis。text。y=element_blank())
圖11
對
USgas
資料集,我們繪製了每個月的密度圖(圖11)。雖然在長達二十年的時間中,每個月的需求都是不同的,但是我們將每一個月份的觀測資料以機率密度的形式表現出來,其中反映出來的天然氣需求的季節性變化可能比上面介紹的季節圖更鮮明。對
UKgrid
資料集,我們首先將原始的半小時資料聚合成小時的資料,然後繪製24個小時的密度圖(圖略),可以看到在24個小時內,電力需求也是存在著季節性的(白天高峰,夜間低谷)。