2017-05-31

統計ダッシュボードAPIによるデータ取得

2017年5月12日、「統計ダッシュボード」(総務省統計局)の運用が始まりました。同サイトでは、ウェブブラウザ画面上で主要な統計データのグラフや表が閲覧できるほか、HTTP プロトコルによるリクエスト/レスポンスの方式によって XML, JSON, またはCSV形式のデータを取得するための API も提供されています。

FMEでは、HTTP プロトコルによる API が公開されているウェブサービスには、一般に HTTPCaller トランスフォーマーによって接続することができ、また、XML, JSON, CSV 形式のデータは自在に変換できます。

ここでは、統計ダッシュボードAPIによるデータ取得の実験として、[時間] 2010~2015年の年別・[地域] 都道府県別の [系列] 人口総数をXML形式で取得し、PostgreSQL データベース (次の2テーブル) に格納するワークスペース例を掲げます。

出力先データベーステーブル
テーブル名列名内容
population region_code 地域コード
year
population 人口総数
region code 地域コード
name 地域名称 (都道府県名)

統計ダッシュボードAPIの利用規約、技術的な仕様 (リクエストURL・パラメーター、レスポンスのスキーマ等) については、統計ダッシュボードサイトのAPI関連ページを参照してください。

FME 2017.0.1.1 build 17291

FMEワークスペース例
























HTTPCaller: Creator から出力されたフィーチャーを受け取ったタイミングで、次のパラメーター設定に基づいて2010~2015年の年別・都道府県別の人口総数データをXML形式で取得するためのHTTPリクエスト (GETメソッド) を発行し、レスポンスとして得られたXML文書を属性として持ったフィーチャーを出力します。

HTTPCaller の主要パラメーター
Request:
    Request URL: http://data.e-stat.go.jp/dashboard/api/1.0/Xml/getData
    HTTP Method: 
GET
    Query String Parameters:

Name Value 備考
Lang JP 取得するデータの言語 (JP:日本語)
MetaGetFlg Y メタ情報取得有無のフラグ (Y:取得する)
IndicatorCode 0201010000000010000 系列コード
RegionLevel 3 地域レベル (3:都道府県)
TimeFrom 2010CY00 時間軸 (開始)
TimeTo 2015CY00 時間軸 (終了)
これらの API パラメーターの全部または一部を、通常の REST API パラメーターの書式で Request URL 文字列に含めても構いません。

Response:
    Response Body Attribute: 
_response_body


XMLFragmenter: XML文書から全ての VALUE 要素をXML断片として抽出するともに、それらを平坦化して regionCode 属性の値 (地域コード)、time 属性の値 (時間軸コード)、および VALUE 要素の内容 (系列の値。この例では人口総数) を取得します。

VALUE 要素 (XML断片) の例
<VALUE indicator="0201010000000010000" unit="090" stat="20020101" regionCode="01000" time="2010CY00" cycle="3" regionRank="3" isSeasonal="1" isProvisional="0">5506419</VALUE>

XMLFragmenter の主要パラメーター
XML Source:
    XML Attribute: _response_body
Feature Paths Configuration:
   
 Elements to Match: VALUE
Customize Attributes:

    Flatten Options:
        Enable Flattening: <checked> 
Expose Attributes:
   
 Attributes to Expose:
        VALUE.regionCode (地域コード)
        VALUE.time (時間軸コード)
        VALUE (系列の値。この例では人口総数)


XMLXQueryExploder: 地域の識別子 (コードと名称) を記述している CLASS 要素をXML断片として抽出します。統計ダッシュボードから取得したXML文書に含まれる CLASS 要素は、いくつかの CLASS_OBJ 要素の子要素としてグループ化されており、何を記述している CLASS 要素であるかは、親の CLASS_OBJ 要素の id 属性によって識別する仕組みになっています。ここでは、地域コードと地域名称を記述している CLASS 要素 (親要素の id 属性値が regionCode であるもの) のみを抽出したいので、断片化の対象とするXML要素の条件を XQuery 式によって自由に指定できる XMLXQueryExploder を使いました。

CLASS_OBJ 要素 (地域) と CLASS 要素の一部
<CLASS_OBJ id="regionCode" name="地域">
    <CLASS code="01000" name="北海道"/>
    <CLASS code="02000" name="青森県"/>
    ....
</CLASS_OBJ>

XMLXQueryExploder の主要パラメーター
XQuery Type:
    XQuery Expression: //CLASS_OBJ[@id="regionCode"]/CLASS
XML Source:
    XML Attribute: 
_response_body
    Remove Source XML Attribute?: Yes
Results:
    Result Attribute: 
_result


XMLFlattener: XMLXQueryExploder によって抽出された各 CLASS 要素を平坦化して、code 属性の値 (地域コード) と name 属性の値 (地域名称。この例では都道府県名) を取得します。

XMLFlattener の主要パラメーター
XML Source:
    XML Attribute: _result
Flatten Paths:
    
Elements to Match: CLASS
Expose Attributes:
    
Attributes to Expose:
        CLASS.code (地域コード)
        CLASS.name (地域名称)


最後に PostgreSQL ライターをワークスペースに追加、2つのフィーチャータイプ (population, region) で出力先テーブルのスキーマを定義し、XMLFragmenter, XMLFlattener トランスフォーマーと接続しました。

VALUE 要素の time 属性の値 (時間軸) は、単位が暦年の場合、"<西暦年>CY00" という書式のコードで記述されています。そのため、"population" ライターフィーチャータイプの User Attributes タブで、時間軸コードの先頭から4文字 (西暦年の部分) のみを year 列に書き込むように設定しました。

PostgreSQL ライター | population フィーチャータイプ (テーブル) の属性 (列) 定義













注: FME  2017.0 では、上の図のように、ライターフィーチャータイプ User Attributes タブ (Value 列) でも属性値を調製できるようになりました。


PostgreSQL データベースに対する SQL クエリ (問い合わせ) と結果テーブルの例:
2015年の都道府県別人口総数 (pgAdmin III クエリーツール)





























2017-05-12

メッシュコードに基づくメッシュポリゴンの作成

e-Stat (政府統計の総合窓口) では、「平成22年国勢調査500mメッシュ」データ (平成22年国勢調査結果に基づいて推計された1/2分割地域メッシュ区画単位の男女別人口総数及び世帯総数) が公開されており、1次メッシュ区画ごとにCSV形式のデータファイルがダウンロードできます。

e-Stat 平成22年国勢調査500mメッシュデータ例















各行1列目には1/2分割地域メッシュのメッシュコード (9桁の数字) が記述されています。ここでは、そのメッシュコードに基づいて、当該メッシュ区画を表す矩形ポリゴン (以下「メッシュポリゴン」と言います) を作成することにより、CSV形式のデータをGIS用のデータセットに変換するワークスペース例を掲げます。

FME 2017.0.1.0 build 17288

FMEワークスペース例












[CSV2] リーダー: 平成22年国勢調査500mメッシュデータ (CSV形式) を読み込む
AttributeSplitter: 1/2分割地域メッシュコード (9桁文字列) を各要素に分割する
AttributeManager: 属性名変更、メッシュ区画南西隅の座標計算等
2DBoxReplacer: メッシュポリゴン作成
Inspector: FME Data Inspector に結果出力 (確認用)

1次メッシュ区画 5339, 5340 の変換例 (FME Data Inspector による表示)
背景は地理院地図 (淡色地図) です。

















[CSV2] リーダーでは、ソースデータの2行目に記述されている列名を属性名とし、3行目以降の各行をフィーチャーとして読み込みました。ただし、第2行1列目は空文字列なので、[CSV2] リーダーは1列目にデフォルトの属性名 "col0" を与え、これにメッシュコードが格納されることになります。

1/2分割地域メッシュコードは9桁の数字で構成されており、各桁を AABBCDEFG で表せば、以下の式でメッシュ区画の南西隅の座標 (xmin, ymin) を求めることができます。

xmin (秒) = (100 + BB) x 3600 + D x 450 + F x 45 + dx
ymin (秒) = AA x 2400 + C x 300 + E x 30 + dy
dx = G が 2 または 4 ならば 22.5, そうでなければ 0
dy = G が 3 または 4 ならば 15.0, そうでなければ 0

メッシュ区画の幅と高さは一定 (1/2分割地域メッシュの場合は 22.5秒 x 15.0秒) なので、南西隅の座標からメッシュ区画を表す矩形の範囲が決定できます。この例では、AttributeSplitter によってメッシュコード (9桁の数字) を AA, BB, C, D, E, F, G の7つの部分に分割したうえで、AttributeManager で上記式によって南西隅の座標を求める方針です。

AttributeSplitter の Delimiter or Format String パラメーターには、Attribute to Split パラメーターで指定した属性に格納されている文字列を分割するための区切り文字 (列) (カンマなど) を指定するほか、#s#s#s... (#は抽出する部分文字列の文字数) という書式によって、先頭から順番に連続して抽出する部分文字列の文字数を指定することもできます。いずれの場合でも、分割・抽出後の部分文字列は、List Name パラメーターで指定した名前のリスト属性に格納されます。

この例では、AttributeSplitter のパラメーターを次のように設定し、_c{} リストに AA ~ G を格納しました。

AttributeSplitter パラメーター設定画面

_c{} リストに格納される値
_c{0} = AA
_c{1} = BB
_c{2} = C (0 ~ 7)
_c{3} = D (0 ~ 7)
_c{4} = E (0 ~ 9)
_c{5} = F (0 ~ 9)
_c{6} = G (1 ~ 4)











AA ~ G が得られたので、次のような設定をした AttributeManeger によってメッシュ区画の南西隅の座標が求められます。ここで、G の値 (1 ~ 4) に応じて決まる dx, dy は、Conditional Value (条件別の値) として設定しています。また、浮動小数点数の計算誤差を回避する観点から、計算過程では数値を整数で扱った方が有利であるため、ここで求める座標の単位は1/10秒としました (そのため、式中の定数は、前述の式における定数の10倍になっています)。

AttributeManager パラメーター設定画面

























2DBoxReplcer は、パラメーターとして左下 (南西) 隅の座標、右上 (北東) 隅の座標を設定することにより、それらを結ぶ直線を対角線とする矩形ポリゴンを作成します。ここで、[1/10秒] から [度] への換算もあわせて行いました。

2DBoxReplacer パラメーター設定画面


















ワークスペース例では、Inspector を接続して FME Data Inpector によって変換結果を確認しているだけにしていますが、ベクターデータの格納をサポートする適当なフォーマットのライターをワークスペースに追加すれば、そのフォーマットの「平成22年国勢調査500mメッシュ」データセットが作成できます。


文字列の分割または部分文字列の抽出

文字列をカンマなどの特定の区切り文字 (列) で分割する場合は、AttributeSplitter を使うのが一般的です。

メッシュコードのように、文字数が固定されている複数の部分文字列で構成されている文字列も、上記例のように AttributeSplitter によって個別の部分文字列に分割することができますが、分割後の部分文字列の一部しか利用しない場合には、SubstringExtractor も選択肢のひとつになります。

特定の区切り文字 (列) がなく、部分文字列の文字数も固定されていない場合でも、元の文字列の構成パターンを正規表現で表すことができる場合には、StringSearcher (部分式を含む正規表現) によって文字列の分割や部分文字列の抽出ができます。

例えば、ひとつのデータセット内で、1/2分割地域メッシュコードが9桁の連続した数字だけでなく、数字以外の区切り文字 (ハイフンなど) で1次 ~ 3次、1/2分割メッシュコードを連結した文字列 (例: 5339-23-45-1) で記録されている可能性もある場合には、次のような正規表現を設定した StringSearcher によって、どちらの書式であってもメッシュ区画南西隅を求めるために必要な各要素を抽出することができます。

^(\d\d)(\d\d)\D*([0-7])([0-7])\D*(\d)(\d)\D*([1-4])$