はだだだだ

定食にサラダは不要だと思う。

MENU

google trendsで長期間のdailyデータを取得する方法

google trendsのデータを使って時系列分析の勉強をしようと思いました。gtrendsRというRパッケージを使用すればRからAPI経由でデータを取得できるようです。

gtrendsRの関連記事
https://mrunadon.github.io/gtrendsR/

しかし、google trendsの仕様ではdailyで取得できるのは最大9ヶ月程度で、かつ、数値は抽出時の最大値を100として指数化されているため、期間を分けて抽出したとしても単純に比較が出来ません。

そこで、以下の内容を実現するための関数を別途作成しました。

  • startとendで期間を指定可能(9ヶ月以上可)
  • 抽出した数値の基準が揃っており、長期間で比較が可能

コードの全体は以下です。

# import packages ---------------------------------------------------------
library(gtrendsR)
library(lubridate)
library(tidyverse)

# parameters --------------------------------------------------------------
start <-  "2018-04-01" # yyyymm (only 1st date of month)
end <- "2019-08-01" # yyyymm (only 1st date of month)
keyword <- "HKT48"
geo <- "JP"

# get google trends data --------------------------------------------------
# change parameters into aruguments of gtrends() function
start_date <-  seq(as.Date(start), as.Date(end), by = "month")
end_date <- seq(as.Date(start), length = length(start_date), by = "month")

period <- cbind(data.frame(s = start_date[-length(start_date)]), data.frame(e = end_date[-1])) %>%
  mutate(period = str_c(s, " ", e)) %>%
  select(period)

# get google trends data
trends <- lapply(period$period, gtrends, keyword = "usj", geo = "JP")

# extract index data
trends_df <- trends %>% 
  map("interest_over_time") %>% 
  bind_rows() %>% 
  mutate(weight_temp = 
           coalesce(ifelse(date == lag(date, 1), lag(hits, 1) / hits , 1), 1),
         weight = cumprod(weight_temp),
         hits_adj = hits * weight) %>%
         distinct(date, .keep_all = TRUE)

trends_df %>%
  mutate(date = as.Date(date)) %>% 
  ggplot() +
  geom_line(aes(x = date, y = hits_adj)) +
  scale_x_date(date_labels = "%Y%m%d")

処理の流れ

期間してについてはyyyy-mm-01形式しか対応していませんが、機関を余分に設定すれば欲しい期間のデータはそろうため、このままにしております。
流れは以下です。

  • パラメータで検索ワードと期間(start, end)を指定
  • startendから1ヶ月区切りのパラメータベクトルperiodを作成
  • periodの分だけgtrendsR::gtrendsをまわす
  • 取得した複数のデータフレームを連結し、検索数(hits)を調整したhits_adjを作成

処理のポイント

1ヶ月区切りの日付を作成する歳に、1日だけ日付が重なるようにしています。

# parameters --------------------------------------------------------------
start <-  "2018-04-01" # yyyymm (only 1st date of month)
end <- "2019-08-01" # yyyymm (only 1st date of month)
keyword <- "HKT48"
geo <- "JP"

# get google trends data --------------------------------------------------
# change parameters into aruguments of gtrends() function
start_date <-  seq(as.Date(start), as.Date(end), by = "month")
end_date <- seq(as.Date(start), length = length(start_date), by = "month")

period <- cbind(data.frame(s = start_date[-length(start_date)]), data.frame(e = end_date[-1])) %>%
  mutate(period = str_c(s, " ", e)) %>%
  select(period)

>period
> period
                  period
1  2018-04-01 2018-05-01
2  2018-05-01 2018-06-01
3  2018-06-01 2018-07-01
4  2018-07-01 2018-08-01
5  2018-08-01 2018-09-01
6  2018-09-01 2018-10-01
7  2018-10-01 2018-11-01
8  2018-11-01 2018-12-01
9  2018-12-01 2019-01-01
10 2019-01-01 2019-02-01
11 2019-02-01 2019-03-01
12 2019-03-01 2019-04-01
13 2019-04-01 2019-05-01
14 2019-05-01 2019-06-01
15 2019-06-01 2019-07-01
16 2019-07-01 2019-08-01

これによって、各期間で取得したデータフレームの検索数(hits)の調整ができるようになります。
調整をおこなっているのは以下の箇所です。

# get google trends data
trends <- lapply(period$period, gtrends, keyword = "usj", geo = "JP")

# extract index data
trends_df <- trends %>% 
  map("interest_over_time") %>% 
  bind_rows() %>% 
<b>  mutate(weight_temp = 
           coalesce(ifelse(date == lag(date, 1), lag(hits, 1) / hits , 1), 1),
         weight = cumprod(weight_temp),
         hits_adj = hits * weight)
</b>

まず、取得したデータフレームを縦につなげます。

trends_df <- trends %>% 
  map("interest_over_time") %>% 
  bind_rows() %>% 

次に、日付が連続しているところ(元々データフレームの境目)のhitsの水準を私用して、前後のデータフレームの調整係数を作成します。

 mutate(weight_temp = 
           coalesce(ifelse(date == lag(date, 1), lag(hits, 1) / hits , 1), 1),
         weight = cumprod(weight_temp),

ここの処理を表にすると以下のようになります。
f:id:hadadada00:20190803215304p:plain

日付が連続しているところでweight_tempを作成し、その連乗積を計算することでweightを計算しています。
そしてhitsweightをかけることで最初に取得したデータフレーム内のhitsの水準に、以降のデータフレームのhitsを合わせています。

実行例

以下のように、長期のdailyのデータが取得できています。
f:id:hadadada00:20190803215655p:plain

以上