追記:何故か後編の記事が削除されていましたので、分割後修正して再アップしました。)はじめにこの記事は実際に手を動かし、コンピュータを使ってデータ可視化を行う人に向けて一般的なノウハウをお伝えする三回シリーズの第二回です。昨夜寝る前に気づいたのですが、前回のプログラマ向けのニッチな記事をはてなブックマークのヘッドラインで見かけて驚きました。その中に鋭いコメントを発見しました:この手のグラフ系の可視化で本当に知見が得られたの?って思ってしまうな。これはまさにその通りで、これこそ私がこの記事をまとめようと思った理由の一つです。身も蓋もない事実を申し上げますと、分かりにくいどころか、ほぼ何の意味もないグラフ可視化がこの世には無数に存在します。結局各種ツールが発展して可視化が手軽にできるようになったと言うことは、それだけ簡単に大量のジャンクダイアグラムを作成できてしまうということにほかならないのです。Excelが普及して簡単なチャートがすぐに作れるようになった一方、ミスリーディングなチャートや酷い3Dグラフなどが量産されたのと理由は全く同じです。それなのに我々のような可視化ツールを研究のためのインフラとして作っている組織に、アメリカの政府機関や大手製薬会社が長きに渡りまとまった資金を投下してくれる理由は何なのでしょう?この理由について考えるのは「データ可視化で実際に手を動かす人々が効果的な可視化手順を追求する」と言うこの記事のテーマにぴったりで、とても意義深い議論だと思うので、予定を変更して中編を追加しそこを考察してみます。diagramと呼ばれます。ノードを線(エッジ)で繋ぎあわせて、様々なレイアウトアルゴリズムを使って配置すると言う、可視化の手法としてはとてもポピュラーなものです:小規模なデータの場合、もしくは元のグラフが特殊な構造を持っている場合(例えば木)各ノードの関係性を直感的に理解できるので、何の工夫もない可視化でもそれなりに有効です。この手法には大きな問題点があります。実はこの手法、巨大なグラフデータに対してスケールしません。このままGPUの進化が進めば、実装方法によっては数百万のノードとエッジを軽々と描画し、巨大な銀河の如きグラフデータをリアルタイムにレンダリングすることも可能になるでしょう。かかわらずスケールしないのです。これはどういうことでしょう?上の2つは、以前私が「分野外の人に研究を説明するので、なんか派手なイメージを作ってくれ」と言うリクエストを受けて、Cytoscapeである生物のインタラクトームを描画したものです。これでもノード数は数千のオーダーです。数百万、数億のオーダーのグラフというものがどうなるかは想像がつくと思います。巨大ネットワーク描画はいつも無意味なのでしょうか?「ソーシャルネットワークのグラフデータがあるからとりあえず描画してみよう」と言うのは誰しも思いつくグラフ可視化ソフトウェアの使い方です。最終的にそこから新たな知見を得られるレベルの可視化に仕上げるのはそれほど簡単ではありません。多くの場合に問題なのは、ただ漫然と巨大データを可視化したからというより、その前に明確なテーマを設定しなかったことだと思います。メンロパークにあるFacebookの本社を訪れたことがある方は見たことがあると思いますが、ドリンクなどが置いてあるラウンジに、大量のタッチスクリーンを組み合わせた身長を超える大きさのディスプレイ・アレイが置いてあり、そこでFacebookに関する様々なデータを可視化しています(撮影禁止だったので画像はありませんが、検索すればいっぱい出てくると思います)。いわゆるデジタルサイネージに属するものですが、描画の元になっているのは実データであり、一種のデータ可視化です。diagramですが、個人的にはこれが全く無意味だとは思いません。them.(私は地理的・政治的な境界線がどのように人々の交友関係に影響をあたえるのかを見てみたいと思いました。どの都市の住民がたくさんの(密な)交友関係を持つのかという可視化が欲しかったのです。)つまり、疑問からスタートし、その疑問に対する回答を得る手段として可視化を用いているのです。彼のゴールが完全に達成されたかどうかは皆さんの判断に委ねますが、少なくとも一定程度は成功していると思います。大切なのは「データがあるから可視化しよう」ではなく、「データのこの側面が見たいからこの手法で可視化しよう」という、手法の限界を知った上での選択です。手法のスケーラビリティ可視化のスケーラビリティには2つの意味があります。計算量が大きすぎて、一般的なワークステーションでは処理しきれず描画できない描画はできるが描画結果から有益な情報がほとんど読み取れない私がここで議論しているのは2番目の問題です。上のような大きなグラフの一括描画から読み取れるものとは何でしょう?恐らく下記のような情報は何とか読み取れると思います:グラフの大雑把な大きさ。「少なくとも数千」程度の予想値グラフのおおよその密度、つまり単位ノードあたりのエッジの数しかしこれらは、なにも重い描画をしてGPUのファンを回さなくても他に手法があります。一つの手法の限界を超えるシンプルな手法で分かりやすい可視化を作成できないのならば、他の手法を検討したり併用するのが賢いやり方です。アプリケーションとしてのリリース分かりにくい可視化の壁を超えるため、これらを一つ一つ検討してみましょう。diagramがうまく問題に使えないならば、他の手法も検討します。前回の記事に「手法の選択」と言うステップを入れたのはこれも理由の一つです。diagramは言ってみればデータポイントから画像へのone-to-oneマッピングです。シンプルですが、万能ではありません。それがうまく行かないのならば、可視化のテーマを補強するデータのエッセンスを抽出することを考えればいいのです。グラフ密度グラフの特性を知るには、ネットワーク図以外にもたくさんの方法があります。シンプルな指標の一つである密度(density)はただの数値ですから、複数の巨大グラフの特性を比較したいような場合、ただのバーチャートで間に合ってしまいます:(ちなみにこのチャート、理想的なものではありません。「各グラフの密度の差を示す」と言うゴールなので、僅かな値の差はそれほど重要ではないため、縦横のグリッドは無くしたほうがスッキリしていいですね。)上のチャートは、NetworkXでアルゴリズミックに生成したグラフ(と一つの実データ)の密度比較です。当然ですが、完全グラフの密度は1で、スケールフリーネットワークはとても小さな密度を持つことが読み取れます。非常に原始的ですが、可視化のテーマがネットワークの接続状態を知る、というものであれば、これだけでも充分テーマをサポートするデータ可視化です。(有向グラフの場合)これらの値を一般的なチャートにプロットするだけでもネットワークの性質に関する様々な情報が得られます。当然ですが、これらの指標の計算もリニアな計算量のものばかりではありませんので、グラフが巨大になればかなりの時間がかかってしまう場合もあります。それでも出力される結果はチャート化しやすいものが多いので、ネットワークの性質を理解すると言うゴールには有効です。ここで注意すべきは、闇雲に統計値を計算したとしても、それが自らのテーマを補強/検証するのに無意味な値ならば、結局はむやみに可視化を行うことと何も変わり無いということです。あるデータセットに対し、どのような統計処理をすればそのデータセットのどのような性質が分かるのかを理解しなければこの手段を上手く使うことは出来ません。(PCA)などの考え方がアナロジーとして適切かもしれません。安直な、生のデータプロットが意味のある可視化にならない場合、元のデータに統計処理を施し、データの元々の性質を失わずに意味のある知識を抽出すると言う方針です。統計の世界は巨大すぎてとてもここでは扱えませんし、私も専門家ではありませんので他の専門書(家)に譲りますが、可視化分野に関わる限り、ある程度は理解しないと限界に突き当たると思います。描画手法の切り替えと併用あるデータタイプに対して利用できる可視化手法は一つではありません。diagramのような一般的な描画手法以外にも、特定の構造を持つネットワークに対して使える便利な手法もあります。データがその基準に適合する場合、別の描画手法を検討するのもいいアイデアです。User:GBoshouwers現実世界に現れるデータには、全くのランダムなネットワーク以外にも、階層構造を持つものが散見されます。(Javaのあれではなく、可視化手法の名前です)が便利です。これは、長方形でデータ全体を表し、その中で各下部構造がどのような大きさを占めているのか、それはどのようなさらなる下部構造を持っているのか、と言うのをタイル状の入れ子構造で表したものです。diagramとして展開するTreemapで見えないコネクションの詳細を見せるこの組み合わせは親となるデータが巨大な場合に特に有効です。Treemap化により、サブグラフ内のコネクションに関する情報は消えますが、かなり大きなデータでも全体と部分の関係性を直感的に理解できるうえに、内部コネクション(エッジ)の詳細が必要な場合は、人間が理解できる大きさの小規模なサブグラフとして展開できるため、全体と詳細の両方をカバー出来ます。これはインタラクティブなWebアプリケーションとして実装した時に特に効果を発揮する方法です(詳細は後述)。diagramの一種とも言えますが、親となるネットワーク内のグループ間のおおよその繋がりが重要な場合には利用を検討してみる価値があります。これの発展形でcircosと言うとても美しい画像を生成する手法があるのですが、個人的には見る人に求めるリテラシーが高過ぎるかな...と言う立場です。利用に明確な意図のある場合は別です。バクテリアは我々と異なり環状DNA構造を持っていますから、Circosのような手法でベースとなるリングを構築し、その上に様々な情報をマッピングするのは理にかなっています。最初に書いたように、これらの手法は元になるデータの状態により限定されます。ここでもデータの傾向を考慮に入れず利用すれば、「美しいジャンク」の出来上がりですからご注意を。新しい描画方法を開発する巨大グラフの可視化は、可視化そのものが研究対象の専門家も試行錯誤している段階で、様々な手法が考案されています。決定打と呼べるものはありません。diagramに比べると、見る人が読み方を学ぶのに少し時間がかかると言う弱点があります。私は研究者ではなく、研究者が開発した結果をプログラマや一般ユーザーが使えるレベルに下ろしてくるのが仕事なため、基本的にここへは深入りしないようにしています。私の観測範囲がどうしても生物学周辺での応用に偏っているので、まだまだ他にもたくさんの実験的手法があると思いますが、基本的な方向性は似ています。diagramを、なんとか直感的に理解できるものに変えようという試みです。これはすなわち今までなかった可視化手法そのものの開発であり、なかなか難しいトピックです。この辺りを追求したい方はもう既にやっていると思いますが、IEEEのカンファレンスペーパーなどを追いかけるのが良いと思います。diagramの優位性・自明性は急速に失われます。それをそのまま使いながら弱点を克服する全く別のアプローチもあります。それがインタラクティブな可視化です。ここまでは、最終的にPDFなどへ出力するユースケースを想定してきました。計算機ベースの可視化は手描きのイラストとは異なり、インタラクティブ性を付与できるのが大きな違いです。同じ手法を使ったとしても、インタラクティブ性があることにより多くの弱点を克服できる場合があります。Earthを使ったことがある方は多いと思います。あのアプリケーションが素晴らしいのは、データのクオリティもさることながら、地球の俯瞰図という「ズームレベル0」からストリートビューという「ズームレベルMax」までを切れ目なくナビゲートすることが出来る点です。あれが単なる高精細な地球の静止画像だった場合、その優位性は地球儀に対してほとんどありません。Earthを有用な可視化たらしめているのは、そのコアをなす機能としてインタラクティブ性があるからです。興味のある細部への素早いアクセスの提供この基本機能を提供するだけでも、細かすぎてよくわからなかった図から様々な情報を読み取ることが可能になります。styleをmetroに切り替えてみてください)これはただ単にグラフとして再構成した東京メトロの各路線をCytoscape.jsで描画しただけですが、ここから様々なインタラクションを追加することにより、静止画では理解するのが難しかった大きさのネットワークもユーザーが能動的にブラウズすることが出来るようになります。diagramの融合は、このテクニックの非常に良い応用例です。diagramとして展開」と言うメニューから新しいビューを開けるようにすれば、とても自然なUXを構築できると思います。これはD3.jsのTreemapレイアウトとForce、もしくはCytoscape.jsなどのグラフ専用ライブラリを利用することにより、比較的少ないコード量で実現できます。このようなアプリケーションを一から開発するのは、かつてはとても大変でした。現在は才能ある多くのJavaScriptハッカーたちがウェブベースの可視化ライブラリを開発しており、これらを組み合わせることで比較的短期間でウェブアプリケーションとしての可視化を構築できます。我々もデスクトップアプリケーションと一緒にCytoscape.jsと言うJavaScriptライブラリも開発しているのは、可視化を発表するプラットフォームとしてのウェブは、もう避けられない未来だからです。これもまた大きな話題ですので、いずれ何か記事を書いてみたいと思います。手法の限界を知った上で適切な使い方をするここまでは、「上手くいかない場合はどうしたらよいか」を考えてきました。diagramは正しく使えば研究者にとって非常に強力なツールになることも事実です。ここからは逆に「では正しい利用法とはどのようなものか」という点を、いくつか実際の研究で使われている例を通して見てみましょう。手前味噌で申し訳ありませんが、私が勤務する研究室でかつて行われていた研究に、生体内機能モジュールの異種間での保存の調査というものがありました。これは比較的よく調べられている生物種のタンパク質間相互作用ネットワークと、そうではない種を比較し、似たような構造を持つサブネットワークを抽出するというものです。現代分子生物学の研究の要となっている相同性検索の考えをネットワークのレベルに拡張したものです。似たようなサブモジュールを統計的手法で抽出Side-by-sideで両モジュールを比較できるように自動レイアウトCytoscapeで読めるデータとして出力そのアウトプットを、論文にするときに少しだけ手でレイアウト修正4番目のステップに「インチキだ!」と思われる方も居るかもしれませんが、この辺りはバランスで、人間がやったほうがうまくいく、もしくはそれほど手間がかからない場合は、最後の手直しをマニュアルで行うことも有効です。このワークフローにより、異なるネットワークに存在する似通った部分構造というものが分かりやすく提示できていると思います。生物系のデータではなくても、部分構造の類似性比較、あるいはネットワークモチーフの抽出といった場合に、同じような手法で可視化が行えると思います。ここでのポイントは、可視化は計算によって導かれたサブネットワークにのみ適用されていて、大元の巨大なネットワークをそのまま描画しているわけではないことです。グラフクラスタリングなどもそうですが、全体の可視化よりも意味のあるモジュールの抽出と可視化をペアで利用するのが有効です。肥満のソーシャルネットワーク上での伝播ここではちょっと毛色の変わったデータを見てみましょう。上記の例は分子生物学の専門的な論文で用いられたもので、なかなかその背景が伝わりにくいと思うのですが、こちらは誰にでも理解しやすいユニークな研究です。我々のプロジェクトのコラボレーターにジェームス・ファウラー教授が居ます。彼はソーシャルネットワークをキーワードに、様々な研究を行っています。その中でも有名なものに、「肥満は果たして身近な人を通じて伝播するのか?」と言う疑問を検証した論文があります。Multipleと考えることが出来ます。年ごとに同じネットワークのデータを使い、そこに別のデータセット(この場合は調査参加者のBMI)をマッピングし、タイムポイントごとの変化を提示しています。アニメーションを使わないで変化を示すのにこれはとても有効で、各実験参加者のBMIをそのままチャートにするよりも、「ソーシャルネットにおける肥満の伝播を時系列で可視化する」と言う研究のテーマを上手く表していると思うのですがいかがでしょう?なお、これらのデータをCytoscapeのセッションファイルとして配布すれば、ユーザーは自由にその中身にアクセスしたり、見やすく改変することも出来ます。Notebook等)としてユーザーが好きな様に加工できる、見られるようにして配布するのも、データのサイズによっては有効ですから検討してみてください。山のように実例はあるのですが、長くなりそうなのでとりあえずリンクだけ張っておきます。これらは生物学の論文で利用されているものですが、基本的な可視化の考え方はあらゆる分野に応用可能です。Publicationsまとめ結論としては「定番となった可視化手法にはそうなった理由があり、正しく使うことによりデータの理解を助ける可視化を作成することは可能である」と言えます。同時に、手法・ツールの性質・限界を理解し、ゴールを達成するためにそれらを柔軟に組み合わせることが大切です。我々も、自前で開発したものだけで何とかしようというのはリソースの無駄遣いだと認識していますので、できるだけ外に開いたツール体系を構築するのを目標としています。二次加工が便利なフォーマットでデータを保存することを心がければ、ある手法から別の手法に移るのも容易ですから、そのあたりにも気をつけてあなたにとって便利なワークフローを構築してみてください。急ぎ足で書いたので説明不足の点も多々あるかと思いますが、いずれもうちょっとブラッシュアップします。Ono@keionoアメリカの研究機関で、生命科学系の研究に使用されるソフトウェアを開発しております。主な分野はデータの統合と可視化です。upLoginユーザーは見つかりませんでした。