Rを使ってGoogleトレンドからデータをガバっと引っこ抜く(gtrendsR)

GoogleトレンドはGoogleを通じてある単語がどの程度検索されているかを調べられるサービスです。
こんにち話題になったテーマがGoogle検索されないことはありえません。
検索はその回数で定量的に測ることができますので、このデータを使えばトピックの間のアテンションの差や時間変化、さらには地域差までも分析することができます。

Googleトレンドの基本の画面はポチポチやるだけで簡単に操作できるため、いつまでも楽しく遊ぶことができます。
しかし一部の人は遊んでいるうちにもっと柔軟に、もしくはより高度なデータ分析をしてみたいと考え始めるでしょう。
Googleトレンドにはcsvをダウンロードするインターフェースがあるため、これを使ってデータをダウンロードしてRで分析してもいいのですが、

  • 柔軟にデータ形式を設定できない。たとえば時系列データには地域のフィールドを含められない
  • 単語をたくさん持ってきて比較しようと思うと何度もポチポチしなければならず面倒
  • そもそも分析の再現性の観点からマウスポチポチはしたくない

という理由からAPIを通じて直接データを取得したいと思うわけです。
自力でインターフェースを書く必要はありません。ライブラリgtrendsRがあります。

インストール

#R
install.packages("gtrendsR")

公式にはCRANバージョンはgoogle trendsの仕様変更によりうまくいかない、とありますが、私はこれで普通にいけました(2018-09-10時点)。

基本の使い方

メイン関数はgtrendsで、gtrendsオブジェクトを返します。
Googleへのログイン等は必要ありません。

#R
library(gtrendsR)
res <- gtrends(
  keyword = "usj", # 検索キーワード
  geo = "JP", # 検索地域
  time = "today+5-y" #取得期間。ここでは5年
)
plot(res)

なおGoogleトレンドの検索指数の単位は対象期間内のピークを100とした相対指数です。
よって数値の単位は検索条件を変えると変わってしまうため、数値を比較する際には注意しましょう。

gtrendsオブジェクトには関連するデータが格納されていて、たとえば生の時系列データはinterest_over_time要素に入っています。

#R
summary(res$interest_over_time)
##      date                 hits         keyword              geo               gprop              category
## Min.   :2013-09-15   Min.   : 19.0   Length:261         Length:261         Length:261         Min.   :0
## 1st Qu.:2014-12-14   1st Qu.: 33.0   Class :character   Class :character   Class :character   1st Qu.:0
## Median :2016-03-13   Median : 37.0   Mode  :character   Mode  :character   Mode  :character   Median :0
## Mean   :2016-03-13   Mean   : 38.4                                                            Mean   :0
## 3rd Qu.:2017-06-11   3rd Qu.: 44.0                                                            3rd Qu.:0
## Max.   :2018-09-09   Max.   :100.0                                                            Max.   :0

この生時系列データを使えば、ふつうのGoogleトレンドのインターフェースでは見えにくい季節ごとの比較ができます。

#R
library(dplyr)
library(ggplot2)
library(lubridate)
gpfun.seasonality <- function(res.tbl){
  res.tbl %>%
    mutate(
      udate = update(date, year = 2013),
      year = year(date) %>% factor()
    ) %>%
    ggplot(aes(udate, hits)) +
      geom_point(aes(color = year, shape = year)) +
      geom_line(aes(color = year, group = year)) +
      scale_x_datetime(date_labels = "%b", date_breaks = "1 month", name = "")
}
res$interset_over_time %>%
  filter(year(date) > 2014) %>%
  gpfun.seasinality

過去の同時期と比較して今年2018年7月から検索量が明らかに少ないことが観察できます。

地域で比較

ふつうのGoogleトレンドのインターフェースでは地域間の比較が容易ではありませんがgtrendsRを使えば簡単に実現できます。
検索元の地域を絞り込むためにはgtrends関数のオプションgeoで地域コードを指定します。
指定する地域コードはISO 3166に基づきます。
国:ISO 3166-1
地域:ISO 3166-2

ご丁寧なことにgtrendsRパッケージはISO 3166のテーブルを準備してくれています。

#R
data("countries")
head(countries)
##  country_code sub_code        name
##           AF          AFGHANISTAN
##           AF   AF-BDS  BADAKHSHAN
##           AF   AF-BDG     BADGHIS
##           AF   AF-BGL     BAGHLAN
##           AF   AF-BAL       BALKH
##           AF   AF-BAM      BAMIAN

おそらくGoogleトレンドの制約により一度に取得できる地域は5種類までに制限されています。
今回は「東京都、愛知県、大阪府、兵庫県、京都府」の5地域を取得してみることにします。

myregion <- tribble(
  ~geo, ~geo_name,
  "JP-13", "TOKYO",
  "JP-23", "AICHI",
  "JP-27", "OSAKA",
  "JP-28", "HYOGO",
  "JP-26", "KYOTO"
)
res2 <- gtrends(
  keyword = "usj",
  geo = myregion$geo,
  time = "2015-01-01 2018-09-08"
)
res2 %>%
  .[["interest_over_time"]] %>%
  left_join(myregion, by = "geo") %>%
  gpfun.seasonality + facet_wrap(~geo_name)

これらを見ると、USJの検索は一定の季節性(春休み、ハロウィンが多い)があるものの、地域によって微妙に傾向が異なることが分かります。
たとえば東京は1〜2月のクールジャパンの時期が年間のピークに近く、これは他の地域には無い傾向です。
東京人はクールジャパンが好きだと言えるのかもしれません。

兵庫は大阪と同程度の検索量があります。
大阪からの検索は実際にUSJに来た人からの検索が多く含まれるであろうことを考慮すれば、兵庫からの検索はかなり多いような気がします。
兵庫県民は重要顧客と言えそうです。
この重要顧客が今年6月後半から激しく離反しているのは不穏な雰囲気を感じさせます。

関連キーワード

Googleトレンドには『関連キーワード』という機能があり、ある用語と同時にどのようなキーワードが検索されているかを調べることができます。
また関連キーワードは検索量で測られる『人気度』と、検索の増加率で測られる『注目度』の二種類の指標を持ち、用途に合わせて使い分けられます。
たとえばこれを使って地域の間に関連キーワードの顕著な違いを見出すことができれば、地域ごとの特色のようなものを発見できるでしょう。

関連キーワードはgtrendsオブジェクトのrelated_queries要素に収められています。

#R
library(stringr)
gp4 <- res2$related_queries %>%
  filter(related_queries == "top") %>% # 検索量(人気度)のみを抽出
  mutate(subject = as.numeric(subject)) %>%
  filter(str_detect(value, "usj")) %>% # 重複を除くためusjが含まれない関連キーワードは除外
  mutate(values = str_replace(value, "usj", "") %>% str_trim) %>%
  group_by(values) %>%
  mutate(sub.sum = sum(subject)) %>%
  ungroup %>%
  filter(dense_rank(sub.sum * -1) < 10) %>% # 重要な関連キーワード上位10種のみを抽出
  mutate(values = reorder(values, sub.sum * -1)) %>%
  left_join(myregion, by = "geo") %>%
  ggplot(aes(values, subject)) +
    geom_point(aes(shape = geo_name, color = geo_name), size = 3, alpha = 0.8) +
    xlab("") + ylab("search index")

大阪を除く他の地域では一番の関連キーワードは『チケット』であるのに対して、大阪では『時間』です。
大阪では『待ち 時間』も上位であることから
「せっかちな大阪人はとにかく待ち時間を気にする傾向がある」
と言いたくなってしまいますが、大阪からの検索にはusj内からの検索が含まれることを考えると結論を出すのはまだ早計です。
usj内からの検索の影響を除外して、それでもこの傾向が残っていればそう断言してみてもいいかもしれません。

『混雑』の列を見てみると兵庫県からの数値が高いのが明確に見いだせます。
よく見ると『時間』も『待ち 時間』も兵庫県は大阪の次に高い。
よってイラチな兵庫県民はやたらと混雑を気にしていると言ってもよさそうです。

一方『時間』『待ち 時間』は愛知県の関連キーワードとしてはランク外です。
愛知県民はあまり混雑を気にしない傾向があることも分かりました。

まとめ

ライブラリgtrendsRを使うことでGoogleトレンドのデータを簡単にRで扱えることを確認しました。
これによりGoogleトレンドのデータ取得や分析は一気通貫で自動化させることができ、対応速度や分析の再現性は格段に向上するでしょう。
マウスポチポチという非人間的な単純労働はプログラム君にまかせて人間は人間らしくusjに遊びに行きましょう。


最後にGoogleトレンドの数値を扱う上での一般的な注意点です。
Googleトレンドはあくまで『どれだけ検索されたか』を表しています。
これが『どれだけ人気があるか』とそのまま読み替えることはできません。
言葉は知らないから検索されるのであって、たとえば人気すぎて全員が知っているから全然検索されない、というのは十分ありえることです。
そのあたりは次のサイトが勉強になりました。
Googleトレンドの仕組みと本当の意味を考察した – ysklog

参考

コメントを残す