PolityLinkを活用した分析チュートリアル

はじめに

今回は、政治に関する様々な情報を整理しているPolityLinkを用いてデータ分析を行うためのチュートリアルを紹介します。

PolityLinkは、以下のことを実現するために開発されたサービスとなっています。開発するに至った経緯や利用しているデータについては、PolityLinkのAboutページ開発者のブログにまとまっています。

PolityLinkとは?

PolityLink(ポリティリンク)は政治の「原文」へのポータルサイトです。 私たち国民が、政治に関する「正確」で「中立」な情報に簡単にアクセスできるように、 国会や行政機関の公式サイトに散らばった情報を、互いに関連付けてまとめ直しています。

PolityLinkで収集したデータはGraphQLで管理及び一般公開されています。そのため、この記事ではGraphQLからデータを取得し、基本的な分析を行うところまでのチュートリアルを紹介したいと思います。

チュートリアルの全内容は、こちらのGoogle Colabで公開しているためPolityLinkを使ってみたいと思った方は参考にしてみてください。

チュートリアルの目次

■ 環境構築

■ GraphQLを用いたデータ取得方法

■ チュートリアル1

■チュートリアル2

分析環境の構築

PolityLinkのデータにアクセスするためのGraphQL Clientは、pip経由でインストールすることができます。このライブラリを利用することで、GraphQL上にあるPolityLinkのリソースをpythonコードで取得することができるようになります。

初めての方は、ライブラリのインストールを行い、Python環境でimportして利用してください。

分析例の紹介

データの取得方法

polityLinkで収集されたデータは、GraphQLに保存されています。 データの活用にあたりエンドポイントにアクセスするためには、politylink.graphql.clientに定義されているGraphQLClientを利用します。

では、実際に2020年12月2日に提出された法律案を取得してみます。取得するためには、以下の3ステップが必要となります。

問題なく実行できると、以下の3件の法律案がJSON形式で取得できます。

{'Bill': [{'name': '新型インフルエンザ等対策特別措置法及び感染症の予防及び感染症の患者に対する医療に関する法律の一部を改正する法律案'},
{'name': '出入国管理及び難民認定法の一部を改正する法律案'},
{'name': '新型インフルエンザ等対策特別措置法の一部を改正する法律案'}]}

今回の例では、法律案を日時で条件付けてデータを取得しましたが、他にも議員や委員会の情報など多くのリソースにアクセスすることができます。GraphQLエンドポイントのページから右端のDOCSタブSCHEMAタブを選択することで、どのような情報が保存されているかを確認することができます。

Image for post
Image for post
図1 GraphQLのスキーマ確認方法

■ チュートリアル 1

一つ目のチュートリアルでは、法律案に関する以下の4つの情報を取得し、それぞれのグループに分けて集計を行ってみます。

国会に関する情報を取得するために、Dietリソースからnamebillsを取得します。billsには、その会期で付託された法律案に関する情報が紐付けられています (Billsリソースに対応)。今回のチュートリアルでは以下の6つの項目を利用します。

これらのデータを取得するためのQueryは以下のように書けます。

1.1 会期別に見た法案の付託数

まずは、国会の会期に分けて提出された法案の数を確認してみます (スクリプトは、colabを確認してください。)。

Image for post
Image for post
図2 会期別に見た法案の付託数 (第201回から第203回)

1.2 会期別に見た新たに提出された法律案数

先ほどは各会期で付託された法律案数をみました。次は新たに提出された法律案に絞り込んで確認してみます。

新たに提出された法律案かどうかは、billNumberで確認することができます。 具体的には、国会の会期を表すdietbillNumberの会期が同じ場合が新たに提出された法律案です。

今回も結果のみの確認としますが、第202回国会では新たに提出された法律案が一つもなかったことがわかります。

Image for post
Image for post
図3 会期別に見た新たに提出された法案数 (第201回から第203回)

1.3 法律案の提出から本会議成立までの日数

法律案が本会議で成立したかどうかは、isPassed=TrueまたはpassedCouncilorsDate is not Noneで判定できます。今回は、本会議で成立した日付まで必要なのでpassedCouncilorsDateを利用します。各法律案が成立するまでの日数とヒストグラムの作成は以下のスクリプトで計算できます。

今回は、横軸に成立までの日数、縦軸に頻度をとったヒストグラムを描きます。

Image for post
Image for post
図4 法律案の提出から本会議成立までの日数の分布

最後に特徴的な法律案を確認するために、第201回から第203回の国会で成立した法律案の内、最短で成立したものと最長で成立したものを取得してみました。

最短で成立した法律案は、「国会議員の歳費、旅費及び手当等に関する法律の一部を改正する法律案」で提出された日に本会議で成立していることがわかります。また最長で成立した法律案は、「種苗法の一部を改正する法律案」で274日かかっており、第201回から第203回までの期間で3回とも付託されています。

■ チュートリアル 2

2つ目のチュートリアルでは、Word Cloudを用いて発言内容の概要を把握してみます。

2.1 発言内容の取得

※ 2020年12月現在、議員毎の発言内容はPolityLinkのGraphQLに格納されてないため、公式のAPIを直接利用します。公式APIが充実しているため、PolityLinkに追加するかどうかは現在検討中です。

公式APIを利用すると、以下のように発言者単位で絞り込んでデータを取得することも可能です。他にも複数のパラメータが用意されているため、興味のある方は公式ドキュメントを確認してみてください。

2.2 発言内容を単語に分割

今回は、どのような発言が行われたかを直感的に理解するために対象を名詞に絞り込みます。文章を単語に分割し、特定の品詞のみ取得するために形態素解析ライブラリの一つであるjanomeを利用しました。

2.3 Word Cloudを作成

取得した単語のリストを元にWord Cloudを作成してみます。Word Cloudでは、出現頻度の高い単語ほど大きな文字で表現されます。

Word Cloudはこちらのライブラリを使うと簡単に作成することができます。また、Google Colabではデフォルトでインストールされています。

Image for post
Image for post
図5 第203回 臨時国会での小泉進次郎さんに関するWord Cloud

解析期間中 (2020年10月26日 — 2020年12月5日)の小泉進次郎さんの職務は環境大臣であるため、発言内容も環境問題に関連したものが多くなっていることが確認できます。

[応用] 法律案に関するWord Cloudを作成

最後にチュートリアル2の内容を発展させて、法律案に関するWord Cloudを作成してみます。

ある法律案に関する議事録を取得するためには、その法律案がどの会議で議論されたかを特定する必要があります。2020年12月現在、国会会議録検索システムが提供するAPIはリクエスト時に法律案名での条件付けを提供していません。そのため、法律案が紐付く会議名をネット検索などを用いて探す必要があるのですが少し労力のかかる作業となってしまいます。

そこで解決案の一つとして、PolityLinkが提供するGraphQLを活用することができます。GraphQL上では、国会や法律案、議事録といったさまざまなリソースが紐付いた形で提供されています。

2.4 法律案に紐付く会議を取得

では、実際に法律案名で条件付けてQueryを実行し、その法律案が議論された会議名を取得してみます。

今回は例として、2020年10月27日に内閣から提出された「予防接種法及び検疫法の一部を改正する法律案」について調べてみます。

法律案に紐付く議事録情報は、以下のようにbeDiscussedMyMinutesでアクセスできます。

Queryを実行すると以下のような法律案の情報と関連議事録を取得できます (一部抜粋)。

{'discussedBills': [{'name': '予防接種法及び検疫法の一部を改正する法律案'}],          
'endDateTime': None,
'name': '衆議院厚生労働委員会',
'ndlMinId': '120304260X00220201111',
'startDateTime': {'day': 11, 'month': 11, 'year': 2020},
'urls': [
{'domain': 'ndl.go.jp',
'title': '本文',
'url': 'https://kokkai.ndl.go.jp/#/detail?minId=120304260X00220201111'
},
{'domain': 'shugiin.go.jp',
'title': '概要PDF',
'url': 'http://www.shugiin.go.jp/internet/itdb_rchome.nsf/html/rchome/News/Honbun/kourou20320201111002.pdf/$File/kourou20320201111002.pdf'},
{'domain': 'shugiintv.go.jp',
'title': '審議中継',
'url': 'https://www.shugiintv.go.jp/jp/index.php?ex=VL&deli_id=50816'}]
},

2.5 紐付いた会議の議事録を取得

議事録には、国会会議録検索システム上で一意に特定することができるndlMinIdが付与されています。APIリクエストを送る時に必要になるため、紐付いた議事録のndlMinIdを取得します。

ndlMinIdが取得できたら、国会会議録検索システムにリクエストを発行し、対象の議事録を取得します (※ チュートリアル2.1で行った発言者単位での議事録取得の時とは、エンドポイントが異なります)。

議事録がうまく取得できると、以下のような発言情報が会議毎に得られます。

{'createTime': '2020-12-08 20:12:43',
'speaker': '大島理森',
'speakerGroup': '無所属',
'speakerPosition': '議長',
'speakerRole': None,
'speakerYomi': 'おおしまただもり',
'speech': '○議長(大島理森君)\u3000この際、内閣提出、予防接種法及び検疫法の一部を改正する法律案について、趣旨の説明を求めます。厚生労働大臣田村憲久君。\r\n\u3000\u3000\u3000\u3000〔国務大臣田村憲久君登壇〕',
'speechID': '120305254X00420201110_008',
'speechOrder': 8,
'speechURL': 'https://kokkai.ndl.go.jp/#/detail?minId=120305254X00420201110&spkNum=8&single',
'startPage': 0,
'updateTime': '2020-12-08 20:12:43'
}

2.6 議事録からWord Cloudを作成

では、得られた発言情報をもとに「予防接種法及び検疫法の一部を改正する法律案」に関するWord Cloudを作成します。

作成手順は、2.2と2.3と同様なので省略します (Google Colabには記載してあります)

Image for post
Image for post
図6 「予防接種法及び検疫法の一部を改正する法律案」に関するWord Cloud

Word Cloudの結果を確認すると、「ワクチン」や「ウイルス」、「コロナ」、「確保」などの「予防接種法及び検疫法の一部を改正する法律案」と関連がありそうな単語が抽出できていることがわかります。

国会では、度の会議で複数の法律案について話されることも多いです。例えば、「第203回国会 衆議院 本会議 第6号 令和2年11月19日」では以下の5つの議題があります。

このような場合に、Word Cloudを作成すると現在の方法では複数の議題が混ざった状態になってしまいます。そのため、将来的には議事録の中から各議題がいつ話されているかまで特定し (議題毎にspeechOrderの範囲を返す)、より詳細な解析ができればと思っています。

まとめ

今回の記事では、PolityLinkを用いてデータ分析を行うための準備と簡単な分析例を紹介しました。

チュートリアル1では、特定の会期や会期を跨いで可視化を行うことで全体の傾向を掴み、特徴的な法律案の確認を行いました。

チュートリアル2では、議事録をWord Cloudを利用することで特定の議員の発言を視覚的に確認しました。また、polityLinkを使うことで議案に紐づく複数の議事録を簡単に取得できることを確認し、議案単位でのWord Cloudも作成しました。

今回紹介した以外にもpolityLinkを活用して様々な切り口で政治を理解することができます。ぜひ、このチュートリアルを参考に政治におけるデータ分析に挑戦し、知見を共有していただけると幸いです。

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store