京橋のバイオインフォマティシャンの日常

南国のビーチパラソルの下で、Rプログラムを打ってる日常を求めて、、Daily Life of Bioinformatician in Kyobashi of Osaka

gtrendsRの使い方 と Googleトレンドの情報取得・可視化をやってみた件

はじめに

今回紹介する、gtrendsRは、Google Trendsの情報を取得・表示するためのパッケージである。

そもそも、Google Trendsは、Googleが提供する無料ツールで、Googleの検索エンジンでの検索クエリの人気動向を分析できる。現在、Google検索のシェアが、世界中で約90%とほぼ独占状態であることからも、このワードトレンドの重要度が分かる。

つまりは、市場調査の観点からも、どの国・地域で、どのような行動、ワードが、どういう時系列でトレンドになっているかを素早く把握できるのは良い。

この記事では、gtrendsRでGoogle検索のトレンドデータを取得して、plotlyによるインタラクティブな可視化などをやってみる。検索の実行例は、アメリカ株ネタにやや偏っているが、あしからず。

gtrendsRなどの関連パッケージのインストール

さっそく、gtrendsRなどの関連パッケージをインストールしてみる。

#パッケージ・インストール
pack <- c("gtrendsR", "plotly", "magrittr")
install.packages(pack[!(pack %in% unique(rownames(installed.packages())))])

#ロード
for(n in 1:length(pack)){ eval(parse(text = paste0("library(", pack[n], ")"))) }; rm("n", "pack")

gtrendsの使い方

次に、gtrends関数の使い方をまとめてみた。 この関数では、keyword、geo、timeの引数設定をよく使うことになる。

#gtrendsの使い方
gtrends( keyword , geo , time = "today+5-y", gprop = "web" )

#引数について
#keyword: Google Trends query キーワードである文字ベクトル。複数のキーワード入力も可。
#geo: queryの地理的な地域を示す文字ベクトル。世界中の場合には、"all"を指定する。
#また上記の国コードなどを使用することで、複数の国・地域を指定できる。
#time: queryの期間を指定する文字列。以下を参照のこと。
#"now 1-H" 最後の1時間
#"now 4-H" 最後の4時間
#"now 1-d" 最後の1日
#"now 7-d" 過去7日間
#"today 1-m" 過去30日間
#"today 3-m" 過去90日
#"today 12-m" 過去12ヶ月
#"today+5-y" 過去5年間(デフォルト)
#"all" Google Trends の開始時(2004 年)から
#"Y-m-d Y-m-d" 2つの日付の間で指定(例:「2010-01-01 2010-04-03」)
#gprop: トレンドクエリを収集する Google product を定義する文字列。「web」(デフォ)のままで良いと思う。

代表的な国コード

また、gtrendsRで使う、国コード(country_code)・地域コード(sub_code)は、countriesというデータに格納されている。

代表的な国コードには、日本(JP)、アメリカ(US)、カナダ(CA)、イギリス(GB)などがある。 また、地域コードだと、東京(JP-13)、大阪(JP-27)、ニューヨーク(US-NY)、カリフォルニア(US-CA)などがある。

実際のcountriesからの取り出し方を、以下に記した。

#国コード(country_code)・地域コード(sub_code)の取得
data("countries")
head(countries)
#  country_code sub_code        name
#1           AF     <NA> AFGHANISTAN
#2           AF   AF-BDS  BADAKHSHAN
#3           AF   AF-BDG     BADGHIS
#4           AF   AF-BGL     BAGHLAN
#5           AF   AF-BAL       BALKH
#6           AF   AF-BAM      BAMIAN

#アメリカUSの州・都市
head(countries[grepl("^US-", countries$sub_code),])
#     country_code sub_code       name
#3796           US    US-AL    ALABAMA
#3797           US    US-AK     ALASKA
#3798           US    US-AZ    ARIZONA
#3799           US    US-AR   ARKANSAS
#3800           US    US-CA CALIFORNIA
#3801           US    US-CO   COLORADO

#日本JPの都道府県
head(countries[grepl("^JP-", countries$sub_code),])
#     country_code sub_code         name
#2038           JP    JP-23 AITI [AICHI]
#2039           JP    JP-05        AKITA
#2040           JP    JP-02       AOMORI
#2041           JP    JP-38        EHIME
#2042           JP    JP-21  GIHU [GIFU]
#2043           JP    JP-10        GUNMA

#その他の取得例
#アメリカのカリフォルニア
head(countries[grepl("US", countries$country_code) & grepl("CALIFORNIA", countries$name),])
#       country_code sub_code            name
#3800             US    US-CA      CALIFORNIA
#102327           US    US-MD      CALIFORNIA
#102328           US    US-MO      CALIFORNIA
#102329           US    US-PA      CALIFORNIA
#102330           US    US-CA CALIFORNIA CITY

#ニューヨーク
head(countries[grepl("New York", countries$name),])
#       country_code sub_code         name
#122761           US    US-NY New York, NY

#東京
head(countries[grepl("TOKYO", countries$name),])
#      country_code sub_code             name
#2077            JP    JP-13    TOKYO [TOKYO]
#79623           JP    JP-13    ARIAKE, TOKYO
#79697           JP    JP-13    CHUO-KU/TOKYO
#79806           JP    JP-13    FUTAMI, TOKYO
#79831           JP    JP-13      HABU, TOKYO
#79869           JP    JP-13 HANEDA APT/TOKYO

#大阪
head(countries[grepl("OSAKA", countries$name),])
#      country_code sub_code               name
#2069            JP    JP-27      OSAKA [OSAKA]
#79702           JP    JP-27       DAITO, OSAKA
#79914           JP    JP-27      HIGASHI-OSAKA
#79915           JP    JP-27  HIGASHIOSAKA CITY
#80114           JP    JP-27       IZUMI, OSAKA
#80358           JP    JP-27 KONOHANA-KU, OSAKA

gtrendsのシンプルな実行例

keywordやgeoについて条件を変えて、トレンド検索を実行してみた。

実行例(1)NASDAQのトレンドを国別で12ヶ月分取得して、折れ線プロットを描く

まずは、NASDAQ(ナスダック)のトレンドを、カナダ(CA)と米国(US)、日本(JP)で12ヶ月分取得して、gtrendsRの折れ線プロットをしてみた。

#実行例(1)
res01 <- gtrendsR::gtrends(keyword = c("NASDAQ"), geo = c("US", "CA", "JP"),
                           gprop="web", time = "today 12-m")
plot(res01)
#quartz.save(file = paste0("./Graph_01.png"), type = "png", dpi=150); dev.off()

実行例(2)NASDAQ銘柄のトレンドを、米国(US)で12ヶ月分取得して、折れ線プロットを描く

次に、NASDAQ、TSLA(テスラ)、PLTR(パランティア)、ZM(ズーム), ARKKのトレンドを、米国(US)で12ヶ月分取得して、gtrendsRの折れ線プロットをしてみた。

#実行例(2)
res02 <- gtrendsR::gtrends(keyword = c("NASDAQ", "TSLA", "PLTR", "ZM", "ARKK"), geo = c("US"),
                         gprop="web", time = "today 12-m")
plot(res02)
#quartz.save(file = paste0("./Graph_02.png"), type = "png", dpi=150); dev.off()

TSLAの人気はやはりすごい。

ただ、ここで、Googleトレンドの検索指数は、対象期間内のピークを100とした相対値である。

そのため、取得期間や検索語の組み合わせで、上図の通り、検索指数が変わってくるので、その点は注意する必要である。

あと、同時に検索できるキーワード数は、5つまでのようだ*1

実行例(3)market crashやmarket highとかのキーワード検索

続いて、market crashやmarket highとかのキーワードで検索してみると。。

#実行例(3)
res03 <- gtrendsR::gtrends(keyword = c("market crash", "stock crash", "stock high"), geo = c("US"),
                         gprop="web", time = "2021-01-01 2021-03-25")
plot(res03)
#quartz.save(file = paste0("./Graph_03.png"), type = "png", dpi=150); dev.off()

「stock high」は少し先に反応しているようにも見える。

また、「market high」でも検索してみた(省略)が、それはあまり使わないワードみたい。。。

実行例(4)最近のロビンフット(米国株の人気銘柄)のトレンド

さらに、最近のrobinhoodのトレンドはどうだったのかと思い、それも検索してみた。

#実行例(4)
res04 <- gtrendsR::gtrends(keyword = c("robinhood"), geo = c("US"),
                         gprop="web", time = "2021-01-01 2021-03-25")
plot(res04)
#quartz.save(file = paste0("./Graph_04.png"), type = "png", dpi=150); dev.off()

やっぱり、ゲームストップ事件のあたりで、一時期サチってたのかもね。

plotlyを使った可視化の実行

これくらい遊んだところで、plotlyを使った可視化も実行してみた。

#トレンドデータの取り出し
res04 %>%
  .$interest_over_time -> res04.i 
head(res04.i)
#        date hits   keyword geo                  time gprop category
#1 2021-01-01    2 robinhood  US 2021-01-01 2021-03-25   web        0
#2 2021-01-02    4 robinhood  US 2021-01-01 2021-03-25   web        0
#3 2021-01-03    4 robinhood  US 2021-01-01 2021-03-25   web        0
#4 2021-01-04    5 robinhood  US 2021-01-01 2021-03-25   web        0
#5 2021-01-05    5 robinhood  US 2021-01-01 2021-03-25   web        0
#6 2021-01-06    4 robinhood  US 2021-01-01 2021-03-25   web        0

#グラフ作成
fig <- plotly::plot_ly() 
fig <- fig %>% add_trace(x=res04.i$date, y = res04.i$hits, 
                         name = 'robinhood', mode = 'lines') 
fig <- fig %>% layout(yaxis = list( title = "Search index"))
fig

#保存
#fig %>% htmltools::save_html(file="Graph_05.html")

まとめ

簡単に、トレンド解析できるのは大変良い。

ただ、検索語をどれにするかとか、適切にキーワードを選択できるかは悩みどころかも。

補足

r-bloggersをもとに改変版コードを作ってみた

r-bloggersでの実行コードが為になったので、その記事をもとに改変版コードを作成して実行してみた。

#install.packages("gtrendsR")
library(gtrendsR)
#install.packages("tidyverse")
library(tidyverse)
#install.packages("ggthemes")
library(ggthemes)

gtrends(keyword = "robinhood",
        geo = "US",
        time = "today 12-m") -> results

results %>% summary()
#                    Length Class      Mode
#interest_over_time  7      data.frame list
#interest_by_country 0      -none-     NULL
#interest_by_region  5      data.frame list
#interest_by_dma     5      data.frame list
#interest_by_city    5      data.frame list
#related_topics      6      data.frame list
#related_queries     6      data.frame list

results %>% 
  .$interest_over_time %>%
  glimpse()
#Rows: 52
#Columns: 7
#$ date     <dttm> 2020-03-29, 2020-04-05, 2020-04-12, 2020-04-19, 2020-…
#$ hits     <int> 7, 7, 9, 8, 9, 8, 8, 8, 6, 9, 12, 13, 8, 7, 8, 8, 7, 7…
#$ keyword  <chr> "robinhood", "robinhood", "robinhood", "robinhood", "r…
#$ geo      <chr> "US", "US", "US", "US", "US", "US", "US", "US", "US", …
#$ time     <chr> "today 12-m", "today 12-m", "today 12-m", "today 12-m"…
#$ gprop    <chr> "web", "web", "web", "web", "web", "web", "web", "web"…
#$ category <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …

results %>%
  .$interest_over_time %>%
  ggplot(aes(x = date, y = hits)) +
  geom_line(colour = "darkblue", size = 1) +
  facet_wrap(~keyword) +
  ggthemes::theme_economist()
#quartz.save(file = paste0("./Graph_robinhood.png"), type = "png", dpi=150); dev.off()

やっぱ、2月は、robinhoodバブルだったのかもね。

参考資料

https://cran.r-project.org/web/packages/gtrendsR/gtrendsR.pdf

www.r-bloggers.com

*1:length(keyword) <= 5 is not TRUE