Webアプリを創る 😊クリエイティブWeb

カテゴリー: オープンデータ

Excel の xls ファイルは機械判読不可能?

2014年5月8日

前回のブログでも書いたように、最近、都道府県別・市町村別等の1980~2040年の5歳年齢階級別人口の推移のページを作成しました。その時に利用した日本のデータは、過去の分は国勢調査のデータを、将来の分は国立社会保障・人口問題研究所の将来推計を使用しています。

過去の国勢調査のデータを使用する場合に、特に市町村で問題になるのが市町村合併をどう処理するかです。人口の推移ではやはり市町村合併を考慮すべきだと思うので、過去の分では旧市町村の分を集計する必要があります。これに関しては、次世代統計利用システムの方で都道府県・市区町村コード情報がLOD(Linked Open Data)で提供されているので、それを利用することで市町村合併を機械で取得できるのでそれほど手間をかけずに処理をすることができました。また、国勢調査のデータは、今回は SDMX の API を使って取得しました。今後、Eurostat 等でも同じような処理でデータを取得できるというメリットがあると思っています。

一方、将来推計人口の方は、Excel ファイルでデータを公開しています。自分の場合は、Excel のファイルを C# で Excel Data Reader という OSS のライブラリーを使って処理しているので特に問題なく処理できました。むしろ、心配したのはデータの著作権の方でした。数字だけなので著作権の問題はないだろうと思って使いましたが、やはり気になるところです。

最近は、日本でもオープンデータの取り組みが始まり、統計データも API で公開されるようになって便利になりました。ただ、オープンデータの取り組みの中でどうも Excel の xls ファイルは機械判読ができない取り扱いになっているようなので気になって少し調べてみました。

首相官邸の「電子行政オープンデータ実務者会議」のページの 「電子行政オープンデータに関連する決定」をみると「機械判読に適したデータ形式での公開の拡大」が結構大きな目標になっています。それで、「機械判読に適したデータ形式」とはどういう形式なのかを調べてみました。結論はよく分かりませんでしたが、第1回データWGの配布資料7の「データ形式・構造、データカタログに関する技術について」(小池データWG主査代理提出資料)という資料があり、機械判読可能なデータ形式の資料がありました。そこには「オープンデータの5つの段階」という話があって、Excel の xls ファイルは、「公開文書(編集可)」という位置づけで、「機械判読可能な公開データ」という位置づけにはなっていないようです。

image 

自分の C# の Excel Data Reader を使った Excel ファイルの判読ルーティンのサンプルは以下のようなものです。

using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Net.Http;
using Excel;

    public void GetExcel(string url, string cachePath)
    {
        //毎回Excelのファイルをダウンロードするのは無駄なのでキャッシュしている
        if (!File.Exists(cachePath))
        {
            //Webサイト(アドレス url)からのファイルの読み込み
            using (var client = new HttpClient())
            {
                var sr = client.GetStreamAsync(url).Result;                    
                var sw = File.Create(cachePath);
                sr.CopyTo(sw);
                sw.Close();
            }
        }
        FileStream stream = File.OpenRead(cachePath);
        IExcelDataReader excelReader = ExcelReaderFactory.CreateBinaryReader(stream);
        //Excel Data Readerを使って、Excel のデータを DataSet クラスに読み込む。
        DataSet result = excelReader.AsDataSet();
        stream.Close();

        int sheet = 2; 
        int column = 3;
        int row = 8;
        string s = result.Tables[sheet].Rows[row][column].ToString();
    }

また、SMDX を使った国勢調査のデータの判読ルーティンのサンプルは以下のようなものです。

using System;
using System.Collections.Generic;
using System.Xml.Linq;

    public void GetSmdx(string url)
    {
        //使用している名前空間を定義
        XNamespace generic = "http://www.sdmx.org/resources/sdmxml/schemas/v2_1/data/generic";

        //APIからXElementに読み込み
        var xe = XElement.Load(url);

        //LinqToXmlで各データの値を取得
        var obsList = from q in xe.Descendants(generic + "Obs")
            select q;
        foreach (var obs in obsList)
        {
            string cat01 = "";
            string cat02 = "";
            string cat03 = "";
            string area = "";
            string time = "";
            foreach (var obsKey in obs.Descendants(generic + "ObsKey").Descendants())
            {
                switch (obsKey.Attribute("id").Value)
                {
                    case "cat01":
                        cat01 = obsKey.Attribute("value").Value;
                        break;
                    case "cat02":
                        cat02 = obsKey.Attribute("value").Value;
                        break;
                    case "cat03":
                        cat03 = obsKey.Attribute("value").Value;
                        break;
                    case "area":
                        area = obsKey.Attribute("value").Value;
                        break;
                    case "time":
                        time = obsKey.Attribute("value").Value;
                        break;
                }
            }
            string value = obs.Descendants(generic + "ObsValue").First().Attribute("value").Value;

            //以下で取得したデータを処理する
            処理(cat01, cat02, cat03, area, time, value);
        }
    }

ほぼ SDMX と同じような処理で、公開された Excel データを自動処理することが可能です。違いといえば、SDMX の場合は定義された名前空間を使ってデータにアクセスできますが、xls ファイルの場合は、自分でシート番号とセルの位置を計算して指定してやる必要があるということです。確かに SDMX が名前空間が定義されているのでいつでもデータが取得できる確実性が高いのに対して、xls ファイルの場合は誰でもがすぐに表の形式を変更できるため次回も同じ方法でデータを取得できるという保証がないのが大きな欠点です。

しかし、データを作成する側から言えば、名前空間を定義してやらないといけないので、XML ファイルでデータを提供するのは結構大変だと思います。一方、xls ファイルでの公開は簡単だし、多くの人が簡単に利用できます。

Excel のファイルを扱うことができるフリーソフトとしては、Java では Apache POI、Ruby では Spreadsheet、PHP では PHPExcel、Python では Python Excel、JavaScript でも Sheet JS というソフトがあります。現在では、メジャーな言語であればExcel を扱うことのできる OSS のソフトが存在して、Excel を持っていなくても Excel のファイルを扱うことが可能になっています。

image

確かに数年前はExcel のファイルを Excel を使わずに扱うことは難しいことでした。でも、上の図は Seet JS のホームページですが、Excel がなくてもそのデータを使えるようにしようというエンジニアの努力によって、今では xls ファイルも商用のソフトを使用しなくても機械判読可能です。

資料を作った小池博氏は、「株式会社日立コンサルティング テクニカルディレクター」でデータ・ワーキンググループのワーキンググループ主査代理です。なぜ、xls ファイルを機械判読可能としなかったのでしょうか。確かに XML ファイルで提供される方がAPIとして利用する人にはベターなのですが、普通のユーザーには使い方が難くなるし、提供側でも作成に関してもそれなりに追加コストが必要です。そういう点を考えれば xls ファイルの機械判読がどの程度困難なのかで、XML 化する範囲やスピードについて結論は変わってくると思うのです。こういう資料を見ていると、LoD とか RDF というのは理想ですが、まだまだ一般の人が使えるような物ではありません。だから、Sheet JS のメンバーのような現実的な解決案を提供するという視点も重要です。そういう視点が欠けていることが日本のソフトウェアの高コスト体質を生んでいるように思います。

三好市の人口の推移のグラフを作ってみた - 極点社会~新たな人口減少クライシス~

2014年5月6日

5月1日のNHKのクローズアップ現代「極点社会~新たな人口減少クライシス~」で、高齢者が減少し“消滅”の危機にある代表として徳島県の三好市が取り上げられていた。そこで、三好市の1980年から2040年までの年齢階級別の人口の推移のグラフを作成してみた。

image

データについては、2010年までは国勢調査で、それ以降は国立社会保障・人口問題研究所の『日本の地域別将来推計人口(平成25年3月推計)』を使用しています。

このグラフを見ると三好市では、1980年には、池田町、三野町、山城町、井川町、東祖谷山村、西祖谷山村の6町村で47,057人の人口だっだのが、2010年には29,951人にまで減少し、2040年には13,745人にまで減少することが推計されています。非常に厳しい状況にあることが理解できると思います。もう少し詳しく数字をみると、もう一段と厳しい状態があることがわかります。以下が、0~34歳までの5歳階級別の人口の表です。

image

1980年に0~4歳だった人は2,643人ですが、30年後の2010年に30~34歳の人は1,184人です。正確ではないですが簡単にいえば、三好市で1976~1980年に生まれた人では、45%の人が地元に残り、それ以外の他の市町村に転出してしまっているということになります。1986~1990年に生まれた人だと地元に残る若者はわずかに36%です。1991~1995年に生まれた人は46%が地元に残ると推計されそれ以降も割合が増えていますが、それは純移動率の計算方法に原因があります。国立社会保障・人口問題研究所の地域別将来推計人口の「純移動率」の推計については以下のようになっています。

市区町村別・男女年齢別の純移動率は、一時的な要因によって大きく変化することがあるため、一定の規則性をみいだすことが難しい。そこで最終的に「日本の将来推計人口(平成 24 年 1 月推計)」(出生中位・死亡中位仮定)による推計値と一致させることを考慮し、全域的な傾向を一律に反映させることとした。「住民基本台帳人口移動報告」(総務省統計局)から平成 12(2000)年以降の動きをみると、転入超過数の地域差は平成 19(2007)年をピークとして縮小傾向にある。したがって、原則として、平成 17(2005)~22(2010)年に観察された市区町村別・男女年齢別純移動率を平成 27(2015)~32(2020)年にかけて定率で縮小させ、平成 27(2015)~32(2020)年以降の期間については縮小させた値を一定とする仮定を置いた。

確かに2008年のリーマンショックの影響によって東京圏への人口流入は減少し、地方でも人口の流出は抑えられています。しかし、2015年~2020年にかけてもこの傾向が続くかどうかは不明です。クローズアップ現代の「極点社会~新たな人口減少クライシス~」では、「地方の介護産業が高齢者を求め東京に進出し」、そこで働く若年女性も、「地方から東京へ移動し始めています」という問題を取り上げています。もし、今後地方からの若者の人口流出が増加するようなことになれば、地方の人口の減少は更に加速し、「極点社会」になってしまうのも近いと思います。

三好市は典型的な例ですが、県庁所在地の徳島市でも2010年の264,548人が2040年には206,368人と22%減少する推計になっています。東京圏への人口集中が進めばそれ以上に減少する可能性もあります。地方では県庁所在地でさえ大きく人口が減る時代になっています。地方は危機感を持って若者がどうしたら地域でいい生活を送れるのかを真剣に考えていかないといけないと思います。

統計データを取得するために SDMX を使ってみた

2014年4月30日

年齢別人口のデータを取得するために SDMX を使ってみました。SDMX は、Statistics Data and Metadata eXchage の略で日本語でいえば統計データ及びメタデータ交換仕様といったところでしょうか。世界開発銀行、ヨーロッパ中央銀行、ヨーロッパ統計局、IMF、OECD、国連、世界銀行によって支援されています。

そういうことで、今後統計データを入手しようと思えば、SDMX を使うのがいいだろうと思って使い始めました。取りあえず今回はヨーロッパ統計局の人口関係のデータを取得して、下の図のようなグラフを描くところまでできました。各国の年齢階級別人口の推移のページで公開しています。

image

SDMXについては、初心者の段階なので、もう少し理解できるようになったら詳しい内容をブログに書きたいと思っています。

ヨーロッパは少子化が進んでいるというようなイメージがあったのですが、図をみればわかるようにヨーロッパ全体では人口は安定した動きになっています。少子化対策の優等生といわれるフランス(フランスの5歳年齢階級別人口の推移)やいち早く少子化が社会問題となったスウェーデン(スウェーデンの5歳年齢階級別人口の推移}では、リンクをクリックして見ていただければわかるのですが少子化対策が成功しているように思われます。

日本の全国及び各都道府県の年齢階級別人口の推移のページも作成しました。グラフをみると日本の少子化の深刻さがわかります。このままにしておけば百年もすれば日本の地方から人がいなくなるといってもいいような状態だと思います。日本も子供を育てやすい国になることを真剣に考えないといけないと思います。

気象庁防災情報XMLを使ってみた

2014年4月26日

気象庁の防災情報XMLフォーマット形式電文を実際に使ってみました。現在は、天気予報を表示するページを作ってみてテスト運用をしています。これで安定して運用が出来るようになれば Web アプリに組み込みたいと思っています。

PubSubHubbub の subscriber ですべてを処理させるのは、機能追加の時に問題が出そうなので、subscriber は更新情報を受信したら Amazon SQS にメッセージを送るだけの機能にして、XML電文の処理の方は別のコンソールアプリケーションにさせるようにしています。

テストをしてみて、C# の非同期処理 async / await は便利だということを実感しました。XML データを取ってきたり、Amazon の SQS や データの保存に S3 を使う場合には、どうしても一件当たり100ミリ秒単位の時間がかかるので同期処理をすると100件ぐらいで分単位の処理時間がかかるようになってしまいます。async / await を使うとそれを簡単に非同期処理ができるので処理時間を数分の1に短縮することができます。

実際に防災情報XMLを使ってみて感じたのは、今更なのですが天気予報を以下の例のように言葉で表現したものは簡潔でわかりやすいなと思いました。日本の伝統的な洗練されたものがあるように感じました。

南の風 23区西部 では はじめ 南の風 やや強く 晴れ
夜 くもり 所により 雨 で 雷を伴う
波 1メートル 後 0.5メートル

一方で、XMLの方は使いずらいと思いました。以下に、日本、アメリカ、イギリス、ノルウェーのXMLのサンプルを表示しましたが、日本だけが間延びして階層が異常に深くなっていることがわかると思います。技術的な評価はよく分かりませんが、少なくとも利用する側としては、日本のXMLは4つの中で最低です。階層が深くかつデータがばらばらとあるので、データを取得するプログラムの行数は増えていきます。7階層までいかないとどの項目か判断できないような設計はせずに、外国のように4階層ぐらいでデータを取得できるようにしてほしかったと思います。日本が後発で外国の例を参考にできる立場だっただけに残念です。

日本

jmaxml 

アメリカ

noaaxml

 

イギリス

metofficexml

ノルウェー

metnoxml

それから、今回プログラムを作成していて、かなり時間がかかったのが、WetherCode のコード表の件です。WetherCode のコードについての説明がないので、どのアイコンを使えばいいのかがはっきりしないのです。自分が見落としているかもしれませんが、アメリカの場合は、XML の中に画像のURL が記載されているし、イギリス、ノルウェーの場合でも、得意でない英語の文章でも探すことができました。

天気予報APIのFAQに、「天気の種類は何種類ありますか?」という問いに対して、「天気の種類は現在のところ121種類ございます。尚、121種類の詳細につきましては、開発ドキュメントにてご確認いただけます。」という回答になっていて、秘密保持契約をまかないと開発ドキュメントは手に入れられないので、天気の種類という基本的なことが公開されていないようなのです。drk7氏が独自にしている「気象庁の天気予報情報を XML で配信」のページに、天気情報と画像ファイルの対応表を公開していたので、それを参考にして対応表を作りました。実際に運用してみてチェックしていこうと思っています。

XMLを洗練したものにできない理由を考えてみると、言葉による天気予報では、長年かけて予報官が自ら改善していったものだと思います。しかし、システムのことになると日本の予報官は分からないから、SI業者に丸投げに近い状態になっていて、その SI業者はというと、現状をそのままシステム化しただけになっていると思います。日本では、SI業者に依存しすぎるので、システムのことになると現場の改善力がうまく発揮できないようです。その上に気象会社からの圧力があって、改善すると民業圧迫といわれるので余計に改善の意欲がわかない状態になっていると思います。

問題点は書きましたが、やっと実現した天気予報の無料XMLなので、大いに活用しましょう。気象庁防災情報XMLを使いたい人は、http://ecitizen.jp/weatherのページのリンクから各府県のXMLが取得できるので、月3000PVまでであれば自由に使ってもらっても構いません。事前準備をしなくでもすぐにXMLの取得ができます。商用利用も可能ですが、気象庁の利用上の留意事項については遵守してください。

気象庁 XML と他国の気象庁の天気 API との比較

2014年2月24日

気象庁が防災情報XMLフォーマット形式電文の公開を始めて1年以上になりますが、日本の天気予報を自分の Web ページに載せたいと思って、気象庁XMLを使い始めています。それで、今まで使ったことがある他国の気象庁が公開している天気 API と比較してみました。

自分が使ったことのあるのは、アメリカイギリスノルウェーの気象庁のAPIです。まず、大きな違いは、気象庁 XML が、それを取得するために PubSubHubbub の subscriber を構築しないといけないということです。アメリカとノルウェーは、誰でもがRESTで簡単に取れます。下のリンクをクリックすると現時点での天気予報のXMLが表示されます。イギリスは、ユーザー登録が必要ですが、オンラインでキーが発行されます。

アメリカ ニューヨーク セントラルパーク

http://graphical.weather.gov/xml/sample_products/browser_interface/ndfdXMLclient.php?lat=40.78&lon=-73.97&product=glance

http://forecast.weather.gov/MapClick.php?lat=40.78&lon=-73.97&unit=1&lg=english&FcstType=dwml
こちらだと現在の気温等の観測データも入っています。

イギリス シティ オブ ロンドン

http://datapoint.metoffice.gov.uk/public/data/val/wxfcs/all/xml/350929?res=3hourly&key=(key)

ノルウェー オスロ

http://api.met.no/weatherapi/locationforecast/1.8/?lat=59.9127;lon=10.7461

気象庁が、無料で天気予報のXMLを公開するのは画期的なことだと思います。ただ、subscriber を構築しないと受信できないのは、ハードルの上げすぎではないかと思っています。初心者にとってはサーバー側のプログラムを組むというのは厳しいです。

それに、subscriber は、警報のように何時発表されるか分からない情報だと確かに便利だと思うのですが、天気予報のように定期的に発表されているものでは必要ないと思います。逆に、サーバーがダウンしたりして通知を取りこぼすと次に新しい通知があるまで復旧できないのが大きな欠点です。できれば、試行から本番に移行するときには他国のように単純に REST で XML を取得できるようにして、subscriber の方は追加の通知機能ということにして欲しいと思います。

ところで、先端IT活用推進コンソーシアム(AITC)の「気象庁防災情報XML」を活用するためのAPIが公開されているのを知りました。先端IT活用推進コンソーシアムには、日本の代表的な SIer が会員になっているし、鶴保会長も日本の SIer の代表者だと思います。こういう組織が作る利用規約だと先進的な利用規約を作るものと思っていましたが、10年以上遅れた利用規約で、明らかに気象庁の利用規約の方が上です。

具体的に言うと、利用規約に「新しい技術やデータセットの評価をおこなうためのものであるため、商用利用を固くお断りします。」、「定期的なクローリング、プログラムからの大量アクセスはご遠慮ください。」という条項があることです。

オープンデータでは、基本的に利用目的については問いません。だから、気象庁も商用利用を認めているし、イギリスの気象庁は Q&A で以下のように商用利用を積極的に認めています。今回の場合でも、商用利用といってもテスト的な利用はあるえると思うし、共同で開発していこうという姿勢を持つことが必要だと思います。それで、普通に書くとしたら「新しい技術やデータセットの評価をおこなうためのものであるため、予告なしにAPI等を変更することがあります。その結果生じたいかなる損失・損害についても、責任を負いません。」ぐらいの書き方がベターでないかと思います。

Can I use the DataPoint web services on a commercial website?

Yes, we actively encourage the use of the DataPoint web services on commercial websites, subject to the conditions set out in the detailed terms and conditions

次に「大量アクセスはご遠慮ください。」というのは、プログラムをする側からすれば意味不明です。きちんと定義すべきです。

アメリカの場合は、基本的に無制限で詳細に書いてあるのは免責条項です。サービスの説明の方にデータの更新は1時間に1回以上はしないから、アクセスの方も同一地点については1時間に1回だけにしてねと書いてあるだけです。

イギリスの利用規約では、1日5000リクエスト、1分100リクエスト以上になるとフェアーユースの範囲を超えるとして、有料になります。

For the purposes of this DataPoint Fair Use Policy, the Fair Use Limits shall be defined as follows:

  • You may make no more than 5000 data requests per day; and
  • You may make no more than 100 data requests per minute.

ノルウェーの利用規約では、毎秒20リクエスト以上を大量アクセスと定義しています。

You should save the information on your own server if you have heavy traffic. Heavy traffic means more than 20 requests from the api per second.

このサービスに多大なコストがかかるのであれば、今のような利用規約になっても仕方がないと思うのですが、最近は運用コストが低下して費用はそれほどかからないと思います。個人で天気予報 XML を公開している人もいるぐらいです。それに、先端IT活用推進コンソーシアムの会員にはクラウドコンピューティングを提供している企業もあるのでスポンサーになってもらえばいいのではないかと思います。日本の SIer も、OSS とかの活動にもう少し積極的になって欲しいと思います。

自分も希望があれば天気予報や週間天気予報の XML を他の国のようにRESTですぐに取れるように公開してもいいと思っています。もし、希望があればコメントに書いてください。