ENGD 02

Plano de Aula

O presente material apresentado contempla a segunda aula prática de Estatística Descritiva, contemplando uma breve introdução a séries temporais (time series).


Para tal, será utilizado o dataset AirPassengers, que tem funcionalidade similar ao iris, porém estrutura de classe diferente (ts).


Esta aula está disponível no RPubs e no GitHub.
Para pleno andamento da atividade, os discentes deverão verificar e, se necessário, verificar a necessidade de instalação dos seguintes pacotes:

  • ggfortify;
  • ggplot2.


Em um momento final, haverá, também, uma breve introdução para aplicação do pacote dygraphs.

Série Temporal

Série temporal são nada mais que a colocação de observações, de modo sequencial, ao longo do tempo. As ts (time series) podem ser uni ou multivariadas, e apresentar influência de fatores inerentes (covariáveis).


Este tipo de informação requer uma atenção a mais em relação ao df, pois, normalmente, é necessário verificar a adequação de classe (class) dos dados tabulados.


No presente estudo prático, analisaremos apenas aspectos visuais de ts.

HANDS-ON

Inicialmente iremos carregar nosso dataset AirPassengers e verificar sua classe.

data("AirPassengers")
View(AirPassengers)
class(AirPassengers)
## [1] "ts"


Observe também que a estrutura visual do objeto AirPassengers apresentada no Ambiente de Trabalho é diferente do modelo convencional de dataframe.


Contudo, perceba que se solicitado o print no console, há informação “oculta” no objeto.


print(AirPassengers)
##      Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
## 1949 112 118 132 129 121 135 148 148 136 119 104 118
## 1950 115 126 141 135 125 149 170 170 158 133 114 140
## 1951 145 150 178 163 172 178 199 199 184 162 146 166
## 1952 171 180 193 181 183 218 230 242 209 191 172 194
## 1953 196 196 236 235 229 243 264 272 237 211 180 201
## 1954 204 188 235 227 234 264 302 293 259 229 203 229
## 1955 242 233 267 269 270 315 364 347 312 274 237 278
## 1956 284 277 317 313 318 374 413 405 355 306 271 306
## 1957 315 301 356 348 355 422 465 467 404 347 305 336
## 1958 340 318 362 348 363 435 491 505 404 359 310 337
## 1959 360 342 406 396 420 472 548 559 463 407 362 405
## 1960 417 391 419 461 472 535 622 606 508 461 390 432


ôpa! Agora é possível entender um pouco melhor sobre esses dados. Os dados históricos são os totais mensais de passageiros (uni variado) da companhia aérea Box & Jenkins, entre 1949 a 1960.


Mas, mesmo com outra classe é possível extrair informação? Sim, é possível. Entretanto é aconselhável o uso de pacotes específicos para ts ou que seja feito manipulação de dados. Por ora utilizaremos funções residentes no R, através do pacote stats e base.


Em ts, uma análise inicial essencial é a verificação de gaps/missing data (dados faltantes - NA), e isto pode ser verificado, de maneira genérica, utilizando a função residente is.na(), onde contaremos (somaremos) a quantidade de observações que "é NA).

sum(is.na(AirPassengers))
## [1] 0


A frequência de observações (meses), bem como a ordem dos meses, podem ser facilmente verificadas, respectivamente, com as funções frequency e cycle.

stats::frequency(AirPassengers)
## [1] 12
stats::cycle(AirPassengers)
##      Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
## 1949   1   2   3   4   5   6   7   8   9  10  11  12
## 1950   1   2   3   4   5   6   7   8   9  10  11  12
## 1951   1   2   3   4   5   6   7   8   9  10  11  12
## 1952   1   2   3   4   5   6   7   8   9  10  11  12
## 1953   1   2   3   4   5   6   7   8   9  10  11  12
## 1954   1   2   3   4   5   6   7   8   9  10  11  12
## 1955   1   2   3   4   5   6   7   8   9  10  11  12
## 1956   1   2   3   4   5   6   7   8   9  10  11  12
## 1957   1   2   3   4   5   6   7   8   9  10  11  12
## 1958   1   2   3   4   5   6   7   8   9  10  11  12
## 1959   1   2   3   4   5   6   7   8   9  10  11  12
## 1960   1   2   3   4   5   6   7   8   9  10  11  12


Estatística básicas podem ser extraídas


Nessa aula utilizaremos, nesse momento, os pacotes ggfortify (que pode ser entendido como uma extensão do ggplot2, porém com simplificações) e o pacote tseries.


O pacote ggfortify proporciona o uso da função autoplot, que permite realizar plots com boa estética e de modo bastante simplificado.

library(ggfortify)
autoplot(AirPassengers)

autoplot(AirPassengers) + 
  labs(x = "Data", y = "Número de Passageiros (1000's)",
       title = "Passageiros de 1949 a 1961") 


Perceba a simplicidade para realização deste plot, e também que ele aceita os mesmos comandos do pacote ggplot2.


Entre os diversos tipos de estudos que podem ser concebidos utilizando a abordagem de séries temporais, podemos destacar as análises de sazonalidade, tendência, estacionariedade, ciclicidade e autocorrelação como os mais simples e essenciais. Contudo, nesta aula, abordaremos apenas a análise de sazonalidade e de tendências de modo visual.


Para tal, será necessário decompor a série original, que pode ser feita de modo multiplicativo ou aditivo.

decomposeAP1 <- stats::decompose(AirPassengers, "multiplicative")
autoplot(decomposeAP1)

decomposeAP2 <- stats::decompose(AirPassengers, "additive")
autoplot(decomposeAP2)


EXTRA!! E se desejado utilizar o ggplot2? Neste caso podemos utilizar o pacote zoo para facilitar a programação.

library(ggplot2)
library(zoo)

df <- data.frame(Passageiros = as.matrix(AirPassengers),
                 Data = zoo::as.yearmon(time(AirPassengers)))

ggplot(df) +
  geom_line(aes(x = Data, y = Passageiros)) +
  theme(axis.text.x = element_text(angle = 90))


Para maiores aplicações de ggplot2 a ts, deixo como sugestão este link.


E o dygraphs?

library(dygraphs)
dygraphs::dygraph(AirPassengers)


Para um exemplo mais lúdico, utilizaremos três séries temporais que mostram as mortes mensais por bronquite, enfisema e asma no Reino Unido, 1974-1979, ambos os sexos (ldeaths), homens (mdeaths) e mulheres (fdeaths).

df2 <- cbind(mdeaths, fdeaths)
dygraphs::dygraph(df2)
library(dplyr)
dygraphs::dygraph(df2) %>% dygraphs::dyRangeSelector()
df3 <- cbind(mdeaths, fdeaths, ldeaths)
dygraphs::dygraph(df3)
dygraphs::dygraph(df2) %>%
  dygraphs::dySeries("mdeaths", label = "Maculino") %>%
  dygraphs::dySeries("fdeaths", label = "Feminino") %>%
  dygraphs::dyOptions(stackedGraph = TRUE) %>%
  dygraphs::dyRangeSelector(height = 20)