Ir para o conteúdo principal

Séries temporais com Google Trends e R

Como extrair e visualizar dados do Google Trends no R com o pacote gtrendsR para análise de séries temporais e comparação de interesse por termos ao longo do tempo.

Série temporal do Google

A série temporal do Google Trends nos fornecem números que representam o interesse pelo termo pesquisado. O valor 100 é o pico de maior popularidade, assim quanto mais próximo de 100, mais popular o termo foi enquanto um valor próximo de 50 significa que o termo teve metade de sua popularidade. Da mesma maneira ocorre com os valores próximo de 0, que significa que o termo teve menos de 1% da popularidade de pico

Obtendo a série temporal

Para especificar a busca, precisamos preencher os seguintes campos (Nota: alguns deles têm default e não precisam ser preenchidos):

data_scientist <- gtrends(c("Aprendizado de Máquina", "Big Data", "R Linguagem de programação", "Estatística"),
                          geo = c("BR"),    #default para todo o mundo, podemos utilizar também: c("BR", "US")
                          time = "2004-01-01 2014-12-31",  #Data inicial Data final
                          gprop = c("web"), #Opções: "news","images", "froogle", "youtube"
                          category = 0,     #Zero é defaul, uma lista de categorias pode ser conferida abaixo
                          hl = "pt-BR"        
                          )

Acessando os dados obtidos:

💡 Amostra dos dados retornados por gtrends() — a estrutura completa tem ~528 linhas (4 termos × 132 meses). Aqui as primeiras linhas de cada termo:

datehitskeywordgeogprop
2004-01-010Aprendizado de MáquinaBRweb
2004-02-010Aprendizado de MáquinaBRweb
2004-01-014Big DataBRweb
2004-02-012Big DataBRweb
2004-01-010R Linguagem de programaçãoBRweb
2004-02-010R Linguagem de programaçãoBRweb
2004-01-0162EstatísticaBRweb
2004-02-0167EstatísticaBRweb
2005-06-0172EstatísticaBRweb
2014-12-0151EstatísticaBRweb

A coluna hits é normalizada de 0 a 100 (100 = pico histórico do termo na região/período).

Manipulando o formato das datas de busca

Exemplos retirados do manual do pacote de como é possível alterar o formato das datas de busca:

## Playing with time format
gtrends(c("R Studio", "Machine Learning"), time = "now 1-H") # última hora
gtrends(c("R Studio", "Machine Learning"), time = "now 4-H") # últimas 4 horas
gtrends(c("R Studio", "Machine Learning"), time = "now 1-d") # último dia
gtrends(c("R Studio", "Machine Learning"), time = "today 1-m") # últimos 30 dias
gtrends(c("R Studio", "Machine Learning"), time = "today 3-m") # últimos 90 dias
gtrends(c("R Studio", "Machine Learning"), time = "today 12-m") # últimos 12 meses
gtrends(c("R Studio", "Machine Learning"), time = "today+5-y") # últimos 5 anos (default)
gtrends(c("R Studio", "Machine Learning"), time = "all") # desde 2004

Visualizando os resultados:

Após isso, já podemos conferir qual foi o comportamento dos dados que selecionamos desde 2004 com a função o plot():

plot(data_scientist)

Séries temporais de popularidade dos termos Big Data e Estatística no Google Trends

Observe como a popularidade da pesquisa pelo termo “Estatística” vem diminuindo conforme o tempo.

É no mínimo curioso, pois com o aumento da popularidade do termo “Big Data” (que definido da maneira mais simples envolve o aumento no volume, velocidade e variedade dos dados de forma absurda) o uso da estatística (tanto teórica como computacional) sido cada vez mais requisitada!

Analises estatísticas

Agora que já obtemos os dados do google trends, além da visualização também podemos aplicar toda a teoria de séries temporais que já conhecemos.

o comportamento da popularidade do termo “Estatística” se apresentou de forma muito interessante, vejamos com mais detalhes o o que esses dados têm a dizer:

library(dplyr)
#Selecionando apenas as observações referêntes ao termo "Estatística"
Estatistica=data_scientist$interest_over_time%>%
  filter(keyword=="Estatística")

Elementos da decomposição de uma Série Temporal

Consideramos as observações \({Z_t,t = 1,...,N}\) de uma série temporal, um modelo de decomposição consiste em escrever \(Z_t\) como uma soma de três componentes não-observáveis,

\[ Z_t=T+S+R \] onde:

  • \(T\) : Tendência
  • \(S\) : Sazonalidade (repetição de um fenômeno no período de tempo)
  • \(R\) : Aleatória (espera-se que seja um \(RB\))

Para decomposição de séries temporais inicialmente vamos criar estes objetos que identificamos na base de dados:

ts=ts(as.numeric(Estatistica$hits),freq=12)
ts_dec=decompose(ts)

Com os objetos em mão, vejamos os resultados da decomposição:

plot(ts_dec)

Decomposição da série temporal em tendência, sazonalidade e resíduo

Com isso somos capazes de criar modelos que possam acompanhar o comportamento da série e interpretar suas características.

Tendências

Inicialmente vamos supor que a componente sazonal \(S_t\) não esteja presente.

Há vários métodos para estimar \(T_t\), exemplos:

  • ajustar uma função do tempo, como um polinômio, uma exponencial ouuma função suave de \(t\);
  • suavizar (ou filtrar) os valores da série ao redor de um ponto, para estimar a tendência naquele ponto
  • suavizar os valores da série através de sucessivos ajustes de retas de mínimos quadrados ponderados (“lowess”)

Testes para tendência

Vamos considerar as hipóteses:

\[ H_0: \text{não existe tendência} \\ H_1: \text{existe tendência} \]

Para avaliar estas hipóteses temos uma série de testes disponíveis mas aqui utilizei apenas um, veja:

  • Teste de sequências (Wald-Wolfowitz)
randtests::runs.test(ts)
## 
##  Runs Test
## 
## data:  ts
## statistic = -9.4058, runs = 12, n1 = 65, n2 = 63, n = 128, p-value <
## 2.2e-16
## alternative hypothesis: nonrandomness

O teste de sequências forneceu uma evidência de que realmente existe uma tendência da série de dados referênte à popularidade do termo “Estatística” nas mídias sociais do Google.

Sazonalidade

É dificíl definir tanto do ponto de vista conceitual como estatístico dizer o que seja sazonalidade.

Empiricamente, consideramos como sazonais os fenômenos que ocorrem regularmente de tempos em tempos.

Testes para a sazonalidade

Para avaliar a sazonaldade podemos utiizar alguem teste que avalie as hipóteses:

\[ H_0: \text{Todos os anos possuem funções de distribuição iguais} \\ H_1: \text{Ao menos dois dos anos possuem funções de distribuição diferentes} \] A base de dados é a seguinte:

data=data.frame(cbind(serie=as.numeric(ts),mes_ano=rep(seq(1,12),11)))
kruskal.test(data=data,serie~mes_ano) 
## 
##  Kruskal-Wallis rank sum test
## 
## data:  serie by mes_ano
## Kruskal-Wallis chi-squared = 12.461, df = 11, p-value = 0.33

Como o valor p sugere significância estatística e além disso visualmente confirmamos a sensação de ocorrer a sazonalidade, não parece haver evidências suficientes para rejeitar a hipótese nula de que todas os anos possuem funções de distribuição iguais, implicando assim uma sazonalidade anual com tendência negativa para a popularidade do termo “Estatística” pesquisado na web.

Como nossos dados confirmam sazonalidade e encontramos uma tendência, vou arriscar aqui de brincadeira ajustar um modelo pelo método de amortecimento exponencial de Holt-Winters (para dados com sazonalidade) só para ter uma perspectiva de como a estatística é immportante.

Método de Amortecimento exponencial de Holt-Winters (dados com sazonalidade)

Este modelo ajuda a descobrir padrão de comportamento complexos. A previsao deste modelo é feita de acordo com a série que pode ser Sazonal Aditiva ou Sazonal Multiplicativa.

É uma adaptação do modelo de amortecimento exponencial de Holt-Winters para dados com sazonalidade. Um parâmtro será incluído nas equações e teremos um novo parâmtro que será a constante de amortecimento dos fatores sazonais

No R, considerando a série sazonal aditiva (por default do R):

ajuste_com_sazonalidade<-HoltWinters(ts)
plot(ajuste_com_sazonalidade)

Ajuste do modelo de Holt-Winters à série temporal sazonal

Note que o ajuste de Holt-Winters obtem melhores resultados para valores mais próximos, pois atribui maior peso para observações mais recentes.

Com a função forecast() podemos obter previsoes do modelo, veja:

library(forecast)
previsao_com_sazonalidade<-forecast(ajuste_com_sazonalidade,h = 12)
plot(previsao_com_sazonalidade)

Comparação entre a série observada e o ajuste de Holt-Winters

Muito a fazer

Trouxe aqui algumas idéias de como a combinação de alguns pacotes junto a artíficios estatísticos podem revelar insformações interessantes, os dados da popularidade de termos de pesquisa do Google são livres para qualquer pessoa e podem gerar insights poderosos para a tomada de decisão, agora com mais uma nova ferramenta poderosa na caixinha basta colocar a mão na massa! Essas séries temporais de buscas também podem ser cruzadas com outras fontes públicas, como fiz na análise do mercado de criptomoedas com R.

Referência

MORETTIN, P.A; TOLOI, C.M. Análise de Séries Temporais. São Paulo, Blucher, 2006

Perguntas frequentes

Como acessar os dados do Google Trends diretamente do R?

Instale o pacote gtrendsR via CRAN ou GitHub e use a função gtrends(), informando os termos de busca, geografia, período e tipo de busca desejados.

Desde quando o Google Trends disponibiliza dados históricos?

A base de dados do Google Trends reúne informações de busca desde o ano de 2004, com valores normalizados de 0 a 100 representando o interesse pelo termo pesquisado.

Como testar se existe tendência ou sazonalidade em uma série do Google Trends?

O teste de sequências (Wald-Wolfowitz) avalia a presença de tendência, enquanto o teste de Kruskal-Wallis pode ser usado para avaliar se há sazonalidade entre os meses do ano.

Recebe os próximos posts por email

Data science, IA e agentes. Sem spam, cancela quando quiser.

Confirmar inscrição

Fellipe Gomes
Autor
Fellipe Gomes
Data Science Specialist @ Accenture | Kaggle Master

Sou formado em estatística e atuo como cientista de dados desde 2017. Compartilho meus estudos e evolução por meio de artigos, tutoriais e projetos de código aberto. Se quiser saber mais sobre meu trabalho, sinta-se à vontade para entrar em contato através das minhas redes sociais.