Pythonでe-StatのAPIデータを取得、グラフ作成

事前準備

www.e-stat.go.jp

dekiru.net

API

https://www.e-stat.go.jp/api/sites/default/files/uploads/2019/07/API-specVer3.0.pdf

https://www.e-stat.go.jp/api/sample/testform3-0/

  • APIの登録しアプリケーションID(appId)を取得する
  • APIのアイコンのものだけ使える
  • statsDataIdが必要

JSON

このサービスは、政府統計総合窓口(e-Stat)のAPI機能を使用していますが、サービスの内容は国によって保証されたものではありません。

import pandas as pd
import requests
from pandas.io.json import json_normalize

params = {
    "appId": "",
    "lang": "J",
    "statsDataId": "0003191360",
    "metaGetFlg": "Y",
    "cntGetFlg": "N",
    "sectionHeaderFlg": "1",
}

r = requests.get(
    "https://api.e-stat.go.jp/rest/3.0/app/json/getStatsData", params=params
)

# URL確認
r.url

# JSON
data = r.json()

# 内容確認
data

# normalize
df = json_normalize(data["GET_STATS_DATA"]["STATISTICAL_DATA"]["DATA_INF"]["VALUE"])

df

CSV

  • JSONからCSVに変換するだけでもかなりの手間がかかるので表形式のデータの場合JSONで取得するよりもCSVで取得する
import io

import pandas as pd
import requests

import japanize_matplotlib
import matplotlib.pyplot as plt

params = {
    "appId": "",
    "lang": "J",
    "statsDataId": "0003191360",
    "metaGetFlg": "Y",
    "cntGetFlg": "N",
    "sectionHeaderFlg": "1",
}

r = requests.get(
    "https://api.e-stat.go.jp/rest/3.0/app/getSimpleStatsData", params=params
)

# URL確認
r.url

# CSV内容確認
print(r.text)

# CSVファイル読込
df = pd.read_csv(io.BytesIO(r.content), skiprows=26)

# データ確認
df.head(20)

# 欠損値確認
df.isna().any(axis=0)

# データ型確認
df.dtypes

# 列名確認
df.columns

# 年度ごとに集計
pv = df.pivot_table(
    index=["認知・検挙件数・検挙人員", "重要犯罪・重要窃盗犯"],
    columns="時間軸(年次)",
    values="value",
    aggfunc="sum",
).astype(int)

# CSVに保存
pv.to_csv("data.csv")

# グラフ
pv.loc[[("認知件数", "重要犯罪"),("検挙件数", "重要犯罪")],:].T.plot(ylim=0, figsize=(8, 6))

# 凡例を枠外
plt.legend(bbox_to_anchor=(1.05, 1), loc="upper left", borderaxespad=0, fontsize=10)

# グラフ表示
plt.show()

f:id:imabari_ehime:20200114100428p:plain

強姦

# グラフ
pv.loc[[("認知件数", "重要犯罪_強姦"),("検挙件数", "重要犯罪_強姦")],:].T.plot(ylim=0, figsize=(8, 6))

# 凡例を枠外
plt.legend(bbox_to_anchor=(1.05, 1), loc="upper left", borderaxespad=0, fontsize=10)

# グラフ表示
plt.show()

f:id:imabari_ehime:20200123173529p:plain

f:id:imabari_ehime:20200123173730p:plain