なぜ可視化が重要か

SPARQLクエリで取得したデータは、テーブル形式の結果だけでは全体像を把握しにくいことがあります。データを地図、グラフ、タイムラインなどの視覚的な形式に変換することで、パターンや傾向の発見、データの探索、研究成果のプレゼンテーションが格段に向上します。

筆者はこれまで、Snorql、YASGUI、Wikidata Query Serviceの組み込み可視化、Google Colabを使ったPythonでの可視化、さらにはPeripleoによる地理空間データの可視化など、さまざまな可視化手法を実践してきました。本章では、これらの経験をもとに可視化手法を体系的に解説します。

SPARQLクライアントによる可視化

Snorql

筆者が公開しているSnorqlは、複数のSPARQLエンドポイントを手軽に切り替えて探索できるブラウザUIです。Snorql — 複数の SPARQL エンドポイントを手軽に探索できるブラウザ UI を公開しましたで紹介しています。

Snorqlの特徴は、クエリ結果の表形式表示に加え、リソースの詳細表示やクエリ履歴の管理が可能な点です。ジャパンサーチ向けのカスタマイズについては、Snorql for Japan Searchのカスタマイズ方法の調査で詳しく解説しています。

また、筆者は「教科書の中の源氏物語LOD」のデータをSnorqlで探索する事例も紹介しています。「教科書の中の源氏物語LOD」を使ってみるでは、DydraのRDFストアに格納されたデータをSnorqlとYASGUIで閲覧する方法を示しています。

YASGUI

YASGUI(Yet Another SPARQL GUI)は、構文ハイライト、自動補完、結果の多様な表示形式を備えたSPARQLエディタです。筆者は以下の記事でYASGUIの活用方法を紹介しています。

YASGUIは結果の表形式表示に加え、ピボットテーブル、グラフ、地図表示などの機能も備えています。

Wikidata Query Serviceの可視化機能

Wikidata Query Serviceには、クエリ結果をさまざまな形式で可視化する機能が組み込まれています。クエリの先頭に #defaultView: コメントを追加するだけで、デフォルトの表示形式を指定できます。

地図表示(Map)

座標データ(wdt:P625)を含むクエリ結果を地図上にプロットします。

#defaultView:Map
SELECT ?temple ?templeLabel ?coord ?image
WHERE {
  ?temple wdt:P31/wdt:P279* wd:Q160742 .
  ?temple wdt:P17 wd:Q17 .
  ?temple wdt:P625 ?coord .
  OPTIONAL { ?temple wdt:P18 ?image . }
  SERVICE wikibase:label { bd:serviceParam wikibase:language "ja,en" . }
}

地図のレイヤー分け

?layer 変数を追加することで、データを色分けして地図上に表示できます。

#defaultView:Map
SELECT ?site ?siteLabel ?coord ?layer
WHERE {
  VALUES (?type ?layer) {
    (wd:Q9259 "世界遺産")
    (wd:Q839954 "日本の史跡")
  }
  ?site wdt:P31 ?type .
  ?site wdt:P17 wd:Q17 .
  ?site wdt:P625 ?coord .
  SERVICE wikibase:label { bd:serviceParam wikibase:language "ja,en" . }
}

バブルチャート(BubbleChart)

#defaultView:BubbleChart
SELECT ?prefLabel (COUNT(?city) AS ?cityCount)
WHERE {
  ?city wdt:P31/wdt:P279* wd:Q515 .
  ?city wdt:P131 ?pref .
  ?pref wdt:P31 wd:Q50337 .
  SERVICE wikibase:label {
    bd:serviceParam wikibase:language "ja,en" .
    ?pref rdfs:label ?prefLabel .
  }
}
GROUP BY ?prefLabel
ORDER BY DESC(?cityCount)

折れ線グラフ(LineChart)

#defaultView:LineChart
SELECT ?year (COUNT(?person) AS ?count)
WHERE {
  ?person wdt:P31 wd:Q5 .
  ?person wdt:P27 wd:Q17 .
  ?person wdt:P106 wd:Q36180 .
  ?person wdt:P569 ?birth .
  BIND(YEAR(?birth) AS ?year)
  FILTER(?year >= 1800 && ?year <= 2000)
}
GROUP BY ?year
ORDER BY ?year

グラフ(ネットワーク)表示(Graph)

エンティティ間のリンク関係をネットワークグラフとして表示します。

#defaultView:Graph
SELECT ?person ?personLabel ?influencedBy ?influencedByLabel
WHERE {
  ?person wdt:P31 wd:Q5 .
  ?person wdt:P27 wd:Q17 .
  ?person wdt:P106 wd:Q36180 .
  ?person wdt:P737 ?influencedBy .
  ?influencedBy wdt:P27 wd:Q17 .
  SERVICE wikibase:label { bd:serviceParam wikibase:language "ja,en" . }
}
LIMIT 100

表示形式の一覧

コメント表示形式必要な変数
#defaultView:Map地図座標(?coord
#defaultView:ImageGrid画像グリッド画像URL
#defaultView:Timelineタイムライン日付
#defaultView:BubbleChartバブルチャート数値
#defaultView:BarChart棒グラフ数値
#defaultView:LineChart折れ線グラフ数値(時系列推奨)
#defaultView:ScatterChart散布図2つの数値
#defaultView:TreeMapツリーマップ数値
#defaultView:Graphネットワークグラフ2つのエンティティ
#defaultView:Treeツリー(階層)親子関係

RDFグラフの可視化

RDFグラフそのものの構造を可視化することも重要です。筆者は「ARC2によるRDFグラフの視覚化」をPythonで利用するで、PythonでRDFグラフをネットワーク図として描画する方法を紹介しています。また、RDFデータの追加と可視化に関する備忘録でも、RDFデータの可視化に関する実践的なノウハウを共有しています。

地理空間データの可視化

Peripleo

Peripleoは、Linked Dataを用いた地理空間データの可視化ツールです。筆者はPeripleoを試すで、RDFデータに含まれる地理情報をPeripleoで可視化する方法を紹介しています。歴史的な地名データや文化遺産の所在地を地図上に表示する際に有用です。

Leafletによる地図表示

JavaScriptのLeafletライブラリを使えば、SPARQLで取得した座標データを対話的な地図上にプロットできます。

<!DOCTYPE html>
<html>
<head>
  <link rel="stylesheet" href="https://unpkg.com/leaflet@1.9/dist/leaflet.css" />
  <script src="https://unpkg.com/leaflet@1.9/dist/leaflet.js"></script>
  <style>#map { height: 600px; width: 100%; }</style>
</head>
<body>
  <div id="map"></div>
  <script>
    const map = L.map('map').setView([36.5, 137.5], 6);
    L.tileLayer('https://tile.openstreetmap.org/{z}/{x}/{y}.png', {
      attribution: '&copy; OpenStreetMap contributors'
    }).addTo(map);

    const endpoint = 'https://query.wikidata.org/sparql';
    const query = `
      SELECT ?museum ?museumLabel ?coord WHERE {
        ?museum wdt:P31/wdt:P279* wd:Q33506 .
        ?museum wdt:P17 wd:Q17 .
        ?museum wdt:P625 ?coord .
        SERVICE wikibase:label { bd:serviceParam wikibase:language "ja,en" . }
      } LIMIT 200
    `;

    fetch(`${endpoint}?query=${encodeURIComponent(query)}`, {
      headers: { 'Accept': 'application/sparql-results+json' }
    })
    .then(res => res.json())
    .then(data => {
      data.results.bindings.forEach(item => {
        const coord = item.coord.value;
        const match = coord.match(/Point\(([^ ]+) ([^ ]+)\)/);
        if (match) {
          const lng = parseFloat(match[1]);
          const lat = parseFloat(match[2]);
          L.marker([lat, lng]).addTo(map).bindPopup(item.museumLabel.value);
        }
      });
    });
  </script>
</body>
</html>

Pythonによる可視化

Google Colabでの活用

Google Colabを使えば、環境構築なしでSPARQLクエリの実行と可視化が可能です。筆者はGoogle Colabを用いたジャパンサーチRDFストアに対するSPARQLの実行例で、Google ColabからジャパンサーチにSPARQLクエリを実行し、結果をPandasのDataFrameに変換して可視化する方法を詳しく解説しています。

# Google Colabでの実行例
!pip install SPARQLWrapper

from SPARQLWrapper import SPARQLWrapper, JSON
import pandas as pd

sparql = SPARQLWrapper("https://query.wikidata.org/sparql")
sparql.setQuery("""
    SELECT ?cityLabel ?population
    WHERE {
      ?city wdt:P31/wdt:P279* wd:Q515 .
      ?city wdt:P17 wd:Q17 .
      ?city wdt:P1082 ?population .
      SERVICE wikibase:label { bd:serviceParam wikibase:language "ja" . }
    }
    ORDER BY DESC(?population)
    LIMIT 20
""")
sparql.setReturnFormat(JSON)
results = sparql.query().convert()

df = pd.DataFrame([
    {
        'city': r['cityLabel']['value'],
        'population': int(r['population']['value'])
    }
    for r in results['results']['bindings']
])

df.plot.barh(x='city', y='population', figsize=(10, 8),
             title='日本の都市人口ランキング')

ジャパンサーチデータの可視化

筆者はジャパンサーチ利活用スキーマについて、最新の更新年ごとのアイテム数を視覚化するで、ジャパンサーチのSPARQLクエリ結果をYASGUIのチャート機能で可視化する実践例を紹介しています。SPARQLの集約クエリとYASGUIの可視化機能を組み合わせることで、データの傾向を視覚的に把握できます。

Odeuropaの可視化事例

Odeuropaプロジェクトでは、SKOS語彙とSPARQLを活用した香りデータの可視化プラットフォームが構築されています。Odeuropa Visualization: SKOS語彙とSPARQLを活用した香りデータの可視化プラットフォームで、この事例を詳しく紹介しています。LODデータの高度な可視化の好例です。

matplotlibを使ったグラフ作成

from SPARQLWrapper import SPARQLWrapper, JSON
import matplotlib.pyplot as plt
import matplotlib
matplotlib.rcParams['font.family'] = 'Hiragino Sans'

sparql = SPARQLWrapper("https://query.wikidata.org/sparql")
sparql.setQuery("""
    SELECT ?decade (COUNT(?work) AS ?count)
    WHERE {
      ?work wdt:P31 wd:Q7725634 .
      ?work wdt:P495 wd:Q17 .
      ?work wdt:P577 ?pubDate .
      BIND(FLOOR(YEAR(?pubDate) / 10) * 10 AS ?decade)
      FILTER(?decade >= 1900 && ?decade <= 2020)
    }
    GROUP BY ?decade
    ORDER BY ?decade
""")
sparql.setReturnFormat(JSON)
results = sparql.query().convert()

decades = []
counts = []
for result in results["results"]["bindings"]:
    decades.append(int(float(result["decade"]["value"])))
    counts.append(int(result["count"]["value"]))

plt.figure(figsize=(12, 6))
plt.bar(decades, counts, width=8, color='steelblue')
plt.xlabel('年代')
plt.ylabel('作品数')
plt.title('日本の文学作品の出版年代別分布(Wikidataより)')
plt.xticks(decades, [f'{d}s' for d in decades], rotation=45)
plt.tight_layout()
plt.savefig('literary_works_by_decade.png', dpi=150)
plt.show()

まとめ

本章では、SPARQLクエリ結果の可視化手法を学びました。重要なポイントを振り返ります。

  • SnorqlやYASGUIなどのSPARQLクライアントで手軽にデータを探索できる
  • Wikidata Query Serviceの #defaultView: コメントで、地図・グラフ・タイムライン等の可視化が手軽にできる
  • Peripleoなどの専用ツールで地理空間データを可視化できる
  • Leafletを使えばSPARQL結果を対話的な地図上にプロットできる
  • Pythonのmatplotlibやfoliumでもデータの可視化が容易
  • Google Colabを使えば環境構築なしで手軽にSPARQLクエリの実行と可視化を試せる

次章では、さらなる学習のためのリソース集を提供します。

関連記事