Help us understand the problem. What is going on with this article?

e-Stat を使って統計情報を取得してみる

More than 5 years have passed since last update.

はじめに

今日 (2014/10/31) から政府の統計情報にアクセスできる 
Web API が公開されたらしい。
http://www.e-stat.go.jp/api/

利用できるデータの一覧は下記 URL にある。
国勢調査から勤労統計からいっぱいある。
http://www.e-stat.go.jp/api/api-info/api-data/

なんか面白そう!
ということで使ってみた記録。

登録

  1. まずは、このページにアクセスして、利用者登録を行う。
    http://www.e-stat.go.jp/api/regist-login/
    メールアドレスと名前なんかを入力。

  2. メールアドレスにお知らせが届いているのでクリックしてアクティベート。

  3. 次に、ログイン。アプリケーション ID をゲット。一人 3 ID までらしい。これ以降、アプリケーション ID を xxx とする。

データ取得とプロット

手順は以下の通り。
1. getStatsList にアクセスして適当な ID を取り出す。
2. getStatsData にアクセスして、データを取り出す。
3. カテゴリ名と VALUES のデータを取り出す。
3. 最後に解析。今回は年齢ピラミッドをプロット。

#!/usr/bin/env python
#-*- coding: utf-8 -*-

import httplib2
import lxml.etree
import pylab
import matplotlib.font_manager as fm

# 初期設定
h = httplib2.Http('.cache')
key = "xxx"
baseUrl = "http://api.e-stat.go.jp/rest/1.0/app"
statsCode = "00200521"

# 政府統計コード 00200521 の最初のデータ
# (昭和 55 年の国勢調査) のデータ ID を取ってくる
print "getStatusList..."
cmd = "%s/getStatsList?appId=%s&statsCode=%s"
response, content = h.request(cmd % (baseUrl, key, statsCode))
xml = lxml.etree.fromstring(content)
dataid = xml.xpath('//LIST_INF')[0].attrib["id"]


# データ ID をキーに実際のデータを取り出す
print "getStatusData..."
cmd = "%s/getStatsData?appId=%s&statsDataId=%s"
response, content = h.request(cmd % (baseUrl, key, dataid))
xml = lxml.etree.fromstring(content)


# カテゴリ名の取り出し
categories = {}
for c in xml.xpath("//CLASS_OBJ"):
    categories[c.attrib["id"]] = {"name": c.attrib["name"],
                                  "labels": {}}
    print c.attrib["id"]
    for label in c.xpath("CLASS"):
        print label.attrib["name"], label.attrib["code"]
        categories[c.attrib["id"]]["labels"][label.attrib["code"]] = label.attrib["name"]


# 値の取り出し
values = [{"cat01": v.attrib["cat01"],
           "cat02": v.attrib["cat02"],
           "cat03": v.attrib["cat03"],
           "area": v.attrib["area"],
           "value": int(v.text)}
          for v in xml.xpath('//VALUE')]


# 年齢層 (cat03) ごとの集計
c = categories["cat03"]
data   = []
labels = []
for code in sorted(c["labels"].keys())[1:]:
    labels.append(c["labels"][code])
    data.append(sum([v["value"] for v in values if v["cat03"] == code]))
print data


# プロット
width = 0.5
x = pylab.arange(len(data))
prop = fm.FontProperties(fname='/Library/Fonts/Osaka.ttf') # for mac
pylab.barh(x, data, width)
pylab.yticks(x + width / 2, labels)
pylab.show()

結果はこちら

figure_1.png

参考情報

公式のマニュアル
http://www.e-stat.go.jp/api/wp/wp-content/uploads/2014/10/API-spec.pdf

ウェブのAPI を触るインターフェース
http://www.e-stat.go.jp/api/sample/testform/

mzmttks
ハイラブル株式会社の代表取締役。博士(情報学) カエルの研究をしてました。会話の定量化や分析をしてます。
https://www.mzmttks.com/
hylable
話し合い可視化サービスHylable Discussionを開発・運営するスタートアップ
https://www.hylable.com
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
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  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
ユーザーは見つかりませんでした