プログラマーが効果的な可視化を作成する (前編)

  • 1027
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。
  • 9/2/2014 追記: 最終回が何故か削除されてしまいましたので、二分割して修正の上、復活させました。ご迷惑をお掛けしました

はじめに

この記事は実際に手を動かし、コンピュータを使ってデータ可視化を行う人にむ向けて一般的なノウハウをお伝えする三回シリーズの第一回です。

効果的な可視化とは?

title.png

実務家にとってのデータ可視化

私はサイエンス方面で働くプログラマで、デザインや芸術のバックグラウンドが一切ありません。しかし偶然が重なり、現在は仕事としてデータを可視化するためのソフトウェアを作っています。そこでの経験を通じて、アートやデザインとデータ可視化の間にある共通項と異なる点をだんだん認識できるようになってきました。ここでは私のような元々可視化を専門としない人が最高ではないけど酷くもない(言い換えれば、「70点程度の可視化」)と言うレベルのデータ可視化を作成するときに気をつけている点をまとめてみようと思います。

ここ数年は、生物学者向けに可視化ソフトウェアの使い方と実際の可視化に関するレクチャーを行うことも多くなったので、自分が独学で得た知識をスライドにまとめることも何回か行ってきました。これらのスライドの中からいくつか重要と思われる部分を日本語で再編集してみようと思います。尚、私は科学分野での可視化を中心に扱っていますので、厳密なデータの提示が求められるケースを想定していますが、他の分野でも本質的な部分は同じだと思います。

引用以外の文章と図は、 で再配布可能です。

Data Visualizationの具体例としてのグラフ可視化

graph1.png

私の仕事でのメインプロジェクトはCytoscapeと呼ばれるグラフ(ネットワーク)可視化ソフトと周辺アプリケーションなので、Data Visualizationの具体例として、この分野を取り上げてみたいと思います。一般的なヒストグラムなどに比べるとややマイナーですが、ソーシャルネットワークやインターネットそのものをはじめ、グラフはあらゆる分野で現れるデータ構造なので、汎用性は高いと思います。

なぜこの記事を書こうと思ったのか

opacity.png

Cytoscapeを実際に使っているユーザーに直接話を聞くと、しばしばこのようなことを言われます:

  • スクリーンショット集を見て、自分も同じようなものを作ってみたいと思ったが、プリセットのスタイルから最終的にサンプルのようなところまで持っていく方法よくわからない」
  • 「なぜサンプルにもっと凝ったデザインものを入れないのか?」

これにはいくつか理由があります。一番のポイントは「データが視覚変数(後述)をコントロールする」と言うCytoscapeの根本的なデザインにあります。これは何もCytoscapeに限ったことではなく、汎用性を持ったデータ可視化ソフトウェアは多くの場この方針でデザインされています。つまりこういったソフトウェアで効果的なデータ可視化を行うと言うことは、データの特性を見た上で、基本的な可視化のルールに従ってデータから視覚変数へのマッピングを作成していく事にほかなりません。したがって、どんなデータにもうまくフィットするようなサンプルスタイルを作成するのはなかなか困難で、それが上のユーザーの不満にも繋がっています。これを解決するには、基本操作を知った上で、可視化の基礎的な知識を身に付けるのが一番の近道だと思うので、その知識を身に付ける近道を提供できればと思い、この記事をまとめました。

良い可視化とは何か?

bad1.png

large_net.png

simple.png

そもそも効果的な、良いデータ可視化とはどのようなものでしょう?これには様々な答えがあると思いますが、私は以下のように理解しています:

効果的な可視化とは、データから伝えたいテーマを設定し、それを実現するためにデータから視覚変数への必要最小限のマッピングを設定すること

やや抽象的ですが、これは以下のように分解できます:

  • まずデータの大まかな傾向と特性を把握する
  • 可視化の目的を設定する
  • 目的を語るためのストーリーを考える
  • そのゴールへ到達するための可視化を行う
  • ゴールへ到達するのに不必要な視覚情報を盛り込まない
  • 各視覚変数の特性を理解し、マッピングを効果的に利用する
  • テクノロジーを目的のために使う。テクノロジーのために目的を設定しない

これらを踏まえて自分が今までやってきたことを振り返ると、色々と誤解したまま作業してきたことも多いです。幾つか例をあげてみます。

インフォグラフィックとデータ可視化は異なる

最近目にすることの多いインフォグラフィックは、データを使って表現されたイラストレーションと考えて良いと思います。つまり、インフォグラフィックはデザイナーがその技術を発揮する余地が大きく、データから視覚要素へのマッピングを設定してアルゴリズミックに生成することに主眼を置くデータ可視化とは主従関係が逆になります。

「カッコ良さ」と実用性

新しい技術がそこにあれば使いたくなるのがプログラマの性です。90年代以降、パーソナルコンピュータでもGPUが凄まじい速度で進歩し、あらゆる3次元グラフィックスがラップトップでさえ描画できるようになり、それを利用した多くのデータ可視化ソフトウェアが作成されました。確かに大規模なデータをハイパワーなGPUを使って3次元空間に描画するのは純粋にカッコ良く、SF映画に出てくるフェイクUIのようなものを個人が作ることさえ可能になってきました。しかし、三次元を使ってデータを可視化するのは常に有効な手法なのでしょうか?

私の関わっている分野で3Dを利用したわかり易い可視化例は、タンパク質の三次元構造ビューアです:

3VKH.png
X-ray structure of a functional full-length dynein motor domain PDB ID: 3VKH ダイニンと呼ばれる一種の分子モーターの三次元構造

これは現実に三次元構造を取るアミノ酸の鎖を、そのままコンピュータ上の三次元空間に投影して扱いやすくしたものですから、デザインとして極めて理にかなっている上に、ユーザーにとっても理解が容易です。ここには3Dグラフィックスを利用する明確な理由があります。

しかし以下の例はどうでしょう?

3d.png

これは以前私が、あるネットワークデータをProcessingをライブラリとして使いCytoscape上で描画してみたものです。もちろんこのデータは、以下の様なシンプルな2Dネットワーク図としても描画できます。

2d1.png

この2つを比べた時、3Dになったことで最終的なストーリーを語る上で何か明確なアドバンテージがあるか、と問われれば、必ずしもイエスとは言えないと思います。見た目は派手になりましたが、それ以上のメリットを提示するのは難しいです。更に、以下の例はigraphライブラリにより比較的小さなネットワークに三次元レイアウトを施して画像にしたものです:

3dgraph1.png

3Dレイアウトをグラフに対して行うと、かえってナビゲーションが煩雑になったり、全体の見通しが悪くなることもしばしば起こります。上の例も、二次元の配置に比べて見づらくなったノードやエッジも増えています。このように本当に必要がある場合以外、三次元を安易に使うのは望ましくないです。

It would be more accurate to say that visual space has 2.05 dimensions.
[Ware 2008]

つまり新しい技術、もしくは複雑性を可視化に持ち込む場合、それが最終的なゴールに到達する手助けにならない場合は、もう一度本当にそれが必要かどうか考える必要があります。

効果的な可視化を作成するのにアーティストである必要はない

先に述べたように、美しいインフォグラフィックスを作成するにはデザイナーの素養が必要です。しかし効果的なデータ可視化を制作する技術は、アーティスティックな才能とは異なり、いくつかの基本的なルールを守ることで劇的に向上させることが可能です。これは文書化可能な技術であり才能ではありませんから、だれでも少し時間をかけると「これは酷い」と言うレベルから脱却することは容易です。

可視化作業の流れ

ここからは実際の流れと気をつけるべきポイントを見ていきます。どのような可視化作業でも、以下の手順に従います:

  • テーマの設定
  • データの大まかな傾向・特徴の把握
  • 手法の選択
  • データの準備(加工)
  • データの読み込みと統合
  • 実際の可視化
    • マッピングの作成
    • レイアウト

この中でも、最終的な結果に大きく影響を与えるステップについて詳細を見て行きます。

テーマの設定

全ての作業の中で最も重要なステップです。これを行わないと、最終的な可視化結果は意味のないものになりがちです。とは言っても特段難しいことではなく、取り組む問題を文章化し、実際に手を動かす各ステップでそのゴールからずれていないかを確認するのに使うだけです。これを最初に設定することにより、各ステップで行う作業が提示したいテーマ、もしくはストーリーを補強するものになっているかどうかを確認することが可能となり、無駄な作業や不要な装飾を避けやすくなります。

テーマの例

  • Twitterネットワーク上で、ある人の発言が時間とともに拡散する様子を観察したい
  • あるクラスのオンラインソーシャルネットワーク上に流れるメッセージ量をネットワーク上にマッピングし、生徒間の関係性を推測したい
  • パスウェイの上で承認薬剤が使えるドラッグターゲットと既知の疾患関連遺伝子を可視化し、その重なりを見たい

現実的にはこの程度のテーマ設定で十分です。今後の作業で、このテーマを補強することに繋がっていないと考えられる場合、もう一度ここへ戻ってその作業の妥当性を確認するのが良いデータ可視化への近道です。

edge-weight.png
例(データはフェイク): 一日あたりのメッセージの流量=エッジの太さ・コネクションの数=ノードのサイズ。これは生徒の関係性を示すのに妥当なマッピングだろうか?可視化作成の全体のプロセスを通して、これを自問しながら作成するのが望ましい。

データの傾向の把握

ネットワークを可視化する場合、ネットワークのトポロジー(接続の状態)以外にも様々なデータを組み合わせて可視化を行います。そこで使うデータのある程度の傾向をつかむことは最終的にどのような手法を選択するのかにも繋がり、重要な作業の一つです。もちろん最終的には可視化によってデータを理解しようとしているのですから、それほど詳細に把握する必要はありませんが、以下の様な点だけでもしっかり把握することにより、手法の選択に大きく役立ちます

マッピングに使うデータ

  • データの種類
    • カテゴリカル・データ(離散値)
      • カテゴリーの数
    • 連続値
      • レンジ(最大値・最小値)
  • データポイントの数

例えば、カテゴリー数を把握するのはマッピングする先の視覚変数を選択するのに役立ちます。数十個のカテゴリーがあった場合、それを単純に色にマッピングするというのはひどい結果になりがちです:

category.png

人間が同時に把握できる色の数は想像以上に限られていて、数色程度にとどめておくことが望ましいです:

color_categorical.png

つまり、データのカテゴリー数が多い場合は、色以外のマッピング先を考えたほうがいいということになります。このように、予めデータの傾向を掴んでおくことは、より良い手法を選択するのに役立ちます。

手法の選択

ここでの例はネットワーク可視化ですが、それを実現するのにも様々な方法があります。例えば、上記のTwitterのツイート拡散の例の場合、以下の様な方法が考えられます

  • 最初の発言者から始まり、ダイナミックに情報が伝播していく様子をアニメーションとして表現する
  • 各タイムポイントごとにネットワーク図を作成し、Small Multipleとして変化を提示する
  • タイムポイントごとに色のマップを作成し、一枚の画像で時系列での情報の拡散を示す
    • 情報が到達した時点の色を、t1=red, t2=blue, ...等としてマッピング

実装の難易度、最終的に発表する媒体(ウェブ、論文、ポスター等)、締め切りまでの時間なども考慮に入れて手法を選択します。

ペーパープロトタイピング

手法が決まれば、ここでスケッチを作ります。何も凝った設計図である必要はなく、ただ単に、紙の上に最終的なアウトプットがどのようなものになるのかを描いてみます。データ可視化には、インタラクションの無い(紙への出力、スタティックなイメージの作成)・もしくは少ない(ムービー、自動的に遷移するもの)タイプと、完全なアプリケーションとして提供されるものがあります。後者はここでは扱いませんが、どちらも紙に描いてみてみることにより、実装の難易度やデータの過不足などが確認できます。

ツールの選択

使う手法を決定すると、自ずと使うべきツールも決まってきます。今回の話題とは離れるので詳しくは書きませんが、グラフに関しては以下の様なツールがスタンダードです。しかし可視化以前の部分で使われるツールは、ほとんどどんなデータ可視化でも同じだと思います。

クレンジング

  • Python + IPython Notebook + Pandas
  • grep, sed, awk
  • Exele

解析

  • R
  • Pandas, SciPy, NumPy
  • Matlab
  • Mathematica
グラフ解析
  • igraph
  • NetworkX

可視化

  • デスクトップアプリケーション
    • Cytoscape
    • Gephi
  • ウェブベースの可視化
    • Cytoscape.js
    • D3.js

データの準備、読み込みと統合

ここからが実際にコンピュータに向かう作業です。これは時間がかかるステップである場合も多いですが、反面、機械的な作業でもあるのでそれほど頭は使いません。手元にあるデータから、最終的に使うアプリケーションで利用できる形にデータを「掃除」していきます。

作業の一例として、先日書いた記事へのリンクを張っておきます:

当然ですが、元のデータが綺麗であればそれだけここにかかる手間は小さくなります。もしあなたがデータを公開する機会があれば、是非機械で読み込むのが容易で二次加工しやすいように心がけて下さい。恐らくそれだけでそのデータが利用される機会が増えます。

実際の可視化

マッピングの作成

実際のデータ可視化で中心になるのはこのステップです。綺麗に掃除されたデータ(=機械に読み込みやすい形式に整形されたデータ)を視覚変数にマッピングしていきます。

Visual Variables (視覚変数)とは?

そもそも視覚変数とは何でしょう?これはJacques Bertinが提示した概念で、位置、サイズ、色、形と言った、データを変換する先の視覚的要素の集合のことです。全てのデータ可視化は、データをこれらの要素にマッピングする作業にほかなりません。

  • 小さな数値を小さなノードに、大きな値を大きなノードに
  • 高い重み(スコア)を持つエッジを太く
  • グループAのノードを赤に、グループBのノードを青に

このように概念自体はとても単純なのですが、効果的に使うためには人間の知覚を理解する必要があります。

視覚変数の中身

現在は拡張されたバージョンも有りますが、最初にBertinにより提示された視覚変数は以下の通りです:

vv.png
Carpendale, M. S. T.: Considering Visual Variables as a Basis for Information Visualisation, University of Calgary, Department of Computer Science, 2001-693-16, 2003 (PDF版はこちら)

  • 位置
  • 大きさ
  • 明るさ
  • 向き
  • テクスチャ

どれもお馴染みの概念ばかりだと思います。問題は、これをどう使うかです。

Effectiveness Principle

これらの視覚変数にデータをマッピングする時に従うべき原則はこれです:

Encode most important attributes with highest ranked channels
(最も重要なデータを高くランク付けされているチャンネルで表現せよ)
[Mackinlay 86]

チャンネルとは何か?

ここで言うチャンネルは、同程度の正確さを持つ視覚変数と考えてもらって問題無いと思います。以下は、Jock Mackinleyの論文からの引用ですが、人は一部の視覚変数の値の差は正確に読み取れるが、小さな差異を読み取れない変数もあるということを踏まえた可視化の重要性を論じています:

Mackinlay.png
Jock Mackinlay. 1986. Automating the design of graphical presentations of relational information. ACM Trans. Graph. 5, 2 (April 1986), 110-141.

つまり、伝えたいテーマの中心となるようなデータは、正確性の高いチャンネルを用いて表現すべきであるということです。例えば、オブジェクトの位置は人が最も正確に読み取ることが出来る視覚変数ですから、「異常値もなくきれいな相関関係が存在する」ということを示すのには、データポイントを位置そのもので表す散布図は効果的な手法ということになります。

ネットワーク可視化でも、位置の整理によるわかりやすさの向上は劇的です。エッジという2つのノードの関係性を表す値に基づいて位置を調整することにより、関係性の可視化というネットワーク描画で大切な情報が浮かび上がってきます。例えば以下の2つは全く同じデータですが、適切にノードの配置を変えることにより、見えなかったツリー構造が見えるようになりました:

layout1.png

layout2.png

そしてもう一つ覚えておくべきことは、データのタイプによって、適切なチャンネルとそうでないものが存在するということです。

Mackinlay1.png

Mackinleyは同論文で、データのタイプによってランキングも変化すると述べています。例えば、定量的なデータ(連続値)ならば、それを形の変化などにマッピングするのはナンセンスですが、小さなグループに別れたデータを形にマッピングするのは理にかなっています。具体例で言えば、

は分かりやすいですが、

  • ある社内SNSをネットワーク図で表現し、100人の社員の成績を100種類のノードの形を使って表現する(Ordinalから形へ)

と言うのは出来ないこともないですがナンセンスです。このランキングを一つ一つ見ていけばとても当たり前のことを言っているだけなのですが、それを意識しつつ使い分けるだけで、可視化の完成度は目に見えて上がります。

例: ヒートマップ

ヒートマップはバイオインフォマティクスでもよく使われる手法で、データ全体のトレンドや局所的な変化を把握するのに使われます。例えば(この比喩はあまり正確ではないのですが)ゲノムがスタティックなソースコードならば、マイクロアレイ等の手法で得られるデータは、生命という分子機械(ランタイム)のスナップショットのようなものだと考えてもらえれば分かりやすいと思います。あるシステムの状態を知る、と言う場合は一つ一つの値の細かな差よりも、全体的に赤っぽい/青っぽい、もしくはグループXがアクティブであると言うような、おおよその傾向が見通せれば良いので、近接する値の差を見分けるのが困難で低ランクに位置づけられるが、ひと目で全体の傾向をつかみやすい「色」というチャンネルを使うのが分かりやすい結果を生みます。

Node Color Mapping

特に時系列データならば、タイムポイントごとにマッピングを作り、タイル状に並べればアニメーションよりも分かりやすい可視化を生む場合も多いです。

このようにマッピングには一定のルールは定義できるのですが、「このデータならばこのマッピング」と言うほど単純化が出来ないのが少々難しいところです。良い可視化への近道は、「これは分かりやすい」と思った可視化があれば、それがどのようなデータをどのような視覚変数にマッピングしているのかを意識的に見るようにして、それを自分の作業にフィードバックしていくことだと思います。

中編へ続きます

参考文献

  1. Jock Mackinlay. 1986. Automating the design of graphical presentations of relational information. ACM Trans. Graph. 5, 2 (April 1986), 110-141.
  2. CPSC 533C: Information Visualization
  3. Jacques Bertin. 1983. Semiology of Graphics. University of Wisconsin Press.
  4. Colin Ware. 2008. Visual Thinking: For Design. Morgan Kaufmann Publishers Inc., San Francisco, CA, USA.