<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>尾上洋介 on Data Visualization Japan</title>
        <link>https://data-visualization.jp/speakers/%E5%B0%BE%E4%B8%8A%E6%B4%8B%E4%BB%8B/</link>
        <description>Recent content in 尾上洋介 on Data Visualization Japan</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>ja-jp</language>
        <lastBuildDate>Sat, 28 Dec 2024 00:00:00 +0000</lastBuildDate><atom:link href="https://data-visualization.jp/speakers/%E5%B0%BE%E4%B8%8A%E6%B4%8B%E4%BB%8B/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>尾上 洋介／ネットワーク可視化の世界</title>
        <link>https://data-visualization.jp/network-visualization/</link>
        <pubDate>Sat, 28 Dec 2024 00:00:00 +0000</pubDate>
        
        <guid>https://data-visualization.jp/network-visualization/</guid>
        <description>&lt;img src="https://data-visualization.jp/network-visualization/cover.jpg" alt="Featured image of post 尾上 洋介／ネットワーク可視化の世界" /&gt;&lt;p&gt;Data Visualization Japan Meetup 2024（2024年12月28日開催）における、尾上 洋介さん（日本大学 文理学部 情報科学科 教授）の講演です。ネットワークデータから知見を見出すために欠かせない、グラフ描画アルゴリズムの原理を体系的に紹介します。&lt;/p&gt;
&lt;hr&gt;
&lt;div class=&#34;video-wrapper&#34;&gt;
    &lt;iframe loading=&#34;lazy&#34; 
            src=&#34;https://www.youtube.com/embed/1C_LfqJcdMA&#34; 
            allowfullscreen 
            title=&#34;YouTube Video&#34;
    &gt;
    &lt;/iframe&gt;
&lt;/div&gt;

&lt;p&gt;「ネットワーク可視化の世界」というタイトルでお話しさせていただきます。尾上と申します。よろしくお願いします。&lt;/p&gt;
&lt;h2 id=&#34;自己紹介&#34;&gt;自己紹介
&lt;/h2&gt;&lt;p&gt;今、日本大学の文理学部というところで教育と研究をやっています。専門が情報可視化で、情報可視化の分野で研究をしたり、半分趣味で Web 関係の技術を追いかけて、可視化の技術も交えて Webサイトを作ったりといったことをずっとやっています。&lt;/p&gt;
&lt;p&gt;これまでで最も世の中に見てもらった Webサービスとしては、中央省庁がやっている年間5000本ほどの行政事業を検索できる Webサイトがあります。これは矢崎さんとご一緒させてもらった仕事です。&lt;/p&gt;
&lt;p&gt;情報可視化を専門にしていると、いろいろな共同研究のご相談をいただきますが、その中でも自分が最も得意としているのがネットワークの可視化です。今日はその辺りの話を中心にしていこうと思います。&lt;/p&gt;
&lt;h2 id=&#34;ネットワークデータを可視化するということ&#34;&gt;ネットワークデータを可視化するということ
&lt;/h2&gt;&lt;p&gt;ネットワークデータは世の中にさまざまなものがあり、可視化することでネットワークの全体的な構造や局所的な構造を読み取る助けになります。また、ネットワークのデータは視覚的に興味を引きやすい――見慣れない、変わった図が出てくるので――という側面もあります。&lt;/p&gt;
&lt;p&gt;たとえば、先ほどお話しした中央省庁の例。省庁の中の部局と、そこから事業によって支出している会社や他の法人との関係をネットワークで表したものです。色がついているものが省庁ごとの色分けで、周りにあるグレーの点が会社などを表しています。&lt;/p&gt;
&lt;p&gt;これを見ると、全体的な構造として色が固まって見える。「同じ省庁だから近くに寄せる」といった処理はしていないのに、自然と同じ省庁で集まってくる。つまり省庁ごとにクラスターを形成していて、ある種、省庁ごとに得意先になっている会社が存在することを意味しています。&lt;/p&gt;
&lt;p&gt;もう少し細かく見ると、たとえばオレンジ（文部科学省）が左の塊と右の塊の2箇所に分かれています。詳しく見てみると、片方は文部科学省の中でも研究・大学の方をやっている部局が集まっていて、もう片方は小中校の教育をやっているところ。社会福祉寄りの部局と研究寄りの部局とで、離れた政策領域を持つことが読み取れます。&lt;/p&gt;
&lt;p&gt;このように、ネットワークを図にすることで、どういう構造があるのかを視覚的に読み取りやすくできるわけです。&lt;/p&gt;
&lt;h2 id=&#34;ネットワークデータをどう作るか&#34;&gt;ネットワークデータをどう作るか
&lt;/h2&gt;&lt;p&gt;可視化のためには、まずネットワークデータを作らなければなりません。ネットワーク可視化は意外といろいろなところで使えて、&lt;strong&gt;元々ネットワークになっているデータ&lt;/strong&gt;もあれば、&lt;strong&gt;ネットワークでないデータ&lt;/strong&gt;もネットワークとして構成すれば可視化できるようになります。&lt;/p&gt;
&lt;p&gt;元々ネットワークになっているデータとは、基本的にはデータの集合の中に要素があって、2つの要素の間に何らかの関係があるものです。典型的には SNS のフォロー／フォロワー関係、EC サイトで誰がどの商品を買ったか。ほかにもさまざまな分野で、2つの間の関係性が表されていれば、それはネットワークの形になります。&lt;/p&gt;
&lt;p&gt;一方、元々はネットワークでない表形式のデータでも、要素間の関係性を定義することでネットワークデータに変換できます。テキストデータは元々ネットワーク構造を持ちませんが、ある文書と文書のつながりや、文書の中に現れる単語と単語のつながりをうまく定義すれば、ネットワークデータとして扱えます。表形式のベクトルデータであっても、ベクトル同士がどれだけ近いかという距離や類似度を用いてネットワークに変換できます。&lt;/p&gt;
&lt;p&gt;ただし、先ほどの行政事業のネットワークのように全データが膨大な場合は、1画面に表すことができません。そうしたときは、元の構造を失わないようにサンプリングや粗視化と呼ばれる処理をしてあげる必要が出てきます。&lt;/p&gt;
&lt;h2 id=&#34;2つの表現--ノードリンク図と行列&#34;&gt;2つの表現 ― ノードリンク図と行列
&lt;/h2&gt;&lt;p&gt;作ったネットワークデータの表現方法は、大きく言うと&lt;strong&gt;ノードリンク図&lt;/strong&gt;と、それ以外（主に行列）の表現に分かれます。「ネットワーク図」と言うと、多くの人は左側のようなノードリンク図をイメージすると思いますが、実は右のような行列の形（ヒートマップ）で表す方法もあります。&lt;/p&gt;
&lt;p&gt;こちらは『レ・ミゼラブル』という小説の登場人物を点で表し、同じ話の中で関わりがある人物を線で結んだデータです。ノードリンク表現では点がそれぞれの登場人物を表し、行列表現ではそれぞれの列や行が1人1人の登場人物を表しています。同一のネットワークデータであっても、まったく異なる表現ができるわけです。&lt;/p&gt;
&lt;p&gt;今日は主にノードリンク図の方の話をしていきます。&lt;/p&gt;
&lt;h2 id=&#34;視覚的属性とその決め方&#34;&gt;視覚的属性と、その決め方
&lt;/h2&gt;&lt;p&gt;ネットワークデータの視覚的表現には、ノードの大きさ・色・ラベルの表示・画像の埋め込みなど、さまざまな属性があります。ノードだけでなくリンクにもいろいろな属性を持たせられます。&lt;/p&gt;
&lt;p&gt;そこに何を反映させるか。データが元々持っている属性のほか、ネットワークの構造から計算できるもの――ネットワーク分析の分野で盛んに研究されています――たとえば&lt;strong&gt;ノードの中心性&lt;/strong&gt;（どのノードがネットワークの中で中心的な役割を果たしているか）や、ネットワークの中から塊を見つける&lt;strong&gt;コミュニティ検出&lt;/strong&gt;などの計算結果を、視覚的属性に反映できます。また、ネットワークではエッジを読み取るのが大変になりますが、それをまとめて分かりやすく表示する&lt;strong&gt;エッジバンドリング&lt;/strong&gt;という方法もあります。&lt;/p&gt;
&lt;h2 id=&#34;ツールとライブラリ&#34;&gt;ツールとライブラリ
&lt;/h2&gt;&lt;p&gt;ネットワーク可視化を行うためのソフトウェアやライブラリを、主要なものだけ挙げておきます。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ソフトウェア&lt;/strong&gt;では、Gephi、（冒頭でご挨拶されていた大野さんが開発に携わられている）Cytoscape、そして少しマイナーかもしれませんが Tulip。この3つは GUI で画面を操作していくと、ネットワークの図を作ったり視覚的表現を加えたりできます。もう1つ有名なものとして Graphviz があり、こちらは主にコマンドラインで操作し、ネットワークデータを与えると図を作ってくれます。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ライブラリ&lt;/strong&gt;では、Python なら NetworkX。ネットワークデータを扱うためのライブラリで、その中に可視化の機能も備えています。igraph は Python 版もあり、中身は C言語で実装されていて R 用の機能も提供されています。研究者ぐらいしか使っているのを見ないかもしれませんが、C++ で実装された OGDF というライブラリもあります。JavaScript（主に Web 上）なら、D3.js の1機能として提供されている &lt;strong&gt;d3-force&lt;/strong&gt; があります。&lt;/p&gt;
&lt;p&gt;ちなみに、React などのフロントエンド技術で可視化をするライブラリはたくさんあり、その中にネットワーク可視化の機能を持つものも結構ありますが、中身の多くはこの d3-force を使っていたりします。d3-force 以外で、いわばオリジナルのアルゴリズムを実装しているものとしては、cola.js や sigma.js が挙げられます。&lt;/p&gt;
&lt;h2 id=&#34;なぜ毛玉になってしまうのか&#34;&gt;なぜ「毛玉」になってしまうのか
&lt;/h2&gt;&lt;p&gt;とはいえ、いろいろなツールがあって、ネットワークデータが作れたから可視化してみよう――そこまでは簡単なのですが、意外と苦労されるのではないかと思います。経験のある方なら分かると思いますが、結構うまくいかないんですよ。&lt;/p&gt;
&lt;p&gt;ネットワークの構造にもよりますが、うまくいかない可視化結果が出てきてしまうことがあります。ネットワーク可視化の研究では&lt;strong&gt;ヘアボール問題&lt;/strong&gt;と呼ばれ、髪の毛の毛玉のようなものができてしまう。そうなると、そこから情報を読み取るのは難しく、有意な分析が困難になってしまいます。&lt;/p&gt;
&lt;p&gt;ネットワーク可視化を活かして有意な分析をするには、さまざまな工夫が必要です。データ作成の方法、ノードやエッジにどういう情報を載せるかという視覚的表現に加えて、実は&lt;strong&gt;ノードの配置をどう決めるか&lt;/strong&gt;という配置アルゴリズム――専門的には&lt;strong&gt;グラフ描画&lt;/strong&gt;と言います――を、うまく選ぶ必要があります。そのためには知っている必要がある。ここから先は、そのグラフ描画アルゴリズムにどういうものがあるのかをざっと見ていきます。&lt;/p&gt;
&lt;h2 id=&#34;グラフ描画とは&#34;&gt;グラフ描画とは
&lt;/h2&gt;&lt;p&gt;「グラフ」と言っても棒グラフや円グラフのことではなく、数学的な構造としてのグラフ、つまり頂点（ノード）の集合と、リンク・エッジと呼ばれる辺の集合の組を指してグラフと言います。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;グラフ描画&lt;/strong&gt;とは、このグラフを入力として、頂点の空間への埋め込みを出力するものです。画像として出力するなら2次元平面に埋め込む必要があるので、ここで言う「空間」は2次元平面などになります。一言で言えば、グラフを入力として座標を出力するもの。ネットワークの中のどういう構造を強調したいか、という用途に応じてさまざまなアルゴリズムが存在します。&lt;/p&gt;
&lt;p&gt;非常にお世話になっている専門書として &lt;em&gt;Handbook of Graph Drawing and Visualization&lt;/em&gt; があります。2013年刊なので10年以上前の本ですが、とてもいい本です。定価で買うと結構高いのですが、オンラインでプレプリント版の PDF が無料公開されています。すごくディープな内容で、私が博士論文を書いたときは、この本の1つのチャプターを半分も理解できたかどうか、というくらいでした。研究的にも実務的にもネタの宝庫のような本です。&lt;/p&gt;
&lt;p&gt;実際、同じデータでも異なるアルゴリズムを適用すると、まったく別の結果になります。上の方は比較的似た結果でも、下の方はまったく違うアプローチになる。同じネットワークからでも、アルゴリズムの選び方によってまったく異なる可視化が得られるわけです。&lt;/p&gt;
&lt;h2 id=&#34;力指向アルゴリズムforce-directed&#34;&gt;力指向アルゴリズム（Force-directed）
&lt;/h2&gt;&lt;p&gt;先ほど紹介した主要なソフトウェアやライブラリの多くに取り入れられているのが、&lt;strong&gt;フォースダイレクト（力指向）アルゴリズム&lt;/strong&gt;で、今では主流の1つです。&lt;/p&gt;
&lt;p&gt;これはネットワークのノード間に働く力学的な力から、エネルギーの停留点を求めるもの。力学的にバランスの取れた点が、ネットワーク的に綺麗な配置だとみなして計算を行います。&lt;/p&gt;
&lt;p&gt;そこで主に使われるのが&lt;strong&gt;バネの力&lt;/strong&gt;です。バネの力はフックの法則として知られ、&lt;code&gt;K(x − d)&lt;/code&gt; のように表されます。バネをイメージすると、引っ張ったり縮めたりしなければ自然な長さをしている。これを&lt;strong&gt;自然長&lt;/strong&gt;と言います。そこから縮めると反発する力が働き、伸ばすと縮もうとする力が働く。力の大きさは自然長からの伸び縮みで決まり、自然長を d、実際の2点の距離を x とすると、&lt;code&gt;x − d&lt;/code&gt; にバネ定数 K をかけたものが力の強さになります。&lt;/p&gt;
&lt;p&gt;バネを使った力指向アルゴリズムは、大きく2つのモデルに分類されます。&lt;/p&gt;
&lt;p&gt;1つが&lt;strong&gt;スプリング・エレクトリック・モデル&lt;/strong&gt;。リンクで結ばれた頂点のペアをバネで結び、さらに結ばれているところも結ばれていないところも、ちょうどいい間隔を取るように電気の力（斥力）をかけて反発させ合ってシミュレーションを行います。&lt;/p&gt;
&lt;p&gt;もう1つが&lt;strong&gt;スプリング・モデル&lt;/strong&gt;。すべての頂点のペアをバネで結ぶ――リンクで結ばれているところもいないところも全部バネがあると想定して力の計算を行います。&lt;/p&gt;
&lt;h3 id=&#34;スプリングエレクトリックモデルの特徴&#34;&gt;スプリング・エレクトリック・モデルの特徴
&lt;/h3&gt;&lt;p&gt;多くのアルゴリズム（d3-force など）でスプリング・エレクトリック・モデルが採用されているのは、&lt;strong&gt;速いから&lt;/strong&gt;です。計算量が小さい。元々はすべての頂点ペアの斥力の計算が必要で頂点数の2乗ほどかかりますが、&lt;strong&gt;Barnes-Hut 近似&lt;/strong&gt;――物理学で天体のシミュレーションに使われる技術――を使うと、これが頂点数 V に対して V log V ほどに落ちます。相当する配列の処理と比べてもそれほど変わらず、実用的に高速に動きます。&lt;/p&gt;
&lt;p&gt;歴史的には、1991年の &lt;strong&gt;Fruchterman-Reingold&lt;/strong&gt; のアルゴリズムでは頂点数の2乗の計算量がかかっていたものが、2000年前後になって V log V で済むアルゴリズムの研究が盛んに行われました。代表的なものが **FM³（Fast Multipole Multilevel Method）**です。&lt;/p&gt;
&lt;p&gt;また、Gephi で使われていることで有名なものとして &lt;strong&gt;ForceAtlas2&lt;/strong&gt; があります。論文が出たのは Gephi が普及したかなり後ですが、技術的な詳細が論文で説明されています。ちなみに ForceAtlas2 は厳密にバネと電気の力をシミュレーションしているわけではなく、グラフ描画に適した力を自分たちで作っていて、その結果として見やすい配置ができています。&lt;/p&gt;
&lt;h3 id=&#34;デモバネだけでは重なってしまう&#34;&gt;デモ：バネだけでは重なってしまう
&lt;/h3&gt;&lt;p&gt;自分で作った資料ですが、Processing（の JavaScript 版）を使ってブラウザ上で力学シミュレーションを見せているものがあります。初歩的ですが、スプリング・エレクトリック・モデルでネットワーク可視化をする原理が分かるようになっています。&lt;/p&gt;
&lt;p&gt;3つのノードがあって、その間にバネが働いていて、だんだん三角形に落ち着いていく。ではバネの力だけで斥力がないとどうなるかというと、力が釣り合う点でノードが重なってしまうんですね。だからノード間で反発させ合う必要がある。斥力を加えると、ノードが重ならずにうまい位置に配置されます。&lt;/p&gt;
&lt;p&gt;これは特別なライブラリを使っておらず（描画に Processing のライブラリは使っていますが）、計算としては100行ちょっとくらいのコードで、簡単なネットワーク可視化のプログラムを実現できます。さらにノードが増えると1箇所に落ち着かないことがあるので、空気抵抗をかけて早く収まるようにする、といった工夫も説明しています。&lt;/p&gt;
&lt;h2 id=&#34;ストレスモデルスプリングモデル&#34;&gt;ストレスモデル（スプリング・モデル）
&lt;/h2&gt;&lt;p&gt;自分がここしばらく研究として行っているのが、スプリング・モデル、あるいは&lt;strong&gt;ストレスモデル&lt;/strong&gt;と呼ばれるグラフ描画のアルゴリズムです。&lt;/p&gt;
&lt;p&gt;バネの自然長としてノード間の&lt;strong&gt;理想距離&lt;/strong&gt;を設定し、そのバネですべての頂点のペアを結びます。理想距離として一般的に採用されるのは、グラフ理論的な最短経路問題を解いた最短経路。それと、2次元に描画したときの距離がなるべく一致するように計算します。&lt;/p&gt;
&lt;p&gt;このとき、すべてのバネの弾性エネルギーが最小化されるような配置を式で表せます。式の中の |Xi − Xj| が実際に描画した距離、d_ij が理想の距離です。つまり、&lt;strong&gt;実際の距離と理想の距離の2乗誤差を最小化する問題&lt;/strong&gt;として、ネットワーク可視化を考えることができます。&lt;/p&gt;
&lt;p&gt;ただ、この最適化問題は簡単ではなく、&lt;strong&gt;非線形最適化問題&lt;/strong&gt;に分類されます。これを最小にする座標を得るのは理論的に非常に難しい。もう1つの欠点として、スプリング・エレクトリック・モデルと比べて計算量がかかります。どこでかかるかというと、グラフ理論的最短経路を求めるところで、頂点数の3乗、あるいは頂点数の2乗×log V ほどの計算量がかかってしまいます。&lt;/p&gt;
&lt;p&gt;主要なアルゴリズムは大きく4つあるので、順番に見ていきます。&lt;/p&gt;
&lt;h3 id=&#34;-kamada-kawai-法&#34;&gt;① Kamada-Kawai 法
&lt;/h3&gt;&lt;p&gt;ストレスモデルとともに最初に登場したのが Kamada-Kawai のアルゴリズムです。他のアルゴリズムと比べたときのアプローチの特徴は、&lt;strong&gt;ノードを1つずつ動かす&lt;/strong&gt;という点にあります。&lt;/p&gt;
&lt;p&gt;デモで動きを見てみましょう。最初にごちゃっと適当にノードを配置してしまい、そこからノードを1個ずつ、そのノードにとってストレスが最も小さくなる位置を計算で見つけて動かしていきます。アニメーションのため1個ずつ動かしているので時間がかかって見えますが、だんだん進んでいくとネットワークの形が出てきて、緑色のノードがこの辺りに固まってきます。&lt;/p&gt;
&lt;p&gt;（大野さんが補足してくださっていますが、頂点数の3乗はコンピューターで計算するには結構大変で、ノード数にもよりますが、数百ノードなら問題なく動きます。それが数千を超えるようなネットワークになると、数分では下らない、下手をすると数時間待つような場合もあり得ます。）&lt;/p&gt;
&lt;p&gt;1個ずつ動かすのは、結構まどろっこしいですよね。実際に計算するときは最終結果だけ出ればいいので、こんなに1個ずつ動かすことはありません。それに、1つずつ動かしていくので、「全部を一度に動かせたらもっといい配置ができるのに」という場合も生じてしまいます。&lt;/p&gt;
&lt;h3 id=&#34;-ストレスマジョライゼーション&#34;&gt;② ストレス・マジョライゼーション
&lt;/h3&gt;&lt;p&gt;そこで後に登場したのが&lt;strong&gt;ストレス・マジョライゼーション&lt;/strong&gt;です。マジョライゼーションはあまり馴染みがないと思いますが、最適化の方法で、優関数法（マジョライゼーション・テクニック）を用いてストレス関数を最小化する方法です。Kamada-Kawai から15年ほど経ってから登場しました。&lt;/p&gt;
&lt;p&gt;デモを見ると、先ほどと比べて全体が一気に動いて、綺麗な位置に落ち着いていきます。だんだんいい位置に落ち着いて動かなくなる。エネルギーが最小になる点を数学的に計算しながらノードを配置していく方法です。&lt;/p&gt;
&lt;p&gt;これについては自分の記事で理論的な解説も書いているので、興味のある方はぜひご覧ください。Python で実装するとどうなるか、というのも書いていて、これも意外と100行いかないくらいで実装できます。&lt;/p&gt;
&lt;h3 id=&#34;-確率的勾配降下法sgd&#34;&gt;③ 確率的勾配降下法（SGD）
&lt;/h3&gt;&lt;p&gt;そこからまた十数年経って、画期的なグラフ描画アルゴリズムが登場しました。&lt;/p&gt;
&lt;p&gt;最近の機械学習ブーム、特にニューラルネットワークで、うまく学習するために行列のパラメーターを決める最適化の方法として**確率的勾配降下法（Stochastic Gradient Descent, SGD）**が用いられています。実は2018年の論文で、これがグラフ描画に対しても非常に有効だということが示されました。&lt;/p&gt;
&lt;p&gt;動きを見てみると、見た目としては最初すごくガチャガチャと動いていて綺麗とは言いがたいのですが、だんだん動きを小さくしていって、落ち着いたところがすごくバランスのいい配置になります。&lt;/p&gt;
&lt;p&gt;何をしているかというと、ネットワーク中のノードのペアを&lt;strong&gt;ランダムに&lt;/strong&gt;取ってきて、その2つのノードが理想距離になるように動かす。それをランダムな順番で繰り返していくと、先ほどのような動きになります。&lt;/p&gt;
&lt;p&gt;「そんな適当でいいのか」と思うかもしれませんが、これが非常に有効なんです。マジョライゼーションの方法では、最初にどうノードを配置するかによって最後に落ち着く形が決まってしまう。だから初期配置が悪いと、綺麗な結果にならないことがあります。それに対して SGD を使った方法では、ランダムに動かす分、&lt;strong&gt;局所最適解&lt;/strong&gt;に落ちにくく、いいレイアウトが得やすいことが明らかになりました。&lt;/p&gt;
&lt;p&gt;実装が簡単なこと、そして後で紹介する2次元平面以外への描画といった拡張が簡単なことも、この方法の特徴です。&lt;/p&gt;
&lt;h3 id=&#34;-mds多次元尺度構成法&#34;&gt;④ MDS（多次元尺度構成法）
&lt;/h3&gt;&lt;p&gt;もう1つ典型的な方法として &lt;strong&gt;MDS&lt;/strong&gt; があります。&lt;/p&gt;
&lt;p&gt;説明し損ねましたが、ストレスモデルではノードペアの違反がどれだけ重要かという&lt;strong&gt;重み&lt;/strong&gt;をかけています。この重みがないバージョンを解くための方法が MDS です。&lt;/p&gt;
&lt;p&gt;動かしてみると、他の方法と比べて見た目があまりよろしくありません。なぜかというと、単純にノード間の理想距離だけで配置を決めてしまうので、距離関係が同じノードが同じ座標に行ってしまう、といった問題が生じるためです。&lt;/p&gt;
&lt;p&gt;なので MDS を使ったグラフ描画は単体ではあまり有効ではないのですが、&lt;strong&gt;この配置は初期配置によらず一定に決まります&lt;/strong&gt;。したがって、初期配置を MDS で決めてしまって、他のグラフ描画アルゴリズムに用いる、ということが可能になります。&lt;/p&gt;
&lt;h3 id=&#34;グラフ描画と次元削減の関係&#34;&gt;グラフ描画と次元削減の関係
&lt;/h3&gt;&lt;p&gt;MDS は実は次元削減手法の1つで、グラフ描画と次元削減には密接な関わりがあります。MDS によるグラフ描画は古典的 MDS とまったく同じですし、非古典的な MDS（代表的にはメトリック MDS）の実装にはマジョライゼーション・テクニックが使われていて、実はそれをグラフ描画の方に持ってきた、という位置付けになっています。&lt;/p&gt;
&lt;p&gt;逆に、次元削減の方法にグラフ描画やバネを用いたアプローチが用いられることもあります。グラフ描画は、高次元のネットワークデータを低次元へ埋め込んでいる、と解釈することができるわけです。&lt;/p&gt;
&lt;h2 id=&#34;ストレスモデルの拡張&#34;&gt;ストレスモデルの拡張
&lt;/h2&gt;&lt;p&gt;ここからは、スプリング・モデルの拡張についていくつか触れます。&lt;/p&gt;
&lt;p&gt;SGD が登場する以前は「どうやってストレスが最小の点を見つけるか」という最適化問題としての研究が盛んでしたが、ストレス関数を最小化するという課題は、ある意味 SGD の登場で決着がつきました。したがって、これから進んでいくストレスモデルの研究は、&lt;strong&gt;それをどううまく拡張するか&lt;/strong&gt;というところになります。&lt;/p&gt;
&lt;h3 id=&#34;パラメーターで見た目が変わる&#34;&gt;パラメーターで見た目が変わる
&lt;/h3&gt;&lt;p&gt;単純にストレスモデルと言っても、パラメーターの決め方で描画結果が変わります。たとえば同じネットワークデータでも、辺の長さに緩急をつける――大事な辺は短く、クラスター同士をつなぐ辺は長く――としたものが左（重み付きエッジ）、すべて一様に同じ長さにしたものが右です。左の方が、グラフの全体的な構造と局所的な構造が強調されて見えます。&lt;/p&gt;
&lt;h3 id=&#34;制約付きレイアウト&#34;&gt;制約付きレイアウト
&lt;/h3&gt;&lt;p&gt;ネットワークを可視化するとき、さまざまな制約を加えたいことがあります。ノードを階層的に配置したい、ノードが重ならないように配置したい、など。これを得意としているのが &lt;strong&gt;cola.js&lt;/strong&gt; です。&lt;/p&gt;
&lt;p&gt;たとえば、向きのある辺がなるべく上から下向きになるように配置する制約を入れながらストレスモデルを解く。あるいはノードのグループがあって、グループ同士が重ならないように箱で囲い、その箱同士が重ならないように配置する。ほかにも、ノード同士が近すぎるとラベルを表示している場合に見えなくなってしまうので、重ならないような配置にする、といった制約を入れてレイアウトすることが可能になります。&lt;/p&gt;
&lt;h3 id=&#34;計算量への対処--ピボット&#34;&gt;計算量への対処 ― ピボット
&lt;/h3&gt;&lt;p&gt;ストレスモデルの大きな欠点の1つが計算量の問題です。&lt;/p&gt;
&lt;p&gt;デモとして、SGD を用いて1000ノードほどのネットワークを描画しています。ただ1000ノードで頂点数の3乗となると相当な時間がかかってしまうので、すべての頂点ペアの座標を計算するのではなく、&lt;strong&gt;ピボット&lt;/strong&gt;と呼ばれるいくつかの頂点からだけ最短経路を求めます。&lt;/p&gt;
&lt;p&gt;ピボットの数を少なめに設定して動かしてみます。1000頂点中50の頂点だけを選んで動かすと、まだごちゃごちゃしています。100にしても、まだ少しごちゃっとしていますね。200にすると、なんとなくこの辺りに輪のある構造が見えてきて、300にするともう少し綺麗になり、いくつかの輪が見えてネットワークの全体的な形が見えてきます。&lt;/p&gt;
&lt;p&gt;つまり、どれくらい近似をするかによりますが、&lt;strong&gt;描画品質を多少犠牲にしてでも実行時間を削減する&lt;/strong&gt;ことが可能になります。&lt;/p&gt;
&lt;h2 id=&#34;2次元平面以外への描画&#34;&gt;2次元平面以外への描画
&lt;/h2&gt;&lt;p&gt;最後の話題として、2次元平面以外での描画も紹介します。代表的なものとして球面・双曲面・トーラスがあります。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;球面&lt;/strong&gt;では、球そのものは表示していませんが、球面上にネットワークを配置します。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;双曲面&lt;/strong&gt;は情報可視化で時々用いられるもので、外側に行くほど広がっている空間を、外側を縮めることで描いています。インタラクションによって、たとえば右の方にあるノードを中心に持ってくると、その辺りがズームして拡大されるように見える。全体像を保ちながら注目しているところだけ拡大表示する、&lt;strong&gt;魚眼レンズのような効果&lt;/strong&gt;が得られます。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;トーラス空間&lt;/strong&gt;はドーナツ型の空間で、それを平面に切り開いたものです。ドラクエ3などの世界地図をイメージしてもらうといいと思いますが、平面の右端と左端、上端と下端がそれぞれつながっていて、上に突き抜けると下から出てくるという空間でグラフ描画をします。1個分の領域が上下左右に繰り返されていて、注目したいところに移動していくことが可能になります。&lt;/p&gt;
&lt;p&gt;球面やトーラスのようにループする空間になっていると、1箇所にノードが固まってしまうことを避けて、全体的にバランスの取れたレイアウトができる場合があります。&lt;/p&gt;
&lt;h2 id=&#34;どこで使えるか&#34;&gt;どこで使えるか
&lt;/h2&gt;&lt;p&gt;ここまで紹介したアルゴリズムがどこで実装されているかを簡単にまとめておきます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Fruchterman-Reingold&lt;/strong&gt;（スプリング・エレクトリック・モデルの最初のもの）… NetworkX、Graphviz&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ForceAtlas2&lt;/strong&gt; … 元々 Gephi で実装され、現在は NetworkX や sigma.js でも利用可能&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kamada-Kawai&lt;/strong&gt; … NetworkX&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ストレス・マジョライゼーション&lt;/strong&gt; … Graphviz（レイアウトを選択すると利用できます）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;先ほどデモで紹介したものは、私が片手間に作っているライブラリです。人に使ってもらえるようなドキュメントの整備はまだ不十分ですが、いろいろ実験して実装しているので、利用されたいという方がいればお声かけください。&lt;/p&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ
&lt;/h2&gt;&lt;p&gt;今回は「ネットワーク可視化の世界」ということで、特にグラフ描画アルゴリズムについて紹介しました。&lt;/p&gt;
&lt;p&gt;グラフ描画のアルゴリズムには本当にいろいろなものがあり、&lt;strong&gt;アルゴリズムの選び方によって可視化結果はまったく異なってきます&lt;/strong&gt;。ネットワーク可視化を試してみたけれどうまくいかない、という場合でも、アルゴリズムの選び方によって綺麗な結果が出ることがあります。目的に応じて適切なアルゴリズムを選ぶこと、そしてアルゴリズムだけでなくパラメーターをどう設定するかによっても、ネットワーク可視化の出来は変わります。&lt;/p&gt;
&lt;p&gt;代表的なものはさまざまなツールに実装されているので、1つのアルゴリズムを試してダメだったときは、他のツールを試してみる。それだけでも有意な分析につながるのではないかと思います。&lt;/p&gt;
&lt;p&gt;自分はネットワーク可視化まわりでいろいろな道具や理論を試しているので、もしお困り事があればご相談ください。共同研究や受託研究、あるいはお仕事としての開発など、さまざまなアプローチでご協力できると思います。興味のある方はぜひご連絡ください。&lt;/p&gt;
&lt;p&gt;以上で話を終わりにさせていただきます。ありがとうございました。&lt;/p&gt;</description>
        </item>
        <item>
        <title>尾上 洋介／ビジュアライゼーションとモダンWeb開発</title>
        <link>https://data-visualization.jp/viz-and-modern-web/</link>
        <pubDate>Wed, 29 Dec 2021 00:00:00 +0000</pubDate>
        
        <guid>https://data-visualization.jp/viz-and-modern-web/</guid>
        <description>&lt;img src="https://data-visualization.jp/viz-and-modern-web/cover.jpg" alt="Featured image of post 尾上 洋介／ビジュアライゼーションとモダンWeb開発" /&gt;&lt;p&gt;Data Visualization Japan Meetup 2021（2021年12月29・30日開催）における、尾上 洋介さん（日本大学 文理学部 情報科学科 准教授）の講演です。行政事業データベース JUDGIT! の開発経験をもとに、可視化アプリケーションを支える Web 技術の現在地を紹介します。&lt;/p&gt;
&lt;hr&gt;
&lt;div class=&#34;video-wrapper&#34;&gt;
    &lt;iframe loading=&#34;lazy&#34; 
            src=&#34;https://www.youtube.com/embed/_bkaED27FE4&#34; 
            allowfullscreen 
            title=&#34;YouTube Video&#34;
    &gt;
    &lt;/iframe&gt;
&lt;/div&gt;

&lt;p&gt;「ビジュアライゼーションとモダンWeb開発」ということで、普段やっていることを振り返って喋ってみようと思います。&lt;/p&gt;
&lt;h2 id=&#34;自己紹介&#34;&gt;自己紹介
&lt;/h2&gt;&lt;p&gt;日本大学 文理学部 情報科学科で准教授として教育・研究をしています。実データを触る関係で企業からも声をかけていただくことが多く、現在は&lt;strong&gt;株式会社帝国データバンクの客員研究員&lt;/strong&gt;として、可視化のデザインやシステムのデザインを行っています。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;可視化と Web が好き&lt;/strong&gt;です。私が可視化を始めたのは2013年ごろ、&lt;strong&gt;D3.js が流行りだしたタイミング&lt;/strong&gt;でした。もともと&lt;strong&gt;オペレーションズ・リサーチ（最適化）&lt;/strong&gt; の研究をやっていて、いろいろあってドクターから可視化の分野に踏み込むことになったのですが、&lt;strong&gt;教授の下にいる若い先生に「これからは可視化も Web だよ」と唆されて&lt;/strong&gt;、可視化と Web はその時期からセットで取り組んできました。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;アカデミックな研究とエンジニアリングの両立&lt;/strong&gt;を目指していて——新しいアルゴリズムや視覚的表現を作る基礎研究、可視化技術を各分野に適用する応用研究、可視化というキーワードで分野横断的な問題解決に取り組む研究、といったことをしています。&lt;/p&gt;
&lt;p&gt;私は、**可視化とは「人とデータが向き合う場のデザイン」**だと考えています。アプリを作るのか、デバイスを用意するのか——&lt;strong&gt;どういう環境を整えたら、データに向き合っている人がそれを行動に結びつけられるのか&lt;/strong&gt;を考えて取り組んでいます。&lt;/p&gt;
&lt;p&gt;**デザイン方面は全然明るくなく、完全にエンジニアの方面から可視化に取り組んでいます。**ソフトウェア開発、データベース、システム設計を勉強したり、学生時代に Web 開発のアルバイトをして実務的なシステムの作り方を学んできました。&lt;/p&gt;
&lt;h2 id=&#34;nhkスペシャル検証-コロナ予算-77兆円&#34;&gt;NHKスペシャル「検証 コロナ予算 77兆円」
&lt;/h2&gt;&lt;p&gt;昨日放送された番組に協力させていただきました。&lt;strong&gt;データを分析して提供したり、一緒に議論したり、専門家として意見を出す&lt;/strong&gt;ということをやりました。&lt;/p&gt;
&lt;p&gt;番組は NHK プラスで見逃し配信されています。また番組と併設して&lt;strong&gt;コロナ予算をいろんな角度から見る Web サイト&lt;/strong&gt;も公開されていて、&lt;strong&gt;こちらは矢崎さんがかなり気合いを入れて関わっている&lt;/strong&gt;のでぜひご覧ください。&lt;/p&gt;
&lt;h2 id=&#34;judgit--行政事業のデータベース化&#34;&gt;JUDGIT! ― 行政事業のデータベース化
&lt;/h2&gt;&lt;p&gt;なぜコロナ予算の分析に携わることになったかというと、&lt;strong&gt;2018年末ごろから行政事業をデータベース化して可視化する&lt;/strong&gt;ことに取り組んでいたからです。&lt;/p&gt;
&lt;p&gt;現在、中央省庁は小さい委員会なども含めると21いくつかありますが、&lt;strong&gt;そこで行われる事業は年間約5000件&lt;/strong&gt;あります。&lt;/p&gt;
&lt;p&gt;**省庁の縦割りで、別の組織が何をやっているのか見えない。**予算的な観点で全体を管轄する財務省ですら、担当外はあまり詳しくなかったりする。&lt;strong&gt;行政事業の全体像の把握は非常に困難でした。もはや年間約5000件の事業の全体像を把握できている人間はいなかったのではないか&lt;/strong&gt;と思います。&lt;/p&gt;
&lt;h3 id=&#34;行政事業レビューシート&#34;&gt;行政事業レビューシート
&lt;/h3&gt;&lt;p&gt;情報自体は「&lt;strong&gt;行政事業レビューシート&lt;/strong&gt;」という、各事業の自己点検のための書類として毎年出されていました。&lt;strong&gt;Excel で書かれていて、担当の人が埋めていく&lt;/strong&gt;という形です。&lt;/p&gt;
&lt;p&gt;これを&lt;strong&gt;コンピュータで扱いやすいように、記述が曖昧な部分を整理してデータベース化&lt;/strong&gt;し、閲覧できる Web サイト &lt;strong&gt;JUDGIT!&lt;/strong&gt; を公開しました。&lt;/p&gt;
&lt;p&gt;レビューシートは実に多種多様な情報を含んでいます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;数値情報&lt;/strong&gt;：予算額、どれだけのお金がついてどれだけ使ったか&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;定量評価&lt;/strong&gt;：どういうアウトカム・アウトプットを設定してどれだけ実現できたか&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;定性的なテキスト&lt;/strong&gt;：事業の概要、有識者からのコメント&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;関連情報&lt;/strong&gt;：他の事業との関連、どういう会社や民間団体に仕事を依頼していくら出しているか&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;データベース化したことで、&lt;strong&gt;もともと一つの事業の自己点検に使われていたものを、全事業横断で調べられるようになりました。&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&#34;予算宇宙--事業の関連ネットワーク&#34;&gt;予算宇宙 ― 事業の関連ネットワーク
&lt;/h3&gt;&lt;p&gt;番組で「&lt;strong&gt;予算宇宙&lt;/strong&gt;」という形で取り上げていただいたもののベースになっているのが、このネットワーク図です。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;事業の文章をニューラルネットワークで処理して文章同士の近さを計算し、近いものをつなぐ&lt;/strong&gt;とネットワークが出てきます。&lt;/p&gt;
&lt;p&gt;そうすると——経済産業省、厚生労働省といったそれぞれの省庁が事業を展開しているわけですが、&lt;strong&gt;文章の書きぶりから、結構似たことを違う省庁でやっているもの&lt;/strong&gt;があったりします。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;それはある意味「重複した無駄」かもしれないし、あるいはそれらを連携することでより効果的な事業を展開できるのではないかという示唆にもつながります。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;左の方に大きな島があって、このあたりは&lt;strong&gt;経産省・農水省・国交省&lt;/strong&gt;などの事業がつながっています。いわゆる&lt;strong&gt;社会課題系のものは多面的で、いろんな見方から問題解決に取り組まないといけない&lt;/strong&gt;ので、他省庁でも同じような課題への対策が行われている。&lt;strong&gt;それを見て「もっとどうやったらよくできるのか」を考える材料&lt;/strong&gt;にできます。&lt;/p&gt;
&lt;p&gt;個人的に面白かったのは&lt;strong&gt;ICT 関係の島が孤立してあった&lt;/strong&gt;こと。**ICT は本来、社会課題解決の根幹に来なければならないものだと思うのですが、大きな島から離れて出てきてしまっているのは、正直なところ「日本らしいな」と。**ある意味、&lt;strong&gt;日本の ICT が抱える課題&lt;/strong&gt;でもあるのかなと感じました。&lt;/p&gt;
&lt;h3 id=&#34;きっかけはプロトタイプだった&#34;&gt;きっかけはプロトタイプだった
&lt;/h3&gt;&lt;p&gt;最初からこういうものを作ろうと思っていたわけではありません。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;共同運営している団体から「東京オリンピック予算の検証がしたい」と持ちかけられた&lt;/strong&gt;のが2018年ごろでした。「&lt;strong&gt;レビューシートという Excel のシートがあるんだけど、これから何とかできないか&lt;/strong&gt;」と。&lt;/p&gt;
&lt;p&gt;行政の事業データや政策には明るくなかったので、**まずは自分がデータの理解を深めるためのビューアを作り始めた。**いくつか検索や簡単な可視化ができるようにしたら、&lt;strong&gt;それがプロジェクトメンバーに思いのほか受けが良く&lt;/strong&gt;、「東京オリンピック予算の検証は抜きにしても、これ自体を世に出そう」ということになって本格的に仕上げて公開しました。&lt;/p&gt;
&lt;p&gt;これをやって感じたのが、&lt;strong&gt;プロトタイピングをして、ドメインの専門家と相互理解をして、それを世に出すことの重要性&lt;/strong&gt;です。&lt;/p&gt;
&lt;p&gt;**私が可視化の専門家として、行政事業というドメインの知識を獲得する。同時に、データを使って何かをしたいドメインの専門家が、可視化やデータ分析の技術に触れる。**プロトタイプを作って開発していくのは非常に良い体験でした。&lt;/p&gt;
&lt;h3 id=&#34;こだわったこと&#34;&gt;こだわったこと
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;軽快に、簡単に&lt;/strong&gt;——&lt;strong&gt;Web サイト自体の質を高めよう&lt;/strong&gt;と工夫しました。&lt;/p&gt;
&lt;p&gt;最近は国も力を入れて行政系からもいいウェブサイトが出るようになっていますが、&lt;strong&gt;古いイメージだと行政系のサイトは重くて硬い雰囲気がある。それを払拭して行政事業を身近にしたい&lt;/strong&gt;という気持ちがありました。&lt;/p&gt;
&lt;p&gt;もう一点、&lt;strong&gt;データが Excel や PDF で公開されていたため、普通の人が調べ物をした時にそういう情報に行き当たりにくい&lt;/strong&gt;という課題がありました。&lt;strong&gt;まず行政事業という情報自体を、検索エンジンのクローラーがしっかり拾ってくれるようにしたい。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;検索エンジンフレンドリーにコンテンツを作ることで、身近なところから行政情報につながる&lt;/strong&gt;ことを意識しました。&lt;/p&gt;
&lt;p&gt;Google Analytics のアクセス状況を見ると、&lt;strong&gt;4分の3がオーガニックサーチ&lt;/strong&gt;——&lt;strong&gt;ほとんど検索流入&lt;/strong&gt;です。「JUDGIT! というサイトを知っていたわけではないけれど、どこからともなくたどり着く」方がほとんどです。&lt;/p&gt;
&lt;p&gt;ユーザーを見てみると、**もともと行政に強い関心がある人というより、平日昼間のアクセスが多い。**仕事で調べ物をしていて、たまたま行政の情報にたどり着く、という方が多いことが分かりました。&lt;/p&gt;
&lt;h3 id=&#34;公開してよかったこと&#34;&gt;公開してよかったこと
&lt;/h3&gt;&lt;p&gt;**「こういうものがあるんだ」と、行政の情報に気軽に触れられるようになった。**その結果として、&lt;strong&gt;今回のコロナ予算の NHK スペシャルのように「もっとこういうことできませんか」という問い合わせをいただく&lt;/strong&gt;ようになりました。&lt;/p&gt;
&lt;p&gt;**元の Excel ファイルの束だと、そこから何か分析をしようという気は起こらなかったと思う。**それがデータベース化されていることで、&lt;strong&gt;もっと次のアイデアが生まれてくる。実際にユーザーにデータに触れてもらうことで、さらに次の良いアイデアに進むことができる&lt;/strong&gt;——これが作って公開してよかったことです。&lt;/p&gt;
&lt;h2 id=&#34;可視化とは何か&#34;&gt;可視化とは何か
&lt;/h2&gt;&lt;p&gt;改めて考えてみます。&lt;/p&gt;
&lt;p&gt;「可視化とは」と言った時、&lt;strong&gt;普通のビジネスパーソンが思い浮かべるのは「棒グラフとか円グラフとか、いろんな表現があるよね」ということ&lt;/strong&gt;だったり、&lt;strong&gt;「Tableau で可視化できるよ」「matplotlib で可視化できるよ」というツールの話&lt;/strong&gt;だったりします。可視化を専門としないデータサイエンティストもよく言います。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;でも、これらを使いこなすことが可視化なのかというと、多分そうではない。&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&#34;視覚変数とデータの対応づけ&#34;&gt;視覚変数とデータの対応づけ
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;表現可能な視覚変数&lt;/strong&gt;は一通りあります。位置、大きさ、色、模様、形——&lt;strong&gt;特にコンピュータの上で使える視覚変数は、そんなに大した量がない。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;コンピュータグラフィックスは結果的に複雑な図形を描けますが、&lt;strong&gt;基本は多角形を描く、線分を引く、点を打つ、それくらい。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;逆に言うと、可視化はそういった基本的な要素をデータと結びつけることで成り立っています。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;折れ線グラフで線の高さが何を表しているのか——&lt;strong&gt;「人口」というデータの空間から、「座標」という視覚変数の空間へのマッピング。これが可視化を成り立たせることの根幹&lt;/strong&gt;にあるわけです。&lt;/p&gt;
&lt;h3 id=&#34;データを視覚的に表現する限界&#34;&gt;データを視覚的に表現する限界
&lt;/h3&gt;&lt;p&gt;実際のデータは&lt;strong&gt;行数も列数も無数にあり、大規模化・複雑化しています。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;行数（レコード数）の限界&lt;/strong&gt;は非常に分かりやすい。&lt;strong&gt;8Kディスプレイ——実際に使われている最大の解像度でも、約3200万ピクセル&lt;/strong&gt;です。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;仮に一要素を1ピクセルで表せるとしても&lt;/strong&gt;（そんな可視化をしたら怒られるとは思いますが）、&lt;strong&gt;そのピクセル数分の要素しか表現できない。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;**3200万要素は、ビッグデータの時代からすると非常に些細な量です。**何億レコードとなると桁がいくつも足りない。&lt;strong&gt;せいぜい一要素100ピクセルは使いたいと思うと、表現できる情報の桁はさらに減ります。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;列（データのフィールド）&lt;/strong&gt; で考えても、&lt;strong&gt;視覚的表現に割り当てられる変数はごく少数&lt;/strong&gt;です。一つの円に対して割り当てられるのは、座標、半径、色——&lt;strong&gt;たかだかそれくらい。&lt;strong&gt;でも&lt;/strong&gt;何十列とかになってくると、当然すべてを見渡せなくなります。&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&#34;だから選ぶ必要がある&#34;&gt;だから「選ぶ」必要がある
&lt;/h3&gt;&lt;p&gt;複雑で大規模なデータには——&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;可視化する対象を行なり列なりで選ぶ&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;統計的に集計して統計情報を出す&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;列方向でまとめる次元削減&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;行をまばらに取り出すサンプリング&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;データ全体の傾向を失わないように粗く表す粗視化&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;といったアプローチが必要になります。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;それでもなお「見せるものを選ばないといけない」のが課題です。見せられないものを補いたかったら、もうインタラクションくらいしかない。&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;検索・絞り込みのインターフェースをつける&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;メインのビューだけでは捉えられない情報をサブのリンクトビューで表す&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;点をクリックすると詳細が見えるドリルダウン&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;ただ、そういうインタラクションを実装していくと開発コストが高くなり、開発自体が複雑化していく。それとどう向き合うのか&lt;/strong&gt;を考えなければなりません。&lt;/p&gt;
&lt;h2 id=&#34;なぜ-web-で作るのか&#34;&gt;なぜ Web で作るのか
&lt;/h2&gt;&lt;p&gt;可視化システムをユーザーにどう提供するか。&lt;strong&gt;デスクトップアプリ&lt;/strong&gt;と &lt;strong&gt;Web アプリ&lt;/strong&gt;の比較です。&lt;/p&gt;
&lt;p&gt;Tableau のようにパッケージをダウンロードしてインストールするものに比べて、&lt;strong&gt;Web アプリはインストール不要で、ブラウザさえ動けば利用可能。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;**ただし性能面では Web アプリはデスクトップアプリにかないません。**実装言語の性能上の問題も、ハードウェア機能の利用が限られる制約もある。&lt;strong&gt;パフォーマンスとデリバリーのしやすさにトレードオフがある&lt;/strong&gt;わけです。&lt;/p&gt;
&lt;h3 id=&#34;web-の利点&#34;&gt;Web の利点
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;第一に、ユーザーに届けることが簡単になる。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;私は他の大学や研究所と共同研究することが多いのですが、&lt;strong&gt;忙しい研究者に「こういうのを作ったから遊んでみてください」と言う時に、「このソフトをインストールしてこの手順でセットアップしてください」と言うと、なかなかやってくれない。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;**Web で提供していれば「このページにアクセスしてください」で済む。**向こうもハードルが低くてすぐ利用してもらえる。&lt;strong&gt;すぐ利用してもらえるとフィードバックがもらえて、次の機能改善につながる。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;**もう一つは、今のアプリはリッチだということ。**日常的に触れるアプリケーションはそこそこリッチで、&lt;strong&gt;そういうリッチな UI を個人や数人のチームで片手間に開発するのは大変。Web の技術に乗っかることで、ユーザーにも馴染みのある UI を、そんなにコストをかけずに提供できます。&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&#34;補足--オフラインで動く-web-アプリ&#34;&gt;補足 ― オフラインで動く Web アプリ
&lt;/h3&gt;&lt;p&gt;スライドに入れられなかったので補足すると、&lt;strong&gt;実はインターネット接続がなくても使用できる Web サイトがあります。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;さすがに最初の1回は訪れておく必要がありますが、&lt;strong&gt;Service Worker という技術を使えばオフラインで動く Web アプリケーションを作ることができます。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;私も一時期そういうものを作っていました。&lt;strong&gt;共同研究先がインターネットもないような場所にフィールドワークに行くので、「可視化アプリをネットに繋がらなくても使えるようにならないか」というニーズがあった&lt;/strong&gt;んです。興味のある方はぜひ調べてみてください。&lt;/p&gt;
&lt;h2 id=&#34;トレンド-宣言的ui&#34;&gt;トレンド① 宣言的UI
&lt;/h2&gt;&lt;p&gt;2010年前後から &lt;strong&gt;HTML5&lt;/strong&gt; が言われ出し、&lt;strong&gt;HTML を単純にコンテンツを表示させる土台から、アプリケーションのプラットフォームとして成熟させていこう&lt;/strong&gt;という動きがありました。2010年代はなかなかカオスでしたが、その中で発展してきたのが &lt;strong&gt;Web フロントエンドのフレームワーク&lt;/strong&gt;です。&lt;/p&gt;
&lt;p&gt;**Web の表現力が高まった一方で、それは開発コストを高めることでもある。**従来 PHP や Ruby on Rails でバックエンドでやってきた処理を、&lt;strong&gt;リッチな Web 体験のために前（ブラウザ側）に持っていく&lt;/strong&gt;動きがあったので、&lt;strong&gt;フロントエンドの開発コストが大きくなりました。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;10年ほど前は jQuery が流行っていて「プラグインを入れると簡単におしゃれな機能を加えられます」という感じでしたが、&lt;strong&gt;それでは到底太刀打ちできない規模のアプリケーションがブラウザ上で動かされるように&lt;/strong&gt;なってきた。&lt;/p&gt;
&lt;p&gt;そこで &lt;strong&gt;React、Vue、Angular、Svelte&lt;/strong&gt; といったフレームワークが使われるようになります。&lt;/p&gt;
&lt;p&gt;今回紹介するのは &lt;strong&gt;React&lt;/strong&gt; ですが、そこが取り入れているトレンドが「&lt;strong&gt;宣言的UI&lt;/strong&gt;」です。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;UI = f(state)&lt;/code&gt;&lt;/strong&gt; と表されます。&lt;strong&gt;UI があってユーザーが操作すると、アプリケーション内部が持っている「状態（state）」が変化し、その結果 UI が更新されてユーザーが見る&lt;/strong&gt;——&lt;strong&gt;UI 構築と状態管理を分離して&lt;/strong&gt;アプリケーションを構築していく流れです。&lt;/p&gt;
&lt;p&gt;React は Facebook 社が開発するライブラリで、&lt;strong&gt;JavaScript の拡張構文 JSX&lt;/strong&gt; を利用します。JavaScript の関数の中にタグが出てくるので、&lt;strong&gt;慣れないうちはちょっと気持ち悪い&lt;/strong&gt;気がするかもしれません。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Facebook には意外と関数型言語や凝ったプログラミング言語が好きな人が昔からいて&lt;/strong&gt;、関数型言語を利用した開発効率の向上に研究的に取り組んできた流れがあります。&lt;/p&gt;
&lt;p&gt;大雑把に言うと——&lt;strong&gt;データがあって、それを UI のどこに埋め込むかを宣言的に書くことで、データと UI の関係を分かりやすくする&lt;/strong&gt;、というのが一つのアプローチです。&lt;/p&gt;
&lt;h3 id=&#34;react-と可視化&#34;&gt;React と可視化
&lt;/h3&gt;&lt;p&gt;可視化は結局、&lt;strong&gt;元のデータと、それに対するユーザーの興味関心が操作に反映されて出てくる&lt;/strong&gt;ものです。&lt;strong&gt;React はそのまま SVG のタグを書くこともできます。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;上の方にデータがあって、それを SVG のタグの中にどうやって埋め込むかを考えればいい。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;可視化ライブラリは古くは D3.js、最近は関数を一つ呼び出せば綺麗なチャートを描いてくれるものもたくさんあります。&lt;strong&gt;でも「有り物のチャートでは満足できない」という人は、D3.js のような低レイヤーの API を使って可視化を組み立てていく。そういう時にこのアプローチが有効になります。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;**私は D3.js で UI を構築するということはもうやっていません。**D3.js 自体はしょっちゅう使いますが、&lt;strong&gt;UI の構築・可視化の構築には React を使う&lt;/strong&gt;というアプローチをずっと取ってきました。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;D3.js を「可視化のオールインワンのパッケージ」として使うのではなく、「データ変換のためのツール」として使う&lt;/strong&gt;アプローチです。&lt;/p&gt;
&lt;p&gt;先ほどの「データと視覚要素をどう結びつけるか」でやっていたのは、実は&lt;strong&gt;線形変換&lt;/strong&gt;です。&lt;strong&gt;&lt;code&gt;d3.scaleLinear&lt;/code&gt;&lt;/strong&gt; はよく使われるのではないでしょうか。&lt;strong&gt;そういうものでデータと視覚変数の対応関係を作り、必要なコンポーネントに渡してマッピングをする。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;**新しく始める際のポイントは &lt;code&gt;d3.select&lt;/code&gt; を使わずにやってみること。**おそらく &lt;code&gt;d3.select&lt;/code&gt; から勉強された方が多いと思いますが、&lt;strong&gt;宣言的UIで可視化コンテンツを作ろうと思ったら、まず &lt;code&gt;d3.select&lt;/code&gt; を使わないという縛りプレイから始めるといいかもしれません。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;もちろん完成された D3 のコンポーネントを持っていたり既存ライブラリを使いたい場合は直接使った方が効率的ですし、&lt;strong&gt;必要になれば React の中に &lt;code&gt;d3.select&lt;/code&gt; を組み込むこともできる&lt;/strong&gt;ので、そんなに怖がらずに。&lt;strong&gt;「まだ &lt;code&gt;d3.select&lt;/code&gt; で UI 構築しているよ」という人は、結構違った世界が見えるかもしれません。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&#34;トレンド-パフォーマンスと-nextjs&#34;&gt;トレンド② パフォーマンスと Next.js
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;本当は昨日のリリースに間に合わせたかった&lt;/strong&gt;のですが、パフォーマンスを意識した新しい技術スタックで作るアプリケーションにチャレンジしていました。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;新型コロナウイルス感染症対応地方創生臨時交付金&lt;/strong&gt;——内閣府が地方自治体に向けてコロナ対策の補助金を出すので提案を出してください、というものです。&lt;strong&gt;全国約1800の自治体から集められた6万件ほどの事業情報&lt;/strong&gt;が Excel で公開されていたので、データベース化しました。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;自治体の数が多いので事業数が多く、地域性も見たい&lt;/strong&gt;ということで、地図を含むいろんな観点から検索できるダッシュボードを開発しました。&lt;/p&gt;
&lt;p&gt;「緊急経済対策との関係」が19個ほどのカテゴリーから選択されていたり、「&lt;strong&gt;地域未来構想20&lt;/strong&gt;」との関係が書かれていたりします。医療関係、中小企業対策、環境、地域経済の活性化——&lt;strong&gt;カテゴリーごとにいくら使われているか&lt;/strong&gt;を表示し、&lt;strong&gt;絞り込むと「どの自治体がどれくらいの金額の事業を行っているか」の地図表示もリアルタイムに連動する&lt;/strong&gt;ようにしました。&lt;/p&gt;
&lt;h3 id=&#34;パフォーマンスの原則&#34;&gt;パフォーマンスの原則
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;データ容量が大きくなると Web サイトの中身がなかなか表示されず、ユーザーは見るのを諦めて離脱する&lt;/strong&gt;と言われています（これは可視化に限らず Web 一般の話です）。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;パフォーマンス、結局「時間」というのは「距離 ÷ 速さ」なんですよね。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;地球上は光ファイバーで通信されていますが、残念ながら「速さ」の方の光は速くならない。&lt;strong&gt;なので&lt;/strong&gt;「距離」をいかに縮めるかが、どんなレベルのパフォーマンスでも問題になる。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;CPU の高速化でも、**レジスタからメモリまでの距離が遠いので近くにキャッシュメモリを置く。**Web でも、&lt;strong&gt;海外だけにサーバーを置くのではなく日本にもサーバーを置いてコンテンツを早く届ける。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;メインのアプリケーションサーバーとデータベースがあって、&lt;strong&gt;そこまでの距離が遠いのが問題&lt;/strong&gt;なので、&lt;strong&gt;ユーザーのより近くにエッジのサーバーを置く&lt;/strong&gt;必要がある。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;でも、可視化のデザイナーがここまでフルスタックにエンジニアリングして可視化アプリを作るのはなかなか大変じゃないですか。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;そこで &lt;strong&gt;CDN（コンテンツデリバリーネットワーク）の利用&lt;/strong&gt;で Web サイトの体験を良くすることが、より身近に手が届くようになっています。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;React ベースの Next.js&lt;/strong&gt; は、**Web サイトのローディングパフォーマンスを向上させる仕組みにかなり力を入れています。**これを作っている &lt;strong&gt;Vercel&lt;/strong&gt; という会社がホスティングサービスを提供していて、&lt;strong&gt;そこに Next.js のアプリを載せるだけで勝手にこうした恩恵が受けられる。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;もう一点のメリットとして——&lt;strong&gt;可視化コンテンツを表示するために毎回データベースを叩いて集計するとコストが小さくない。一方で見られるデータは毎回同じなはず。&lt;strong&gt;Next.js や Vercel は&lt;/strong&gt;キャッシュの仕組みを持っていて、データベースへのアクセス回数を落とせます。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;可視化アプリケーションでも、こういう技術トレンドが取り入れられていくのではないか&lt;/strong&gt;と思います。&lt;/p&gt;
&lt;h2 id=&#34;トレンド-webgpu-と-webassembly&#34;&gt;トレンド③ WebGPU と WebAssembly
&lt;/h2&gt;&lt;p&gt;キーワードだけになりますが——&lt;/p&gt;
&lt;h3 id=&#34;webgpu&#34;&gt;WebGPU
&lt;/h3&gt;&lt;p&gt;先ほど説明されていた &lt;strong&gt;deck.gl&lt;/strong&gt; は &lt;strong&gt;WebGL&lt;/strong&gt; ベースのライブラリですが、&lt;strong&gt;もう一歩先のグラフィックスAPIの策定&lt;/strong&gt;が進んでいて、それが &lt;strong&gt;WebGPU&lt;/strong&gt; です。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;OpenGL はコマンドを発行するコストが大きいという問題があり&lt;/strong&gt;、それを取り払うために &lt;strong&gt;Vulkan&lt;/strong&gt; や Apple の &lt;strong&gt;Metal&lt;/strong&gt; といった&lt;strong&gt;低レベルなグラフィックスAPI&lt;/strong&gt;が策定され使われるようになりました。&lt;strong&gt;Web もそれに準じた API を提供しよう&lt;/strong&gt;と進んでいます。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;大きな違いの一つが GPGPU が可能になること&lt;/strong&gt;——&lt;strong&gt;GPU で計算できるようになる。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ブラウザ上で大きなデータと向き合う時、描画だけでなくある程度クライアント側で処理しなければならない。&lt;strong&gt;そこそこの量となると&lt;/strong&gt;複雑な計算をクライアント側で高速にやる必要が出てくる&lt;/strong&gt;ので、&lt;strong&gt;有力な選択肢の一つとして上がってくる&lt;/strong&gt;のではないかと思います。&lt;/p&gt;
&lt;h3 id=&#34;webassembly&#34;&gt;WebAssembly
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Web は文化が独特なので、Web の上で使える可視化ツールが他に持って行っても使いにくい&lt;/strong&gt;という問題があります。&lt;/p&gt;
&lt;p&gt;そこで &lt;strong&gt;WebAssembly&lt;/strong&gt; ——&lt;strong&gt;ブラウザ上で動作するバイナリフォーマット&lt;/strong&gt;です。これを使えば **C++ や Rust など他の言語からコンパイルしてブラウザ上で動くプログラムを生成できる。**すでに多くのブラウザで動作する実用的な技術です。&lt;/p&gt;
&lt;p&gt;私もこれを利用していて、&lt;strong&gt;グラフのレイアウトを計算するライブラリ&lt;/strong&gt;を、&lt;strong&gt;論文を書くためにも作らなければいけないし、アプリを開発するためにも作らなければいけない。それを両立させるために Rust で実装&lt;/strong&gt;して、研究用のベンチマークと Web アプリ開発の両方に使ったりしています。&lt;/p&gt;
&lt;h2 id=&#34;可視化は総合格闘技&#34;&gt;可視化は総合格闘技
&lt;/h2&gt;&lt;p&gt;技術的にもいろんなことを考えなければいけないし、&lt;strong&gt;ドメインエキスパートと協業するのも大変&lt;/strong&gt;です。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;可視化という自分の主軸を置きながら、他の技術・他のドメインにチャレンジする&lt;/strong&gt;ことがどうしても必要になる。データを収集して加工して可視化してシステムを構築する——&lt;strong&gt;本当にいろんなレベルのスキルが必要&lt;/strong&gt;です。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;でも、これに恐れずチャレンジしてほしい。私は可視化は総合格闘技だと思っていて、情報科学プラスアルファの周辺分野の幅広い知見を学んで実践していく、チャレンジングな分野&lt;/strong&gt;だと思っています。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ドメインの専門家と協業するという意味では、本当に「壊すことを恐れない」——たくさん作ってたくさん壊していい&lt;/strong&gt;と思います。&lt;/p&gt;
&lt;p&gt;これは企業と一緒に作っていたものの事例ですが、&lt;strong&gt;結構何回も作り直しています。&lt;/strong&gt;「もっと違うものが見たい」「作ってみたけれど見たいものは違った」——&lt;strong&gt;作っては見せて意見をもらってまた直す。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;**そういうプロトタイピングを通じてドメイン専門家との相互理解が生まれる。**可視化の専門家としてはドメイン知識とユーザーニーズが得られるし、&lt;strong&gt;同時にドメインの専門家も「可視化によって何ができるのか」「分析によって何ができるのか」の理解が深まります。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&#34;学生の取り組み&#34;&gt;学生の取り組み
&lt;/h2&gt;&lt;p&gt;うちのゼミでは、&lt;strong&gt;ガチガチの理系の学生でもプログラミングや情報科学だけでなく、「デザインをどう考えるか」のワークショップを一緒に勉強&lt;/strong&gt;したり、&lt;strong&gt;データを頑張って取ってきて整形してデータベースにしてシステムを作る&lt;/strong&gt;ことに取り組んでもらっています。&lt;/p&gt;
&lt;p&gt;一例として、今の4年生が開発している「&lt;strong&gt;世界の音楽トレンドの可視化&lt;/strong&gt;」。&lt;strong&gt;Spotify で各国で再生された曲のランキングと詳細情報&lt;/strong&gt;を使って、SPA として可視化コンテンツを作ってもらっています。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;この1年間、完全にオンラインでやっていた&lt;/strong&gt;のですが、&lt;strong&gt;オンラインのツールをすごく活用してくれていて&lt;/strong&gt;、&lt;strong&gt;ユーザーストーリーマッピング&lt;/strong&gt;をやってみるなど、議論を重ねてくれました。いろんな観点から音楽トレンドの情報が可視化できるコンテンツになっています。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;取り留めのない話でしたが、&lt;strong&gt;可視化をちゃんとやっていこうと思うと、どうしても可視化だけにとどまることはできない&lt;/strong&gt;のが現状だと思うので、&lt;strong&gt;技術的にも領域的にも広く考えて取り組んでいけたら&lt;/strong&gt;と思っています。&lt;/p&gt;
&lt;p&gt;以上になります。ありがとうございました。&lt;/p&gt;</description>
        </item>
        
    </channel>
</rss>
