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 を利用します。(なお、データ作成は山口 寛氏に担当いただきました。)詳細な環境構築など今回は割愛いたします。
データ取得から分析用データ作成までの流れ
ワクチンに関連するキーワードをSearch Ranking API で取得
関連キーワードごとに性別や年代など必要な情報を Search Volume API で取得
取得したデータを整形して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種類のキーワードが存在していますが、一つひとつのキーワードの検索数推移を可視化しても読み解くのが大変な為、キーワードをカテゴリに分けていきます。
キーワード分類
上記のようなカテゴリが作れました。「副反応」は新型コロナワクチン接種とともに耳にするようになった特徴的な言葉なので、意味合いの近い「副作用・不安」とは独立してカテゴリを作成しました。
カテゴリに対する妥当性の検討は時間がいくらあっても足りませんので、一旦これくらいにして、カテゴリごとの検索数推移を可視化してみましょう。
データの可視化および考察
グラフの可視化は、使い慣れている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
※本記事の内容は公開日時点の情報です。
この記事が参加している募集
この記事が気に入ったらサポートをしてみませんか?