Extração de séries

Ao acessar a ferramenta do Google Trends é possível pesquisar por um termo, por exemplo, Minas Gerais. Uma série será produzida de acordo com os filtros presentes: recorte geográfico, frequência temporal, categoria e tipo de pesquisa.

Além disso, o Google Trends oferece opções para compartilhamento e download dos dados em formato CSV, bem como a desagregação regional e a apresentação de assuntos e pesquisas relacionadas. Esses recursos, juntamente com outros detalhes relevantes, serão explorados a seguir, utilizando a linguagem de programação R e com o objetivo de extrair um número amplo de séries de forma automatizada.

Para realizar a extração, será utilizado o pacote gtrendsR em que a principal função é a gtrends.

if (!require("gtrendsR")){
  install.packages("gtrendsR")
  library(gtrendsR)
}
## Carregando pacotes exigidos: gtrendsR

A documentação indica os argumentos da função e detalha suas funcionalidades, sendo necessário informar pelo menos uma palavra-chave (keyword) a ser buscada.

?gtrends
## starting httpd help server ... done

Ao realizar uma pesquisa e inserir parâmetros, como geo="BR" para indicar a busca realizada no Brasil e time="today 3-m" para definir o período de tempo, o objeto serie01 irá conter a série de interesse em interest_over_time.

serie01 <- gtrends(keyword ="Minas Gerais",
                   geo = "BR",
                   time =  "today 3-m")
head(serie01$interest_over_time)
##         date hits      keyword geo      time gprop category
## 1 2023-02-22   80 Minas Gerais  BR today 3-m   web        0
## 2 2023-02-23   94 Minas Gerais  BR today 3-m   web        0
## 3 2023-02-24   87 Minas Gerais  BR today 3-m   web        0
## 4 2023-02-25   73 Minas Gerais  BR today 3-m   web        0
## 5 2023-02-26   84 Minas Gerais  BR today 3-m   web        0
## 6 2023-02-27   93 Minas Gerais  BR today 3-m   web        0

Também é possível realizar a busca com base em uma data específica, utilizando um intervalo definido no formato AAAA-MM-DD AAAA-MM-DD para obter informações diferentes das pré-definidas.

serie02 <- gtrends(keyword ="currículo",
                   geo = "BR",
                   time =  "2012-01-01 2023-04-30")
head(serie02$interest_over_time)
##         date hits   keyword geo                  time gprop category
## 1 2012-01-01   22 currículo  BR 2012-01-01 2023-04-30   web        0
## 2 2012-02-01   23 currículo  BR 2012-01-01 2023-04-30   web        0
## 3 2012-03-01   24 currículo  BR 2012-01-01 2023-04-30   web        0
## 4 2012-04-01   21 currículo  BR 2012-01-01 2023-04-30   web        0
## 5 2012-05-01   23 currículo  BR 2012-01-01 2023-04-30   web        0
## 6 2012-06-01   21 currículo  BR 2012-01-01 2023-04-30   web        0
# gráfico
plot(serie02)

Uma observação interessante é que a grafia das palavras, com ou sem acentuação, pode resultar em séries distintas. Veja, a seguir, o exemplo da palavra currículo sem acento.

serie03 <- gtrends(keyword ="curriculo",
                   geo = "BR",
                   time =  "2012-01-01 2023-04-30")
# gráfico
plot(ts.union(ts(serie02$interest_over_time$hits,start = c(2012,1), frequency = 12),
              ts(serie03$interest_over_time$hits,start = c(2012,1), frequency = 12)),
     plot.type = "single",col = c(1,2), ylab="", xlab="Mês")
legend("bottomright", legend = c("currículo","curriculo"),col = c(1,2), bty = 'n',lty = c(1,1))

Aplicando filtro geográfico

Além disso, também é possível extrair séries temporais referentes às diferentes unidades da federação, por exemplo:

serie04 <- gtrends(keyword ="vaga de emprego",
                   geo = "BR-MG",
                   time =  "2012-01-01 2023-04-30")
# gráfico
plot(serie04)

Uma palavra muito buscada em um período pode gerar um outlier, conforme exemplificado anteriormente. Portanto, é necessário realizar um tratamento dessas séries para fins estatísticos.

Também é possível extrair a mesma série para diferentes locais e realizar comparações entre eles. Nesse caso, o índice é construído com base nas buscas conjuntas em todos os locais. O valor 100 é atribuído ao ponto do tempo e ao local que apresenta o maior número de buscas.

serie05 <- gtrends(keyword ="vaga de emprego",
                   geo = c("BR-MG","BR-SP"),
                   time =  "2012-01-01 2023-04-30")
head(serie05$interest_over_time)
##         date hits         keyword   geo                  time gprop category
## 1 2012-01-01   18 vaga de emprego BR-MG 2012-01-01 2023-04-30   web        0
## 2 2012-02-01   15 vaga de emprego BR-MG 2012-01-01 2023-04-30   web        0
## 3 2012-03-01   17 vaga de emprego BR-MG 2012-01-01 2023-04-30   web        0
## 4 2012-04-01   14 vaga de emprego BR-MG 2012-01-01 2023-04-30   web        0
## 5 2012-05-01   15 vaga de emprego BR-MG 2012-01-01 2023-04-30   web        0
## 6 2012-06-01   15 vaga de emprego BR-MG 2012-01-01 2023-04-30   web        0
# gráfico
plot(serie05)

Uma limitação é que as comparações são restritas a um máximo de cinco locais ou cinco palavras.

Extraindo uma categoria

Os dados também são agrupados em categorias usando um mecanismo de classificação de linguagem natural, que inclui categorias como saúde, emprego, esportes, viagens, entre outras. A lista completa dessas categorias pode ser visualizada utilizando o pacote gtrendsR:

data("categories")
View(categories)

Para realizar uma comparação, pode-se efetuar buscas com e sem a categoria Jobs - 60 para a palavra-chave vaga, por exemplo:

serie06a <- gtrends(keyword ="vaga",
                   geo = "BR-MG",
                   time =  "2012-01-01 2023-04-30",
                   category = 0)
serie06b <- gtrends(keyword ="vaga",
                   geo = "BR-MG",
                   time =  "2012-01-01 2023-04-30",
                   category = 60)
head(serie06a$interest_over_time)
##         date hits keyword   geo                  time gprop category
## 1 2012-01-01   41    vaga BR-MG 2012-01-01 2023-04-30   web        0
## 2 2012-02-01   41    vaga BR-MG 2012-01-01 2023-04-30   web        0
## 3 2012-03-01   42    vaga BR-MG 2012-01-01 2023-04-30   web        0
## 4 2012-04-01   36    vaga BR-MG 2012-01-01 2023-04-30   web        0
## 5 2012-05-01   36    vaga BR-MG 2012-01-01 2023-04-30   web        0
## 6 2012-06-01   30    vaga BR-MG 2012-01-01 2023-04-30   web        0
head(serie06b$interest_over_time)
##         date hits keyword   geo                  time gprop category
## 1 2012-01-01   39    vaga BR-MG 2012-01-01 2023-04-30   web       60
## 2 2012-02-01   36    vaga BR-MG 2012-01-01 2023-04-30   web       60
## 3 2012-03-01   38    vaga BR-MG 2012-01-01 2023-04-30   web       60
## 4 2012-04-01   36    vaga BR-MG 2012-01-01 2023-04-30   web       60
## 5 2012-05-01   30    vaga BR-MG 2012-01-01 2023-04-30   web       60
## 6 2012-06-01   32    vaga BR-MG 2012-01-01 2023-04-30   web       60
# gráfico
plot(ts.union(ts(serie06a$interest_over_time$hits,start = c(2012,1), frequency = 12),
              ts(serie06b$interest_over_time$hits,start = c(2012,1), frequency = 12)),
     plot.type = "single",col = c(1,2), ylab="", xlab="Mês")
legend("topleft", legend = c("sem categoria","com categoria"),col = c(1,2), bty = 'n',lty = c(1,1))

As próprias categorias também podem ser extraídas ao não incluir uma keyword:

serie07 <- gtrends(geo = "BR-MG",
                   time =  "2012-01-01 2023-04-30",
                   category = 60)
# gráfico
plot(serie07)

Comparando séries

Assim como foi possível comparar diferentes localidades, também é possível comparar diferentes palavras-chave, com a limitação de até cinco palavras.

serie08 <- gtrends(keyword =  c("currículo","curriculo","vaga de emprego","vaga","sine"),
                   geo = "BR-MG",
                   time =  "2012-01-01 2023-04-30",
                   category = 60)
head(serie08$interest_over_time)
##         date hits   keyword   geo                  time gprop category
## 1 2012-01-01   14 currículo BR-MG 2012-01-01 2023-04-30   web       60
## 2 2012-02-01   13 currículo BR-MG 2012-01-01 2023-04-30   web       60
## 3 2012-03-01   11 currículo BR-MG 2012-01-01 2023-04-30   web       60
## 4 2012-04-01   12 currículo BR-MG 2012-01-01 2023-04-30   web       60
## 5 2012-05-01   15 currículo BR-MG 2012-01-01 2023-04-30   web       60
## 6 2012-06-01    9 currículo BR-MG 2012-01-01 2023-04-30   web       60
# gráfico
plot(serie08)

Extraindo palavras relacionadas

Explorando uma outra funcionalidade, a cada extração é possível obter uma lista de 50 palavras relacionadas.

serie09 <- gtrends(keyword =  c("currículo"),
                   geo = "BR-MG",
                   time =  "2012-01-01 2023-04-30",
                   category = 0)
serie09$related_queries$value
##  [1] "curriculo"                               
##  [2] "fazer currículo"                         
##  [3] "lattes currículo"                        
##  [4] "modelo currículo"                        
##  [5] "lattes"                                  
##  [6] "enviar currículo"                        
##  [7] "modelo de currículo"                     
##  [8] "como fazer currículo"                    
##  [9] "objetivo currículo"                      
## [10] "objetivo"                                
## [11] "o que é currículo"                       
## [12] "currículo online"                        
## [13] "fazer um currículo"                      
## [14] "currículo pdf"                           
## [15] "curriculum"                              
## [16] "objetivo para currículo"                 
## [17] "como fazer um currículo"                 
## [18] "currículo primeiro emprego"              
## [19] "currículo pronto"                        
## [20] "o que colocar no currículo"              
## [21] "o que é um currículo"                    
## [22] "meu currículo"                           
## [23] "fazer curriculo"                         
## [24] "modelos de currículo"                    
## [25] "currículo vitae"                         
## [26] "fazer currículo online"                  
## [27] "jovem aprendiz"                          
## [28] "fazer currículo pelo celular"            
## [29] "currículo online grátis"                 
## [30] "como fazer um curriculo"                 
## [31] "currículo referência de minas gerais"    
## [32] "como fazer currículo pelo celular"       
## [33] "fazer currículo em pdf"                  
## [34] "fazer currículo online grátis"           
## [35] "bncc"                                    
## [36] "objetivo profissional para currículo"    
## [37] "objetivo para currículo primeiro emprego"
## [38] "curriculo simples"                       
## [39] "o que colocar no objetivo do currículo"  
## [40] "como fazer currículo online"             
## [41] "criar curriculo"                         
## [42] "currículo pronto word"                   
## [43] "criar currículo online"                  
## [44] "gerador de currículo"                    
## [45] "objetivo para currículo"                 
## [46] "o que colocar no currículo"              
## [47] "objetivo currículo"                      
## [48] "objetivo"                                
## [49] "currículo online"                        
## [50] "currículo pdf"

É possível enriquecer um conjunto inicial de palavras ao expandir o grupo com termos do mesmo contexto. No entanto, é crucial realizar uma avaliação cuidadosa de cada palavra adicionada para garantir sua relevância ao contexto em estudo, alinhada com o objetivo pretendido.

palavras <- unique(c("currículo",serie09$related_queries$value)) #conjunto de palavras únicas
length(palavras)
## [1] 45

Computação paralela

Todos os exemplos anteriores foram construídos por meio da extração de uma ou mais séries. No entanto, para obter um conjunto mais amplo de séries, existem várias abordagens possíveis como a família de funções Apply:

start_time <- Sys.time()
data01 <- sapply(palavras[1:25], function(i) gtrends(keyword =  i,
                   geo = "BR-MG",
                   time =  "2012-01-01 2023-04-30",
                   category = 60,
                   onlyInterest = TRUE)$interest_over_time$hits)
end_time <- Sys.time()
end_time - start_time
## Time difference of 24.38817 secs

Outra alternativa é aproveitar a computação paralela ao considerar atividades independentes. O pacote parallel oferece essa funcionalidade. Para obter mais detalhes sobre pacotes de computação paralela no R, recomenda-se consultar este link.

Um aspecto relevante é o número de núcleos disponíveis na CPU.

if (!require("parallel")){
  install.packages("parallel")
  library(parallel)
}
## Carregando pacotes exigidos: parallel
numCores<-detectCores()
numCores
## [1] 8

A ideia principal é criar um conjunto de instâncias paralelas do R para execução simultânea. Para alcançar isso, é necessário criar essas instâncias usando a função makeCluster e inserir em cada uma delas as informações necessárias para realizar a tarefa usando a função clusterEvalQ:

# criando cópias
cl<- makeCluster(numCores-1)

# salva objetos
save.image("partial.Rdata")

# envia dados para cada uma das cópias
clusterEvalQ(cl,{load("partial.Rdata")
  library(gtrendsR)
})
## [[1]]
## [1] "gtrendsR"  "stats"     "graphics"  "grDevices" "utils"     "datasets" 
## [7] "methods"   "base"     
## 
## [[2]]
## [1] "gtrendsR"  "stats"     "graphics"  "grDevices" "utils"     "datasets" 
## [7] "methods"   "base"     
## 
## [[3]]
## [1] "gtrendsR"  "stats"     "graphics"  "grDevices" "utils"     "datasets" 
## [7] "methods"   "base"     
## 
## [[4]]
## [1] "gtrendsR"  "stats"     "graphics"  "grDevices" "utils"     "datasets" 
## [7] "methods"   "base"     
## 
## [[5]]
## [1] "gtrendsR"  "stats"     "graphics"  "grDevices" "utils"     "datasets" 
## [7] "methods"   "base"     
## 
## [[6]]
## [1] "gtrendsR"  "stats"     "graphics"  "grDevices" "utils"     "datasets" 
## [7] "methods"   "base"     
## 
## [[7]]
## [1] "gtrendsR"  "stats"     "graphics"  "grDevices" "utils"     "datasets" 
## [7] "methods"   "base"

Realizando a extração anterior novamente, porém utilizando computação paralela:

start_time <- Sys.time()
data02 <- parSapply(cl,palavras[1:25], function(i) gtrends(keyword =  i,
                   geo = "BR-MG",
                   time =  "2012-01-01 2023-04-30",
                   category = 60,
                   onlyInterest = TRUE)$interest_over_time$hits)
end_time <- Sys.time()
end_time - start_time
## Time difference of 7.135392 secs
# stop cluster
stopCluster(cl)

Extras

Construindo um ranking relativo

Uma abordagem viável para construir um ranking de palavras é normalizar cada série com uma palavra única e relevante para o contexto em estudo. Para isso, é necessário extrair as séries em pares e calcular uma medida sintética que será usada para o ranking.

É válido tentar identificar a palavra com maior número de buscas no período e, preferencialmente, utilizá-la como a palavra de referência. A ideia é que essa palavra apresente o ponto máximo em comparação com todas as séries. No caso em que isso não ocorra, o ranking pode ser considerado uma aproximação, destacando um grupo de palavras mais buscadas, sem necessariamente refletir uma ordenação precisa.

O Google Trends atribui o valor <1 para buscas menores que 1, mas não nulas. Portanto, as séries são extraídas como tipo character. Foi decidido considerar o valor 0 nessas situações e utilizar a média dos valores das séries extraídas. Com base nesses procedimentos, é possível criar uma função:

f.ranking <- function(palavra, palavra_rel, geo, time, category){
  # extrai o par de séries
  data = gtrends(keyword =  c(palavra,palavra_rel),
                   geo = geo,
                   time =  time,
                   category = category,
                   onlyInterest = TRUE)$interest_over_time$hits
  # seleciona a série apenas da palavra em estudo
  data = data[1:(length(data)/2)]
  # substitui na base os menores que 1 por zero
  data[data=="<1"]=0
  # transforma em numérico
  data = as.numeric(data)
  # computa uma médida síntese
  media = mean(data,na.rm=TRUE)
  return(media)
}

Cria-se novamente as cópias:

# criando cópias
cl<- makeCluster(numCores-1)

# salva objetos
save.image("partial.Rdata")

# envia dados para cada uma das cópias
clusterEvalQ(cl,{load("partial.Rdata")
  library(gtrendsR)
})
## [[1]]
## [1] "gtrendsR"  "stats"     "graphics"  "grDevices" "utils"     "datasets" 
## [7] "methods"   "base"     
## 
## [[2]]
## [1] "gtrendsR"  "stats"     "graphics"  "grDevices" "utils"     "datasets" 
## [7] "methods"   "base"     
## 
## [[3]]
## [1] "gtrendsR"  "stats"     "graphics"  "grDevices" "utils"     "datasets" 
## [7] "methods"   "base"     
## 
## [[4]]
## [1] "gtrendsR"  "stats"     "graphics"  "grDevices" "utils"     "datasets" 
## [7] "methods"   "base"     
## 
## [[5]]
## [1] "gtrendsR"  "stats"     "graphics"  "grDevices" "utils"     "datasets" 
## [7] "methods"   "base"     
## 
## [[6]]
## [1] "gtrendsR"  "stats"     "graphics"  "grDevices" "utils"     "datasets" 
## [7] "methods"   "base"     
## 
## [[7]]
## [1] "gtrendsR"  "stats"     "graphics"  "grDevices" "utils"     "datasets" 
## [7] "methods"   "base"

Agora, finalmente, calcula-se o ranking:

ranking <- parSapply(cl,palavras, function(i) f.ranking(palavra = i,
                                                       palavra_rel = "curriculo",
                                                       geo = "BR-MG",
                                                       time = "2012-01-01 2023-04-30",
                                                       category = 60))  

Organizando e vizualizando o ranking:

# ordena
ranking <- data.frame(média = sort(ranking, decreasing = TRUE))
ranking
##                                                média
## curriculo                                58.83088235
## lattes                                   45.66911765
## currículo                                19.41911765
## curriculum                               16.27205882
## objetivo                                  5.90441176
## fazer curriculo                           4.09558824
## lattes currículo                          2.62500000
## fazer currículo                           2.42647059
## como fazer um curriculo                   1.94117647
## enviar currículo                          1.60294118
## modelo currículo                          1.54411765
## como fazer currículo                      1.45588235
## objetivo currículo                        1.37500000
## modelo de currículo                       1.25735294
## jovem aprendiz                            1.12500000
## curriculo simples                         1.11764706
## currículo online                          1.08088235
## fazer um currículo                        1.06617647
## currículo primeiro emprego                0.85294118
## como fazer um currículo                   0.83823529
## objetivo para currículo                   0.82352941
## currículo pronto                          0.80147059
## currículo pdf                             0.67647059
## criar curriculo                           0.66176471
## currículo vitae                           0.63235294
## o que colocar no currículo                0.51470588
## modelos de currículo                      0.51470588
## meu currículo                             0.44852941
## o que é currículo                         0.38970588
## fazer currículo online                    0.38970588
## currículo online grátis                   0.27205882
## fazer currículo online grátis             0.23529412
## fazer currículo pelo celular              0.21323529
## como fazer currículo pelo celular         0.21323529
## currículo referência de minas gerais      0.16911765
## objetivo para currículo primeiro emprego  0.15441176
## fazer currículo em pdf                    0.14705882
## bncc                                      0.14705882
## gerador de currículo                      0.14705882
## o que é um currículo                      0.13235294
## objetivo profissional para currículo      0.11764706
## o que colocar no objetivo do currículo    0.11029412
## currículo pronto word                     0.10294118
## como fazer currículo online               0.07352941
## criar currículo online                    0.06617647

Pode-se também gerar uma núvem de palavras:

if (!require("wordcloud")){
  install.packages("wordcloud")
  library(wordcloud)
}
## Carregando pacotes exigidos: wordcloud
## Carregando pacotes exigidos: RColorBrewer
set.seed(32)  #para reproduzir a mesma núvem

wordcloud(words = rownames(ranking),
          freq = ranking$média,
          scale = c(4, 1),  min.freq=0, max.words = 50,
          random.order = FALSE,
          color = 1:nrow(ranking))

Referências

Fellows, I. (2018). wordcloud: Word Clouds. URL: link

Gonçalves, C. C. S. (2023) Produção de indicadores do mercado de trabalho com modelos de séries temporais de pesquisas repetidas Tese (Doutorado em População, Território e Estatísticas Públicas) – Escola Nacional de Ciências Estatística - Instituto Brasileiro de Geografia e Estatística, Rio de Janeiro. URL: link

Google (2022) Google Trends lessons. URL: link

Jun, S., Yoo, H. S. and Choi, S. (2017) Ten years of research change using Google Trends: From the perspective of big data utilizations and applications. Technological Forecasting and Social Change. URL:link

Massicotte, P. (2021) gtrendsr: Perform and display Google Trends queries. URL: link

R Core Team (2022) Package parallel. URL: link

Contribuições

Dúvidas, contribuições, comentários e sugestões podem ser direcionadas para o e-mail ou diretamente no Github por meio do link

Citação

Sugestão de citação: Gonçalves, C. Extração de séries do Google Trends. Belo Horizonte, Brasil: Rpubs, 2023. Disponível em https://rpubs.com/caiocgonc/googletrends.