Googleトレンドを使いこなそう その２

# はじめに
前回、超入門の[「Googleトレンド」](https://qiita.com/pooshikin/items/4bf6a347f9cebf07657f)の使い方をやりました。
その２では、[**google-trends-api**](https://www.npmjs.com/package/google-trends-api)をインストールして、特定のキーワードでGoogleトレンドの**検索クエリ**と**value**を取得してみたいと思います。
GoogleトレンドのAPIの結果はJSON形式で返却されます。
**「まず、やってみよう！」**です。

# 前提
* OS : Windows7以上
* PoweShellのターミナルで実行
* VSCodeでコード編集
* node.js環境構築済み
* npmインストール済み

# google-trends-apiのインストール
とりあえず、google-trends-apiをローカルにインストールします。
こんな感じでインストールできれば、OKです。

```tex
npm i  google-trends-api --save
```

```Shell
Windows PowerShell
Copyright (C) 2009 Microsoft Corporation. All rights reserved.

PS C:\Users\～\Google> npm i google-trends-api
+ google-trends-api@4.9.0
added 100 packages from 100 contributors and audited 344 packages in 37.337s
found 1 high severity vulnerability
  run `npm audit fix` to fix them, or `npm audit` for details


   ╭───────────────────────────────────────────────────────────────╮
   │                                                               │
   │      New major version of npm available! 5.6.0 -> 6.9.0       │
   │   Changelog: https://github.com/npm/cli/releases/tag/v6.9.0   │
   │               Run npm install -g npm to update!               │
   │                                                               │
   ╰───────────────────────────────────────────────────────────────╯
```

# 段階的サンプルコードの１
検索ワードを「相撲」にしてみました。
検索条件を**obj**をとします。
**relatedQueries**で関連キーワードを取得できます。
GooglトレンドがJSONで何を返すのか、まず調べてみます。
ソースファイル名を**「sample1.js」**で保存します。

|項目|変数|値|説明|
|:--|:--|:--|:--|
|検索ワード|serachword|"相撲"||
|検索条件(obj)|keyword|serachword|検索ワードを設定|
||startTime|"2019-01-01"|検索範囲の開始日|
||endTime|"2019-10-01"|検索範囲の終了日|
||geo|"JP"|検索地区を日本|
||hl|"ja"|言語を日本語|


**\<sample1.js>**

```Javascript

const trdapi = require("google-trends-api");
const serachword = "相撲";

const obj = {
  keyword: serachword,
  startTime: new Date("2019-01-01"),
  endTime: new Date("2019-10-01"),
  geo: "JP",
  hl: "ja"
};

trdapi.relatedQueries(obj).then(results => {
    const json = JSON.parse(results);
    console.log(json);
}).catch(err => {
    console.error(err);
});
```

**\<実行結果>**

```Shell
PS C:\Users\～\Google Trends> node sample1.js
{ default: { rankedList: [ [Object], [Object] ] } }
```
返却値として、**default**とその下位に**rankedList**があることがわかります。

# 段階的サンプルコードの２
console.logの出力を**json**から**json.default**に変えてみます。

**\<sample2.js>**

```Javascript

const trdapi = require("google-trends-api");
const serachword = "相撲";

const obj = {
  keyword: serachword,
  startTime: new Date("2019-01-01"),
  endTime: new Date("2019-10-01"),
  geo: "JP",
  hl: "ja"
};

trdapi.relatedQueries(obj).then(results => {
    const json = JSON.parse(results);
    console.log(json.default);
}).catch(err => {
    console.error(err);
});
```
**\<実行結果>**

```Shell
PS C:\Users\～\Google Trends> node sample2.js
{ rankedList: [ { rankedKeyword: [Array] }, { rankedKeyword: [Array] } ] }
```
**rankedList**の下位は**rankedkeyword**が配列(Array)で返却されるこがわかります。
二つの**rankedkeyword**が返却されるので、**rankedList**は**要素数が2**となります。
つまり、**json.default.rankedList.length=2**ということがわかります。

npmのgoogle-trends-apidのrelatedQueriesの説明は下記となっています。

>
* **Top(人気)** - 最も人気のある検索クエリ。 スコア付けは、100の値が最も一般的に検索されるクエリ、50が半分の頻度で検索されるクエリ、および0の値が最も一般的なクエリの1％未満の頻度で検索されるクエリです。
* **Rising(上昇中)** - 最後の期間以降に検索頻度が最も増加したクエリ。 「ブレイクアウト」とマークされた結果は、おそらくこれらのクエリが新しく、以前の検索が（あったとしても）ほとんどなかったために、著しく増加しました。
>

答えを先に教えると、json.default.rankedList[0]は**Top**の値が設定されています。
json.default.rankedList[1]の値には、**Rising**の値が設定されます。

# 段階的サンプルコードの３

console.logの出力を**json.default.rankedList[0].rankedKeyword**に変えて、Topを取得します。

**\<sample3.js>**

```JavaScript

const trdapi = require("google-trends-api");
const serachword = "相撲";

const obj = {
  keyword: serachword,
  startTime: new Date("2019-01-01"),
  endTime: new Date("2019-10-01"),
  geo: "JP",
  hl: "ja"
};

trdapi.relatedQueries(obj).then(results => {
    const json = JSON.parse(results);
    console.log(json.default.rankedList[0].rankedKeyword);
}).catch(err => {
    console.error(err);
});
```

**\<実行結果>**

```Shell
PS C:\Users\～\Google Trends> node sample3.js
[ { query: '相撲 結果',
    value: 100,
    formattedValue: '100',
    hasData: true,
    link: '/trends/explore?q=%E7%9B%B8%E6%92%B2+%E7%B5%90%E6%9E%9C&date=2019-01-1+2019-10-1&geo=JP' },
  { query: '相撲 場所',
    value: 27,
    formattedValue: '27',
    hasData: true,
    link: '/trends/explore?q=%E7%9B%B8%E6%92%B2+%E5%A0%B4%E6%89%80&date=2019-01-1+2019-10-1&geo=JP' },
  { query: '相撲 協会',
    value: 25,
    formattedValue: '25',
    hasData: true,
    link: '/trends/explore?q=%E7%9B%B8%E6%92%B2+%E5%8D%94%E4%BC%9A&date=2019-01-1+2019-10-1&geo=JP' },
  { query: '相撲 の 結果',
    value: 20,
    formattedValue: '20',
    hasData: true,
    link: '/trends/explore?q=%E7%9B%B8%E6%92%B2+%E3%81%AE+%E7%B5%90%E6%9E%9C&date=2019-01-1+2019-10-1&geo=JP' },
  { query: '相撲 部屋',
    value: 18,
    formattedValue: '18',
    hasData: true,
    link: '/trends/explore?q=%E7%9B%B8%E6%92%B2+%E9%83%A8%E5%B1%8B&date=2019-01-1+2019-10-1&geo=JP' },
  { query: '今日 の 相撲',
    value: 17,
    formattedValue: '17',
    hasData: true,
    link: '/trends/explore?q=%E4%BB%8A%E6%97%A5+%E3%81%AE+%E7%9B%B8%E6%92%B2&date=2019-01-1+2019-10-1&geo=JP' },
  { query: '相撲 速報',
    value: 16,
    formattedValue: '16',
    hasData: true,
    link: '/trends/explore?q=%E7%9B%B8%E6%92%B2+%E9%80%9F%E5%A0%B1&date=2019-01-1+2019-10-1&geo=JP' },
  { query: '今日 相撲 結果',
    value: 15,
    formattedValue: '15',
    hasData: true,
    link: '/trends/explore?q=%E4%BB%8A%E6%97%A5+%E7%9B%B8%E6%92%B2+%E7%B5%90%E6%9E%9C&date=2019-01-1+2019-10-1&geo=JP' },
  { query: '日本 相撲 協会',
    value: 14,
    formattedValue: '14',
    hasData: true,
    link: '/trends/explore?q=%E6%97%A5%E6%9C%AC+%E7%9B%B8%E6%92%B2+%E5%8D%94%E4%BC%9A&date=2019-01-1+2019-10-1&geo=JP' },
  { query: '今日 の 相撲 結果',
    value: 13,
    formattedValue: '13',
    hasData: true,
    link: '/trends/explore?q=%E4%BB%8A%E6%97%A5+%E3%81%AE+%E7%9B%B8%E6%92%B2+%E7%B5%90%E6%9E%9C&date=2019-01-1+2019-10-1&geo=JP' },
  { query: '大相撲',
    value: 13,
    formattedValue: '13',
    hasData: true,
    link: '/trends/explore?q=%E5%A4%A7%E7%9B%B8%E6%92%B2&date=2019-01-1+2019-10-1&geo=JP' },
  { query: 'トランプ',
    value: 13,
    formattedValue: '13',
    hasData: true,
    link: '/trends/explore?q=%E3%83%88%E3%83%A9%E3%83%B3%E3%83%97&date=2019-01-1+2019-10-1&geo=JP' },
  { query: 'トランプ 相撲',
    value: 12,
    formattedValue: '12',
    hasData: true,
    link: '/trends/explore?q=%E3%83%88%E3%83%A9%E3%83%B3%E3%83%97+%E7%9B%B8%E6%92%B2&date=2019-01-1+2019-10-1&geo=JP' },
  { query: '今日 の 相撲 の 結果',
    value: 12,
    formattedValue: '12',
    hasData: true,
    link: '/trends/explore?q=%E4%BB%8A%E6%97%A5+%E3%81%AE+%E7%9B%B8%E6%92%B2+%E3%81%AE+%E7%B5%90%E6%9E%9C&date=2019-01-1+2019-10-1&geo=JP' },
  { query: '相撲 取り',
    value: 11,
    formattedValue: '11',
    hasData: true,
    link: '/trends/explore?q=%E7%9B%B8%E6%92%B2+%E5%8F%96%E3%82%8A&date=2019-01-1+2019-10-1&geo=JP' },
  { query: '相撲 力士',
    value: 11,
    formattedValue: '11',
    hasData: true,
    link: '/trends/explore?q=%E7%9B%B8%E6%92%B2+%E5%8A%9B%E5%A3%AB&date=2019-01-1+2019-10-1&geo=JP' },
  { query: '相撲 番付',
    value: 11,
    formattedValue: '11',
    hasData: true,
    link: '/trends/explore?q=%E7%9B%B8%E6%92%B2+%E7%95%AA%E4%BB%98&date=2019-01-1+2019-10-1&geo=JP' },
  { query: '相撲 チケット',
    value: 10,
    formattedValue: '10',
    hasData: true,
    link: '/trends/explore?q=%E7%9B%B8%E6%92%B2+%E3%83%81%E3%82%B1%E3%83%83%E3%83%88&date=2019-01-1+2019-10-1&geo=JP' },
  { query: 'お 相撲 さん',
    value: 8,
    formattedValue: '8',
    hasData: true,
    link: '/trends/explore?q=%E3%81%8A+%E7%9B%B8%E6%92%B2+%E3%81%95%E3%82%93&date=2019-01-1+2019-10-1&geo=JP' },
  { query: '相撲 夏 場所',
    value: 8,
    formattedValue: '8',
    hasData: true,
    link: '/trends/explore?q=%E7%9B%B8%E6%92%B2+%E5%A4%8F+%E5%A0%B4%E6%89%80&date=2019-01-1+2019-10-1&geo=JP' },
  { query: '相撲 大会',
    value: 8,
    formattedValue: '8',
    hasData: true,
    link: '/trends/explore?q=%E7%9B%B8%E6%92%B2+%E5%A4%A7%E4%BC%9A&date=2019-01-1+2019-10-1&geo=JP' },
  { query: '火 ノ 丸 相撲 ネタバレ',
    value: 8,
    formattedValue: '8',
    hasData: true,
    link: '/trends/explore?q=%E7%81%AB+%E3%83%8E+%E4%B8%B8+%E7%9B%B8%E6%92%B2+%E3%83%8D%E3%82%BF%E3%83%90%E3%83%AC&date=2019-01-1+2019-10-1&geo=JP' },
  { query: '相撲 大阪',
    value: 8,
    formattedValue: '8',
    hasData: true,
    link: '/trends/explore?q=%E7%9B%B8%E6%92%B2+%E5%A4%A7%E9%98%AA&date=2019-01-1+2019-10-1&geo=JP' },
  { query: '相撲 懸賞',
    value: 7,
    formattedValue: '7',
    hasData: true,
    link: '/trends/explore?q=%E7%9B%B8%E6%92%B2+%E6%87%B8%E8%B3%9E&date=2019-01-1+2019-10-1&geo=JP' },
  { query: '相撲 ニュース',
    value: 7,
    formattedValue: '7',
    hasData: true,
    link: '/trends/explore?q=%E7%9B%B8%E6%92%B2+%E3%83%8B%E3%83%A5%E3%83%BC%E3%82%B9&date=2019-01-1+2019-10-1&geo=JP' } ]
```

以下の要素を持つJSONが返却されます。

|要素|値|説明|
|:--|:--|:--|
|query|クエリ|検索クエリの中身|
|value|0～100|1%～100%の検索クエリスコア|
|formattedValue|'0'～'100'|valueをシングルコーティションで括った|
|hasData|true|クエリの関連付け有無|
|link|アドレス|クエリのリンク先アドレス|

# 段階的サンプルコードの４

取出したいのは、**検索クエリ**と**value**です。
**Top**からこの２要素を取出してみます。

```JavaScript

const trdapi = require("google-trends-api");
const serachword = "相撲";

const obj = {
  keyword: serachword,
  startTime: new Date("2019-01-01"),
  endTime: new Date("2019-10-01"),
  geo: "JP",
  hl: "ja"
};

trdapi.relatedQueries(obj).then(results => {
    const json = JSON.parse(results);
    for (let i = 0; i < json.default.rankedList[0].rankedKeyword.length; i++) {
        console.log(json.default.rankedList[0].rankedKeyword[i].query 
                    + "," + json.default.rankedList[0].rankedKeyword[i].value);
    } 
}).catch(err => {
    console.error(err);
});
```

**\<実行結果>**

```Shell
PS C:\Users\～\Google Trends> node sample4.js
相撲 結果,100
相撲 場所,29
相撲 協会,26
相撲 の 結果,22
相撲 部屋,20
相撲 速報,18
今日 の 相撲,17
大相撲,16
日本 相撲 協会,15
相撲 結果 今日,14
相撲 今日 の 結果,14
トランプ 相撲,14
相撲 トランプ,13
今日 の 相撲 の 結果,13
相撲 力士,12
トランプ,12
相撲 チケット,11
相撲 取り,11
相撲 動画,11
相撲 番付,10
相撲 優勝,9
相撲 夏 場所,9
お 相撲 さん,9
相撲 大会,9
相撲 ニュース,8
```

検索クエリの結果を見ると、「今日　の　相撲」と形態素解析がされているようです。
検索値として想定されるのは、「今日の相撲」ではないでしょうか？
とりあえず目標の**検索クエリ**と**value**を取得できました。
出力結果をコピーしてスプレッドシートに貼付けて**色々と分析**できそうです。

# まとめ
**ビックデータをどのように解析するのか？**
という命題にふとこの頃突き当りました。
何か便利なツールはないか？
あったじゃないか、毎日使っている、それも億の世界中の人々がせっせと脇目もふらず、検索しまっくているサイト**Google**が提供している**Googleトレンド**。
これだ、といわけで超簡単スクリプトで「相撲」に興味のある人の検索クエリを取得してみました。
そこで次回はこれから**因果関係**という謎の迷宮システムへの第一歩に踏み込みます。

**宿題**
**「相撲と結果は因果関係が成り立ちます。」**
なんのこと？