Imagine poder prever o que irá acontecer? Tentador não? O ser humano faz isso sempre, imaginamos cenários dos impactos diretos e indiretos de nossas decisões. Agora, imagine a capacidade de prever o resultados de estratégias de venda, marketing para uma empresa. Isso pode ser muito interessante!
Através da matemática e estatística foram criadas fórmulas e algoritmos, que em conjunto com a tecnologia, permitiram nossa mente preditiva, antecipar o que irá acontecer. Hoje vou mostrar algumas técnicas de análise preditiva, para séries temporais, usando o R e o algoritmo ARIMA.
Aviso importante.
Com esse artigo não tenho a intenção de escrever algo definitivo sobre a previsão de séries temporais ou análise de dados. Muito menos definir as técnicas utilizadas como as únicas, pois, existem várias maneiras de realizar previsões.
Não estou considerando aqui: algumas das técnicas de tratamento e treinamento, que podem ser executadas para melhorar o modelo; o volume de tempo ideal; normalização; entre outros passos que podem ser necessários, dependendo do contexto e do conjunto de dados.
A ideia é apresentar uma introdução ao tema para que o leitor, em conjunto dos seus estudos, possa aprimorar seu conhecimento.
Por que comecei a me interessar por previsões?
Trabalhando com SEO (ainda atuo nessa área) os clientes sempre me perguntavam sobre quando estariam na primeira página do Google. No ano de 2010, eu tinha um cliente que insistia muito, mas muito mesmo nessa pergunta! Na época, eu sempre enviava um relatório mensal com os dados de busca orgânica, incluindo indicadores de visitas, posicionamento por palavras-chave, dentre outros números e medidas que considerava necessário para a boa tomada de decisões. Contudo, ele não ficava satisfeito com isso, meu cliente queria saber do futuro! Foi aí que comecei a procurar na estatística algumas ferramentas que me ajudassem a prever os resultados daquelas ações de SEO, acima de tudo, sem me basear em achismos, mas nos números (análise preditiva é isso!).
Comecei a trabalhar com as regressões mais simples, tentando prever posicionamento por palavras-chave e números. Na época eu não utilizava nenhuma linguagem ou ferramenta sofisticada, somente algumas fórmulas no Excel. Muitas delas pesquisadas em sites e blogs de estatística.
Os modelos preditivos que eu utilizava na época me forneciam algum embasamento para o trabalho, porém, com o passar do tempo senti a necessidade de me atualizar e comecei a procurar métodos que pudessem melhorar as minhas previsões.
Foi aí que conheci algoritmos mais sofisticados, dentre eles, os modelos ARIMA.
O que é o ARIMA.
O objeto principal desse ensaio, o algoritmo ARIMA (Autoregressive Integrated Moving Average) é muito utilizado, principalmente, em séries temporais. Trata-se de um modelo auto-regressivo, que captura as estruturas temporais do conjunto de dados, visando prever resultados futuros.
Existem outros modelos para previsão, como o holt-winters e outros algoritmos de regressão linear, contudo, o ARIMA é um dos mais utilizados, talvez pela qualidade dos modelos gerados.
Não vou abordar o cálculo manual e sua fórmula, pois não é o objetivo aqui, uma vez que, será executado através do R, contudo, existem boas referências que podem ajudar a entender melhor como funciona a parte matemática dele.
A vantagem de realizar toda a operação no R, é que ele agiliza e automatiza as suas previsões. Também é possível utilizar um recurso muito bom que é o Auto ARIMA. Ele ajuda a definir os parâmetros “P” (ordem, número de defasagens), “D” (o grau de diferenciação) e “Q” (a ordem da média móvel do modelo) da série, importantes para a precisão do modelo.
Biblioteca e conjunto de dados.
Em primeiro lugar, vamos chamar a biblioteca forecast. Trata-se de um pacote necessário para a utilização de modelos e ferramentas para a previsão de séries temporais. Ela permite a automação de funções importantes para a execução das previsões.
Nesse estudo vamos usar o conjunto de dados “visitas”. Você vai perceber que a maioria dos exemplos encontrados, são de datasets (Iris, AirPassagens, Cars, etc) e bancos de dados públicos. Nesse ensaio procurei trazer algo diferente. Uma série temporal de três anos, de usuários que visitaram o site de uma loja de instrumentos musicais.
library(forecast)
visitas <- read.csv("visitas.csv", sep = ",")
visitas
Transformando em time-series.
Para poder trabalhar com esse conjunto de dados, vou transformar a coluna usuários em uma time-series (ts), para que o R possa entendê-la como uma série temporal. Depois disso, uso um plot(), para visualizar a série.
ts_visitas <- ts(data = visitas$Usuários, start = c(2019), frequency = 12)
ts_visitas
plot(ts_visitas)
Saída do conjunto de dados, transformado em time-series:
Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
2019 121 332 340 260 1671 1483 1125 2437 2128 3101 2725 4282
2020 231 433 461 393 1874 1583 2325 3337 3328 4005 3935 5191
2021 4443 4543 4785 4225 3656 4177 4415 5331 5128 5605 6835 7191
Analisando os dados é possível perceber algumas características e tendências. Trata-se de uma série temporal de três anos, com uma tendência de crescimento. Você pode fazer outras análises prévias, aprendidas no artigo sobre análise exploratória.
Iniciando o ARIMA
Antes, vamos rodar a função auto.arima(), pois ela vai possibilitar a definição de parâmetros “P”, “D” e “Q”, e fornecer o melhor ajuste da série.
auto.arima(ts_visitas)
Observe a saída a seguir:
Series: ts_visitas
ARIMA(0,1,0)(0,1,0)[12]
sigma^2 = 895167: log likelihood = -190.24
AIC=382.48 AICc=382.67 BIC=383.62
A melhor combinação apontada foi “0,1,0” para order e a mesma sequência para sazonal. Agora basta montar o modelo, com a função Arima() e depois a previsão com o forecast().
Perceba que, a nota do AIC ficou em 382, o que é ótimo, quanto menor essa nota melhor. O AIC é o Critério de Informação de Akaike, ele mede a distância entre os modelos, verificando a quantidade de informação perdida. Podemos considerar que se trata de uma métrica de qualidade para o modelo. É um bom indicador para realizar comparativos entre os modelos criados.
Iniciando o Forecast.
Finalmente chegou a hora de realizar a previsão, com os parâmetros selecionados no auto.arima() e visualizar graficamente os possíveis cenários.
Aqui serão usadas duas funções importantes: a primeira delas é o próprio Arima(), onde vamos determinar: o conjunto de dados utilizado; os parâmetros para order e seasonal (lembre-se de usar os que foram selecionados anteriormente); e o forecast(), que irá prever a quantidade de meses que forem determinados.
prev <- Arima(ts_visitas, order = c(0,1,0), seasonal = c(0,1,0))
previsao <- forecast(prev, h=12)
previsao
plot(previsao)
Na tabela a seguir, é exibida a previsão com os intervalos de confiança de 80% e 95%.
Perceba, na imagem a seguir, que a previsão segue a tendência sazonal dos últimos anos, bem como o comportamento de aumento e queda de visitas.
Conclusões.
O grande desafio é a criação de um modelo que atenda o que você precisa.
Creio que o ARIMA é um dos algoritmos que mais ajudam a se aproximar de um ajuste adequado. Como comentei no início, não há somente uma forma de fazer previsões de séries temporais, inclusive, recomendo que o leitor faça uma pesquisa de variações desse processo, algoritmos de treinamento, entre outras técnicas, que poderão melhorar ainda mais o seu modelo.
Para um conjunto de dados, faça cada ensaio em um arquivo diferente, depois promova um comparativo entre eles, através do AIC, pois assim, será possível determinar qual deles vai atender melhor as suas necessidades.
Olá, saudações! Desejo saber como podemos fazer em um mesmo gráfico os dados previstos pelo algoritmo da série temporal versus os dados efetivamente realizados/ocorridos de fato para fins de comparação visual.
Oi Silvestre, O que você quer fazer é um comparativo correto? Eu geralmente faço isso usando o ggplot. Eu separo os dados de previsão em uma variável, os dados realizados em outra e faço um gráfico usando o ggplot, com duas linhas. Uso muito para ir mostrando aos clientes a evolução perante o que foi previsto. Vou planejar escrever um artigo sobre isso, pois é um tema interessante. Obrigado pela visita! Abs!