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)を指定
- startとendから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),
ここの処理を表にすると以下のようになります。
日付が連続しているところでweight_tempを作成し、その連乗積を計算することでweightを計算しています。
そしてhitsにweightをかけることで最初に取得したデータフレーム内のhitsの水準に、以降のデータフレームのhitsを合わせています。
実行例
以下のように、長期のdailyのデータが取得できています。
以上