背景
2021年10月1日の緊急事態宣言解除から2年が経過し、2023年5月8日以降は新型コロナウイルス感染症の感染症法上の位置づけが5類感染症へと移行されます。
この(ある意味一区切りついた)タイミングで、Qiitaに投稿された記事の中から、新型コロナウイルスに関連するタグを付与された記事を分析し、どのような取組みがあったかを確認します。
環境
Qiita API v2
Node-RED v3.0.2
Google Spreadsheet
調査対象
「COVID-19」、「コロナウイルス」のいずれかのタグを付与された記事を対象とします。
各タグの状況
ブラウザから各タグの投稿状況をみると、「COVID-19」は331記事、「コロナウイルス」は282記事あることが分かります。
タグの重複もあると思いますので、データを取得してからクレンジングしましょう。
調査概要
データの取得
Node-REDでQiita APIを呼び出し、タグを付与された記事の一覧から作成日・タイトルを抽出します。
・処理フロー
・フローをJSON形式でExportしたもの
[{"id":"89aa9340dd959f7f","type":"inject","z":"0651a1782265ec8e","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"inject","payloadType":"str","x":130,"y":760,"wires":[["b1600241c4d76ac9"]]},{"id":"b1600241c4d76ac9","type":"http request","z":"0651a1782265ec8e","name":"","method":"GET","ret":"obj","paytoqs":"ignore","url":"https://qiita.com/api/v2/items?page=1&per_page=100&query=tag%3Aコロナウイルス","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[],"x":270,"y":760,"wires":[["fe539af4bec57a58"]]},{"id":"ddfb43dce20f8205","type":"function","z":"0651a1782265ec8e","name":"title","func":"let array_data01 = msg.payload;\nlet title = [];\n\n//指定した回数分のタイトルを取得\nfor (let i = 0; i < 100; i++) {\n if (!array_data01[i] || !array_data01[i].title) {\n break; // 入力がなくなったら処理を終了\n }\n title[i] = array_data01[i].title;\n}\nmsg.title = title;\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":570,"y":760,"wires":[["754f4d30cdc3eaa0"]]},{"id":"fe539af4bec57a58","type":"function","z":"0651a1782265ec8e","name":"created_at","func":"let array_data = msg.payload;\nlet created_at = [];\n\n//指定した回数分の記事投稿日を取得\nfor (let i = 0; i < 100; i++) {\n if (!array_data[i] || !array_data[i].created_at) {\n break; // 入力がなくなったら処理を終了\n }\n created_at[i] = array_data[i].created_at;\n}\nmsg.created_at = created_at;\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":430,"y":760,"wires":[["ddfb43dce20f8205"]]},{"id":"754f4d30cdc3eaa0","type":"debug","z":"0651a1782265ec8e","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":690,"y":760,"wires":[]}]
http requestノードには以下の通り指定します。
https://qiita.com/api/v2/items?page=1&per_page=100&query=tag%3Aコロナウイルス
「1ページあたりに含まれる要素数」を表すper_pageは、Qiita APIの仕様で上限100と定められています。
https://qiita.com/api/v2/docs#%E3%83%9A%E3%83%BC%E3%82%B8%E3%83%8D%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3
100記事×ページ数ぶんの処理を実行する必要があるため、上限値である100を設定しています。
フロー実行時に、「タグ名」、「ページ指定」を手動で更新し、各タグの最後(=実行結果が100件未満)まで出力を繰り返します。
取得したデータ(フロー末尾のDebugノード出力結果)をGoogleSpreadsheetに貼り付け、分析へ進みます。
分析
1. 月毎の記事数を可視化する
各タグの出力結果のうち、重複したタイトルを除外します。
2020年3月以降、各月に何本の記事が投稿されたかをグラフで見ていきます。
全記事数515のうち、44%に相当する227記事が2020年3月〜4月に投稿されています。
2. 国内感染者数データと比較
投稿数の多い時期と、国内感染者数の動向に関係性はあるでしょうか。
<厚生労働省(https://covid19.mhlw.go.jp/) の新規陽性者数の推移データより作成>
ヤマが明らかに2022年冬期にあるので、全然わかんないですね。
2000年にクローズアップしてみるとどうでしょう。
<厚生労働省(https://covid19.mhlw.go.jp/) の新規陽性者数の推移データより作成>
2020年4月に顕著な増加はみられますが、年末と比較すると感染者数は少ないですね。
なんとなく国内じゃないな・・という事で、海外動向を確認しましょう。
<出典:https://www.forth.go.jp/topics/20210527.html>
2020年3~4月に死者数が大きく跳ね上がっていることから、この辺りに記事執筆の動機があることが推察されます。
3.タイトルに含まれる文字列をAIで分析
続いて、記事タイトルの文字列を分析し、傾向を見ていきます。
タイトルの分析にはUserLocalのAIテキストマイニングを使用しました。
<UserLocal:AIテキストマイニング(https://textmining.userlocal.jp/) にて作成>
記事タイトルには当然コロナ関連用語が使用されているため、ここからは何も読み取れません。
「COVID-19」「新型コロナウイルス」等の用語を除外し、再度分析します。
<UserLocal:AIテキストマイニング(https://textmining.userlocal.jp/) にて作成>
「SIR(モデル)」、「Python」、「可視」、「解析」、「シミュレーション」という文字列から、感染症流行初期の先の見えない状況において、今後どのような状況が訪れうるか模索していた様子がうかがえます。
おわりに
本記事では、Qiitaの記事タイトルをもとに、コロナ禍を通じてどのような記事が投稿されたかの概況を調査しました。
近年、オープンデータやクラウドサービスが充実し、専門家でなくともさまざまな分析に挑戦できる環境が整っています。
自身が気になる問題に対してデータを収集し、分析することで新しい発見があるかもしれません。積極的にチャレンジしていきましょう!