Você está na página 1de 18

Usando o R para ensinar Ajuste Sazonal

Pedro G. C. Ferreira
Instituto Brasileiro de Economia (FGV|IBRE)

Daiane M. de Mattos
Instituto Brasileiro de Economia (FGV|IBRE)

Palavras-chave: Ajuste Sazonal; X13-ARIMA-SEATS; R; RStudio.

Resumo

O artigo mostra como dessazonalizar séries temporais utilizando X-13ARIMA-SEATS com


interface no software R fazendo uso do pacote seasonal desenvoldido por Christoph Sax.
Além de apresentar o passo-a-passo do ajuste sazonal, mostra-se também como analisar cada
output retornado pelo programa e fazer previsões da série original e da série com ajuste
sazonal. O método é aplicado à série temporal do índice de produção industrial geral do Brasil
em que se verificou que inserir o efeito do carnaval, da Páscoa e de dias úteis melhoram a
qualidade do ajuste.

1. Introdução

Uma série temporal, segundo a decomposição clássica, pode ser decomposta em quatro
componentes não observáveis: tendência, sazonalidade, ciclo e erro. A sazonalidade, objeto
de estudo deste artigo, é causada por movimentos oscilatórios de mesma periodicidade que
ocorrem em período intra-anual, como variações climáticas, férias, feriados, entre outros.

A ocorrência desses eventos pode levar a conclusões inadequadas a respeito da série temporal
em estudo. Por exemplo, a oferta de emprego costuma aumentar, no final do ano, devido às
festas natalinas, isto é, há uma demanda maior por bens e serviços, elevando o nível de
contratações de pessoas. Porém, como a maioria das vagas é temporária, geralmente, há
diminuição no nível de pessoal ocupado no período seguinte. Para a análise econômica, o
importante é detectar a diferença entre o que periodicamente ocorre e o que de fato ocorre de
diferente naquele período específico, possibilitando observar a tendência e o ciclo da
variável.

A remoção da sazonalidade de uma série temporal é chamada de ajuste sazonal ou


dessazonalização. Neste artigo será apresentada, de uma maneira simples, como removê-la
utilizando ferramentas acessíveis a qualquer usuário, avançado ou não.

1
O tutorial será explicado utilizando o software R (R Core Team, 2015). Por isso é indicado
que o usuário já tenha feito algum primeiro contato com o programa. Indicamos alguns
materiais que podem ser úteis para esse propósito: An Introduction to R (R Core Team,
2015); R in a Nutshell (Adler, 2009); A First Course in Statistical Programming with R
(Braun & Murdoch, 2008); Introductory Statistics with R (Dalgaard, 2008); Análise de Séries
Temporais em R – um curso introdutório (Ferreira, Mattos, Almeida, Oliveira, & Pereira,
2016).

Outro programa que será utilizado é o X-13ARIMA-SEATS, desenvolvido pelo U.S. Census
Bureau com o apoio do Banco de España e é mantido pela primeira instituição. É este o
programa que fará o ajuste sazonal e foi implementado no software R por Christoph Sax
(2015).

Para que o alvo deste trabalho seja alcançado, este está dividido da seguinte maneira: na
seção 2, apresenta-se brevemente o programa de ajuste sazonal e os passos sugeridos para
dessazonalização de uma série temporal; tais passos são aplicados no software R na seção 3.
Por fim, na seção 4, tem-se as considerações finais.

2. Metodologia de ajuste sazonal

É importante que o leitor saiba que existem diversas metodologias para dessazonalizar séries
temporais. Podem ser citados como exemplo modelos de regressão com dummies sazonais e
modelos de suavização exponencial. Nesse artigo, no entanto, será utilizado o X-13ARIMA-
SEATS, ou apenas X13 de agora em diante.

O X13 foi desenvolvido pelo U.S. Census Bureau com o apoio do Banco de España. O
programa, criado em julho de 2012, é a junção de outros dois programas de ajuste sazonal
X12-ARIMA (Findley et al, 1998) e TRAMO/SEATS (Gómez & Maravall, 1996). Além de
dessazonalizar séries, o programa oferece diversos diagnósticos com o intuito de avaliar a
qualidade do ajuste sazonal.

Um procedimento contido no X13 que merece destaque é o pré-ajuste da série temporal, isto
é, uma correção antes de ser feito, de fato, o ajuste sazonal. Alguns eventos atípicos e/ou não
sazonais como, por exemplo, efeitos do calendário (trading days, working days, moving
holidays, etc), greves, catástrofes, entre outros, podem afetar a estimação do padrão sazonal
da série temporal e, consequentemente, gerar um ajuste de qualidade inferior. O tratamento
desses eventos (pré-ajuste) deve ser feito, se necessário. Outro procedimento importante do
X13 é a utilização de modelos da classe ARIMA para fazer previsões da série temporal. É

2
fundamental que o modelo seja bem diagnosticado, caso contrário os erros de previsão podem
ser expressivos.

No site dos desenvolvedores do programa (United States Census Bureau, 2015), estão
disponíveis diversos materiais que podem ser úteis para os leitores que desejam se aprofundar
no assunto como, por exemplo o manual do programa: X-13ARIMA-SEATS Reference
Manual Acessible HTML Output (United States Census Bureau, 2015). Outros artigos
recomendados pelos desenvolvedores estão disponíveis em Historical Papers Concerning X-
11 and Seasonal Adjustment (United States Census Bureau, 2015). Porém, aqui serão
apresentados os principais passos para que o leitor consiga fazer, diagnosticar e corrigir um
ajuste sazonal. Os passos são os seguintes:

Análise Gráfica;
1. Execução do X13 no modo automático;
2. Avaliação do ajuste sazonal;
3. Correção de (2) se necessário.
4. Previsão

A análise gráfica de uma série temporal permite visualizar suas características para uma boa
modelagem, por exemplo: seu padrão sazonal, quebras estruturais, possíveis outliers, se há
necessidade (e possibilidade) de usar transformação logarítmica nos dados para estabilizar a
variância, etc. O programa, executado no modo automático, pode conseguir verificar as
características mencionadas anteriormente na análise gráfica e retornar um ajuste de boa
qualidade. Para avaliar a qualidade do ajuste, o X13 oferece algumas ferramentas como testes
para a verificação de sazonalidade, para detecção de autocorrelação e normalidade residual e
gráficos para verificar a estabilidade dos fatores sazonais. Caso em algum diagnóstico haja
falhas, o ajuste pode ser refeito sem considerar as opções automáticas. É importante saber
que o X13 oferece muitas ferramentas de auxílio ao ajuste sazonal, mas nem todas serão
exploradas aqui.

3. Como fazer o ajuste sazonal no R


Antes do tutorial de como fazer ajuste sazonal com o X13 no R, é fundamental saber que
com o tempo, os pacotes e as funções do R podem ser atualizados e consequentemente não
funcionar da maneira informada neste tutorial. Por isso destacaremos as versões dos
programas e dos pacotes utilizados durante o desenvolvimento do artigo, a começar pela
versão dos programas principais: R versão 3.2.3 e RStudio versão 0.99.491.

3
3.1 Preparação do ambiente de trabalho

Os quatro passos citados na seção 2 são sugeridos para um ajuste sazonal de qualidade. Para
executá-lo no R, no entanto, alguns procedimentos precisam ser executados primeiramente:

1. Definir diretório de trabalho;


2. Baixar arquivo executável do X-13ARIMA-SEATS;
3. Informar o local do arquivo executável baixado em (2);
4. Instalar e carregar pacote seasonal;
5. Verificar se as etapas anteriores foram executadas corretamente;
6. Leitura da série temporal de interesse.

A seguir, o desenvolvimento de cada passo:

1. Definir diretório de trabalho: É nesse local onde ficarão os arquivos necessários para
realizar o ajuste sazonal como a série temporal de interesse e o arquivo executável do X13.
O leitor pode direcionar o diretório para qualquer pasta de interesse. No comando a seguir,
direcionamos o diretório para a pasta work contida na unidade C.
> setwd("C:/work")

2. Baixar X-13-ARIMA-SEATS: O software pode ser encontrado no site do U.S. Census


Bureau. Deve ser baixado e colocado na pasta de diretório de trabalho definida em (1). Para
facilitar, seguindo os comandos abaixo, o usuário pode obter o arquivo sem precisar sair do
R. O arquivo será armazenado no diretório de trabalho especificado anteriormente com o
nome de x13.zip, e em seguida será descompactado. A versão do X13 utilizada aqui é a
versão 1.1.

> download.file("https://www.census.gov/ts/x13as/pc/x13as_V1.1_B19.zip",
+ destfile = "./x13.zip")
> unzip("x13.zip")

Ocasionalmente, novas versões do programa podem ser criadas causando mudanças no link
de download e, consequentemente, o não funcionamento da linha de comando. Vale lembrar
também que não é preciso fazer o download do arquivo sempre que for feito um ajuste
sazonal. Apenas deixe-o em seu diretório de trabalho para futuras utilizações e passe para
etapa seguinte, ignorando esta.

3. Informar o local do arquivo executável baixado em (2): O arquivo x13as.exe é que de


fato faz o ajuste sazonal. É necessário informar o seu caminho ao R.

> local <- paste0(getwd(), "/x13as")


> Sys.setenv(X13_PATH = local)

4
4. Instalar e carregar pacote seasonal: Christoph Sax (2015) desenvolveu o pacote
seasonal que executa o X-13ARIMA-SEATS no R. Em sua página na internet, o autor
apresenta vários exemplos do uso do X13. O pacote deve ser instalado e carregado. A versão
utilizada nesse artigo é a 1.1.0.

> install.packages("seasonal")
> library(seasonal)

5. Verificar se todas as etapas foram executadas corretamente: A função checkX13() do


pacote seasonal permite verificar se será possível a realização do ajuste sazonal. Se os quatro
procedimentos anteriores foram executados de maneira correta, a função retorna uma
mensagem de confirmação e é possível dessazonalizar uma série temporal com o X-
13ARIMA-SEATS no R.

> checkX13()
X-13 installation test:
- X13_PATH correctly specified
- binary executable file found
- command line test run successful
- seasonal test run successful
Congratulations! 'seasonal' should work fine!

seasonal now supports the HTML version of X13, which offers a more
accessible output via the out() function. For best user experience,
download the HTML version from:

http://www.census.gov/srd/www/x13as/x13down_pc.html

and copy x13ashtml.exe to:

C:/work/x13as

6. Leitura da série temporal de interesse: Nesse artigo, a série temporal que será ajustada
é a série de produção industrial do Brasil, divulgada pelo Instituto Brasileiro de Geografia e
Estatística (IBGE, 2015) por meio da Pesquisa Industrial Mensal – Produção Física (PIM-
PF). A série está disponível para download no banco de dados SIDRA da instituição e
representa um índice de base fixa sem ajuste sazonal com base em 2012 = 100. Os dados
variam de jan/2002 a set/2015. Após baixar o arquivo com a série temporal e inseri-lo na
pasta de diretório de trabalho, deve-se lê-lo no R e transformá-lo em um objeto de séries
temporais, como é feito a seguir.
> pim <- read.csv2("pim.csv")
> head(pim)
Data PIM
1 jan/02 72.4
2 fev/02 69.7
3 mar/02 77.4
4 abr/02 79.6
5 mai/02 80.4
6 jun/02 77.5
> pim <- ts(pim[,2], start = c(2002,1), freq = 12)

Uma vez que ambiente de trabalho está preparado, pode-se avançar para os passos de ajuste
sazonal.

5
3.2 Análise Gráfica

Para esboçar, de forma simples, o gráfico de uma série temporal, utiliza-se a função plot().
Outro gráfico que pode ajudar a entender o comportamento de séries temporais é dado pela
função monthplot(). Esse gráfico esboça a série temporal de cada mês do ano, ajudando a
verificar padrões sazonais. Os comandos utilizados para análise gráfica estão a seguir.

# Figura 2
> plot(pim)
> abline(h = seq(70,110,5), v = seq(2002,2016,1), lty = 3, col = "darkgrey")

# Figura 3
> monthplot(pim, labels = month.abb, lty.base = 2)
> legend("topleft", legend = c("pim/month", "average/month"),
+ cex = 0.8, lty = c(1,2), bty = "n")

A análise gráfica da série temporal (Figuras 1 e 2) permite supor que o índice de produção
industrial

a. tem característica sazonal, uma vez que de janeiro a outubro o índice tem
comportamento crescente e nos outros dois meses, decrescente. Esse comportamento
se repete em todos os anos;
b. foi extremamente afetado pela crise econômica no final de 2008. Nota-se que o índice
atingiu um valor discrepante em relação ao comportamento habitual, o que pode ser
entendido como um outlier;
c. tinha uma tendência crescente antes da crise econômica (final de 2008), parece estar
estável (sem crescimento ou quedas expressivas) após tal acontecimento e até o final
de 2013, e mostra queda preocupante a partir de janeiro de 2014;
d. parece ter variação constante, não necessitando que os dados sejam transformados
para estabilizá-la;
e. tem média maior para no mês de outubro que é justificado pelo aquecimento do
mercado devido às comemorações de fim de ano.

Figura 1: Série temporal da produção industrial do Brasil

6
Figura 2: Monthplot - produção industrial do Brasil por mês

3.3 Execução do X13 no modo automático

Após visualizar graficamente o comportamento histórico da série temporal, o próximo passo


é efetuar o ajuste sazonal no modo automático. Em seguida, poderá ser verificado, por
exemplo, se o programa identifica alguns dos meses do final de 2008 como outliers,
conforme vimos na análise gráfica.

Para fazer o ajuste sazonal, usa-se a função seas() do pacote seasonal. A função possui
diversos argumentos, no entanto, como o intuito nessa parte é utilizar o ajuste automático, só
será utilizado o argumento x que indica a série temporal que se pretende dessazonalizar.
> ajuste <- seas(x = pim)

Na etapa a seguir, o ajuste sazonal feito pelo método automático será avaliado.

3.4 Avaliação do ajuste sazonal

A etapa de avaliação do ajuste sazonal consiste em quatro procedimentos básicos:

1. Verificar teste de sazonalidade QS;


2. Diagnosticar pré-ajuste e modelo ARIMA;
3. Verificar indícios de sazonalidade ou efeitos de dias úteis graficamente;
4. Estabilidade do ajuste sazonal;

É fundamental verificar a sazonalidade da série temporal pois séries sem sazonalidade


detectável não devem/podem ser ajustadas e, no caso de séries caracterizadas sazonais, é
esperado que a sazonalidade tenha sido removida após o ajuste sazonal. Embora isso pareça
óbvio, estudos empíricos mostraram que nem todos os ajustes automáticos conseguiram
remover a sazonalidade como era esperado, por isso é extremamente importante verificar o
teste de sazonalidade.

7
O teste de sazonalidade do X13 é dado pela estatística QS. A hipótese nula do teste é de não
haver sazonalidade. Quando a série temporal tem comprimento superior a 8 anos de
informações (como ocorre na série desse estudo), o teste é feito na série completa e nos
últimos 8 anos mais recentes, caso contrário, o teste é feito apenas na série completa. Além
de ser aplicado na série original e na série com ajuste sazonal, o teste também é aplicado
sobre as séries dos resíduos do modelo ARIMA e da componente irregular. Exceto na série
original, espera-se que não haja evidências de sazonalidade em todas as outras séries.

No R, utiliza-se a função qs() do pacote seasonal para obter resultados do teste, como é feito
a seguir.

> qs(ajuste)
qs p-val
qsori 173.70326 0.00000
qsorievadj 253.36540 0.00000
qsrsd 0.02517 0.98750
qssadj 0.00000 1.00000
qssadjevadj 0.00000 1.00000
qsirr 0.00000 1.00000
qsirrevadj 0.00000 1.00000

qssori 93.60663 0.00000


qssorievadj 135.95390 0.00000
qssrsd 0.00000 1.00000
qsssadj 0.00144 0.99928
qsssadjevadj 0.00000 1.00000
qssirr 0.00000 1.00000
qssirrevadj 0.00000 1.00000

Como se pode observar, ao considerar nível de confiança de 95%, não há evidências de


sazonalidade nas séries dessazonalizada, dos resíduos do modelo ARIMA e da componente
irregular, e há evidências de sazonalidade para a série original. Tais resultados são
semelhantes para o teste aplicado nos 8 anos mais recentes (segunda parte do output da
função qs()1).

O próximo passo é diagnosticar o pré-ajuste e o modelo ARIMA. Para isso, utiliza-se a


função summary().

> summary(ajuste)

Call:
seas(x = pim)

Coefficients:
Estimate Std. Error z value Pr(>|z|)
Mon 0.0056111 0.0022705 2.471 0.01346 *
Tue 0.0061464 0.0022688 2.709 0.00675 **
Wed 0.0012275 0.0022072 0.556 0.57811

1
qsori: original; qsorievadj: original corrigida por valores extremos; qsrsd: resíduos do modelo ARIMA;
qssadj: série temporal com ajuste sazonal; qssadjevadj: série temporal com ajuste sazonal corrigida por
valores extremos; qsirr: componente irregular; qsirrevadj: componente irregular corrigida por valores
extremos.

8
Thu 0.0053846 0.0022462 2.397 0.01652 *
Fri 0.0006303 0.0022272 0.283 0.77719
Sat -0.0002697 0.0022575 -0.119 0.90491
Easter[1] -0.0245531 0.0042930 -5.719 1.07e-08 ***
LS2008.Dec -0.1332041 0.0181144 -7.353 1.93e-13 ***
AO2011.Feb 0.0596638 0.0126875 4.703 2.57e-06 ***
AO2014.Feb 0.0608561 0.0132069 4.608 4.07e-06 ***
MA-Seasonal-12 0.6857542 0.0666806 10.284 < 2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

SEATS adj. ARIMA: (0 1 0)(0 1 1) Obs.: 165 Transform: log


AICc: 646.8, BIC: 680.8 QS (no seasonality in final): 0
Box-Ljung (no autocorr.): 23.03 Shapiro (normality): 0.9833 *

Messages generated by X-13:


Warnings:
- At least one visually significant trading day peak has been
found in one or more of the estimated spectra.

O output da função summary() aponta que no pré-ajuste foram utilizadas variáveis de


calendário como Páscoa (Easter[1]) e dias da semana (Mon, Tue, etc), e tais variáveis possuem
efeitos significativos ao considerar nível de significância de 5%. Mesmo que somente
algumas variáveis de dias da semana sejam significativas, isso sugere que a quantidade de
dias da semana no mês influencia na produção industrial do Brasil. No entanto, é preciso
saber que as variáveis de calendário relacionadas aos dias da semana não foram construídas
levando em conta o calendário brasileiro e, portanto, precisam ser modificadas.

Também foram detectados outliers: um outlier level shift no mês de dezembro de 2008
(LS2008.Dec), mês extremamente afetado pela crise econômica, e outros dois outliers
aditivos, não esperados visualmente pela análise gráfica, em fevereiro de 2011 e 2014
(AO2011.Feb e AO2014.Feb). Os três outliers possuem efeitos significativos ao considerar nível
de significância de 5%. Para o leitor que deseja estender o conhecimento sobre tipos de
outliers aceitos no X13, indicamos a leitura do módulo sobre outliers no curso teórico de
ajuste sazonal da Eurostat (2015).

O modelo ARIMA estimado é da ordem (0 1 0)(0 1 1), e o parâmetro MA sazonal é


significativo. De acordo com o teste de autocorrelação de Ljung-Box, não há evidências de
autocorrelação residual para o modelo ARIMA estimado. O teste de normalidade de Shapiro-
Wilk sugere não normalidade, no entanto essa não é uma característica extremamente
necessária no diagnóstico de modelos ARIMA. Nota-se também que foi empregada a
transformação logarítmica nos dados, embora na análise gráfica não fosse esperado.

O próximo diagnóstico fornecido pelo programa tem o objetivo de verificar se há indícios de


sazonalidade e efeitos de dias úteis antes e após o ajuste sazonal. O diagnóstico é dado pelo
gráfico da função de autocovariância, de uma dada série temporal, reestimada por densidade
espectral. O diagnóstico é dado para quatro séries: original, série dessazonalizada, resíduos
do modelo ARIMA e componente irregular. No R, utiliza-se a função series() do pacote

9
seasonal para obter as séries espectrais. Os códigos para a elaboração de gráficos espectrais
estão a seguir.

> # spectrum series


> spec_orig <- series(ajuste,"sp0")
> spec_sa <- series(ajuste,"s1s")
> spec_resid <- series(ajuste,"spr")
> spec_irreg <- series(ajuste,"s2s")

> # frequency
> freq <- c((1:6)/12, 0.3482, 0.4326)

> # spectral plot: original series


> plot(spec_orig, type = "l")
> abline(v = freq, col = c(rep("red",6),"blue","blue"),
+ lty = c(rep(2,6),3,3))
> legend("topleft", legend = c("Orig", "S. Effects", "TD. Effects"),
+ cex = 0.6, lty = 1:3, bty = "n", col = c(1,2,4))

A interpretação do gráfico espectral (Figura 3) é dada da seguinte maneira: se a densidade


espectral da série temporal apresenta pelo menos um pico sobre frequências sazonais (linhas
tracejadas em vermelho), então há indícios de efeitos sazonais na série; caso os picos sejam
nas frequências de dias úteis (linhas pontilhadas em azul), então há indícios de efeitos de dias
úteis. Na Figura 3, o gráfico aponta efeitos de sazonalidade apenas para série original, no
entanto, efeitos de dias úteis foram encontrados nas séries com ajuste sazonal, componente
irregular e resíduos do modelo ARIMA, indicando que o modelo falhou em retirar esse efeito
ou induziu esse efeito após a inserção da variável de dias úteis no ajuste automático. Isso
corrobora que o efeito dos dias úteis deve ser corrigido pelo calendário brasileiro.

Figura 3: Gráficos Espectrais para efeitos de sazonalidade e dias úteis

(a) Original Series (b) Seasonally Adjusted Series

(c) Residuals Series (d) Irregular Component Series

10
Outra ferramenta disponível pelo X13 para avaliar a qualidade de um ajuste sazonal é dada
pelo diagnóstico Sliding Spans. Dessa vez a ideia é avaliar a estabilidade do ajuste sazonal.
Nesse diagnóstico, caso haja dados suficientes, a série temporal é ajustada considerando 4
tamanhos de janelas de tempo (spans) diferentes que se sobrepõem. Em seguida, para cada
tempo t, os valores da componente sazonal são comparados entre os spans com a finalidade
de verificar se há mudança expressiva (diferença superior a 3%). Não é recomendado utilizar
o ajuste sazonal caso o número de diferenças superiores a 3% ultrapasse 25%. Outros detalhes
sobre a interpretação do diagnóstico Sliding Spans podem ser encontrados na seção 6.2
manual do programa X-13ARIMA-SEATS Reference Manual Acessible HTML Output
(United States Census Bureau, 2015).

No R, utiliza-se a função series() para obter a série temporal de diferenças.

> sliding <- series(ajuste, "sfs")


> sum(sliding[,"Max_._DIFF"] > 3, na.rm = T) /
+ length(na.omit(sliding[,"Max_._DIFF"])) * 100

Nesse caso, o ajuste sazonal mostrou-se estável uma vez que não foi encontrada nenhuma
diferença que ultrapassasse o valor de 3%.

3.5 Correção do ajuste automático

Após análise do ajuste sazonal automático na seção 3.4, conclui-se que este não pode ser
considerado adequado pelo fato de que o programa inseriu variáveis de calendário que não
estão de acordo com o calendário brasileiro. Para construir variáveis de calendário da maneira
correta, coletou-se a série temporal de dias úteis no site IpeaData (Instituto de Pesquisa
Econômica Aplicada, 2015). Além disso, coletou-se também as séries temporais com as datas
dos feriados da Páscoa e do Carnaval.

Seguindo o cálculo utilizado pelos desenvolvedores do X13 (tabela 4.1 do manual do


programa X-13ARIMA-SEATS Reference Manual Acessible HTML Output (United States
Census Bureau, 2015)), o número de dias úteis é definido como a quantidade de dias úteis
5
subtraída de 5/2 da quantidade de dias não úteis (e.g. para fez\70 temos: 19 − 2 9 = −3.5).
No objeto du, abaixo, os dados fornecidos pelo IpeaData estão na segunda coluna (dias_uteis)
e os dados que serão utilizados de fato estão na quinta coluna (dias_uteis_ok).
A construção das variáveis para utilização no ajuste sazonal é dada nos comandos a seguir.

11
> # construção dias úteis
> du <- read.csv2("dias_uteis.csv")
> head(du)
Data dias_uteis dias dias_n_uteis dias_uteis_ok
1 jan/70 21 31 10 -4.0
2 fev/70 19 28 9 -3.5
3 mar/70 21 31 10 -4.0
4 abr/70 21 30 9 -1.5
5 mai/70 19 31 12 -11.0
6 jun/70 22 30 8 2.0
> uteis <- ts(du[,5], start = c(1970,1), freq = 12)

Para a construção das variáveis Páscoa e Carnaval, foi necessária a utilização da função
genhol(). Essa função transforma objeto do tipo data em objeto de série temporal, como é
feito a seguir. Com essa função também é possível estender o efeito do feriado para dias antes
e/ou depois do acontecimento. No feriado da Páscoa, por exemplo, o efeito foi estendido para
oito dias antes.

> # construção feriados


> feriados <- read.csv2("feriados_moveis.csv")
> head(feriados)
Ano Páscoa Carnaval
1 1951 25/03/1951 06/02/1951
2 1952 13/04/1952 26/02/1952
3 1953 05/04/1953 17/02/1953
4 1954 18/04/1954 02/03/1954
5 1955 10/04/1955 22/02/1955
6 1956 01/04/1956 14/02/1956

> # páscoa
> datas.pascoa <- as.Date(as.character(feriados$Páscoa),"%d/%m/%Y")
> pascoa <- genhol(datas.pascoa, start = -8, frequency = 12)

> # carnaval
> datas.carnaval <- as.Date(as.character(feriados$Carnaval),"%d/%m/%Y")
> carnaval <- genhol(datas.carnaval, start = -3, end = 1, frequency = 12)

> regs <- na.omit(cbind(uteis, pascoa, carnaval))


> head(regs)
uteis pascoa carnaval
[1,] -4.0 0 0
[2,] -3.5 0 1
[3,] -4.0 1 0
[4,] -1.5 0 0
[5,] -11.0 0 0
[6,] 2.0 0 0

Com as variáveis do calendário definidas da maneira adequada, o ajuste sazonal é refeito da


seguinte maneira:

> ajuste2 <- seas(x = pim, xreg = regs, regression.aictest = NULL,


+ regression.usertype = c("td", "easter", "holiday"))

Note que dessa vez foram inseridos novos argumentos na função seas(). O primeiro é o xreg
em que se colocou a matriz de séries temporais regs criada anteriormente. O argumento
regression.aictest definido como NULL serve para não deixar que as variáveis de calendário
automáticas do X13 entrem no modelo. Por último, o argumento regression.usertype serve
para especificar o tipo de variáveis definidas no argumento xreg. Outros detalhes sobre a

12
utilização de variáveis no ajuste sazonal podem ser encontrados nas seções 4.3 e 7.13 do
manual do programa X-13ARIMA-SEATS Reference Manual Acessible HTML Output
(United States Census Bureau, 2015). O leitor também pode desabilitar o uso de
transformação log nos dados utilizando o argumento transform.function = "none". Aqui,
no entanto, preferiu-se deixar o argumento de maneira automática não o especificando no
momento do ajuste sazonal.

Assim como foi feito para o ajuste automático, o novo ajuste deve ser diagnosticado. Os
resultados para as funções de diagnóstico estão disponíveis a seguir.

> qs(ajuste2)
qs p-val
qsori 173.70326 0
qsorievadj 250.39649 0
qsrsd 0.00000 1
qssadj 0.00000 1
qssadjevadj 0.00000 1
qsirr 0.00000 1
qsirrevadj 0.00000 1

qssori 93.60663 0
qssorievadj 138.67543 0
qssrsd 0.00000 1
qsssadj 0.00000 1
qsssadjevadj 0.00000 1
qssirr 0.00000 1
qssirrevadj 0.00000 1

> summary(ajuste2)
Call:
seas(x = pim, xreg = regs, regression.aictest = NULL, regression.usertype = c("td
", "easter", "holiday"))

Coefficients:
Estimate Std. Error z value Pr(>|z|)
xreg1 0.0044061 0.0002654 16.601 < 2e-16 ***
xreg2 -0.0109615 0.0041044 -2.671 0.007570 **
xreg3 -0.0218621 0.0062363 -3.506 0.000456 ***
LS2008.Dec -0.1080691 0.0157914 -6.844 7.72e-12 ***
AO2012.Jan -0.0671614 0.0112749 -5.957 2.57e-09 ***
MA-Seasonal-12 0.6946583 0.0693738 10.013 < 2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

SEATS adj. ARIMA: (0 1 0)(0 1 1) Obs.: 165 Transform: log


AICc: 600.1, BIC: 620.5 QS (no seasonality in final): 0
Box-Ljung (no autocorr.): 22.84 Shapiro (normality): 0.9803 *

A análise dos resultados do teste sazonalidade é similar a primeira já feita, em que conclui-
se que há evidências de sazonalidade na série original e não há nas restantes. Na fase do pré-
ajuste, as novas variáveis de calendário foram significativas e apenas dois outliers foram
detectados dessa vez, sendo que o outlier referente a crise de 2008 (LS2008.Dec) se manteve.
O modelo ARIMA não sofreu mudanças sobre a ordem e os resíduos continuam não
autocorrelacionados e não normais. Em relação aos gráficos espectrais (Figura 4), os efeitos
de dias úteis foram suavizados após o ajuste sazonal em comparação ao ajuste automático.

13
Figura 4: Gráficos Espectrais para efeitos de sazonalidade e dias úteis no novo ajuste

(a) Original Series (b) Seasonally Adjusted Series

(c) Residuals Series (d) Irregular Component Series

Por fim, os dois últimos gráficos que serão explorados pelo programa são referentes aos
fatores sazonais e a série com ajuste sazonal. O primeiro é útil na percepção da evolução dos
fatores sazonais ao longo do tempo e é dado pela função monthplot() já utilizada na seção
3.2 durante a análise gráfica. Na Figura 5, obtida pelos códigos a seguir, além de ver a
evolução dos fatores sazonais, é possível ver o comportamento da série SI (componentes
sazonal e irregular agregadas), que tende a acompanhar a componente sazonal levando a
concluir que a decomposição do modelo foi estimada adequadamente. Na Figura 6, tem-se o
gráfico da produção industrial com ajuste sazonal, mostrando uma queda preocupante da
atividade industrial desde o ano 2013.

# figure 5
> monthplot(ajuste2, col.base = 1)
> legend("topleft", legend = c("Irregular", "Seasonal", "Seasonal Average"),
+ col = c(4,2,1), lwd = c(1,2,2), lty = 1, bty = "n", cex = 0.6)

# figure 6
> plot(ajuste2)
> grid()
> legend("topleft", legend = c("Original", "Adjusted"),
+ col = c(1,2), lwd = c(1,2), lty = 1, bty = "n", cex = 0.6)

14
Figura 5: Componentes sazonal e irregular por mês

Figura 6: Produção Industrial com ajuste sazonal

É importante o leitor saber que nem todas as opções retornadas pelo programa X13 foram
exploradas no artigo, e sim apenas aquelas que julgamos essenciais para avaliar a qualidade
de um ajuste sazonal. No R, é possível ver todas as saídas utilizando a função out().
> out(ajuste2)

3.6 Previsão

O X13, utilizando modelos SARIMA, prevê não somente a série temporal original mas
também a série com ajuste sazonal. Por isso é tão importante diagnosticar bem o modelo de
ajuste sazonal como foi feito nas seções 3.4 e 3.5.

Utilizando o objeto ajuste2 e a função series(), obtém-se a previsão da série original (fct)
com os comandos a seguir. Restringimos o horizonte de previsão para apenas um ano, mas o
programa dispõe de três anos de previsões.

> prev <- window(series(ajuste2, "fct"), end = c(2016,12), freq = 12)


> ts.plot(pim, prev, col = c(1,1,4,4), lwd = c(1,2,1,1))
> grid()
> legend("topleft", legend = c("PIM", "PIM Forecast", "CI 95%"),
+ lty = 1, col = c(1,1,4), lwd = c(1,2,1,1), bty = "n", cex = 0.7)

15
Figura 7: Previsão da Produção Industrial com ajuste sazonal

Para obter a previsão da PIM com ajuste sazonal é necessário acrescentar o argumento
seats.appendfcst ao código da função seas(), e em seguida extrair a série com ajuste
sazonal (s11). Se o argumento seats.appendfcst não for acrescentado, ao extrair a série com
ajuste sazonal, os dados que serão mostrados terão horizonte temporal apenas até o último
dado disponível (setembro de 2015).

> ajuste3 <- seas(pim, xreg = regs, regression.aictest = NULL,


+ regression.usertype = c("td","easter", "holiday"),
+ seats.appendfcst = "yes")

> # forecast
> fcst <- window(series(ajuste3, "s11"), start = c(2015,10), end = c(2016,12),
+ freq = 12)

> # adjusted
> fit <- window(series(ajuste3, "s11"), end = c(2015,9), freq = 12)

> # plot
> ts.plot(pim, fit, fcst, col = c(1,2,4), lwd = c(1,2,2))
> grid()
> legend("topleft", legend = c("PIM", "Adjusted PIM", "Adjusted PIM forecast"),
+ lty = 1, col = c(1,2,4), lwd = c(1,2,2), cex = 0.7, bty = "n")

Na Figura 8, a seguir, nota-se que a previsão estimada pelo X13 ainda segue o
comportamento de queda até o mês de dezembro de 2016.

Figura 8: Previsão da Produção Industrial com ajuste sazonal

16
4. Considerações Finais

O artigo apresentou como dessazonalizar séries temporais utilizando X-13ARIMA-SEATS


com interface no software R fazendo uso do pacote seasonal desenvoldido por Christoph
Sax. Além de apresentar o passo-a-passo do ajuste sazonal, mostrou-se também como
analisar cada output retornado pelo programa e fazer previsões da série original e da série
com ajuste sazonal. O método foi aplicado à série temporal do índice de produção industrial
geral do Brasil e sua análise permitiu concluir que, além de o índice ter minimizado seu
crescimento após a crise econômica de 2008 e mostrar queda nos últimos meses de dados
disponíveis, o comportamento de queda é previsto para o ano de 2016. Também verificou-se
que nem sempre o ajuste automático fornecido pelo programa possui a melhor qualidade
possível, assim recomenda-se que o responsável por fazer o ajuste sazonal avalie a saída
automática.

O X-13ARIMA-SEATS fornece diversas ferramentas para diagnosticar um ajuste sazonal e


meios de aprimorá-lo. Para o índice de produção industrial, por exemplo, verificou-se que
inserir o efeito do carnaval, da Páscoa e de dias úteis melhoram a qualidade do ajuste. A
maneira como as variáveis de carnaval e Páscoa foram construídas foi baseada no número de
dias em que os feriados ocorrem no Brasil, porém, o efeito de um feriado pode afetar a
produção industrial dias, semanas ou até meses antes (ou depois) de sua ocorrência. Logo,
essa variável poderia ter sido construída de diversas outras maneiras afetando o resultado
final do ajuste sazonal mas isso não foi levado em conta neste artigo. Destaca-se também que
apesar de o programa oferecer diversos recursos para executar um ajuste sazonal, nem todos
foram explorados mas podem ser ao analisar a saída da função out() do pacote seasonal.

5. Referências
Adler, J. (2009). R in a Nutshell. Sebastopol, CA: O'Reilly.
Braun, W. J., & Murdoch, D. J. (2008). A First Course in Statistical Programming with R.
Cambridge University Press.
Dalgaard, P. (2008). Introductory Statistics with R. LLC, New York: Springer Science +
Business Media.
Eurostat. (2015). Outliers. Fonte: E-learning Courses - Seasonal Adjustment: http://www.sa-
elearning.eu/outliers
Ferreira, P. C., Mattos, D. M., Almeida, D. C., Oliveira, I. C., & Pereira, R. J. (2016). Análise
de Séries Temporais usando o R - um curso introdutório. Rio de Janeiro: Working
Book.
Findley, D. F., Monsell, B. C., Bell, W. R., Otto, M. C., & Chen, B. C. (1998). New
Capabilities and Methods of the X-12-ARIMA Seasonal Adjustment Program (with
discussion). Journal of Business and Economic Statistics, 12.

17
Gómez, V., & Maravall, A. (1996). Programs TRAMO (Time series Regression with Arima
noise, Missingo observations, and Outliers) and SEATS (Signal Extraction in Arima
Time Series. Instructions for the User. Working Paper, Banco de España.
IBGE. (2015). Pesquisa Industrial Mensal Produção Física - Brasil. Fonte: Instituto
Brasileiro de Geografia e Estatística:
http://ibge.gov.br/home/estatistica/indicadores/industria/pimpf/br/default.shtm
Instituto de Pesquisa Econômica Aplicada. (2015). ipeadata. Fonte: Ipea Data:
http://www.ipeadata.gov.br/
R Core Team. (2015). An Introduction to R. Fonte: The Comprehensive R Archive Network:
https://cran.r-project.org/doc/manuals/r-release/R-intro.pdf
R Core Team. (2015). The R Project for Statistical Computing. Fonte: https://www.r-
project.org/
Sax, C. (2015). Github Christoph Sax. Fonte: Github: https://github.com/christophsax
United States Census Bureau. (2015). Historical Papers Concerning X-11 and Seasonal
Adjustment. Fonte: X-13ARIMA-SEATS Seasonal Adjustment Program:
https://www.census.gov/srd/www/sapaper/historicpapers.html
United States Census Bureau. (2015). X-13ARIMA-SEATS Reference Manual Acessible
HTML Output. United States Census Bureau. Fonte:
https://www.census.gov/ts/x13as/docX13AS.pdf
United States Census Bureau. (2015). X-13ARIMA-SEATS Seasonal Adjustment Program.
Fonte: United States Census Bureau: https://www.census.gov/srd/www/x13as/

18