setwd("C:\\Users\\Pessoal\\Desktop\\ESTATÍSTICA\\UFPB\\8º PERÍODO\\SÉRIES TEMPORAIS")
<- read.csv2("dados2.csv", header = F, dec = ",") dados
Séries Temporais - PIB Paraíba
ICMS - Paraíba
Vamos estar utilizando uma série temporal, encontrada no site do IPEA DATA, sobre a arrecadação de ICMS na Paraíba. O link onde pode ser encontrado a série temporal é: Série Temporal
Comentário:
Imposto sobre Operações Relativas à Circulação de Mercadorias e sobre Prestações de Serviços de Transporte Interestadual e Intermunicipal e de Comunicação (ICMS). É um dos Impostos sobre a Produção e a Circulação, sendo um tributo indireto e regressivo. De competência dos Estados, tem como fato gerador as operações citadas, ainda que as operações e as prestações se iniciem no exterior. Incide ainda sobre a entrada de mercadoria importada do exterior. Números referente a um dado estado. Nota: a partir de março de 2014, dados do “Demonstrativo da Receita Corrente Líquida” do “Relatório Resumido de Execução Orçamentária” (RREO), obtidos no “Sistema de Informações Contábeis e Fiscais do Setor Público Brasileiro” (Siconfi). Mais informações: Função Social dos Tributos.
Carregando a série Temporal
Fazendo algumas manipulações no banco de dados
names(dados) <- c("Data", "ICMS")
Verificando o tipo de variável
glimpse(dados)
Rows: 362
Columns: 2
$ Data <chr> "1993.01", "1993.02", "1993.03", "1993.04", "1993.05", "1993.06",…
$ ICMS <dbl> 187.90, 214.49, 263.32, 334.06, 426.48, 632.42, 872.97, 1181.24, …
Como o real entrou em vigor a partir de 1994, vamos omitir os dois primeiros anos da série e trabalhar apenas de 1995 em diante.
<- dados[-c(1:24),] dados
Visualizando as primeiras 10 linhas
%>%
dados slice_head(n=10) %>%
::gt() gt
Data | ICMS |
---|---|
1995.01 | 30896 |
1995.02 | 28483 |
1995.03 | 29352 |
1995.04 | 26762 |
1995.05 | 26876 |
1995.06 | 27771 |
1995.07 | 25503 |
1995.08 | 28720 |
1995.09 | 32856 |
1995.10 | 29159 |
Deflacionando a série via ipc (Indíce de preço ao consumidor)
<- seq(as.Date('1995-01-01'), as.Date('2023-02-01'),by='1 month')
times <- deflateBR::deflate(dados$ICMS, times,"02/2023" ,index = "ipc") icms
Downloading necessary data from IPEA's API
...
Transformando em série Temporal
<- ts(icms, start = c(1995,1), frequency = 12) icms_PB
icms_PB
Jan Feb Mar Apr May Jun Jul
1995 203899.03 184967.58 186932.90 165896.71 161913.77 163690.32 143994.59
1996 185537.78 183152.05 179851.07 175097.05 177124.56 177596.72 166912.29
1997 212482.48 194474.63 165775.90 182484.63 172570.52 187964.77 180973.32
1998 219391.19 186447.38 182247.56 177461.56 191591.68 189045.38 187507.88
1999 229657.40 209932.18 207016.17 217105.33 200809.60 190914.93 191899.87
2000 229003.28 221787.81 215433.95 214762.53 220815.74 235071.27 235134.12
2001 322768.15 260657.07 270032.00 263447.62 266731.99 278307.12 269748.77
2002 273319.67 295517.12 242564.82 261138.72 203546.35 239113.14 226018.12
2003 319154.07 282557.94 240745.49 224400.46 213777.74 260119.45 265406.67
2004 257786.47 266556.24 235536.36 245477.64 258746.17 232353.29 232830.33
2005 301129.31 267135.70 270002.99 282620.00 281029.65 288502.47 270858.68
2006 342472.04 317493.92 287776.07 307182.33 305108.38 305229.93 308402.04
2007 354235.44 333083.81 303469.41 310119.74 326391.73 334968.69 340400.54
2008 396287.64 367856.88 348449.00 353390.22 356867.15 362192.77 351707.46
2009 393448.07 368972.29 355871.49 336826.67 348890.50 361317.01 394604.59
2010 459608.71 413507.63 399448.69 430980.60 408065.42 436925.05 446163.89
2011 508425.37 476718.96 441466.61 445730.28 447724.26 459146.20 468139.49
2012 518326.94 481169.05 479639.38 472424.15 482979.87 493300.50 498118.49
2013 620927.43 545395.01 471983.41 534918.43 531177.08 556251.30 599703.75
2014 637707.79 559601.48 583446.19 568134.68 614247.37 583915.26 554951.32
2015 685436.84 570419.10 523430.60 581592.26 577583.98 546551.40 549466.69
2016 601946.20 552610.19 486134.68 543434.91 524943.94 541629.94 541336.35
2017 633362.68 545049.55 528011.25 558457.05 537703.02 536646.71 537118.98
2018 626620.46 574339.26 541742.34 550492.88 566026.35 514114.45 577379.00
2019 662558.26 596537.23 567038.44 581187.19 609405.66 582043.03 511409.55
2020 695670.16 603384.25 563265.07 516278.45 429554.74 533006.83 553502.79
2021 750374.75 690605.80 641276.72 604020.25 598533.21 651385.32 706911.44
2022 839304.72 641169.95 611303.06 658104.53 663508.97 671881.48 661400.64
2023 708411.01 634287.65
Aug Sep Oct Nov Dec
1995 158008.62 179431.42 158174.69 160708.25 191885.76
1996 173176.30 186253.72 188010.80 182002.22 213369.37
1997 172529.50 178686.69 192282.83 178056.27 200813.09
1998 185814.58 198815.37 208879.26 222130.43 217804.04
1999 221512.71 196899.80 198050.33 204373.96 239634.07
2000 224338.17 248547.21 257320.21 259965.52 264868.18
2001 268252.10 254971.22 260656.71 269563.52 295611.79
2002 257812.71 306419.47 249605.66 274246.37 257230.09
2003 229347.18 234123.41 267342.97 231119.04 266857.41
2004 237336.92 313664.73 254111.29 305243.02 291320.24
2005 281878.63 299454.58 288547.62 312647.16 313031.06
2006 329171.28 338984.82 318558.10 333561.18 356834.46
2007 340218.10 336093.60 357328.26 349206.66 388251.66
2008 379262.10 369229.40 384644.31 392046.39 377439.14
2009 376728.28 394285.73 398528.38 446306.14 417180.25
2010 432473.88 446414.98 449441.04 478620.56 468045.35
2011 468041.68 466213.98 443575.35 452581.42 463047.98
2012 489703.88 491242.90 516556.06 538149.15 565930.91
2013 542380.47 538870.23 553659.59 573670.25 574673.76
2014 564608.65 588289.51 617436.98 647719.43 621369.65
2015 526635.96 43242.99 44527.95 550050.73 555644.86
2016 539636.24 525643.27 561526.28 561817.28 571130.69
2017 536484.96 567071.11 582729.66 597634.79 609277.82
2018 567301.47 640898.18 623451.55 621135.64 666382.98
2019 518965.83 585538.51 593474.88 643324.66 667361.62
2020 628134.29 655216.78 662137.98 698101.90 755371.78
2021 755547.84 713269.30 737088.34 708873.42 770463.45
2022 580198.90 623991.16 613980.04 644417.83 667701.18
2023
Estatística Descritiva da Série
which.max(icms_PB)
[1] 325
Tivemos que o maior valor de arrecadação de ICMS na Paraíba foi em 2022-01-01, e que o valor que foi arrecadado foi de R$ 8.3930472^{5}.
which.min(icms_PB)
[1] 249
Tivemos que o menor valor de arrecadação de ICMS na Paraíba foi em 2015-09-01, e que o valor que foi arrecadado foi de R$ 4.3242994^{4}.
::skim(icms_PB) skimr
Name | icms_PB |
Number of rows | 338 |
Number of columns | 1 |
_______________________ | |
Column type frequency: | |
ts | 1 |
________________________ | |
Group variables | None |
Variable type: ts
skim_variable | n_missing | complete_rate | start | end | frequency | deltat | mean | sd | min | max | median | line_graph |
---|---|---|---|---|---|---|---|---|---|---|---|---|
x | 0 | 1 | 1995 | 2023 | 12 | 0.08 | 401908.2 | 172366.8 | 43242.99 | 839304.7 | 372978.8 | ⣀⣀⣀⡠⠒⠉⠉⠉ |
Visualização Gráfica da Série
::autoplot(icms_PB)+
forecast::labs(title = "Arrecadação de ICMS na Paraíba", subtitle = "De Janeiro de 1955 à Fevereiro de 2023") +
ggplot2::xlab("Tempo") + ggplot2::ylab("Arrecadação em R$") ggplot2
Registered S3 method overwritten by 'quantmod':
method from
as.zoo.data.frame zoo
Características da série
Aqui, vamos testar algumas características que estão presentes em algumas séries temporais, tais como: estacionariedade, tendência, sazonalidade.
Testando a estacionariedade
As hipóteses são:
\[H_0: A \hspace{0.1cm} série \hspace{0.1cm} é \hspace{0.1cm} não \hspace{0.1cm} estacionária\] \[H_1: A \hspace{0.1cm} série \hspace{0.1cm} é \hspace{0.1cm} estacionária\]
::adf.test(icms_PB) tseries
Warning in tseries::adf.test(icms_PB): p-value smaller than printed p-value
Augmented Dickey-Fuller Test
data: icms_PB
Dickey-Fuller = -4.8425, Lag order = 6, p-value = 0.01
alternative hypothesis: stationary
Resposta:
Rejeitamos \(H_0\), ou seja, com 95% de confiança a série, segundo o teste de Dickey-Fuller é não estacionária. O resultado do p-valor foi de 0.01.
Sendo assim, precisamos tomar diferença para tornar a série estacionária, vamos saber quantas diferenças vai ser preciso tomar.
::ndiffs(icms_PB) forecast
[1] 1
Segundo o comando ndiffs precisamos tomar uma diferença para tornar a série estacionária.
Verificando se é preciso tomar diferença na componente sazonal
::nsdiffs(icms_PB) forecast
[1] 0
Conforme o resultado do teste não vai ser preciso tomar diferença na componente sazonal
Testando a tendência
Como pelo gráfico, é observado que possivelmente tem se uma tendência crescente, esse será o argumento a ser testado.
As hipóteses são as seguintes:
\[H_0: A \hspace{0.1cm} série \hspace{0.1cm} não \hspace{0.1cm} tem \hspace{0.1cm} tendência \hspace{0.1cm} crescente\] \[H_1: A \hspace{0.1cm} série \hspace{0.1cm} tem \hspace{0.1cm} tendência \hspace{0.1cm} crescente\]
::cox.stuart.test(icms_PB, alternative = "right.sided") randtests
Cox Stuart test
data: icms_PB
statistic = 167, n = 169, p-value < 2.2e-16
alternative hypothesis: increasing trend
Resposta:
Rejeitamos \(H_0\), ou seja, com 95% de confiança a série tem tendência crescente. O resultado do p-valor foi menor que \(2.2 \times 10^{-16}\).
Testando a sazonalidade
Visualização gráfica
::ggseasonplot(icms_PB) +
forecast::labs(title = "Gráfico de Sazonalidade da Arrecadação do ICSM na Paraíba", subtitle = "De Janeiro de 1955 à Fevereiro de 2023") + ggplot2::ylab("Arrecadação em R$") + ggplot2::xlab("Mês") ggplot2
Comentário:
De acordo com a visualização gráfica, podemos observar que a série tem a presença da componente sazonal, vamos utilizar um teste para comprovar.
- As hipóteses do teste são:
\[H_0: A \hspace{0.1cm} série \hspace{0.1cm} não \hspace{0.1cm} possui \hspace{0.1cm} sazonalidade\] \[H_1: A \hspace{0.1cm} série \hspace{0.1cm} possui \hspace{0.1cm} sazonalidade\]
::combined_test(icms_PB) seastests
Test used: WO
Test statistic: 1
P-value: 0.000196446 0.0003388343 1.676437e-14
::isSeasonal(icms_PB) seastests
[1] TRUE
Resposta:
Rejeitamos \(H_0\), ao nível de confiança de 95% rejeitamos a hipótese nula, ou seja, com 95% de confiança a série possui sazonalidade.
Então a série de Arrecadação de ICMS da Paraíba de 1955 à 2023 possui tendência crescente, é não estacionária (sendo necessário tomar uma diferença) e possui sazonalidade.
Gráficos de Autocorrelação
Gráfico de Autocorrelação Amostral
- O gráfico de correlação amostral é útil na identificação da ordem do processo se ele for um MA, e se for um AR, é esperado um decaimento exponencial.
::Acf(icms_PB, main = "Gráfico de correlação amostral", xlab = "Defasagem", ylab = "Autocorrelações") forecast
É observado um decaimento exponencial, sugerindo assim que o processo seja do tipo AR
Gráfico de Correlação Parcial
- Acima, verificamos que a série possivelmente seja do tipo AR, com o gráfico de Correlação Parcial, é sugerido a ordem do processo, então vamos verificar.
::Pacf(icms_PB, main = "Gráfico de correlação Parcial", xlab = "Defasagem", ylab = "Autocorrelações") forecast
::ggtsdisplay(icms_PB) forecast
Verificação da série
O objetivo é fazer a verificação da série para ajustar um processo que mais se adeque a série, temos já como evidência de que existe a parte autoregressora da série, através do gráfico de correlação parcial, pode ser comprovado.
- Utilizaremos a função
auto.arima
do pacoteforecast
.
::auto.arima(icms_PB) forecast
Series: icms_PB
ARIMA(1,1,2)(0,0,2)[12] with drift
Coefficients:
ar1 ma1 ma2 sma1 sma2 drift
0.3173 -0.5500 -0.3806 0.1349 0.1075 1519.8133
s.e. 0.1094 0.1107 0.0882 0.0557 0.0503 322.2786
sigma^2 = 1.985e+09: log likelihood = -4083.4
AIC=8180.8 AICc=8181.14 BIC=8207.54
Ajustando um processo
<- astsa::sarima(icms_PB,p=1,d=1,q=2,P=0,D=0,Q=2,S=12) fit
initial value 10.832313
iter 2 value 10.740252
iter 3 value 10.717259
iter 4 value 10.712812
iter 5 value 10.709726
iter 6 value 10.708581
iter 7 value 10.705633
iter 8 value 10.703939
iter 9 value 10.700861
iter 10 value 10.697729
iter 11 value 10.697040
iter 12 value 10.696675
iter 13 value 10.696481
iter 14 value 10.696461
iter 15 value 10.696455
iter 16 value 10.696454
iter 17 value 10.696453
iter 18 value 10.696453
iter 19 value 10.696452
iter 20 value 10.696452
iter 20 value 10.696452
iter 20 value 10.696452
final value 10.696452
converged
initial value 10.698024
iter 2 value 10.698019
iter 3 value 10.698003
iter 4 value 10.697992
iter 5 value 10.697987
iter 6 value 10.697985
iter 7 value 10.697981
iter 8 value 10.697981
iter 8 value 10.697981
iter 8 value 10.697981
final value 10.697981
converged
$ttable fit
Estimate SE t.value p.value
ar1 0.3173 0.1094 2.9003 0.0040
ma1 -0.5500 0.1107 -4.9668 0.0000
ma2 -0.3806 0.0882 -4.3136 0.0000
sma1 0.1349 0.0557 2.4220 0.0160
sma2 0.1075 0.0503 2.1381 0.0332
constant 1519.8133 322.2786 4.7158 0.0000
Resposta:
De acordo com o teste é observado que todos os coeficientes são significativos para o modelo e foram iguais aos encontrados na função auto.arima
, sendo assim, manteremos este ajuste.
De acordo com a visualização gráfica do ajuste, observamos que os resíduos são não correlacionados, pelo teste de Ljung-box.
Análise Diagnóstico dos Resíduos
- Precisamos padronizar os resíduos, para que os valores discrepantes não interfiram muito por conta da escala
<- fit$fit$residuals
residuos <- c((residuos - mean(residuos))/sd(residuos)) residuos_padronizados
- Realizando o teste de maneira mais genérica, através da função
checkresiduals
, da bibliotecaforecast
.
::checkresiduals(residuos_padronizados) forecast
Ljung-Box test
data: Residuals
Q* = 3.7984, df = 10, p-value = 0.956
Model df: 0. Total lags used: 10
Resposta:
De acordo com a saída, do teste de Ljung-Box, e com a análise gráfica residual é observado que os resíduos são não correlacionados, pois a hipótese nula de que os resíduos são não correlacionados não foi rejeitada.
Verificando ouliers
::ggplot(icms_PB, ggplot2::aes(x=as.vector(1:338), y = residuos_padronizados))+
ggplot2::geom_point(size = 4, color = "#e7ad52") +
ggplot2::geom_abline(intercept = -2.5, slope = 0,color = "#001132")+
ggplot2::geom_abline(intercept = 2.5, slope = 0,color = "#001132") +
ggplot2::ylim(-11.6,6) +
ggplot2::xlab("Observações") +
ggplot2::ylab("Resíduos Padronizados")+
ggplot2::labs(title = "Gráfico dos resíduos padronizados") ggplot2
Traçando uma reta em 2.5
Tivemos a quantidade de 5 outliers.
Que foram:
<- data.frame(times,icms)
banco which(residuos_padronizados>2.5 | residuos_padronizados< -2.5),] banco[
times icms
249 2015-09-01 43242.99
250 2015-10-01 44527.95
251 2015-11-01 550050.73
305 2020-05-01 429554.74
326 2022-02-01 641169.95
Testando a normalidade
- Para o teste de normalidade dos resíduos vamos utilizar três testes
Teste de Bera-Jarque
- As hipóteses são:
\[H_0: Os \hspace{0.1cm} resíduos \hspace{0.1cm} possuem \hspace{0.1cm} distribuição \hspace{0.1cm} normal\]
\[H_1: Os \hspace{0.1cm} resíduos \hspace{0.1cm} não \hspace{0.1cm} possuem \hspace{0.1cm} distribuição \hspace{0.1cm} normal\]
::jarque.bera.test(residuos_padronizados) tseries
Jarque Bera Test
data: residuos_padronizados
X-squared = 41033, df = 2, p-value < 2.2e-16
Resposta:
Rejeitamos \(H_0\), ou seja, com 95% de confiança os resíduos não estão distribuidos normalmente.
Teste de Lillie-Fors
- As hipóteses são:
\[H_0: Os \hspace{0.1cm} resíduos \hspace{0.1cm} possuem \hspace{0.1cm} distribuição \hspace{0.1cm} normal\]
\[H_1: Os \hspace{0.1cm} resíduos \hspace{0.1cm} não \hspace{0.1cm} possuem \hspace{0.1cm} distribuição \hspace{0.1cm} normal\]
::lillie.test(fit$fit$residuals) nortest
Lilliefors (Kolmogorov-Smirnov) normality test
data: fit$fit$residuals
D = 0.13894, p-value < 2.2e-16
Resposta:
Rejeitamos \(H_0\), ou seja, com 95% de confiança os resíduos não estão distribuidos normalmente.
Teste de Shapiro-Wilk
- As hipóteses são:
\[H_0: Os \hspace{0.1cm} resíduos \hspace{0.1cm} possuem \hspace{0.1cm} distribuição \hspace{0.1cm} normal\]
\[H_1: Os \hspace{0.1cm} resíduos \hspace{0.1cm} não \hspace{0.1cm} possuem \hspace{0.1cm} distribuição \hspace{0.1cm} normal\]
shapiro.test(residuos_padronizados)
Shapiro-Wilk normality test
data: residuos_padronizados
W = 0.70652, p-value < 2.2e-16
Resposta:
Rejeitamos \(H_0\), ou seja, com 95% de confiança os resíduos não estão distribuidos normalmente.
Sintese:
Os resíduos não estão distribuidos normalmente.
Alisamento Exponencial
- Como a série tem a presença de tendência e de sazonalidade, vamos utilizar o alisamento exponencial de HoltWinters, que é utilizado na presença dessas componentes na série temporal.
<- HoltWinters(icms_PB, seasonal = "multiplicative")
fit2 fit2
Holt-Winters exponential smoothing with trend and multiplicative seasonal component.
Call:
HoltWinters(x = icms_PB, seasonal = "multiplicative")
Smoothing parameters:
alpha: 0.3159753
beta : 0
gamma: 0.10589
Coefficients:
[,1]
a 6.342858e+05
b 1.063932e+03
s1 9.554144e-01
s2 9.764387e-01
s3 9.684284e-01
s4 9.906426e-01
s5 9.774125e-01
s6 9.726577e-01
s7 9.600750e-01
s8 9.433302e-01
s9 1.035607e+00
s10 1.074824e+00
s11 1.122869e+00
s12 1.005939e+00
Fazendo previsões para os 6 próximos meses
<- predict(fit2, n.ahead = 6, prediction.interval = T)
prev prev
fit upr lwr
Mar 2023 607022.3 645292.6 568751.9
Apr 2023 621418.9 671188.8 571649.0
May 2023 617351.4 675780.5 558922.3
Jun 2023 632566.4 699787.6 565345.2
Jul 2023 625158.3 698515.3 551801.4
Aug 2023 623152.0 702544.2 543759.8
Visualizando graficamente
plot(fit2,prev,main = "Arrecadação de ICMS na Paraíba", xlab = "Tempo", ylab = "Arrecadaçaõ em R$")
Decomposição da Série
- Vamos aplicar o método de decomposição stl para a série, pois ele é sensível a outliers.
<- stl(icms_PB, s.window = "periodic")
decomp ::autoplot(decomp) +
forecast::labs(title = "Decomposição via método STL da série ICMS - PB")+
ggplot2::xlab("Ano") ggplot2