国連決議への投票結果から、国同士の関係性をベン図を使って可視化する

複数のカテゴリーがあってそれぞれの近さを調べたい時にはよく統計や機械学習のアルゴリズムを使ったりします。例えば、「過去70年間、アメリカが国連でどう孤立していったのか」では距離のアルゴリズムを使って国同士の近さを調べたり、「Spotifyの76,000曲の属性データを分析した結果、J-RockはRockというよりむしろPunkだった 」では主成分分析のアルゴリズムを使って、音楽のジャンルごとの近さを調べたりしています。

しかし、カテゴリーの数が小さい場合は、そういったアルゴリズムを使わずに、Venn Diagram(ベン図)というタイプのチャートを使って、もっと簡単に、さらにもっと直感的にカテゴリー同士の関係を可視化する方法があります。

ベン図を説明するために、過去70年間の国連総会での決議の国ごとの投票内容のデータから、ある二つの国を抜き出し、それぞれの過去の投票結果からその二つの国がどれだけ近いのを見ています。

投票結果には賛成、反対の他に、棄権、欠席などがありますが、ここでは賛成と反対だけに注目します。

例えば、アメリカとカナダの二つを抜き出した場合、以下のようになります。

アメリカの円(青)とカナダの円(緑)が重なっている部分は、両方の国が賛成にしろ反対にしろ同じ投票結果だったということを示し、その数は2,633となっています。逆に、青だけの部分はアメリカが賛成か反対に投票したときにカナダが同じ投票をしなかった件数でその数は1,748となっています。

また、アメリカとロシアの場合は、以下のようになります。

こちらは先ほどのアメリカとカナダの場合と比べて、円が重なっている部分がかなり小さくなっているのがわかります。つまり、アメリカとロシアが同じ投票結果だったのが924件しかないということを示しています。

以上二つの例を比べてみると、円の重なる部分が大きくなるほど、二つの国は近い、もしくは似ていると考えることができます。逆に、円の重なる部分が小さくなるほど、二つの国は遠い、もしくは似ていないと考えることができます。

現在のExploratoryではこちらのベン図はまだサポートされていませんが、実はRには、その名もVennDiagramというパッケージがあります。ということはExploratoryの中でも使えます!

今回はそのパッケージをExploratoryの中でインストールして、ノートの中でベン図を使ってデータの可視化を行う方法を紹介します。

下準備

まず、VennDiagramのRパッケージをインストールします。プロジェクトメニューから「Rパッケージの管理」を選択します。

すると、Rパッケージの管理のダイアログが開くので、「パッケージをインストール」を選択し、「VennDiagram」と入力してインストールボタンをクリックします。

「VennDiagramのインストールに成功しました」と表示されたら、インストールは完了です。

データのダウンロード

Dataverseの国連総会投票データページにあるデータを元に、国連決議へのアメリカ、カナダ、ロシアの投票結果をこちらにまとめておきました。

国連決議の投票結果のデータのページにアクセスしたら、ダウンロードボタンをクリックして、EDFファイルをダウンロードします。

データのインポート

ダウンロードが完了したら、プロジェクトの中でダウンロードしたEDFファイルをドラッグ&ドロップして、インポートします。

EDFファイルをインポートすると、voteというデータフレームが作成され、サマリー・ビューが表示されます。データは4列で、行は約5,000行ほどあることが分かります。

テーブル・ビューからはデータの詳細を確認できます。「vote_id」列は国連決議のID、「CAN」、「RUS」、「USA」は、それぞれの決議に対するカナダ、ロシア、アメリカの投票結果です。「Yes」は賛成、「No」は反対、NA(欠損値)はそれ以外の棄権、欠席などを表します。

データの加工

ベン図を書くのに必要な情報は、それぞれの円の大きさ(それぞれの国の賛成と反対を足した数)と、円の重なっている部分の大きさ(それぞれの国が同じ投票結果の場合の数)です。

そこで、まず、アメリカとカナダが同じ投票結果の場合の数を調べます。具体的には、アメリカとカナダの列の値を比べ、投票結果が同じだったらTRUE、違ったらFALSEが入るような列を新たに作ります。

「USA」の列ヘッダメニューをクリックし、「計算の作成」の「標準」を選択します。

「計算の作成(Mutate)」のダイアログが開いたら、列名に「USA_CAN」、計算エディタに「USA == CAN」と入力します。

この計算は、USAとCANの値が同じ場合にTRUE、違う場合にはFALSEを返します。どちらか、もしくは両方の値がNAの場合は、結果はNAになります。

同様に、アメリカとロシアについても計算します。

「USA」の列ヘッダメニューをクリックし、「計算の作成」の「標準」を選択します。

ダイアログが開いたら、列名に「USA_RUS」、計算エディタに「USA == RUS」と入力し、実行します。

これで、アメリカとカナダが同じ投票をしたかどうかと、アメリカとロシアが同じ投票をしたかどうかを判別する列を追加できました。

最後に集計を行います。

まずは、各国の有効投票数(賛成および反対の数)を集計します。これは、NA(欠損値)以外の値を数えればいいことになります。

「USA」の列ヘッダメニューから「集計」を選択します。

「集計」のダイアログが表示されたら、グループの選択を外して、値に「USA」を選択し、集計関数には「非欠損値の数」を選択します。

次にカナダの有効投票数を集計するために、値に「CAN」を選択し、集計関数には「非欠損値の数」を選択します。

続いて、ロシアの有効投票数を集計するために、値に「RUS」を選択し、集計関数には「非欠損値の数」を選択します。

各国の有効投票数の集計の設定ができたので、次に投票結果が同じだった場合の数を集計します。

これは、投票結果を比べた列の、TRUEの数を数えればいいことになります。

まずは、アメリカとカナダの場合を調べるために、値に「USA_CAN」を選択します。

続いて、値に「USA_RUS」を選択し、実行ボタンをクリックします。

これでデータの準備ができました。

ベン図の作成

それでは、さっそくベン図を作成してみましょう。ドキュメントの右横にある+ボタンを押して、新規にノートを作成します。

するとノートのウィンドウが開きます。

アメリカとカナダ

まずは、先ほどインストールしたVennDiagramパッケージを使ってRのコードを書いて、アメリカとカナダの関係性をベン図で可視化します。

Rのコードを記述するために、プラスボタンから「Rスクリプト」を選択します。

ハイライトした箇所にRのコードを記述することでRのコードの実行が可能です。

続いて、アメリカとカナダの関係性をベン図で表現する以下のコードを、ノートに貼り付けます。

# ライブラリのロード
library(VennDiagram)

# 新しい画像を作成
grid.newpage()
# ベン図の描画
draw.pairwise.venn(
  vote$USA,                            # 左の円の大きさ
  vote$CAN,                            # 右の円の大きさ
  vote$USA_CAN,                        # 重なっている部分の大きさ
  lty = rep("blank", 2),               # 円の枠線を消す
  fill = c("light blue", "#bbffbb"),   # 塗りつぶしの色
  category = c("United States", "Canada"),  # カテゴリーの文字
  cat.pos = c(0, 0),                   # カテゴリーの位置
  scaled=TRUE,                         # 円をスケールするかどうか
  fontfamily = "Arial",                # 円の中の数字のフォント名
  cat.fontface="bold",                 # カテゴリーのフォントスタイル
  cat.fontfamily ="Arial"              # カテゴリーのフォント名
)

なお、先ほど集計作業を行った、voteというデータフレームの「USA」、「CAN」、「USA_CAN」の3つの列を下のベン図を書くためのRのコードの中で参照しています。

上記のコードをコピーして、ノートに貼り付けたら、プレビューボタンをクリックします。

プレビューすると、以下のようなベン図が表示されます。

アメリカとロシア

アメリカとロシアの投票結果を比べる場合には、先ほどのコードの中で使った列をUSA、RUS、USA_RUSの3つの列に変更します。実行結果は以下のようになります。

# ライブラリのロード
library(VennDiagram)

# 新しい画像を作成
grid.newpage()
# ベン図の描画
draw.pairwise.venn(
  vote$USA,                            # 左の円の大きさ
  vote$RUS,                            # 右の円の大きさ
  vote$USA_RUS,                        # 重なっている部分の大きさ
  lty = rep("blank", 2),               # 円の枠線を消す
  fill = c("light blue", "pink"),   # 塗りつぶしの色
  category = c("United States", "Russia"),  # カテゴリーの文字
  cat.pos = c(0, 0),                   # カテゴリーの位置
  scaled=TRUE,                         # 円をスケールするかどうか
  fontfamily = "Arial",                # 円の中の数字のフォント名
  cat.fontface="bold",                 # カテゴリーのフォントスタイル
  cat.fontfamily ="Arial"              # カテゴリーのフォント名
)

3つ以上のカテゴリーの関係性を可視化する

VennDiagramパッケージでは、最大5つのカテゴリーまでのベン図を描くことができます。ここでは、アメリカ、カナダ、ロシアの3カ国の関係性を表すベン図を作ってみます。

3カ国の関係性を表すベン図を作るには、上記の2カ国間の関係性を可視化するのに使用した2カ国間の同じ投票結果の数に加えて、まだ調べていないカナダとロシアの2カ国間の同じ投票結果の数と、3カ国すべてが同じ投票結果の数が必要になります。

そこで、集計の前のステップである8番目のステップに移動します。

「CAN」の列ヘッダメニューをクリックし、「計算の作成」の「標準」を選択します。

カナダとロシアの2カ国が同じ投票結果だったかどうかの列を作るために、列名に「CAN_RUS」、計算エディタに「CAN == RUS」と入力し、実行します。

これで、カナダとロシアが同じ投票をしたかどうかを判別する列を追加できました。

次に、3カ国すべてが同じ投票結果だったかどうかの列を作るために、「USA」の列ヘッダメニューをクリックし、「計算の作成」の「標準」を選択します。

3カ国すべてが同じ投票結果だったかどうかの列を作るために、列名に「USA_CAN_RUS」、計算エディタに「USA == CAN & CAN == RUS」と入力し、実行します。

3カ国すべてが同じ投票結果だったかどうかを判別する列を追加できました。

最後に、追加した2つの列を集計します。右側のステップから一番下の「集計」ステップに移動して、トークンをクリックします。

集計のダイアログが表示されたら、「CAN_RUS」の列を選択し、集計関数に「TRUEの数」を選択します。

「USA_CAN_RUS」の列についても同様に行います。

すべての集計が完了すると、データは以下のような状態になります。

アメリカ、カナダ、ロシアの3カ国の関係性をベン図を表示するコードは以下のようになります。関数名がdraw.triple.vennに変更されていることに注意してください。

# ライブラリのロード
library(VennDiagram)

# 新しい画像を作成
grid.newpage()
# ベン図の描画
draw.triple.venn(
  area1 = vote$USA,        # 円1の大きさ
  area2 = vote$CAN,        # 円2の大きさ
  area3 = vote$RUS,        # 円3の大きさ
  n12 = vote$USA_CAN,      # 円1と2の重なっている部分の大きさ
  n23 = vote$CAN_RUS,      # 円2と3の重なっている部分の大きさ
  n13 = vote$USA_RUS,      # 円1と3の重なっている部分の大きさ
  n123 = vote$USA_CAN_RUS, # 円1と2と3の重なっている部分の大きさ
  # カテゴリーの文字
  category = c("United States", "Canada", "Russia"), 
  lty = "blank",           # 円の枠線を消す
  # 塗りつぶしの色
  fill = c("light blue", "#99ff99", "pink"),         
  fontfamily = "Arial",    # 円の中の数字のフォント名
  cat.fontface="bold",     # カテゴリーのフォントスタイル
  cat.fontfamily ="Arial"  # カテゴリーのフォント名 
)

プレビューすると、アメリカ、カナダ、ロシアの3カ国の関係性を表すベン図が表示されます。

なお、VennDiagramパッケージの描くベン図は、2つのカテゴリーについては、円の大きさと重なる場所の大きさが与えられた値の割合に沿った大きさになるのですが、3つ以上になると図形の形が常に同じになってしまいます。

VennDiagramが提供する関数の詳細については、こちらを参照ください。

まとめ

今回は、Exploratoryを用いてカテゴリー間の関係性をベン図を使って可視化する方法を紹介しました。ビジュアリゼーション自体はとてもシンプルですが、それだけに伝えたいことがストレートに伝わるのが魅力ではないかと思います。ぜひ、使って見てください。

Export Chart Image
Output Format
PNG SVG
Background
Set background transparent
Size
Width (Pixel)
Height (Pixel)
Pixel Ratio