執筆者 Masashi Hamano
この節では、データ可視化、およびそのアウトプットの一つであるネットワーク図の作り方について説明します。ネットワーク図は視覚的なインパクトが強いので、数値やデータを扱い慣れていない非データ部門の方にも取っ付きやすく、企業との共同研究において有用です。
可視化(Visualization)とは、画像やアニメーションのような視覚的表現を使用し、人に何らかの意味を伝達することです。特にデータ可視化(Data Visualization)と言った場合、データが持つ特性を、グラフィカルに分かりやすく表現することを指します。
可視化は、コンピュータの登場するはるか以前から、人間が情報を直感的に理解するための手段として活用されてきました。地勢や行政区分を一目で把握することができる地図は、その最古の例の1つです。また、私たちがExcel等で日常的に作成している棒グラフや円グラフも、典型的な可視化と言えるでしょう。
このように、可視化は長い歴史を持っていますが、研究分野として認知されたのは比較的最近のことです。コンピュータグラフィクスやユーザインターフェイスの進化とともに、より洗練された可視化の技法を求めて、現在も試行錯誤が続けられています。
ここでは、データ可視化の構成要素について説明します。多くの可視化手法に共通している基本的な視覚要素を抽出すると、次のようになります。
座標
データ項目が持つ数値属性を、直交座標や極座標に対応させて、画面上に配置します。棒グラフやガントチャート、散布図など、多くのグラフがこの手法を使っています。
サイズ
データ項目が持つ数値属性を、グラフィック項目の大きさに対応させます。以下の図は、IBM社が運営している可視化共有サイトので作成することができるバブルチャートで、サイズを利用した可視化を行っています。
色彩
データ項目の分類に応じてグラフィック項目を色分けしたり、数値属性を色相や明度に対応させたりします。ハードディスクのデフラグツールの多くは、以下の図のように、ディスク領域の断片化状態に応じた色分け表示を行いますが、これは色彩を利用した可視化の例です。
シンボル
データ項目を、その特徴を示すアイコンや記号によって表現します。コンピュータのデスクトップに置かれているフォルダアイコンやごみ箱アイコンは、現実世界の書類フォルダやごみ箱の役割をシンボル化しているという意味で、一種の可視化と言えます。
関連
グラフィック項目を隣接させたり、線で結合したりすることによって、データ項目間の関連性を表現します。この関連性の可視化の例としては、以下のようなネットワーク図が良く知られています。
こうした視覚要素は、直感的に理解することが容易な上、視覚上の非干渉性を持っています。例えば、以下のバブルチャートは「サイズ」と「色彩」を利用していますが、人間はこの両者をそれぞれ独立して認識することができます。つまり、異なる種類の視覚要素を適切に組み合わせて同時に使用することで、データが持つ多彩な特性を、一度に描き出すことが可能になるのです。
ネットワーク図はグラフとも呼ばれ、複数の点(ノード)とそれを結ぶ線(エッジ)によって構成されます。グラフを用いることで、様々な物の関係を表すことができます。関係に方向性があるものを有向グラフ、ないものを無向グラフと呼びます。エッジとして、前者では矢印、後者では線分が用いられます。
前述の通り、ネットワーク図は主としてデータ項目間の関連性を表現するデータ可視化手法です。しかしながら、レイアウトによって「座標」、ノードのサイズやエッジの重みによって「サイズ」、ノードやエッジの色分けによって「色彩」、ノードやエッジの表示形式によって「シンボル」(ただし、後述するGephiによるネットワーク図作成では、ノードやエッジの表示形式を変えることはできないので、これについては他のツールを使用する必要があります)を表現することができ、データ可視化の構成要素すべてを盛り込むことが可能です。ただ、あまり盛り込み過ぎると、情報量が多すぎてかえって分かりにくくなってしまいます。これはデータ可視化全般に言えることですが、その図によって何を主張したいのかを明確にして、それが伝わるような図を作るようにしましょう。
ここでは、Pythonのネットワーク分析パッケージNetworkXを使用して、可視化するネットワークの元となるグラフファイルをGEXF形式で出力します。グラフファイルには、ノード、エッジ、および属性の3種類のデータを書き込むことができます。属性は、ノードまたはエッジに関連付けられたデータです。NetworkXで扱える基本的なグラフの種類は、(有向 or 無向)×(エッジに重み有り or エッジに重み無し)の4種類です。
例として、(有向)×(エッジに重み有り)のグラフファイルを作成してみます。このグラフは、Aさん(男性)、Bさん(女性)、Cさん(男性)のお互いに対する好意の関係を想定したもので、AさんはBさんに1.0の好意、BさんはCさんに1.0の好意、CさんはAさんとBさん両方に対して1.0の好意をもつとしています。なお、以下のプログラムを実行する際、NetworkXは事前にインストールしておく必要があります。また、NetworkXについてさらに理解を深めたい場合は、公式のチュートリアルおよびレファレンスが参考になると思います。
#coding: utf8 import networkx as nx sample = {} sample["A"] = {} sample["B"] = {} sample["C"] = {} sample["A"]["sex"] = "Male" sample["B"]["sex"] = "Female" sample["C"]["sex"] = "Male" sample["A"]["scores"] = {} sample["B"]["scores"] = {} sample["C"]["scores"] = {} sample["A"]["scores"]["B"] = 1.0 sample["B"]["scores"]["A"] = 1.0 sample["B"]["scores"]["C"] = 1.0 sample["C"]["scores"]["A"] = 1.0 G = nx.MultiDiGraph() for person in sample: G.add_node(person,sex=sample[person]["sex"]) for person1 in sample: for person2 in sample[person1]["scores"]: G.add_edge(person1,person2,weight=sample[person1]["scores"][person2]) nx.write_gexf(G,"sample.gexf")
ここでは、先ほど作成したsample.gexfを、ネットワーク可視化ツールGephi(ゲフィ)に読み込ませて可視化します。Gephiは、Javaで組まれたオープンソースソフトウェアです。ネットワークを可視化し、分析する目的で使用します。使い方は非常に簡単で、サポートされている形式のグラフファイルをインポートするだけです。サポートされている形式には、GEXF(推奨)やCSVなどがあります。また、Gephiには様々な機能が備わっており、読み込んだネットワークについて、各ノードの中心性を計算したり、クラスタリングを行ったり、時間グラフをインポートすることによって動的ネットワーク分析を行ったりすることもできます。Gephiにおけるネットワークの可視化と操作の基本的な手順については、公式のクイックスタートガイドが詳しいので、こちらを参照してください。
先ほど作成したsample.gexfを可視化すると、以下のようになります。レイアウトはForce Atlas、ノードの色(パーティション)は男性がブルー、女性がレッドとしています。なお、Force Atlasレイアウトでは、エッジが張られていないノード間には斥力が(エッジが張られていないノード間には引力が)働くようになっています。したがって、このレイアウトで距離が近いノード同士は、そのネットワークで定義したエッジの張り方において、関連性が強いと言えます。この他にもGephiは数多くのレイアウトを備えており、インタラクティブに操作できるので、いろいろ試してみると面白いでしょう。
「データの概観を捉える」で使用したRestaurant Consumer Datasetから適当なネットワーク図を作り、そこから有用と思われる知見を挙げてみてください。また、その際に「誰にとって(Whom)」「どういう理由で(Why)」有用なのかを明確にするようにしてください。