今回はいよいよ統計データ取得です。
前回までの実行結果から、
政府統計コードが 00200524 である人口推計の
2012 年に調査したデータで、
“年齢(各歳),男女別人口及び人口性比-総人口,日本人人口” という統計表に対する
統計表 ID が “0003080162” で、
それに対する絞込条件は、
cat01:男女別・性比較
cat02:人口
cat03:年齢各歳
area:全国
time:時間軸(年月日現在)
であることがわかりました。
今回はこれらの情報を基に、
条件を絞り込んで統計データを取得したいと思います。
統計データ取得のリクエスト URL は次のようになります。
1 |
http://api.e-stat.go.jp/rest/2.0/json/getStatsData?appId=xxxxxx&statsDataId=0003080162 |
このリクエスト URL に対して、
さらに絞込条件に関するパラメータを追加することで、
取得したい統計データのみを取得できます。
さて、
ここで取得したいデータを、
各歳それぞれの男性の人口および女性の人口であるとします。
また、ここでの人口は日本人人口とします。
男性の人口と女性の人口をそれぞれ取得したいため、
絞込条件 cat01 に対する条件は “男” または “女” になります。
それぞれの code は “002” と “003” となります。
このように絞込条件が複数ある場合はカンマ区切りで指定します。
パラメータは次のようになります。
1 |
cdCat01=002,003 |
次に、日本人人口の値を取得したいため、
絞込条件 cat02 に対する条件は “日本人人口” となります。
code は “002” となります。
パラメータは次のようになります。
1 |
cdCat02=002 |
最後に、
各歳それぞれの人口を知りたいため、
絞込条件 cat03 に対する条件は “0歳”、”1歳”、・・・、”99歳”、”100歳以上” となります。
絞込条件が複数であるため、
cat01 と同様にすると次のようになります。
1 |
cdCat03=01001,01002,01003,・・・,01100,01101 |
項目数が 101 個もあるため、入力が非常に大変ですね。
さらに、仕様書を確認すると、
ひとつの絞込条件に対する項目数は 100 個までだそうです。
したがって、このままでは上限を超えているため、
統計データを取得することができません。
このような場合は、パラメータの指定方法として、
“cdCat03″ ではなく、”cdCat03From” と “cdCat03To” を使用します。
絞込条件の開始条件として、”cdCat03From” を使用し、
絞込条件の終了条件として、”cdCat03To” を使用します。
今回の場合は “0歳” から “100歳以上” までが絞込条件となるため、
cdCat03 パラメータはつぎのようになります。
1 |
cdCat03From=01001&cdCat03To=01101 |
以上、今回の例では、
統計データ取得のためのリクエスト URL は次のようになります。
1 |
http://api.e-stat.go.jp/rest/2.0/json/getStatsData?appId=xxxxxx&statsDataId=0003080162&cdCat01=002,003&cdCat02=002&cdCat03From=01001&cdCat03To=01101 |
これまでの絞込条件によるパラメータをすべて “&” でつなげて結合した形となります。
それでは C# コードから統計データ取得を実行してみましょう。
今回のコードは次のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
namespace EstatSample { using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Text; class Program { static void Main(string[] args) { var baseUrl = "http://api.e-stat.go.jp/rest/2.0/app/json/"; var appId = "xxxxxx"; // 自分のアプリケーション ID を貼り付けて下さい。 var statsDataId = "&statsDataId=" + "0003080162"; var cdCat01 = "&cdCat01=" + "002,003"; var cdCat02 = "&cdCat02=" + "002"; var cdCat03 = "&cdCat03From=" + "01001" + "&cdCat03To=" + "01101"; var options = cdCat01 + cdCat02 + cdCat03; var getStatsData = baseUrl + "getStatsData?" + "appId=" + appId; var requestUrl = getStatsData + statsDataId + options; var json = RequestToAPI(requestUrl); var dic = Json.Parse(json) as Dictionary<string, object>; var status = (long)dic.GetValue("GET_STATS_DATA/RESULT/STATUS"); var message = dic.GetValue("GET_STATS_DATA/RESULT/ERROR_MSG") as string; if (status != 0) throw new Exception(message); object[] objects = null; var values = dic.GetValue("GET_STATS_DATA/STATISTICAL_DATA/DATA_INF/VALUE"); if (values.GetType().IsArray) objects = values as object[]; else objects = new object[] { objects }; var valueList = objects != null ? objects.OfType<Dictionary<string, object>>().ToArray() : null; if (valueList == null) throw new NullReferenceException(); foreach (var value in valueList) { var cat01 = value.GetValue("@cat01") as string; var cat02 = value.GetValue("@cat02") as string; var cat03 = value.GetValue("@cat03") as string; var _value = value.GetValue("$") as string; Console.WriteLine("cat01=" + cat01 + ", cat02=" + cat02 + ", cat03=" + cat03 + ", value=" + _value); } Console.Read(); } } } |
前回と同様、Json クラスや GetValue() 拡張メソッド等は省略しています。
統計データ取得のリクエストに対するレスポンスは、
GET_STATS_DATA をルートタグとして、
GET_STATS_DATA/STATISTICAL_DATA/DATA_INF/VALUE に具体的な値が格納されます。
本当は、指定した絞込条件によって本当にデータが取得できたかどうかなどを調べ、
その上で VALUE タグにアクセスするべきですが、
今回は前回までのコードから明らかにデータがあるとわかっているため、
その辺の異常検出コードのほとんどを省略しています。
絞り込んだ条件にヒットしたデータだけを取得していることが確認できると思います。
試しに cat03 に対する条件をひとつだけにしてみたり、
いろいろいじってみるともっと理解できると思います。
また、VALUE タグには上記コードの他にも、unit 属性があったり、
いろいろここでは省略されているものがあるので、
仕様書とにらめっこしながらいじってみて下さい。
実際のアプリケーションに実装するには、
コードとそれに対する表題を結び付けたり、
そもそも政府統計コードを用意しておかなきゃいけなかったり、
いろいろ表示のためのデータ変換やら前準備がたくさんあります。
以上、政府統計データ取得 API の簡単な使用方法でした。
果たして本当に簡単だったのだろうか…。