Wstęp

W nieniejszej pracy chciałbym przyjrzeć się wygodnym i uzytecznym metodom wizualizacji szeregów czasowych. Często ich przedstawienie może sprawiać wiele problemów, więc warto skorzystać z nowych metod.

Instalacja pakietów, przygotowanie danych

Poniżej przedstawiono wyjątkowo użeteczny sposób instalacji i ładowania wymaganych pakietów, jakich bedziemy używać w tym projekcie.

requiredPackages = c("readr","forecast", "ggplot2", "dygraphs", "highcharter") # list of packages add new packages and run the code 
for(i in requiredPackages) {if(!require(i,character.only = TRUE)) install.packages(i)} 
for(i in requiredPackages) {library(i,character.only = TRUE)}

Następnie zaimportujemy dane wybrane dla tego projektu. Są to miesięczne dane produkcji energii elektrycznej w Finlandii, dostepne w bazie danych Eurostat.

library(readr)
energyproduction_monthly_finland <- read_delim("energyproduction_monthly_finland.csv", 
    ";", escape_double = FALSE, col_types = cols(value = col_number()), 
    trim_ws = TRUE)
View(energyproduction_monthly_finland)

Aby dokonać analizy zadeklarujemy nasze dane jako szereg czasowy nazwany tutaj examplets.

examplets <-ts(energyproduction_monthly_finland$value,
               start=2008,frequency=12)

Jak widać bazowo oferowany wykres może zostać poprawiony i uzupełniony dodatkowymi funkcjami. Dodatkowo, aby przedstawić możliwości wizualizacji prognoz zostanie zrobiona prognoza przy użyciu Modelu Sieci Neuronowej (Neural Network Model)

nnmodel <-nnetar(examplets)
nnmodel_forecast <-forecast(nnmodel,h=36,PI=T)

Poniżej został przedstawiony automatyczny wykres oferowany przez pakiet ggplot2. Jest czytelny jednakże można go jeszcze poprawić i uzyskać ciekawsze efekty.

autoplot(nnmodel_forecast)

W tym celu trzeba najpierw zadeklarować potrzebne dane, tutaj umieszczone końcowo w graph_data.

data <- nnmodel_forecast$x
lower <- nnmodel_forecast$lower[,2]
upper <- nnmodel_forecast$upper[,2]
pforecast <- nnmodel_forecast$mean
graph_data <- cbind(data, lower, upper,
                pforecast)

Teraz można narysować podstawowy interaktywny wykres prezentujacy zarówno szereg czasowy jak i jego prognozę.

dygraph(graph_data, main = "Produkcja energii elektrycznej w Finlandii") %>% 
  dyRangeSelector() %>% 
  dySeries(name = "data", label = "Produkcja energii") %>%
  dySeries(c("lower","pforecast","upper"), label = "Prognoza") %>%
  dyLegend(show = "always", hideOnMouseOut = FALSE) %>%
  dyAxis("y", label = "Miesięczna produkcja w GWh") %>%
  dyHighlight(highlightCircleSize = 5,
              highlightSeriesOpts = list(strokeWidth = 2)) %>%
  dyOptions(axisLineColor = "navy", gridLineColor = "grey")

Do wykresu warto dodać oznaczenia chociażby dwóch wykrytych obserwacji odstających.

dygraph(graph_data, main = "Produkcja energii elektrycznej w Finlandii") %>% 
  dyRangeSelector() %>% 
  dySeries(name = "data", label = "Produkcja energii") %>%
  dySeries(c("lower","pforecast","upper"), label = "Prognoza") %>%
  dyLegend(show = "always", hideOnMouseOut = FALSE) %>%
  dyAxis("y", label = "Miesięczna produkcja w GWh") %>%
  dyHighlight(highlightCircleSize = 5,
              highlightSeriesOpts = list(strokeWidth = 2)) %>%
  dyOptions(axisLineColor = "navy", gridLineColor = "grey") %>%
  dyAnnotation("2010-1-1", text = "AO", tooltip = "Additive Outlier 1", attachAtBottom = T, width=30) %>%
  dyAnnotation("2010-12-1", text = "AO", tooltip = "Additive Outlier 2",attachAtBottom = T, width=30)

Choć może na tym troszke ucierpieć czytelnośc wykresu w tym przypadku łatwo wysunać hipotezę, iż sezonowść produkcji energii elektrycznej wynika z potrzeb ogrzewania budynków w trakcie zimniejszych miesiący. Przy pomocy bardzo prostego narzędzia można to łatwo zwizualizować na wykresie.

month <- rep(c(1,1,0,0,0,0,0,0,0,0,1,1), times = 15)
#oznaczenie miesiecy zimowych
dygraph(graph_data, main = "Produkcja energii elektrycznej w Finlandii") %>% 
  dyRangeSelector() %>% 
  dySeries(name = "data", label = "Produkcja energii", strokeWidth=3, color="green") %>%
  dySeries(c("lower","pforecast","upper"), label = "Prognoza", strokeWidth=3, color="red") %>%
  dyLegend(show = "always", hideOnMouseOut = FALSE) %>%
  dyAxis("y", label = "Miesięczna produkcja w GWh") %>%
  dyHighlight(highlightCircleSize = 5,
              highlightSeriesOpts = list(strokeWidth = 2)) %>%
  dyRibbon(data=month, palette= c("#efefef","#95A8F8") )

Dzieki czemu wyraźnie teraz widzimy, że wieksze wartości znajdują się w odpowiednio pokolorowanych miesiącach zimowych. Widać ogromną różnice pomiędzy automatycznymi wykresami prezentowanymi na początku, wykres można łatwo dopasować do wiekszości potrzeb i stworzyć bardzo ciekawe wizualizacje. Szczególną cechą tego pakietu jest bardzo proste uzyskiwanie interaktywnego wykresu, który na bierząco pokazuje wartości szeregu czasowego zgodnie z położeniem myszki, czy dla wiekszej czytelności podświetla obszar prognozy. Także znajdujący się na dole obrazka suwak pozwalający na płynną zmianę wyswietlanego okresu zdecydowanie zwieksza uzyteczność tego pakietu.

Pakiet highcharter

Dodatkowe opcje, szczególnie w zakresie wygodnego przybliżania wykresu oferuje pakiet higcharter, jest także wyposażony w wiele gotowych motywów i pozwala uzyskać wykres robiący spore wrażenie zaledwie kilkoma linijkami kodu. Poniżej prezentacja omawianego szeregu czasowego, bez uwzględnienia jego prognozy.

highchart(type="stock") %>%
  hc_add_series(examplets, type="line")%>%
  hc_title(text = "Szereg czasowy sezonowy") %>% 
  hc_subtitle(text = "Produkcja energii elektyrcznej w Finlandii") %>% 
  hc_xAxis(title = list(text = "Data")) %>% 
  hc_yAxis(title = list(text = "Miesięczna produkcja GWh")) %>% 
  hc_add_theme(hc_theme_darkunica())

Podsumowanie

Wizualizacja danych z pewnością stanowiduże wyzwanie, w tym także czytelnego przedstawiania szeregó czasowych, jednak dwa powyżej przedstawione pakiety oferujace interaktywne wykresy z pewnością ułatwiają to zadanie. Pozwalają na uzyskanie bardzo ładnych wykresów przy użyciu zaledwie kilku linijek kodu, ich poznanie jest z pewnością niezwykle przydatne.