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.
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.
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())
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.