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

【Python3】e-StatのAPIで遊んでみる「サービス業が増えている?」

More than 1 year has passed since last update.

1.やったこと

政府統計の総合窓口であるe-StatのAPIで遊んでみました。具体的にやったことは

・サービス業従事者数を2013~2017年ごとにプロット
・全体の就業者数の推移と比較する

です。

結果は
①サービス業に従事している人の数が増えている
②全体の就業者数も増えており、全体に対するサービス業の割合はあまり変わらない

でした。グラフです。
11293.png

2.e-Statの利用方法

利用方法は下記を参考にしました。アプリケーションIDなるものを取得してください。
政府統計の総合窓口(e-Stat)のAPIを使ってみよう
e-Stat(政府統計)のAPI機能をつかってpythonでグラフを書いたりしてみる

3.コード

実装したコードの前提として、APIからのレスポンスはjsonファイルで受け取ります。公式ドキュメントにて
qiita1.png
との記載がありますので、リクエストするURLは下記になります。

http://api.e-stat.go.jp/rest/2.1/app/json/getStatsData?+<パラメータ群>

また、総務省の統計結果がWEB上にありましたので、全体の就業者数に関してはそちらをお借りしました。

3.1.e-statAPI.py

実際に動かしたコードになります。

e-statAPI.py
import requests,urllib
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

def get_json(base_url,params):
    params_str=urllib.parse.urlencode(params)
    url=base_url+params_str
    json=requests.get(url).json()
    return json

def str2int(list_str):
    list_int=[int(s) for s in list_str]
    return list_int

def main():
    appID="取得したアプリケーションID"
    base_url="http://api.e-stat.go.jp/rest/2.1/app/json/getStatsData?"
    params={
        "appId":appID,
        "lang":"J",
        "statsDataId":"0003179101",
        "metaGetFlg":"Y",
        "cntGetFlg":"N",
        "sectionHeaderFlg":"1"
    }
    all_workers=np.array([6326,6371,6401,6465,6530])#数字はWEBから拝借
    json=get_json(base_url,params)

    #time_dfを探す
    class_data=json["GET_STATS_DATA"]["STATISTICAL_DATA"]["CLASS_INF"]["CLASS_OBJ"]
    time_df=pd.DataFrame(class_data[3]["CLASS"])
    #valuesを探す
    all_values=pd.DataFrame(json["GET_STATS_DATA"]["STATISTICAL_DATA"]["DATA_INF"]["VALUE"])
    values=all_values[all_values["@cat01"]=="01000"]

    #xyを抽出
    y_str=list(values["$"][0:5])
    y_int=str2int(y_str)#レスポンスされた数字が文字列だったので
    y1=np.array(y_int)/1000
    x=np.array(list(time_df["@name"][0:5]))
    #グラフ描画
    fig=plt.figure()
    ax1=fig.add_subplot(111)
    ln1=ax1.plot(x,y1,marker="o",label="Service Industry Workers")

    ax2=ax1.twinx()
    ln2=ax2.plot(x,all_workers,marker="o",label="All Workers",color="#ffcdd2")

    h1,l1=ax1.get_legend_handles_labels()
    h2,l2=ax2.get_legend_handles_labels()
    ax1.legend(h1+h2, l1+l2, loc='lower right')

    ax1.set_xlabel("Year")
    ax1.set_ylabel("Service Industry Workers(Unit:k)")
    ax1.grid(True)
    ax2.set_ylabel("All Workers(Unit:10k)")
    plt.show()

if __name__ == '__main__':
    main()

pandasを使うと便利だった

返ってきたjsonファイルを見ないと多少わかりづらいところがあると思います。アドバイスと言ったらかなり偉そうで恐縮ですが、レスポンスされたjsonファイルは
[{},{},{}・・・・]のような形が多々ありました。ので、pandasのデータフレームで楽に処理できます。

リストで処理しようとすると

>>> data=json["GET_STATS_DATA"]["STATISTICAL_DATA"]["DATA_INF"]["VALUE"]
>>> pprint.pprint(data)
[{'$': '29425100',
  '@area': '00000',
  '@cat01': '00000',
  '@tab': '002',
  '@time': '2013000000',
  '@unit': '人'},
 {'$': '29687600',
  '@area': '00000',
  '@cat01': '00000',
  '@tab': '002',
  '@time': '2014000000',
  '@unit': '人'},
 {'$': '29877100',
  '@area': '00000',
  '@cat01': '00000',
  '@tab': '002',
  '@time': '2015000000',
  '@unit': '人'},
 {'$': '30017400',
  '@area': '00000',
  '@cat01': '00000',
  '@tab': '002',
  '@time': '2016000000',
  '@unit': '人'},
 -------永遠に続く---------

pandasで処理

>>> df=pd.DataFrame(json["GET_STATS_DATA"]["STATISTICAL_DATA"]["DATA_INF"]["VALUE"])
>>> df
             $  @area @cat01 @tab       @time @unit
0     29425100  00000  00000  002  2013000000     人
1     29687600  00000  00000  002  2014000000     人
2     29877100  00000  00000  002  2015000000     人
3     30017400  00000  00000  002  2016000000     人
4     30373200  00000  00000  002  2017000000     人
5     29277800  00000  00000  002  2013000103     人
6     29402100  00000  00000  002  2013000406     人
7     29480500  00000  00000  002  2013000709     人
8     29540100  00000  00000  002  2013001012     人
9     29533500  00000  00000  002  2014000103     人
10    29700700  00000  00000  002  2014000406     人
11    29741700  00000  00000  002  2014000709     人
12    29774400  00000  00000  002  2014001012     人
13    29653300  00000  00000  002  2015000103     人
14    29905600  00000  00000  002  2015000406     人
15    29996900  00000  00000  002  2015000709     人
16    29952200  00000  00000  002  2015001012     人
17    29858500  00000  00000  002  2016000103     人
18    30024900  00000  00000  002  2016000406     人
19    30083800  00000  00000  002  2016000709     人
20    30102500  00000  00000  002  2016001012     人
21    30017300  00000  00000  002  2017000103     人
22    30409600  00000  00000  002  2017000406     人
23    30498100  00000  00000  002  2017000709     人
24    30567800  00000  00000  002  2017001012     人
25    30433100  00000  00000  002  2018000103     人
26    30580300  00000  00000  002  2018900406     人
27    29269400  00000  00000  002  2013000101     人
28    29242000  00000  00000  002  2013000202     人
29    29322100  00000  00000  002  2013000303     人
...        ...    ...    ...  ...         ...   ...
4530      2600  00000  20000  002  2016000303     人
4531      2700  00000  20000  002  2016000404     人
4532      2700  00000  20000  002  2016000505     人
4533      2700  00000  20000  002  2016000606     人
4534      2700  00000  20000  002  2016000707     人
4535      2700  00000  20000  002  2016000808     人
4536      2800  00000  20000  002  2016000909     人
4537      2700  00000  20000  002  2016001010     人
4538      2700  00000  20000  002  2016001111     人
4539      2700  00000  20000  002  2016001212     人
4540      2800  00000  20000  002  2017000101     人
4541      2700  00000  20000  002  2017000202     人
4542      2700  00000  20000  002  2017000303     人
4543      3000  00000  20000  002  2017000404     人
4544      2900  00000  20000  002  2017000505     人
4545      3000  00000  20000  002  2017000606     人
4546      3000  00000  20000  002  2017000707     人
4547      3600  00000  20000  002  2017000808     人
4548      3600  00000  20000  002  2017000909     人
4549      3600  00000  20000  002  2017001010     人
4550      3600  00000  20000  002  2017001111     人
4551      3600  00000  20000  002  2017001212     人
4552      4900  00000  20000  002  2018000101     人
4553      4900  00000  20000  002  2018000202     人
4554      5000  00000  20000  002  2018000303     人
4555      5500  00000  20000  002  2018000404     人
4556      5700  00000  20000  002  2018000505     人
4557      5100  00000  20000  002  2018900606     人
4558      5600  00000  20000  002  2018900707     人
4559      5900  00000  20000  002  2018900808     人

[4560 rows x 6 columns]

データの操作が超らくちんでありました。

なかなか面白いのでe-StatのAPI使ってみてはいかがでしょうか。

Why do not you register as a user and use Qiita more conveniently?
  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
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