ビッグデータの民主化 : BigQuery で選挙データを可視化する
2016年7月5日火曜日
ビッグデータ、機械学習、データの可視化。これらを日常的に扱っている業界以外の人々にとっては(あるいは業界内の人々でさえ)、この種のテクノロジーは縁遠いものに感じられるのではないでしょうか。大規模な財務モデリングやゲノム研究といったものにしか応用されていない印象があります。
これらのテクノロジーが現実の世界にどのような影響を与えるのか、それを把握することは容易ではありません。そこで私たち Google は、これらのテクノロジーがいかに強力かを示すためには私たちの日常生活に直接的な影響を与える身近なテーマに取り組めばよいと考えました。それは大統領選挙です(後述の選挙データとクエリ コード例についてはデベロッパー ガイドを参照してください)。
州、地域、全国に広がる選挙資金データはとてつもなく量が多く複雑であり、その分析は政治分析の中でも特に難しい分野の 1 つとされています。そのため、民主主義のプロセスにおいて選挙資金が果たす役割を理解するのは困難というのが実情です。
しかし、ここにきてビッグデータが状況を大きく変えようとしています。2012 年は、ビッグデータが大統領選挙を左右する決め手となった最初の年でした。そして 2016 年は、歴史上のどの選挙よりも多くのデータが生成される年になるでしょう。
DIY : データの究極的な民主化
私たちは、Center for Responsive Politics(CRP)から提供されたデータセットを使用して、実際に操作できるデモ(後述)を構築しました。Google BigQuery とオープンソースのデータ可視化ツール re:dash を組み合わせれば、テラバイト級のデータを送り、そのデータからリッチでインタラクティブなビジュアライゼーションを作ることができます。
CRP が持つ選挙献金と経費のデータセットにクエリを送って可視化することは、驚くほど簡単でした。そこで、私たちはさらに歩を進め、できることの限界を探りたいと考えました。このデータと、候補者に関する人々のリアルタイムな意見を融合することにしたのです。
次のステップ : 数 TB の過去データとライブ データの可視化
Google I/O 2016 でのプレゼンテーション “Election 2016 : The big data showdown”(2016 年米大統領選挙 : ビッグデータから見える攻防)にあるとおり、私たちはさまざまなデータソースを積み上げていきました。reddit コメント、Twitter、連邦選挙委員会の開示文書、Wikipedia、世界中のニュース(GDELT 経由)などです。私たちは、Dataflow や Datalab、Cloud Machine Learning、BigQuery を駆使して、すべてのデータソースが持つ意味を抽出しました。
たとえば、4 年前の reddit コメントを基に、さまざまなグループが今の候補者についてどう考えているかを学ぶことはできるのでしょうか。4 年前、Sanders 氏の支持者は /r/space と /r/occupywallstreet に、Trump 氏の支持者は /r/guns、/r/MensRights、/r/ronpaul などにそれぞれ投稿し、Clinton 氏の支持者は /r/lgbt、/r/PoliticalDiscussion、/r/baseball、/r/soccer などにコメントを付けていました。こうした情報はどれくらい役に立ち、これらから何が推論できるのでしょうか。
Washington Post に最近掲載された記事 “Here's the data that told us Bernie Sanders would lose”(Sanders 氏が敗北することを教えてくれたデータ)は、私たちのプレゼンテーションを引用したうえで、こう強調しています。すなわち、このレベルの分析は、過去のデータと現在のライブ データを 1 つにまとめて、有権者が経時的に持ち続けている思いを計測し、今を知るためのヒントを提供するということです。
私たちが他に何を学んだのかは、次の動画をご覧ください。
ビッグデータの可視化に取りかかろう
無料デモを実際に試してみてください。CRP のデータのように、誰もがアクセスできるデータセットと BigQuery があれば、ビッグデータとビジュアライゼーションを組み合わせることで、あらゆることの透明性が向上します。透明性が向上するということは、民主主義がもっと強くなるということです。
クエリの例を見てみましょう。比較的単純なところから始めます。
候補者ごとの献金額 : (クリーンアップ済み)
SELECT * FROM (
SELECT LEFT(date, 7)+'-01' month, recipient,
SUM(amount) amount,
COUNT(DISTINCT contribid ) c,
SUM(c) OVER(PARTITION BY recipient) c_tot,
SUM(c) OVER(PARTITION BY month) m_tot,
FROM [fh-bigquery:opensecrets.indivs16v2] a
JOIN (
SELECT cid, FIRST(party) party
FROM [fh-bigquery:opensecrets.cands16]
WHERE distidrunfor = 'PRES'
GROUP BY 1) b
ON a.recipid=b.cid
WHERE LEFT(realcode, 2)!='Z9'
GROUP BY 1, 2
HAVING c>10
)
WHERE c_tot>8000
AND m_tot>5000
ORDER BY 1, 3 DESC
複雑なものも見てみましょう。予備選挙中、最も効率よく政治献金を実際の代議員数に結びつけた候補者は誰でしょうか(州別)。
SELECT *, ROUND(a.amount/b.delegates,0) ratio_delegates, ROUND(a.amount/b.votes,0) ratio_votes
FROM (
SELECT recipient, state,
FIRST(REGEXP_EXTRACT(recipient, ', (.*)') + ' ' + REGEXP_EXTRACT(recipient, '(.*),')) candidate,
SUM(amount) amount,
SUM(IF(b.party='R',-1,1)*amount) amount_n,
COUNT(DISTINCT contribid ) c,
SUM(c) OVER(PARTITION BY recipient) c_tot,
FROM [fh-bigquery:opensecrets.indivs16v2] a
JOIN (
SELECT cid, FIRST(party) party
FROM [fh-bigquery:opensecrets.cands16]
WHERE distidrunfor = 'PRES'
GROUP BY 1) b
ON a.recipid=b.cid
WHERE LEFT(realcode, 2)!='Z9'
GROUP BY 1,2
HAVING c>10
) a
JOIN [fh-bigquery:opensecrets.primaries_results] b
ON a.candidate=b.candidate
AND a.state=b.state_abbrev
いかがでしょうか。いろいろなことを試してください。そして面白いことがわかったら、ぜひ reddit.com/r/bigquery でシェアしてください。
- Posted by Felipe Hoffa, Developer Advocate