LoginSignup
4
6

More than 3 years have passed since last update.

小売物価統計でガソリン価格を調べる

Last updated at Posted at 2019-08-22

(初出: 2018-09-22)

仕事で直近のガソリン価格を調べる必要があった。なぜか「ガソリンスタンドによって値段が違うからなあ」という反応が多いお題だが、こんなものはさくっと統計を引いてやっつけるべきものだ。そこで小売物価統計からもってくることにする。今はこうした基礎データがネットで簡単に入手できる。e-Stat を見に行こう。一回だけならリンクをたどったり検索したりで十分だが、毎月やるくらいならプログラムを書くべきだろう。e-Stat では API が用意されておりデータを引くのは簡単だ。

ユーザー登録とアプリケーション ID を取得する

手作業で登録する。メールアドレスが必要。

アプリケーション ID を取得する

手作業で登録する。40桁の16進数が得られるようだ。以下 <APPID> とする。

小売物価統計からガソリン価格を取得する

統計表情報取得

提供データの一覧 を見ると小売物価統計調査の政府統計コードは 00200571 であるとわかるので、まずこいつに API からアクセスする場合の統計データ ID を調べる。

$ curl https://api.e-stat.go.jp/rest/2.1/app/getStatsList?appId=<APPID>&statsCode=00200571

結果は XML で得られ、これを覗くと小売物価統計の statsDataId が 0003105586 であることがわかる。

メタ情報取得

データ抽出条件には地域・品目・年月のコード (ID) が必要なので、その一覧を取得する。

$ curl https://api.e-stat.go.jp/rest/2.1/app/getMetaInfo?appId=<APPID>&statsDataId=0003105586

こちらも結果は XML で得られる。今回必要なのは長野県松本市のガソリン価格だ。松本市の地域コードは 20202、自動車ガソリンの品目コードは 07301 であることがわかる。地域コードは地方公共団体コード (チェックディジットなし) と同一だった。

統計データ取得

統計データ本体は、XML/JSON/JSONP/CSV のいずれかの形式で取得できる。全地域全期間全品目のデータを XML で落とすのならばこうする。

$ curl https://api.e-stat.go.jp/rest/2.1/app/getStatsData?appId=<APPID>&statsDataId=0003105586

松本市のデータだけ取得するには、パラメーターに cdArea=20202 を追加する。次の例では CSV での取得を行う。ただし CSV とはいっても冒頭にかなりの量のヘッダが付く。

$ curl https://api.e-stat.go.jp/rest/2.1/app/getSimpleStatsData?appId=<APPID>&statsDataId=0003105586&cdArea=20202

さらに品目を絞り、松本市のガソリン価格だけ取得するため、パラメーターに cdCat01=07301 を追加する。

$ curl https://api.e-stat.go.jp/rest/2.1/app/getSimpleStatsData?appId=<APPID>&statsDataId=0003105586&cdArea=20202&cdCat01=07301

JSON でデータを得るには、エンドポイントを若干変更する。

$ curl https://api.e-stat.go.jp/rest/2.1/app/json/getStatsDataappId=<APPID>&statsDataId=0003105586&cdArea=20202&cdCat01=07301

取得したデータを解釈する

Python で処理する

使い慣れた Python で最新のガソリン価格を得よう。

$ curl -s "https://api.e-stat.go.jp/rest/2.1/app/json/getStatsData?appId=<APPID>&statsDataId=0003105586&cdArea=20202&cdCat01=07301" >result.json
$ python3 -q
>>> import json
>>> result = json.load(open("result.json"))
>>> price_history_raw = result["GET_STATS_DATA"]["STATISTICAL_DATA"]["DATA_INF"]["VALUE"]
>>> price_history = sorted([(e["@time"][:4] + e["@time"][6:8], e["$"]) for e in price_history_raw])
>>> price_history[-1]
('201808', '154')

簡単だ。

Javascript で処理する

JavaScript でも同じように書ける。ここではファイルからではなく直接 e-Stat から読みだしている。


const appid = "<APPID>";
const statsdataid = "0003105586";
const cdarea = "20202";
const cdcat01 = "07301";
var url = `https://api.e-stat.go.jp/rest/2.1/app/json/getStatsData?appId=${appid}&statsDataId=${statsdataid}&cdArea=${cdarea}&cdCat01=${cdcat01}`;
var request = new XMLHttpRequest();
request.open("GET", url);
request.responseType = "json";
request.addEventListener("load", (e) => {
    var prices = e.target.response["GET_STATS_DATA"]["STATISTICAL_DATA"]["DATA_INF"]["VALUE"];
    var yyyymm = prices[0]["@time"];
    yyyymm = yyyymm.slice(0, 4) + yyyymm.slice(6,8);
    var price = prices[0]["$"];
    console.log(yyyymm, price);
});
request.send();

これまた簡単。

4
6
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
6