3
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

posted at

updated at

Wikidataを使って鉄道会社ごとの総路線長をランキングしてみる

初投稿です。よろしくお願いします。

大学の卒研ゼミでSPARQLの検索演習をしたときに、「自分の興味のある内容を取得する」クエリを作成するという課題がありまして、その時に作成したクエリを紹介したいと思います。
ついでに、Wikidataにある数値と実際の数値とで、誤差とは言えない違いを発見しましたので、そのことについても書いていきます。

Wikidataとは

Wikidataは、誰でも編集できる無料のナレッジベース。Wikimediaプロジェクトの一つで、Wikipediaのデータベース版といったところでしょうか。Wikidata Query Serviceのページからクエリ言語SPARQLを用いて問い合わせをすることで、Wikidata項目にあるデータを取得することができます。

目標

Wikidataから鉄道会社ごとの総路線距離を取得しランキングする。
当初の目標は、日本の鉄道路線を路線距離の長い順にランキングすることでしたが、演習結果を提出したところ、「会社ごとの総路線距離を出せたら面白そうだね」ということで手直ししてもらいました。

日本の鉄道路線を路線距離の長い順にランキングしてみる

Wikidata Query Serviceにアクセスし、以下のクエリを作成して実行しました。

PREFIX wdt: <http://www.wikidata.org/prop/direct/>
PREFIX wd: <http://www.wikidata.org/entity/>

select ?s ?sLabel ?o
where { 
 ?s  wdt:P31  wd:Q728937 .
 ?s  wdt:P17  wd:Q17.
 ?s  wdt:P2043  ?o.
SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],ja". }
}order by desc(?o)

解説

  • ?s wdt:P31 wd:Q728937 → 変数?sに「分類」が「鉄道路線」であるデータを取得
  • ?s wdt:P17 wd:Q17 → 変数?s(=鉄道路線)のうち、「国」が「日本」であるデータを取得
  • ?s wdt:P2043 ?o → 変数?s(=鉄道路線)の「全長」のデータを変数?oに取得
  • order by descで降順にソート

実行結果

実行結果の確認はこちら

ランキングは以下のようになりました。
山陰本線がトップのようですね。京都~幡生間を日本海側をずーっと通っているので長いのは想像できますが、トップとは…w
山陰本線のwikipediaを見てみると、京都~幡生間は673.8kmで、ここに仙崎支線の2.2kmが加わって676.0kmのようです。

ID 路線名 路線距離[km]
wd:Q1135170 山陰本線 676
wd:Q900665 東北新幹線 674.9
wd:Q1190152 東海道本線 589.5
wd:Q681190 東北本線 575.7
wd:Q615964 山陽新幹線 553.7
wd:Q1193436 山陽本線 537.1
wd:Q660895 東海道新幹線 515.4
wd:Q386495 奥羽本線 484.5
wd:Q1052288 日豊本線 467.2
wd:Q1151119 函館本線 458.4

私が自力でやったのはここまでです。

鉄道会社ごとの総路線距離を取得しランキングしてみる

ここからは手直しして頂いたところになります。

PREFIX wdt: <http://www.wikidata.org/prop/direct/>
PREFIX wd: <http://www.wikidata.org/entity/>

select (SUM(?o) as ?total) ?op ?opLabel
where { 
 ?s  wdt:P31   wd:Q728937 .
 ?s  wdt:P17  wd:Q17.
 ?s  wdt:P2043  ?o.
 ?s wdt:P137 ?op.
SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],ja". }
}GROUP BY ?op ?opLabel
order by desc(?total)

解説

先ほどのクエリに、「鉄道会社ごと」に「路線距離」を「合計」する部分を追加してあります。

  • select (SUM(?o) as ?total) ?op ?opLabel → SUMで路線距離を合計し変数?totalに代入
  • ?s wdt:P137 ?op → 変数?s(=鉄道路線)の「運営者」すなわち所有する会社を変数?opに取得
  • GROUP BY ?op ?opLabel → GROUP BYで「鉄道会社ごと」にまとめる
  • order by desc(?total) → selectに記述したとおり、会社ごとの総路線距離(?total)を降順にソート

実行結果

実行結果の確認はこちら

総路線距離[km] ID 会社名
6744.9 wd:Q499071 東日本旅客鉄道
5217 wd:Q502125 西日本旅客鉄道
2785.2 wd:Q498930 北海道旅客鉄道
2663.4 wd:Q513679 東海旅客鉄道
2013.6 wd:Q498366 九州旅客鉄道
1289.1 wd:Q1190669 日本貨物鉄道
683.3 wd:Q50187147 嵯峨野観光鉄道
496.3 wd:Q496531 四国旅客鉄道
330 wd:Q1531085 近畿日本鉄道
208.1 wd:Q1332242 東京急行電鉄

此方の結果については、wikidata上はこの数値になっていますが、別に調べたところ、東日本旅客鉄道公式のデータでは営業キロ 7,457.3km(2017年4月1日現在)、近畿日本鉄道は501.1km(wikipediaより)のようで、大きな誤差があることがわかりました。
嵯峨野観光鉄道に至っては683.3kmなわけないし、どこから取得したんだこれ…。と思ったら、これ山陰本線の距離もプラスされているな?!wikidataの嵯峨野観光線の項目には本来の7.3kmってデータがちゃんと登録されていますし、たぶんそういうことでしょうね。

考察

各路線の路線距離を取得するところまではよかったですが、その次の段階でwikidataの不正確さを実感しました。いや、自分が編集したわけじゃないのにこういうこと言うのは失礼ですね、すみません。
今回発見した誤差について、ウィキデータの登録内容に不備があるのか、まだウィキデータ項目が作成されていない路線があるか、いずれにしろ整合性をチェックする必要がありそうです。

Wikidataの編集方法についてはこちらをご覧ください。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
3
Help us understand the problem. What are the problem?