2013年7月2日

郵便番号データの「データパッケージ」

郵便番号データのデータパッケージ (DataPackage) を作ってみました。

データパッケージとは:

A Data Package (or DataPackage) is a coherent collection of data and possibly other assets into a single form. It provides the basis for convenient delivery, installation and management of datasets.

(日本語)

データパッケージとは、理路整然としたデータの集合と、その他にも有用なものをひとつにまとめたものです。 データパッケージは、データセットの簡便な配信、導入、管理の土台を提供します。

つまり、配信や管理を簡単にできるよう、データにメタデータなどを付与してまとめておきましょう、ということです。 Open Data Protocols で定義される Simple Data Format (SDF)、JSON Table Schema、CSV Dialect Description Format (CSVDDF) をまとめたものです。

基本的な構造

データパッケージは datapackage.json という記述用のファイルを提供します。 他にも実データや便利なスクリプトを含めることもできますが、記述ファイル以外は任意に構成できます。 datapackage.json は JSON Table Schema で定義されます。

推奨される構成としては

datapackage.json  # (必須) このデータパッケージのメタデータとスキーマ
README.md         # (任意) マークダウン形式の README

# データファイルはサブディレクトリでもメインディレクトリでも構いません
mydata.csv
data/otherdata.csv

# スクリプトは scripts かメインディレクトリに置きます
scripts/my-preparation-script.py

Datasets in Git には GDP や国コード (ISO 3166) がまとめられています。 TopoJSON の例なんかもあります。

また、データパッケージにはライセンス情報や作成者の情報も含めることができます。 MimeType を指定することでエクセルなど任意のファイル形式もデータとして指定できます。 表計算ソフトで扱うような形式のデータに対するメタデータとして汎用的に使えそうです。

Debian の Deb パッケージ、Java の JAR アーカイブ、JavaScript の CommonJS、それから Open Document Format が参考として挙げられています。 ツールを作る中では、こうした類似フォーマットで利用されている経験則も大事になりそうですね。

郵便番号データ

日本の郵便番号データを使ってみます。 日本郵便株式会社からは4種類のファイルをダウンロードできます。

4種類の内訳としては、3種類の異なる読み仮名データと、大口事業所個別番号になります。 読み仮名は以下の3種類です。

  • 大書き: 読み仮名データの促音・拗音を小書きで表記しないもの
  • 小書き: 読み仮名データの促音・拗音を小書きで表記するもの
  • ローマ字

それぞれのダウンロードページがありますが、データパッケージとしてまとめておくことで、

  • 簡単にダウンロードできる
  • プログラムで参照するフィールド名称を統一できる

というメリットがあります。

今回作成したデータパッケージでは記述ファイルとスクリプトだけを同梱しており、 スクリプトを使って最新のデータをダウンロードする仕様にしています。 また、元のデータは文字エンコーディングが cp932 ですので、 utf8 に変換し、data ディレクトリに配置します。

構成としては:

datapackage.json
README.md
scripts/pulldata.py

使ってみる

実際に使ってみましょう。Github のサイトから ZIP アーカイブをダウンロードして展開します。

scripts フォルダに pulldata.py というスクリプトがありますので、 メインディレクトリから実行します。

$ ./scripts/pulldata.py

しばらく待つと data ディレクトリに CSV ファイルが配置されます。

$ wc -l data/*.csv
   21820 data/facility.csv
  123397 data/ken_all_kogaki.csv
  123397 data/ken_all_oogaki.csv
  123399 data/ken_all_roman.csv
  392013 total

それぞれのスキーマは datapackage.json の resources -> schema -> fields と辿った先にあります。 各リソースの "path""schema" を突き合わせることでフィールドをマッピングできます。 マッピング処理は利用するときに記述する必要がありますが、名称とデータ型をメタデータとして定義しておくことで、 処理の共有を図れるはずです。

例えば、ファイルごとのスキーマを出力するスクリプトは以下のように記述できます。

#!/usr/bin/env python

import json

DESCRIPTOR = 'datapackage.json'

with open(DESCRIPTOR) as fp:
    dp = json.load(fp)
    for r in dp['resources']:
        # 必要ならばファイル読み込み処理
        print r['path']
        fields = r['schema']['fields']
        for field in fields:
            # id, type でフィールドごとにマッピングできる
            print u"- {id:<20}{type:<10}{label}".format(**field)

"path" を出力している箇所でファイルを読み込むと、スキーマとのマッピング処理を実施できるでしょう。

終わりに

郵便番号データのデータパッケージ (DataPackage) を作ってみました。 Open Data Protocols で定義されたものを利用し、再利用可能な形式にまとめたものです。 メタデータの定義やディレクトリの配置はその場しのぎで考えがちですが、 何らかのポリシーに沿って管理することで、再利用性が高まるのではないかと思います。

データパッケージは CSV を基本にした形式なので、特にツールを用意することなく気軽に始められるはずです。 データをオープンにしていく上では配信、導入、管理のそれぞれの方法に渡って考えていく必要があります。 まずはデータパッケージから始めてみる、という試みも良さそうですね。

コメントを投稿