改訂版: プログラマーが効果的な可視化を作成する （前編）

# 改訂版について　(5/7/2019公開)
この記事は、私がこちらに公開したもの中では最も読まれているようです。そこで、執筆後に気づいたこと、古くなった情報、新しい技術動向などを考慮に入れて改訂をしました。主な変更点は以下の通りです：

* 新しいセクションの追加
* 最近の本の紹介
* 細かな表現の修正

この記事は複数のセクションに分かれていますので、前編から始め、順番にアップデートして行きたいと思います。何かお気付きの点などありましたら、コメント欄、もしくはkonoアットマークucsd.eduにお願いいたします。

----

# はじめに
この記事は、可視化の専門家ではない人がコンピュータを使ってデータ可視化を実際に行う場合に必要な、一般的なノウハウをお伝えするシリーズの第一回です。

* 前編: 効果的なデータ可視化とはどのようなものか？　（本稿）
* [中編: 分かりにくい可視化を避けるための手法の選択](http://qiita.com/keiono/items/76c0aaabb4e6e0c10dc5)
* [後編: Part 1 基本原則](http://qiita.com/keiono/items/51a5572db2ee06875e31)
* [後編: Part 2 学習ガイド](http://qiita.com/keiono/items/bdc88655d088fa681ed7)

# 効果的な可視化とは？
![title.png](https://qiita-image-store.s3.amazonaws.com/0/20688/482ec0ed-79c1-d8a3-4160-90b8af610388.png)

## 実務家にとってのデータ可視化
私は[バイオインフォマティクス](http://ja.wikipedia.org/wiki/%E3%83%90%E3%82%A4%E3%82%AA%E3%82%A4%E3%83%B3%E3%83%95%E3%82%A9%E3%83%9E%E3%83%86%E3%82%A3%E3%82%AF%E3%82%B9)と呼ばれる分野で働くプログラマで、デザインや芸術のバックグラウンドが一切ありません。しかし偶然が重なり、現在は仕事として生物学分野で使われる[データを可視化するためのソフトウェア](http://www.cytoscape.org/)や、複雑なUIを持つライフサイエンス向けの各種ウェブ・アプリケーション作っています。そこでの経験を通じて、アートやデザインと実務的なデータ可視化の間にある共通点と差異を徐々に認識できるようになりました。近年は、あらゆるホワイトカラーの人々にとって、データを処理し、可視化し、それを他者に何らかの形でプレゼンテーションするスキルは必要になりました。そこで、私のような元々可視化を*専門としない人*が__最高ではないけど酷くもない__（言い換えれば「70点程度の可視化」）と言うレベルのデータ可視化を作成するときに気をつけるべき点をまとめました。

ここ数年は、研究者や学生向けに可視化ソフトウェアの使い方と実際の可視化に関するレクチャーをすることも多くなったので、自分が独学で得た知識を[スライド](http://www.slideshare.net/keiono/presentations)にまとめてきました。本稿では、これらのスライドの中から重要と思われる部分を再編集し、さらにその後私が学んだ知識を含めてまとめて書きました。なお、私は科学分野での可視化を中心に扱っていますので、厳密なデータの提示が求められるケースを想定していますが、他の分野でも本質的な部分は同じだと思います。さらにこの改訂版では、2019年現在、以前と比較して充実してきた実務者向けの情報やツールを整理し、プログラミングが必要なケースとそうではないケースも含めて、どのような技術と知識が実務家に求められているのかを含めて検討して行きます。

引用図を除く本稿の全ては、[CC BY 4.0](https://creativecommons.org/licenses/by/4.0/deed.ja)ライセンスにて再配布可能です。

![](https://mirrors.creativecommons.org/presskit/buttons/88x31/svg/by.svg)

# 2019年における可視化の実務者を取り巻く環境
この記事の初版を公開してから、五年近くの月日が流れ、データ可視化を取り巻く環境も少しずつ変化してきました。「データ・サイエンティスト」などという言葉がマスメディアにも頻繁に登場するようになり、コンピュータを用いてデータを分析し、第三者にわかりやすく提示するという作業の重要性は、多くの人が認識するようになりました。しかし一方で、ある意味においてバズワードと化した「データ・ビジュアライゼーション」という語は様々な意味で利用されるようになり、時には使い方によって混乱を招くこともあります。そこで、まずはじめに実務者の視点から見た可視化という言葉の定義から始めようと思います。

## 「データ可視化」という言葉の指すもの
現在、主に技術系のメディアに登場する「データ可視化」という言葉は、大きく分けると以下の二つの意味で使われています。

### インフォグラフィックス
最近目にすることの多い[インフォグラフィックス](http://ja.wikipedia.org/wiki/%E3%82%A4%E3%83%B3%E3%83%95%E3%82%A9%E3%82%B0%E3%83%A9%E3%83%95%E3%82%A3%E3%83%83%E3%82%AF)は、データを使って表現されたイラストレーションと言って良いと思います。つまり、インフォグラフィックはデザイナーがその技術を発揮する余地が大きく、次節で述べるデータから視覚要素へのマッピングを設定してアルゴリズミックに生成することに主眼を置くデータ可視化とは主従関係が逆になります。美的要素を中心に考え、デザイナーがIllustratorなどのソフトウェアを使って手作業で仕上げるもので、最終的な結果は作成者のアーティスティックな能力に大きく左右されます。**本稿ではこちらについては触れません**。

### アルゴリズムに基づくデータ可視化
データ可視化、もしくは*dataviz*などという言葉で表されるものは、アルゴリズムに基づいて、データポイントを機械的に視覚効果へマッピングして生成されるものを指します。つまり、実際の描画部分は、計算機がコードとして与えた指示に従って自動的に生成されるものであり、作者の手技によって結果が左右される部分は小さいです。

**本稿では、こちらの意味で「データ可視化」と言うトピックを扱います。**

また、このようなコンピュータを使った可視化には、大きく分けると以下の二つの種類があります。

- 探索的可視化 - コンピュータならではの双方向性を生かし、大規模なデータセットから知見を引き出すようなツールのことを指します
- 説明的可視化 - あるストーリーをデータ可視化によって補強するようなものを差します。

コンピュータを使うことにより、これらのどちらも以前に比べると手軽に始められるようになりました。本稿では、この両方について見て行きたいと思います。

## 2014年から現在までの主な変化
まず初めに、この5年間で起きたデータ可視化周辺での変化を俯瞰してみようと思います。この記事の初版以降に起きた変化で、特筆すべき点には以下のようなものがあります:

### 1. インタラクティブなデータ可視化の一般化
インタラクティブな表現を行うこと自体は比較的低コストで行えるようになってきました。特にジャーナリズムの分野では、内外を問わず、新しい表現の一環としてインタラクティブなデータ可視化やインフォグラフィックスを紙面に取り入れる新聞社も増えました。

* 日本経済新聞社　[Visual Data](https://vdata.nikkei.com/)
* The New York Times [2018: The Year in Visual Stories and Graphics](https://www.nytimes.com/interactive/2018/us/2018-year-in-graphics.html)

このような大手メディアの動きにより、一般の人々にもインタラクティブな表現に触れる機会は格段に増えました。しかしそれは同時に、情報の伝達手法としてはあまり意味のないアニメーションなどの氾濫も招くことになり、データ可視化の根本的なゴールである「データを人にわかりやすく提示する」という点が曖昧になっているケースも増加しました。

### 2. ブラウザのさらなる高速化と実装技術の変化
近年では、[ボリュームレンダリング](https://en.wikipedia.org/wiki/Volume_rendering)やCADなどの特殊な分野を除き、ありとあらゆる可視化関連のツールがウェブベースのアプリケーションへと収束してきています。GPGPUの利用も含めると、かなり大規模データを含めたあらゆる可視化アプリケーションをブラウザ上で実装することが現実的になってきました。また、Slackをはじめとする企業も、デスクトップアプリケーションを実装する技術として[Electron](https://electronjs.org/)を採用するケースがあり、比較的複雑なUIを必要とする可視化アプリケーションでも、ウェブからデスクトップまで、一つのコードを基に生成することが現実的になりました。

### 3. モバイル・ファースト
特にマスメディアによる説明的可視化のようなものを最終的に表示するクライアントとして、モバイルデバイスは最も多く利用されるクライアントになりました。複雑で処理的に重いデータ可視化アプリケーションはモバイルデバイスで動かすのは厳しい場面もありましたが、最新のモバイルデバイスを利用すれば、かなり複雑なウェブベースの技術で実装されたアプリケーションも、現実的な速度で動かすことが可能になりました。

### 4. プログラマではない人々向けツールの充実
ある程度定型化可能な可視化作業では、BIツールや、Tableauなどのプログラマでない人も用いることができるツールも普及し、かなり凝った可視化やダッシュボードの作成でも、コードを書かなくても実現できる場面が増えました。

今から何か可視化のプロジェクトに取り組む方は、こういった現状を踏まえた上で、技術選択（コードを書かないことも含めて）する必要があると思います。

----

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

![graph1.png](https://qiita-image-store.s3.amazonaws.com/0/20688/83f468e3-f75f-ceb9-e33a-5b7204c79b0c.png)

私の業務での主なプロジェクトは[Cytoscape](http://www.cytoscape.org/)と呼ばれるグラフ（ネットワーク）可視化ソフトと周辺アプリケーションなので、はじめにデータ可視化の具体例として、この分野を取り上げてみたいと思います。一般的な[ヒストグラム](http://ja.wikipedia.org/wiki/%E3%83%92%E3%82%B9%E3%83%88%E3%82%B0%E3%83%A9%E3%83%A0)や散布図などに比べるとややマイナーですが、ソーシャルネットワークやインターネットそのものをはじめ、[グラフ](http://ja.wikipedia.org/wiki/%E3%82%B0%E3%83%A9%E3%83%95_(%E3%83%87%E3%83%BC%E3%82%BF%E6%A7%8B%E9%80%A0))はあらゆる場面で現れるデータ構造なので、汎用性は高いと思います。

### この記事を書くきっかけ

![opacity.png](https://qiita-image-store.s3.amazonaws.com/0/20688/219f0b7b-cb96-f1d8-a7b4-249cdb66283e.png)

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

* 「[スクリーンショット集](http://www.cytoscape.org/screenshots.html)を見て、自分も同じようなものを作ってみたいと思ったが、プリセットのスタイルから最終的にサンプルのようなところまで持っていく方法よくわからない」
* 「なぜサンプルにもっと凝ったデザインものを入れないのか？」

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


## 良い可視化とは何か？

![bad1.png](https://qiita-image-store.s3.amazonaws.com/0/20688/b57aabb8-c66e-76b8-55e6-fd8ec0283e05.png)

![large_net.png](https://qiita-image-store.s3.amazonaws.com/0/20688/1f205615-a452-85fc-e007-f52ba807f9e8.png)

![simple.png](https://qiita-image-store.s3.amazonaws.com/0/20688/7294e169-f47d-6740-7ca1-2009f413f520.png)


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

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

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

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

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

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

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


![3VKH.png](https://qiita-image-store.s3.amazonaws.com/0/20688/796b7d19-e562-7b20-3c8a-d07ebec2f8de.png)
_X-ray structure of a functional full-length dynein motor domain_ [PDB ID: 3VKH](http://www.rcsb.org/pdb/explore/jmol.do?structureId=3vkh&bionumber=1)　ダイニンと呼ばれる一種の[分子モーター](http://ja.wikipedia.org/wiki/%E5%88%86%E5%AD%90%E3%83%A2%E3%83%BC%E3%82%BF%E3%83%BC)の三次元構造

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

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


![3d.png](https://qiita-image-store.s3.amazonaws.com/0/20688/28d1f211-893a-91de-d80f-09cdaa809c91.png)

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


![2d1.png](https://qiita-image-store.s3.amazonaws.com/0/20688/e79e88ab-fd89-53b4-368d-1e4e48e77aa0.png)

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

![3dgraph1.png](https://qiita-image-store.s3.amazonaws.com/0/20688/f7924a4e-c1e6-0e60-b151-a853226dfb54.png)

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

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

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

#### 補足： 「広告」としてのデータ可視化

探索的なデータ可視化システムを構築するのに、三次元での表示などは必ずしも実用的でないことは上で述べた通りです。しかし、データ可視化作品には、まず人の興味を引く、いわば宣伝のためのものも存在します。私の働く分野では、主に論文誌や本の表紙に使われる、インパクト重視のものなどがそれに当たります。以下は、三次元空間に、薬剤とそのターゲットをネットワークとして表現したものを描画したものですが、これ自体には大きな意味はなくとも、発表時にアニメーションなどで見せれば聴衆の興味を引くことも可能で、使う場面を間違えなければ、派手な「演出」を伴う可視化も、全く無意味ではありません。

![スクリーンショット 2019-05-06 午後1.59.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20688/c51e4cc9-10e6-1997-dcec-5ad694ef3d07.png)

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

データ可視化の技術と一般的なデザインの技術には重なる部分も多く、デザイナー向けの入門書からは多くのことを学べます。それらの本には、色の選択（カラーパレットの作成）や、余白の使い方、フォントの使い方などは必ず触れられており、そう言ったものを読むことで、センスの勝負になる**前の**段階では、グラフィックデザインや可視化の作成は誰でも学習可能な技術であると理解できると思います。デザインの入門書は日本語でもたくさん出ていますので、評価の高い定番のものを一冊読むだけでも、資料作成や可視化作業で長く使える知識を得られます。

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

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

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


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


### テーマの例
* Twitterネットワーク上で、ある人の発言が時間とともに__拡散する様子を観察したい__
* あるクラスのオンラインソーシャルネットワーク上に流れるメッセージ量をネットワーク上にマッピングし、生徒間の__関係性を推測したい__
* パスウェイの上で承認薬剤が使える[ドラッグターゲット](http://en.wikipedia.org/wiki/Biological_target)と既知の疾患関連遺伝子を可視化し、その__重なりを見たい__
* ソーシャルネットワーク上の人物Aから人物Bへのつながりが存在するのかをインタラクティブに検索したい

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

![edge-weight.png](https://qiita-image-store.s3.amazonaws.com/0/20688/becc2a83-b1f2-5b77-46bf-5dcd8be0aed3.png)
例（データはフェイク）: 一日あたりのメッセージの流量＝エッジの太さ・コネクションの数＝ノードのサイズ。これは生徒の関係性を示すのに妥当なマッピングだろうか？可視化作成の全体のプロセスを通して、これを自問しながら作成するのが望ましい。


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


### マッピングに使うデータ
* データの種類
    * カテゴリカル・データ（離散値）
        * カテゴリーの数
        * カテゴリーの種類
            * グループ化が可能か？
    * 連続値
        * レンジ（最大値・最小値）
        * normalize済みか？
        * 外れ値
* データポイントの数


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

![category.png](https://qiita-image-store.s3.amazonaws.com/0/20688/1dbfd0ad-161f-5fbd-8a8c-49e8ecb29f6d.png)


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


![color_categorical.png](https://qiita-image-store.s3.amazonaws.com/0/20688/2d2173f8-2244-240d-3a9d-84a2dc2db725.png)

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


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

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

また、ネットワークが特殊な形状の場合、例えばツリー構造の時は、ノード・リンク図の他にも、ツリーマップやサークルパッキングなどの手法も利用できます。実装の難易度、最終的に発表する媒体（ウェブ、論文、ポスター等）、締め切りまでの時間なども考慮に入れて手法を選択します。

本稿ではネットワーク（グラフ）データを例としていますが、データの種類により使える定番の手法は自ずと決まってきますので、まずどんな可視化手法が存在するのかを把握しておくことも大切です。

[参考：　The Graphic Continuum](https://visual.ly/community/infographic/how/graphic-continuum)

こう言った定番の手法、すなわち、データと手法の対応を一通り知りたい場合には、この本がお薦めです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20688/390ac1d7-b655-663f-bfbb-38a128f89779.png)
Andy Kirk著 [Data Visualisation: A Handbook for Data Driven Design Second Edition](https://www.amazon.com/Data-Visualisation-Handbook-Driven-Design/dp/1526468921/ref=dp_ob_title_bk)

また、この本の著者は、彼のウェブサイトで盛んに可視化関連の情報を発信していますので、ぜひ読んでみてください。

[visualising data](http://www.visualisingdata.com/)

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

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

#### クレンジング
* Python + IPython Notebook + Pandas
* grep, sed, awk
* Exele

#### 解析
* R
* Pandas, SciPy, NumPy
* Matlab
* Mathematica

##### グラフ解析
* igraph
* NetworkX

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

### 不要なプログラミング/車輪の再発明を避ける
2019年現在、この記事を最初に公開した頃に比べると、有償・無償を問わず、豊富なデータ可視化アプリケーションやライブラリが入手できます。この記事は主にプログラマ向けなので、コードを書ける方がほとんどだと思いますが、データを可視化して提示する、という目的を出来るだけ短時間で達成するためには、あえてコードを書かないことも必要です。D3.jsは素晴らしいライブラリですが、もしあなたがヒストグラムをそれで作ろうとしているのならば、もう一度、本当にそれが必要かどうかを考えるべきです。多くの定番の可視化手法に関しては、非常に高度な機能を持つライブラリが数多く公開されています。例えば、以下のようなものがあります。

* [Vega – A Visualization Grammar](https://vega.github.io/vega/)
* [Dash: Analytical Web Apps for Python. No JavaScript Required](https://plot.ly/products/dash/)

特にDashは、JavaScriptで描画部分のコードを一切書く必要がないため、Pythonのみで一般的なデータ・ダッシュボードを作成することが可能です。また、現在主流になっているノートブック型アプリケーションにデータ解析と可視化のワークフローを落とし込む場合、かつての主流だったライブラリよりも、さらに少ないコード量で綺麗な可視化を生成できるものも登場しています。

[Altair: Declarative Visualization in Python](https://altair-viz.github.io/)

このように、可視化周辺のライブラリやアプリケーションはどんどん進化していますので、「本当に自分でそのコードを書く必要があるのか？」は少しリサーチして考えた方が時間が節約できると思います。基本的には、かなり特殊なインタラクションが必要な場合を除き、自分で一からコーディングする必要は少なくなってきていますので。

Pythonをお使いの場合は、すでに２年前の記事ですが、これが現状を把握するのに役立つと思います。

[Python's Visualization Landscape (PyCon 2017)](https://speakerdeck.com/jakevdp/pythons-visualization-landscape-pycon-2017)

ネットワーク可視化分野に特化したまとめには、こんなものもあります。

[THE GRAPHTECH ECOSYSTEM 2019 – PART 3: GRAPH VISUALIZATION](https://linkurio.us/blog/graphtech-ecosystem-part-3-graph-visualization/)

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

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

* __鉄道路線データをグラフとしてCytoscapeで可視化する__
    * [Part 1](http://qiita.com/keiono/items/29286f49b15a5b13c987)
    * [Part 2](http://qiita.com/keiono/items/5e43bc93f17eb22250ab)
        * [作業記録としてのIPython Notebook](http://nbviewer.ipython.org/github/keiono/stations-japan/blob/master/stations2network.ipynb)
    * [Part 3](http://qiita.com/keiono/items/85cbb721467709113e2f)
    * (以下継続中。Part 1と2がデータ準備の作業記録です。）


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


## 実際の可視化

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

### Visual Variables　(視覚変数)とは？
そもそも視覚変数とは何でしょう？これは[Jacques Bertin](http://en.wikipedia.org/wiki/Jacques_Bertin)が提示した概念で、__位置、サイズ、色、形と言った、データを変換する先の視覚的要素の集合__のことです。全てのデータ可視化は、データをこれらの要素にマッピングする作業にほかなりません。

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

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


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

![vv.png](https://qiita-image-store.s3.amazonaws.com/0/20688/d72e14f5-de80-f442-1ede-c155fe109018.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版は[こちら](http://innovis.cpsc.ucalgary.ca/innovis/uploads/Publications/Publications/Carpendale-VisualVariablesInformationVisualization.2003.pdf))

* 位置
* 大きさ
* 形
* 明るさ
* 色
* 向き
* テクスチャ

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


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

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


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

![Mackinlay.png](https://qiita-image-store.s3.amazonaws.com/0/20688/e2b66ad1-3734-7b30-0137-67d3669ef3f6.png)
Jock Mackinlay. 1986. _Automating the design of graphical presentations of relational information_. ACM Trans. Graph. 5, 2 (April 1986), 110-141.

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

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


![layout1.png](https://qiita-image-store.s3.amazonaws.com/0/20688/a5926510-437c-c6c0-1097-c7235e357880.png)


![layout2.png](https://qiita-image-store.s3.amazonaws.com/0/20688/613f0c74-9825-2431-f396-7b95049a35fd.png)



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

![Mackinlay1.png](https://qiita-image-store.s3.amazonaws.com/0/20688/caaa4fba-5fed-3790-fab2-4c25b44d4ec1.png)

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

* タンパク質相互作用の図で、同一の[スーパーファミリー（グループ）](http://ja.wikipedia.org/wiki/%E3%82%BF%E3%83%B3%E3%83%91%E3%82%AF%E8%B3%AA%E3%83%95%E3%82%A1%E3%83%9F%E3%83%AA%E3%83%BC)に属するものは同じ形で表す　(Nominalデータから形に）

は分かりやすいですが、

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

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


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

![Node Color Mapping](https://qiita-image-store.s3.amazonaws.com/0/20688/dc4993e9-aa4a-60c7-f15b-2eaf862f9e97.png)

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


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

# 本の宣伝
以下宣伝で申し訳ないのですが、間も無く私も参加した本が技術評論社から発売されます。

![datavizbookcover.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20688/aed76e18-ba94-ced7-5536-49c4ba49795c.jpeg)


[プロ直伝 伝わるデータ・ビジュアル術――Excelだけでは作れないデータ可視化レシピ](https://gihyo.jp/book/2019/978-4-297-10582-2)

これは、コードを**書かない人**に向けて書かれた「可視化ツールと事例のカタログ集」という意味合いが強いですが、プログラマの方々にも、どこまでが既存のツールで可能で、コードを書いて実現しなければならない部分はどこから先か？といった判断の助けにはなるのではないかと思います。私は、ネットワーク可視化の章を担当しました。基本的な用語の説明から、実際のデータを使ったサンプルまで含まれていますので、興味のある方は、ぜひ書店にて中身をご覧になてみてください。

## [中編（未改定）へ続きます](http://qiita.com/keiono/items/76c0aaabb4e6e0c10dc5)


## 参考文献
1. Jock Mackinlay. 1986. _Automating the design of graphical presentations of relational information_. ACM Trans. Graph. 5, 2 (April 1986), 110-141.
1. [CPSC 533C: Information Visualization](http://www.cs.ubc.ca/~tmm/courses/533-11/)
1. Jacques Bertin. 1983. _Semiology of Graphics_. University of Wisconsin Press.
1. Colin Ware. 2008. Visual Thinking: For Design. Morgan Kaufmann Publishers Inc., San Francisco, CA, USA.