適材適所

WindowsやPowerShellやネットワーク、IBMなどのシステム系の話やポイ活など気になったことも載せているブログです。

【PowerShell】政府統計の総合窓口APIと戯れる

日本政府の統計データを見てみようと思います。

東京都の65歳以上の人口をグラフ化してみましょう。

政府統計の総合窓口

政府統計の総合窓口

このサイトでは、政府が発表している統計をブラウザ上で簡単に見ることができます。

政府の統計データに家にいながらアクセスできる時代が来ようとは・・・。

便利な世の中になったものです。

このサイトでは、統計データを色々な検索条件で絞ったり、グラフ化してみたり、地図上に表示したり・・・。

ただ、自在に使いこなすには、ちょっと学習が必要そうですが・・・。

このサイトでは、統計データをAPIで提供しています。

そのAPIをPowerShellで操作してみましょう。

APIの例

このページに、PHPとJavaScriptの使用例が書いてあるので、これを参考にPowerShellで操作してみたいと思います。
APIの使い方 | 政府統計の総合窓口(e-Stat)−API機能

アプリケーションIDを作成する

先ほどのページを読むと、APIを利用するためには、アカウントを登録する必要があるとのこと。

トップページの右上の新規登録ぺージから登録することができます。 f:id:shinmai_papa:20191204125849p:plain

アカウントを登録した後は、アプリケーションIDを発行してもらいます。

アプリケーションIDの発行はマイページから行うことができます。

f:id:shinmai_papa:20191204100010p:plain

これで準備ができました。

実際にAPIを使ってみよう

使い方の例が上述のページに書いてあります。

以下のリクエストを実行することにより、東京の老年人口割合[65歳以上人口]を取得することが可能です。

http://api.e-stat.go.jp/rest/2.0/app/getStatsData?appId=<取得したアプリケーションID>&statsDataId=C0020050213000&cdCat01=%23A03503

統計データ取得APIの場合は、次のリクエストURLとなります。

// XMLの場合
http://api.e-stat.go.jp/rest/<バージョン>/app/getStatsData?<パラメータ群>

// JSONの場合
http://api.e-stat.go.jp/rest/<バージョン>/app/json/getStatsData?<パラメータ群>

このとおりリクエストを送れば、統計情報を取得することができるようです。

習うより慣れろ、実際にやってみることにしましょう。

xml、json、csvとデータ形式を選ぶことができますが、今回は扱いが楽なjson形式を使ってみようと思います。

PS C:\> $json=Invoke-RestMethod -Method "GET" -Uri "http://api.e-stat.go.jp/rest/2.0/app/json/getStatsData?appId=<取得したアプリケーションID>&statsDataId=C0020050213000&cdCat01=%23A03503"

こうすると、APIで取得した結果が$json変数にjson形式で格納されているはずです。

確認してみましょう。

PS C:\> $json.GET_STATS_DATA.RESULT

STATUS ERROR_MSG            DATE
------ ---------            ----
     0 正常に終了しました。 2019-11-20T16:36:03.242+09:00

正常に終了したことが確認できるかと思います。

ちなみに、jsonのルートタグは<GET_STATS_DATA>だそうです。

<GET_STATS_DATA>の下にあるタグを確認すると正常終了が確認できます。

データの中身はどこに格納されるのかというと、<GET_STATS_DATA>タグの下、<STATISTICAL_DATA>のさらに下、<DATA_INF>のVALUEにいます。

深い!!

では、確認してみましょう(VALUEは配列なので、添え字を指定しています)。

$json.GET_STATS_DATA.STATISTICAL_DATA.DATA_INF.VALUE[0]
#結果
@tab   : 002
@cat01 : #A03503
@area  : 13000
@time  : 2005
@unit  : %
$      : 18.3

何やらそれらしいデータが返ってきているようですね。

しかし、それぞれの項目名が、よくわからない形式で返ってきます。

ここで仕様を確認してみます。

それによると、STATISTICAL_DATAタグ→CLASS_INFタグ→ CLASS_OBJタグと辿ると、データのメタ情報が格納されている、とのこと。

確認してみましょう。

$json.GET_STATS_DATA.STATISTICAL_DATA.CLASS_INF.CLASS_OBJ|Format-list
#結果
@id   : tab
@name : データ種別
CLASS : {@{@code=001; @name=基礎データ; @level=1}, @{@code=002; @name=指標データ; @level=1}}

@id   : cat01
@name : 項目
CLASS : @{@code=#A03503; @name=老年人口割合[65歳以上人口]; @level=1; @unit=%}

@id   : area
@name : 都道府県・市区町村名
CLASS : @{@code=13000; @name=東京都; @level=1}

@id   : time
@name : 調査年度
CLASS : {@{@code=1975; @name=1975; @level=1}, @{@code=1976; @name=1976; @level=1}, @{@code=1977; @name=1977; @level=1},
         @{@code=1978; @name=1978; @level=1}...}

これを踏まえた上で、改めて先ほどのデータを見てみます。

@tab   : 002(指標データ)
@cat01 : #A03503(老年人口割合[65歳以上人口])
@area  : 13000(東京都)
@time  : 2005(2005年)
@unit  : %
$      : 18.3(値)

併せて考えると、「2005年の東京都では、65歳以上人口が18.3%だった」ということを表しているデータということがわかるかと思います。

Excelの力を借りてグラフ化する

APIで取得できるデータは、ただの羅列ですので中々直観的にわかりにくいですよね。

ということで取得したデータをExcelの力を借りてグラフ化し、視覚に訴える形にしてみたいと思います。

完成イメージ

f:id:shinmai_papa:20191216152311p:plain

グラフ化はPowerShell単体ではできない

PowerShell単体には、グラフを描写する機能はないので、Excelの力を借りてみましょう。

PowerShellでExeclを操作するときは、ComObjectを通して操作します。

ComObjectとは、アプリケーションAPIのことです。

Component Object Model - Wikipedia

ComObjectを使ってExcelを操作する際には、VBAを書く感覚と全く同じです。

つまり、VBAでグラフを書きましょうというのと変わらないですね。

処理の流れ

処理の流れは単純なものです。

  1. 東京都の老齢人口65歳以上の統計情報をExcelのシートに転記
  2. 転記した数値をグラフ化

コードの全体

一部セル範囲をハードコーディングしているお見苦しい箇所がございますが、悪しからず。

 
#APIを使って東京都の老齢人口65歳以上の統計情報を取得する
$json=Invoke-RestMethod -Method "GET" -Uri "http://api.e-stat.go.jp/rest/2.0/app/json/getStatsData?appId=<取得したアプリケーションID>&statsDataId=C0020050213000&cdCat01=%23A03503"

#APIの戻り値を確認して0(正常終了)以外はメッセージを出力して終了
if($json.GET_STATS_DATA.RESULT.STATUS -ne 0){
   $json.GET_STATS_DATA.RESULT.ERROR_MSG
   return
}

#Excelオブジェクトを作成
$excel=New-Object -ComObject excel.application

#画面の描写を停止
$excel.ScreenUpdating=$false

#新しいブックを作成
[void]$excel.Workbooks.Add()

#Excelを可視化
$excel.Visible=$true

#変数にオブジェクトを割り当てる
$bk=$excel.ActiveWorkbook
$sh=$bk.worksheets(1)

#jsonから値の属性を取得してシートに書き込む
$sh.cells(2,1).value=$json.GET_STATS_DATA.STATISTICAL_DATA.CLASS_INF.CLASS_OBJ[1].CLASS.'@name'

#値を書き込む列を格納する変数
$col=2

#年度と値をシートに書き込む
$json.GET_STATS_DATA.STATISTICAL_DATA.DATA_INF.VALUE|%{$sh.cells(1,$col).value=$_.'@time';$sh.cells(2,$col).value=$_.'$';$col++;}

#グラフを作成
$chartObjects=$sh.ChartObjects()
$newChartObject=$chartObjects.add(1,50,350,300)
$chart = $newChartObject.Chart

#グラフ化する範囲を設定
$srcRng=$sh.range("A1:L2")
$chart.SetSourceData($srcRng)
#縦軸の最大値を100に設定
$chart.Axes(2).MaximumScale=40

#凡例を削除
$chart.Legend.LegendEntries(1).delete()

$excel.ScreenUpdating=$true

ほとんどVBAになってしまった

前述しましたが、ほとんどVBAのコードで占められています。

その中でも、政府統計APIで取得したデータを操作する部分がコードの中盤に出てくる、次の2か所です。

jsonから値の属性を取得してシートに書き込む

これは、データのメタ情報のうち、タイトルっぽい値をセルに書き込んでいます。

f:id:shinmai_papa:20191216152315p:plain

#jsonから値の属性を取得してシートに書き込む
$sh.cells(2,1).value=$json.GET_STATS_DATA.STATISTICAL_DATA.CLASS_INF.CLASS_OBJ[1].CLASS.'@name'

年度と値をシートに書き込む

ここでは、年度と値をシートに書き出しています。

f:id:shinmai_papa:20191216152318p:plain

#年度と値をシートに書き込む
$json.GET_STATS_DATA.STATISTICAL_DATA.DATA_INF.VALUE|%{$sh.cells(1,$col).value=$_.'@time';$sh.cells(2,$col).value=$_.'$';$col++;}

他はVBAェ・・・。

最後に

PowerShellとExcelVBAで政府統計APIのデータのグラフ化を(半ば無理やり)してみました。

実際に実践的なグラフを作るとなると、もう少し作り込みが必要かも知れませんが、政府統計APIのさわりについては紹介できたかと思います。

しかし日本の高齢化はすごいですね・・・。あな恐ろしや。

というわけで、ここまでお読みいただき、ありがとうございました。