Como visualizar dados de série temporal: previsão arrumada em R

cupom com desconto - o melhor site de cupom de desconto cupomcomdesconto.com.br


[This article was first published on business-science.io, and kindly contributed to R-bloggers]. (Você pode relatar problemas sobre o conteúdo desta página aqui)


Quer compartilhar seu conteúdo em R-bloggers? clique aqui se você tiver um blog, ou aqui se não tiver.

Interessado em mais tutoriais de séries temporais? Saiba mais dicas R:

👉 Registre-se em nosso blog para obter novos artigos assim que os lançarmos.


Plote dados de série temporal usando o fpp2, fpp3, e timetk estruturas de previsão.

1.1. Introdução

Há vários pacotes de previsão escritos em R para escolher, cada um com seus prós e contras.

Por quase uma década, o forecast pacote tem sido uma estrutura sólida para previsão de séries temporais. No entanto, no ano passado, uma versão oficial atualizada foi lançada com o nome fable que agora segue métodos organizados em oposição à base R.

Leia Também  O que e quem é a comunidade de TI? O que é preciso para fazer parte?

Mais recentemente, modeltime foi lançado e também segue métodos organizados. No entanto, é estritamente usado para modelagem. Para manipulação e visualização dos dados, será utilizado o pacote de horários, que é escrito pelo mesmo autor que modeltime.

A seguir está uma comparação de código de várias visualizações de série temporal entre essas estruturas: fpp2, fpp3 e timetk.

Algumas coisas para ter em mente:

  • Apenas o código essencial foi fornecido
  • Código não essencial, como títulos e temas de enredo, foi excluído
  • Todos os gráficos utilizam o tema Business Science ggplot
# Load libraries
library(fpp2)         # An older forecasting framework
library(fpp3)         # A newer tidy forecasting framework
library(timetk)       # An even newer tidy forecasting framework
library(tidyverse)    # Collection of data manipulation tools
library(tidyquant)    # Business Science ggplot theme
library(cowplot)      # A ggplot add-on for arranging plots
  • O objeto ts de base é usado por forecast E fpp2
  • O objeto tsibble especial é usado por fable E fpp3
  • O objeto tibble padrão é usado por timetk E modeltime

2.1 Carregar dados de série temporal

Para as próximas visualizações, utilizaremos um conjunto de dados contendo valores de produção trimestrais de certas commodities na Austrália.

# Quarterly Australian production data as tibble
aus % as_tibble()
# Check structure
aus %>% str()

Sempre verifique a classe de seus dados de série temporal.

2.2 Método fpp2: do tibble ao ts

# Convert tibble to time series object
aus_prod_ts % tail()

2.3 Método fpp3: De ts a tsibble

2.3.1 Pivô Amplo

# Convert ts to tsibble and keep wide format
aus_prod_tbl_wide %    # TS object
  as_tsibble(index = "index",           # Set index column
             pivot_longer = FALSE)      # Wide format

2.3.2 Pivô Longo

# Convert ts to tsibble and pivot to long format
aus_prod_tbl_long %    # TS object
  as_tsibble(index = "index",           # Set index column
             pivot_longer = TRUE)       # Long format

2.4 Método de cronograma: De tsibble / ts para tibble

2.4.1 Pivô Amplo

# Convert tsibble to tibble, keep wide format
aus % 
    tk_tbl() %>%
    mutate(Quarter = as_date(as.POSIXct.Date(Quarter)))

Solução alternativa para problemas de indexação com tsibble e R 4.0 e superior.

Leia Também  Charada: Você pode continuar girando?

2.4.2 Pivô Longo

# Quarterly Australian production data to long format
aus_long % 
    rename(date = Quarter) %>%
    pivot_longer(
        cols = c("Beer","Tobacco","Bricks",
                 "Cement","Electricity","Gas"))

Ao analisar gráficos de série temporal, procure os seguintes padrões:

  • Tendência: Um aumento ou diminuição de longo prazo nos dados; uma “mudança de direção”.

  • Sazonalidade: Um padrão sazonal de um período fixo e conhecido. Se a frequência for imutável e associada a algum aspecto do calendário, o padrão é sazonal.

  • Ciclo: Um padrão de subida e descida que não tem uma frequência fixa. Se as flutuações não forem de frequência fixa, elas serão cíclicas.

  • Sazonal vs Cíclico: Os padrões cíclicos são mais longos e variáveis ​​do que os padrões sazonais em geral.

3.1 Método fpp2: Plotar várias séries nos mesmos eixos

# Using fpp2
aus_prod_ts %>%               # TS object
  autoplot(facets=FALSE)      # No facetting

3.2 Método fpp3: Plotar várias séries nos mesmos eixos

# Using fpp3
aus_prod_tbl_long %>%    # Data in long format
  autoplot(value) 

3.3 Método ggplot: Plotar várias séries nos mesmos eixos

Observe que a plotagem de vários gráficos nos mesmos eixos não foi implementada em timetk. Usar ggplot.

# Using ggplot
aus_long %>%
    ggplot(aes(date, value, group = name, color = name)) +
    geom_line()

3.4 Método fpp2: Plotar várias séries em eixos separados

# Using fpp2
aus_prod_ts %>%  
  autoplot(facets=TRUE)   # With facetting

Gráfico facetado com fpp2

3.5 Método fpp3: Plotar várias séries em eixos separados

# Using fpp3
aus_prod_tbl_long %>%
  ggplot(aes(x = index, y = value, group = key)) + 
  geom_line() + 
  facet_grid(vars(key), scales = "free_y")   # With facetting

Gráfico facetado com fpp3

3.6 Método de cronograma: Plotar várias séries em eixos separados

# Using timetk
aus_long %>% 
    plot_time_series(
        .date_var = date,
        .value = value,
        .facet_vars = c(name), # Group by these columns
        .color_var = name, 
        .interactive = FALSE,
        .legend_show = FALSE
    )

Gráfico facetado com calendáriok

Use gráficos sazonais para identificar os períodos de tempo em que os padrões mudam.

4.1 Método fpp2: Plotar temporadas individuais

# Monthly plot of anti-diabetic scripts in Australia 
a1 %
  autoplot() 
# Seasonal plot
a2 % 
  ggseasonplot(year.labels.left = TRUE,   # Add labels
               year.labels = TRUE) 
# Arrangement of plots
plot_grid(a1, a2, ncol=1, rel_heights = c(1, 1.5))

Gráfico sazonal com fpp2

Leia Também  Visualização de casos COVID-19 em Arkansas
cupom com desconto - o melhor site de cupom de desconto cupomcomdesconto.com.br

4.2 Método fpp3: Plotar temporadas individuais

# Monthly plot of anti-diabetic scripts in Australia
a1 %
  as_tsibble() %>%
  autoplot(value)
# Seasonal plot
a2 %
  as_tsibble() %>%
  gg_season(value, labels="both")   # Add labels
# Arrangement of plots
plot_grid(a1, a2, ncol=1, rel_heights = c(1, 1.5))

Gráfico sazonal com fpp3

4.3 Método ggplot: Plotar temporadas individuais

Observe que parcelas sazonais não foram implementadas em timetk. Use o ggplot para escrever:

# Convert ts to tibble
a10_tbl %
    tk_tbl()
# Monthly plot of anti-diabetic scripts in Australia 
a1 % 
    plot_time_series(
        .date_var = index,
        .value    = value,
        .smooth   = TRUE,
        .interactive = FALSE,
        .title = "Monthly anti-diabetic scripts in Australia"
    )
# New time-based features to group by
a10_tbl_add % 
    mutate( 
        month = factor(month(index, label = TRUE)),  # Plot this
        year = factor(year(index))  # Grouped on y-axis
    )
# Seasonal plot
a2 %
    ggplot(aes(x = month, y = value, 
               group = year, color = year)) + 
    geom_line() + 
    geom_text(
        data = a10_tbl_add %>% filter(month == min(month)),
        aes(label = year, x = month, y = value),
        nudge_x = -0.3) + 
    geom_text(
        data = a10_tbl_add %>% filter(month == max(month)),
        aes(label = year, x = month, y = value),
        nudge_x = 0.3) + 
    guides(color = FALSE)
# Arrangement of plots
plot_grid(a1, a2, ncol=1, rel_heights = c(1, 1.5))

Gráfico sazonal com ggplot

Use plotagens de subséries para visualizar as mudanças sazonais ao longo do tempo.

5.1 Método fpp2: Plotar subséries nos mesmos eixos

# Monthly beer production in Australia 1992 and after
beer_fpp2 %
  window(start = 1992)    
# Time series plot
b1 % 
  autoplot() 
# Subseries plot
b2 % 
  ggsubseriesplot() 
# Plot it
plot_grid(b1, b2, ncol=1, rel_heights = c(1, 1.5))

A subsérie plota nos mesmos eixos usando fpp2

5.2 Método fpp3: Plotar subséries em eixos separados

# Monthly beer production in Australia 1992 and after
beer_fpp3 %
  as_tsibble() %>%
  filter(lubridate::year(index) >= 1992)
# Time series plot
b3 % 
  autoplot(value) 
# Subseries plot
b4 %
  gg_subseries(value) 
# Plot it
plot_grid(b3, b4, ncol=1, rel_heights = c(1, 1.5))

A subsérie plota nos mesmos eixos usando fpp3

5.3 Método de cronograma: Plotar subséries em eixos separados

# Monthly beer production in Australia 1992 and after
ausbeer_tbl %
    tk_tbl() %>%
    filter(year(index) >= 1992) %>%
    mutate(index = as_date(index))
# Time series plot
b1 %
    plot_time_series(
        .date_var = index,
        .value    = value,
        .interactive = FALSE
    )
# Subseries plot
b2 %
    mutate(
        quarter = str_c("Quarter ", as.character(quarter(index)))
    ) %>%
    plot_time_series(
        .date_var = index,
        .value = value,
        .facet_vars = quarter,
        .facet_ncol = 4, 
        .color_var = quarter, 
        .facet_scales = "fixed",
        .interactive = FALSE,
        .legend_show = FALSE
    )
# Plot it
plot_grid(b1, b2, ncol=1, rel_heights = c(1, 1.5))

A subsérie representa nos mesmos eixos usando o cronogramak

Use gráficos de latência para verificar a aleatoriedade.

6.1 Método fpp2: Plotar atrasos múltiplos

# Plot of non-seasonal oil production in Saudi Arabia
o1 %
  autoplot()
# Lag plot of non-seasonal oil production
o2 

Lag plots usando fpp2

6.2 Método fpp3: Plotar atrasos múltiplos

# Plot of non-seasonal oil production
o1 %
  as_tsibble() %>%
  autoplot(value)
# Lag plot of non-seasonal oil production
o2 %
  as_tsibble() %>%
  gg_lag(y=value, geom = "point") 
# Plot it
plot_grid(o1, o2, ncol=1, rel_heights = c(1,2))

Lag plots usando fpp3

6.3 Método de cronograma (Hack?): Traçar Múltiplos Lags

# Convert to tibble and create lag columns
oil_lag_long %
    tk_tbl(rename_index = "year") %>%
    tk_augment_lags(      # Add 9 lag columns of data
        .value = value, 
        .names = "auto", 
        .lags = 1:9) %>%
    pivot_longer(         # Pivot from wide to long
        names_to = "lag_id", 
        values_to = "lag_value", 
        cols = value_lag1:value_lag9)  # Exclude year & value

Agora você pode representar graficamente o valor vs lag_value

# Time series plot
o1 %
    tk_tbl(rename_index = "year") %>%  
    mutate(year = ymd(year, truncated = 2L)) %>%  
    plot_time_series(
        .date_var = year, 
        .value = value,
        .interactive = FALSE)
# timetk Method: Plot Multiple Lags
o2 %
    plot_time_series(
        .date_var = value,     # Use value instead of date
        .value = lag_value,    # Use lag value to plot against
        .facet_vars = lag_id,  # Facet by lag number
        .facet_ncol = 3,
        .interactive = FALSE, 
        .smooth = FALSE,
        .line_alpha = 0,      
        .legend_show = FALSE,
        .facet_scales = "fixed"
        ) + 
    geom_point(aes(colour = lag_id)) + 
    geom_abline(colour = "gray", linetype = "dashed") 
# Plot it
plot_grid(o1, o2, ncol=1, rel_heights = c(1,2))

Gráficos de atraso usando cronogramak

A função de autocorrelação mede a relação linear entre os valores defasados ​​de uma série temporal. A função de autocorrelação parcial mede a relação linear entre as correlações dos resíduos.

ACF

  • Visualiza o quanto o valor mais recente da série está correlacionado com os valores anteriores da série (atrasos)
  • Se os dados têm uma tendência, então as autocorrelações para pequenos atrasos tendem a ser positivas e grandes porque as observações próximas no tempo também são próximas em tamanho
  • Se os dados forem sazonais, as autocorrelações serão maiores para defasagens sazonais em múltiplos de frequência sazonal do que outras defasagens

PACF

  • Visualiza se certos atrasos são bons para modelagem ou não; útil para dados com um padrão sazonal
  • Remove a dependência de atrasos em outros atrasos usando as correlações dos resíduos

7.1 Método fpp2: Plotar ACF + PACF

# ACF plot 
o1 

As autocorrelações são grandes em defasagens sazonais? As defasagens mais recentes estão acima do limite de ruído branco?

7.2 Método fpp3: Plotar ACF + PACF

# Convert to tsibble
oil_tsbl % as_tsibble()
# ACF Plot
o1 %
  ACF(lag_max = 20) %>%
  autoplot()
# PACF Plot
o2 %
  PACF(lag_max = 20) %>%
  autoplot() 
# Plot both
plot_grid(o1, o2, ncol = 1)

As autocorrelações não são grandes em defasagens sazonais, portanto, esta série não é sazonal. As defasagens mais recentes mostram que existe uma tendência.

7.3 Método de cronograma: Plotar ACF e PACF

# Using timetk
oil %>%
    tk_tbl(rename_index = "year") %>%
    plot_acf_diagnostics(
        .date_var = year,
        .value    = value,
        .lags     = 20,
        .show_white_noise_bars = TRUE, 
        .interactive = FALSE
    )

O ACF mostra que as defasagens mais recentes estão acima das barras de significância do ruído branco, denotando uma tendência. PACF mostra que incluir o lag 1 seria bom para fins de modelagem.

Como acontece com todas as coisas na vida, existem lados bons e ruins em usar qualquer uma dessas três estruturas de previsão para visualizar séries temporais. Todos os três têm funcionalidade semelhante no que diz respeito às visualizações.

8,1 fpp2

  • Código requer parâmetros mínimos
  • Usa o formato de basets
  • Usa ggplot para visualizações
  • Principalmente incompatível com o tidyverse para manipulação de dados
  • Não é mais mantido, exceto para correção de bugs

8,2 fpp3

  • Código requer parâmetros mínimos
  • Usa formato tsibble proprietário com ferramentas especiais de indexação
  • Usa ggplot para visualizações
  • Principalmente compatível com o tidyverse para manipulação de dados; tsibble pode causar problemas
  • Atualmente mantido

8,3 cronogramak

  • O código requer vários parâmetros, mas fornece mais granularidade
  • Usa o formato de tabela padrão
  • Usa ggplot e plotly para visualizações
  • Totalmente compatível com tidyverse para manipulação de dados
  • Atualmente mantido

Autor: Joon Im

Joon é um cientista de dados com R e Python, com ênfase em técnicas de previsão – LinkedIn.



cupom com desconto - o melhor site de cupom de desconto cupomcomdesconto.com.br