適材適所

PowerShellやVBAなどのプログラミングに関すること、キャリア、子育ての3本で書いていきます

東京都の65歳以上人口をグラフ化してみよう(PowerShellとExcel)

Powershellで政府統計を見てみる

前回の続きで、PowerShellを使って政府統計APIを操作していきます。

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

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

完成イメージ

f:id:shinmai_papa:20191216152311p:plain

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

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

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

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

Component Object Model - Wikipedia

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

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

(最初に政府統計APIを操作すると言いながら、これから紹介するコードは半分以上がVBAになってしまいました)

処理の流れ

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

①前回取得した、東京都の老齢人口65歳以上の統計情報をExcelのシートに転記

②転記した数値をグラフ化

コードの全体

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

また、ExcelをPowerShellで操作する際の情報については、他の方のわかりやすい記事を見て頂くのがいいかと思います。

PowerShell で Excel をどうのこうのすることに興味を持ってくれると嬉しい - Qiita

グラフについては、こちらを参考にさせていただきました。

csvデータを取り込んでExcelで折れ線グラフを生成するPowerShell - 雑記+備忘録

コードはこんな感じです。

PowerShellのコンソールにコピペすると、完成イメージのものができあがると思います。

#APIを使って東京都の老齢人口65歳以上の統計情報を取得する
$json=Invoke-RestMethod -Method "GET" -Uri "http://api.e-stat.go.jp/rest/2.0/app/json/getStatsData?appId=a14557bb90017cf65938faf82e754a9314b85f59&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から値の属性を取得してシートに書き込む
$sh.cells(2,1).value=$json.GET_STATS_DATA.STATISTICAL_DATA.CLASS_INF.CLASS_OBJ[1].CLASS.'@name'

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

順番に見てみます。

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

これは、前回の記事で確認した、データのメタ情報のうち、タイトルっぽい値をセルに書き込んでいます。

(前回の記事より)

f:id:shinmai_papa:20191216152315p:plain

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

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

(前回の記事より)

f:id:shinmai_papa:20191216152318p:plain

最後に

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

実際に実践的なグラフを作るとなると、もう少し作り込みが必要かも知れませんが、なんとなく簡単に政府統計APIが使えることが分かって頂けたかと思います。

また時間があれば(あと、やる気がでれば)もう少し掘り下げて実践的なアプリを作ってみたいと思います。

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