Linked Open Data・統計LOD

Image from Gyazo

統計LODとは

統計LODとは, 政府統計の総合窓口であるe-Statの情報を Linked Open Dataの形式で提供するサービスのことです. 国勢調査,人口推計,住民基本台帳人口移動報告,経済センサスなど, 国が調査したデータが管理されており, SPARQLのエンドポイントを介してデータの検索・取得が可能です. 今回は統計LODから東海三県における国勢調査の人口データを取得してみましょう.

ウェブページの作成

SPARQLの検索結果を表示するページを作成しましょう. 最初に index.html にリンクを追加します. 検索結果を表示するページは,lod.py というファイル名のCGIプログラムで作成します.

<ul>
  <li><a href="cgi-bin/js-api.py">ジャパンサーチ 簡易Web API</a></li>
  <li><a href="cgi-bin/js-sparql.py">ジャパンサーチ SPARQL</a></li>
  <li><a href="cgi-bin/dbpedia.py">DBPedia</a></li>
  <li><a href="cgi-bin/lod.py">統計LOD</a></li>      
</ul>

Image from Gyazo

SPARQLで検索

統計LODのSPARQLのエンドポイントは下記のURLです.

http://data.e-stat.go.jp/lod/sparql/alldata/query

SPARQLの検索条件は下記のように記述します. 今回取得するのは,URL,ラベル(rdfs:label), 人口(estat-measure:population),年(cd-dimension:timePeriod)の4つのデータです. ここで,対象のデータセットとして, 2010年の国勢調査を対象としています. また,検索結果から 愛知県岐阜県三重県の文字がラベルに含まれるコンテンツだけを抽出しています.

SELECT ?url ?label ?population ?year WHERE{
  ?url qb:dataSet <http://data.e-stat.go.jp/lod/dataset/g00200521/d0003041389>;
       g00200521-dimension-2010:area g00200521-code-2010:area-all;
       sdmx-dimension:refArea [
         rdfs:label ?label
       ];
       estat-measure:population ?population;
       cd-dimension:timePeriod ?year;
       cd-dimension:sex cd-code:sex-all;
       cd-dimension:nationality cd-code:nationality-japan;
       cd-dimension:age cd-code:age-all.
       FILTER(
          CONTAINS(str(?label), "愛知県") ||
          CONTAINS(str(?label), "岐阜県") ||
          CONTAINS(str(?label), "三重県")
       )
}

新規に lod.py を作成し,cgi-binフォルダに配置します(実行権限の付与が必要). lod.py には下記のコードを記述します.

#!/usr/bin/env python

from SPARQLWrapper import SPARQLWrapper, JSON

print ("Content-type:text/html\n\n")

print("<!DOCTYPE html>")
print("<html>")

print("<head>")
print("<meta charset='utf-8'>")
print("<title>統計LOD</title>")
print("</head>")

print("<body>")
print("<h1>統計LOD</h1>");
print("</body>")

url = "http://data.e-stat.go.jp/lod/sparql/alldata/query"
sparql = SPARQLWrapper(url)
sparql.setReturnFormat(JSON)

prefix = """
PREFIX qb: <http://purl.org/linked-data/cube#>
PREFIX g00200521-dimension-2010: <http://data.e-stat.go.jp/lod/ontology/g00200521/dimension/2010/>
PREFIX g00200521-code-2010: <http://data.e-stat.go.jp/lod/ontology/g00200521/code/2010/>
PREFIX sdmx-dimension: <http://purl.org/linked-data/sdmx/2009/dimension#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX estat-measure: <http://data.e-stat.go.jp/lod/ontology/measure/>
PREFIX cd-dimension: <http://data.e-stat.go.jp/lod/ontology/crossDomain/dimension/>
PREFIX cd-code: <http://data.e-stat.go.jp/lod/ontology/crossDomain/code/>
"""

query = """
SELECT ?url ?label ?population ?year WHERE{
  ?url qb:dataSet <http://data.e-stat.go.jp/lod/dataset/g00200521/d0003041389>;
       g00200521-dimension-2010:area g00200521-code-2010:area-all;
       sdmx-dimension:refArea [
         rdfs:label ?label
       ];
       estat-measure:population ?population;
       cd-dimension:timePeriod ?year;
       cd-dimension:sex cd-code:sex-all;
       cd-dimension:nationality cd-code:nationality-japan;
       cd-dimension:age cd-code:age-all.
       FILTER(
          CONTAINS(str(?label), "愛知県") ||
          CONTAINS(str(?label), "岐阜県") ||
          CONTAINS(str(?label), "三重県")
       )
}
"""

sparql.setQuery(prefix + query)
results = sparql.query().convert()

table = "<table border=`1``>"
table += "<tr>"
table += "<th>label</th>"
table += "<th>population</th>"
table += "<th>year</th>"
table += "</tr>"

for result in results["results"]["bindings"]:

    url = result['url']['value']
    label = result['label']['value']
    population = result['population']['value']
    year = result['year']['value']

    table += "<tr>"
    table += f"<td><a href={url}>{label}</a></td>"
    table += f"<td>{population}</td>"
    table += f"<td>{year}</td>"
    table += "</tr>"

print(table)

print("</html>")

下記が検索結果です. 岐阜県は2,037,175人,愛知県は7,174,451人,三重県は1,812,500人 であることが確認できます.

Image from Gyazo

参考書籍

愛知県名古屋市にある椙山女学園大学 文化情報学部 向研究室の公式サイトです. 専門は情報科学であり,人工知能やデータベースなどの技術要素を指導しています. この公式サイトでは,授業で使用している教材を公開すると共に, ベールに包まれた女子大教員のミステリアスな日常を4コマ漫画でお伝えしていきます. サイトに関するご意見やご質問はFacebookまたはTwitterでお問い合わせください.