見出し画像

DS.API - INSIGHTを使ったデータ分析レシピ ~新型コロナワクチン接種への関心推移~

こんにちは、データアナリストの池本佳史です。

先日、 「検索データから見える新型コロナワクチン接種への関心変遷」という調査レポートがヤフー・データソリューションから公開されました。 「ワクチン ○○」といったワクチンと一緒に検索されているキーワードを使って、新型コロナワクチン接種に対する人々の関心変遷を探るといった分析内容のレポートです。

 分析には、ヤフー・データソリューションが提供しているDS.API - INSIGHT を利用しています。
DS.API - INSIGHT は、自社の分析環境にヤフーの検索ビッグデータを連携しスケーラブルな分析体験を実現できるサービスです。ブラウザ上で操作する分析ツールであるDS.INSIGHT  に対して、DS.API – INSIGHT は、データ部分だけを切り取ったもので、Python, Rのようなプログラミング言語や、TableauのようなBIツール、またExcelでも直接データを繋げて柔軟な分析を行うことができます。

今回のnoteでは、「検索データから見える新型コロナワクチン接種への関心変遷」の分析を例に、DS.API - INSIGHT を使ったデータ分析の方法を説明していきます。

分析環境は、Jupyter Notebook上でPythonのプログラミング言語を使ってAPIデータを扱っていきます。データは、DS.API - INSIGHT から提供されている Search Ranking API と Search Volume API を利用します。(なお、データ作成は山口 寛氏に担当いただきました。)詳細な環境構築など今回は割愛いたします。

データ取得から分析用データ作成までの流れ

  1. ワクチンに関連するキーワードをSearch Ranking API で取得

  2. 関連キーワードごとに性別や年代など必要な情報を Search Volume API で取得

  3. 取得したデータを整形してCSVで出力

事前準備

今回利用するモジュールの読み込みや共通設定をします。最低限で動かして行こうと思います。

import requests
import csv

# リクエストに必要なappidを設定しておきます
headers={'x-z-appid' : 'appidに置き換えてください'}

# 今回使うAPIのURLを設定
ranking_url = 'https://datasolution.yahooapis.jp/api/v1/search/ranking'
volume_url = 'https://datasolution.yahooapis.jp/api/v2/search/volume'

ワクチンに関連するキーワードの取得

 ワクチン接種に関する関心の推移を把握したいので、キーワードに「ワクチン」を指定したランキング情報上位100件を取りたいと思います。取得対象は2021年12月分です。また、リクエストするキーワードの長さ上限が20文字であるため、20文字以上のものは除外しています。

# 今回は期間を2022/4/4の週のデータを取得しています
ranking_payload = {"keyword":"ワクチン",  "period":"monthly", "date": "2021-12-01"}

r = requests.post(ranking_url, json=ranking_payload, headers = headers)
results = r.json()

keywords = []

count = 0
for result in results:
    # 20文字以上のものを除外した上位100位のキーワードを取得
    if (count < 100): 
        if (len(result['keyword']) < 20 ):
            keywords.append(result['keyword'])
            count += 1
        else:
            continue
    else:
        break

 実際に実行した結果のサンプルは以下です。以下のようなキーワード群を取得できます。

'ワクチン接種証明書', 
'コロナ ワクチン', 
'子宮頸がんワクチン', 
'ワクチンパスポート', 
'コロナワクチン 3回目', 
'ワクチン接種',

関連キーワードごとに性別や年代など必要な情報を取得

 次に各キーワードから性年代ごとの検索変化のデータを取得していきたいと思います。利用するのはSearch Volume API で、性別は [指定なし, 男性, 女性] と、年代は [指定なし, 10代以下, 20代, 30代, 40代, 50代, 60代, 70代以上] の掛け合わせになります。
 リクエストパラメータを作成し、作成したものを順次リクエストを行う形で実施しています。

# リクエストパラメータのリストを作成しています
period = 'daily'
genders = ['', 'male', 'female']
generations = ['', 'teensOrLess', 'twenties', 'thirties', 'forties', 'fifties', 'sixties', 'seventiesOrMore']


payloads = []
for keyword in keywords:
    for gender in genders:
        for generation in generations:
            payload = {'period':period, 'keywords':[keyword]}
            if (gender != ''):
                payload['gender'] = gender
            if (generation != ''):
                payload['generation'] = generation
            payloads.append(payload)

 上記を実行した結果、以下のようなリストが作成されます。100キーワードに性別が3種、年代が8種となり、計2400件分のリクエストのパラメータが作成されます。

[
  {'period': 'daily', 'keywords': ['ワクチン接種証明書']}, 
  {'period': 'daily', 'keywords': ['ワクチン接種証明書'], 'generation': 'teensOrLess'}, 
  {'period': 'daily', 'keywords': ['ワクチン接種証明書'], 'generation': 'twenties'}, 
  {'period': 'daily', 'keywords': ['ワクチン接種証明書'], 'generation': 'thirties'}, 
  {'period': 'daily', 'keywords': ['ワクチン接種証明書'], 'generation': 'forties'}, 
  {'period': 'daily', 'keywords': ['ワクチン接種証明書'], 'generation': 'fifties'}, 
  {'period': 'daily', 'keywords': ['ワクチン接種証明書'], 'generation': 'sixties'}, 
  {'period': 'daily', 'keywords': ['ワクチン接種証明書'], 'generation': 'seventiesOrMore'}, 
  {'period': 'daily', 'keywords': ['ワクチン接種証明書'], 'gender': 'male'}, 
  {'period': 'daily', 'keywords': ['ワクチン接種証明書'], 'gender': 'male', 'generation': 'teensOrLess'}, 
  {'period': 'daily', 'keywords': ['ワクチン接種証明書'], 'gender': 'male', 'generation': 'twenties'}, 

# 以下省略略
]

 次に検索ボリュームの変化を取得します。サンプルでは、リクエストの負荷低減のために順次リクエストを行う形にしています。このリクエストを行うことで現在提供している最大3年分(2022年5月20日現在)として2019年5月20日〜2022年5月20日までの性年代ごとのデータを取得できます。

results = []
count = 0

for payload in payloads:
    status = -1
    num = 0
    while(status != 200 and num < 3):
        r = requests.post(volume_url, json = payload, headers = headers)
        status = r.status_code
        if(status == 200):
            results.append(r.json())
            count = count + 1
        else:
            num += 1  

 取得結果は以下のようになります。キーワードや指定した性別や年代ごとに日付ごとのデータを取得できます。この状態ですとまだjson形式なのでExcelやtableauなどで取り込んで作業するには少し手が必要な状態です。

[
  [
    {'keyword': 'ワクチン接種証明書', 'date': '2019-05-13', 'gender': 'all', 'generation': 'all', 'prefecture': 'all', 'volume': 0}, 
    {'keyword': 'ワクチン接種証明書', 'date': '2019-05-14', 'gender': 'all', 'generation': 'all', 'prefecture': 'all', 'volume': 0}, 
    {'keyword': 'ワクチン接種証明書', 'date': '2019-05-15', 'gender': 'all', 'generation': 'all', 'prefecture': 'all', 'volume': 0}, 
... 省略
    {'keyword': 'ワクチン接種証明書', 'date': '2022-05-10', 'gender': 'all', 'generation': 'all', 'prefecture': 'all', 'volume': 1700}, 
    {'keyword': 'ワクチン接種証明書', 'date': '2022-05-11', 'gender': 'all', 'generation': 'all', 'prefecture': 'all', 'volume': 2100}, 
    {'keyword': 'ワクチン接種証明書', 'date': '2022-05-12', 'gender': 'all', 'generation': 'all', 'prefecture': 'all', 'volume': 1900}
 ],
 [
   {'keyword': 'ワクチン接種証明書', 'date': '2019-05-13', 'gender': 'all', 'generation': 'teensOrLess', 'prefecture': 'all', 'volume': 0}, 
   {'keyword': 'ワクチン接種証明書', 'date': '2019-05-14', 'gender': 'all', 'generation': 'teensOrLess', 'prefecture': 'all', 'volume': 0}, 
   {'keyword': 'ワクチン接種証明書', 'date': '2019-05-15', 'gender': 'all', 'generation': 'teensOrLess', 'prefecture': 'all', 'volume': 0}, 

... 以下省略

取得したデータを整形してCSVで出力

 最後に取得したデータをheader付きのCSVファイルとして出力します。

labels = ['date','keyword','gender','generation', 'prefecture', 'volume']

try:
    with open(output_demogra_file, 'w') as f:
        writer = csv.DictWriter(f, fieldnames = labels)
        writer.writeheader()
        for dct_arr in results:
            for elem in dct_arr:
                writer.writerow(elem)
except IOError:
    print("I/O error")

以上で分析に必要なデータの取得は完了です。

データの分析

 ここからいよいよデータ分析のフェーズです。返却された検索ワードを確認すると「ワクチン 副反応」「ワクチン接種2回目」のような、新型コロナワクチン接種に関するキーワードがある一方で、中には「子宮頸がんワクチン」のような今回の分析対象ではないキーワードも含まれています。100種類のキーワードが存在していますが、一つひとつのキーワードの検索数推移を可視化しても読み解くのが大変な為、キーワードをカテゴリに分けていきます。

キーワード分類

2回目接種: コロナワクチン 2回目 …
3回目接種: 
ワクチン3回目, 3回目 ワクチン 違う種類 …
危険性や不安: 
ワクチン 後遺症, ワクチン 危険性 … 
副反応: 
コロナ ワクチン 副反応, ワクチン副反応 …
予約・接種: 
横浜市 ワクチン接種 予約 …
接種率: 
コロナワクチン接種率, ワクチン接種率 …
ワクチンナビ: 
コロナワクチンナビ
接種しない自由: 
反ワクチン, ワクチン 打たない …
子どもへの影響:
ワクチン 子供 … 
証明書・アプリ: 
ワクチン接種証明アプリ, ワクチンパスポート …
海外ワクチン: 
ファイザー ワクチン, アストラゼネカ ワクチン … 
国産ワクチン: 
国産ワクチン コロナ, 塩野義製薬 ワクチン …
ワクチンの成分: 
レプリコンワクチン, mrnaワクチン … 
その他:
子宮頸がんワクチン, インフルエンザワクチン … 

カテゴリと該当キーワード(抜粋)

 上記のようなカテゴリが作れました。「副反応」は新型コロナワクチン接種とともに耳にするようになった特徴的な言葉なので、意味合いの近い「副作用・不安」とは独立してカテゴリを作成しました。
 カテゴリに対する妥当性の検討は時間がいくらあっても足りませんので、一旦これくらいにして、カテゴリごとの検索数推移を可視化してみましょう。

データの可視化および考察

グラフの可視化は、使い慣れているBIツールであるTableauを利用しました。カテゴリごとに検索数を合算した後に、各週でカテゴリ構成比を算出し、100%積み上げ面グラフを作成しました。折れ線グラフは、接種回数別ワクチン接種率です。接種率は、首相官邸で公開されている接種実績データと、総務省統計局の人口推計データを加工して新型コロナワクチン接種率を算出しています。

新型コロナワクチン接種に関する検索カテゴリ構成比推移

グラフをみると、一般接種開始前は主に「海外ワクチン」や「ワクチンの成分」、「国産ワクチン」の検索割合が高く、関心の高い事項であったことがわかります。一般接種開始時には、「ワクチンナビ」の検索割合が急増しています。また、一般接種開始以降は、「予約・接種」「副反応」「証明書・アプリ」「接種率」の順に検索割合が増加しており、1, 2回目接種率の増加とともに関心が変遷していることがわかります。長期的なトレンドであった「危険性や不安」の検索数は1, 2回目接種率が一定数まで上昇した後に減少傾向にあることがわかります。直近では、「3回目接種」や「予約・接種」の検索数が増加していることが分かります。

  • 1, 2回目接種率の増加に従い「予約・接種」→「副反応」→「証明書・アプリ」へと関心が遷移しており、ワクチン接種の一連の関心変遷がわかる。また、接種証明書といった出口戦略に対して関心が向いていることがわかる

  • ワクチン接種に対しては、過去にあまり経験のないことから「危険性や不安」への関心が長期トレンドであったことがわかる

 ヤフーの検索データから新型コロナワクチン接種への関心変遷を捉えることができたのではないでしょうか。
 今回は、DS.API - INSIGHT 使ったデータ分析のレシピを「検索データから見える新型コロナワクチン接種への関心変遷」を例に説明しました。検索データを使うことで新型コロナワクチン接種のような、世の中の関心変遷を把握できました。また、ワクチン接種率の推移グラフと照らし合わせることで検索数の変化に説明がつき、より解釈しやすくなりました。

終わりに

DS.API - INSIGHT は、WEB上のダッシュボード利用に留まらない柔軟な分析を可能にしたスケーラブルなサービスです。自社データと検索データの関心推移とを照らし合わせることで、一歩踏み込んだ考察や新たな発見があるかもしれません。社内データ利活用をドライブさせるための優れたサービスですので、興味がある方はぜひ、DS.API - INSIGHT をご検討ください。

本記事に使用した分析結果は、ヤフーデータソリューションWebに掲載中

本記事に使用したVizは、Tableau Publicに掲載中https://public.tableau.com/app/profile/ds.yahoojp/viz/_16524330552140/sheet0

筆者プロフィール
池本 佳史(いけもと よしふみ)
デザイナーとして入社したが、データの可能性に魅了されデータアナリストに転身。主にDS.ANALYSIS(オーダーメイドの課題解決サービス)における分析業務や、DS.INSIGHT(検索・位置情報などの分析ツール)の効果効率的なCSMに関する分析を担当。
キャンプや登山が趣味で、自身のキャンプギアのブランドを運営している。

Twitter: @ysfm_ikemoto 

データ作成者プロフィール
山口 寛(やまぐち ひろし)
2012年よりヤフー所属、2017年から現在はデータソリューションの立ち上げに従事。
これまでも広告システム開発、データインフラ構築・運用、データソリューション事業立ち上げと一貫してデータ領域のエンジニアリング担当。
現在はDS.APIのプロダクトオーナー、エンジニアマネジメントを担当。日々安全にデータが使えるように事業内外向けに取り組んでます。

他note記事→エンジニアの開発日誌

※今回公開したデータを含め、ヤフー・データソリューションは、お客さまのデータを統計データとしたうえでデータの可視化や分析結果をご提供するサービスであり、個人を識別できるデータ (パーソナルデータ) については、お客さまから新たに同意をいただかない限り外部に提供することはありません


この記事が参加している募集

やってみた

この記事が気に入ったらサポートをしてみませんか?