KNIMEで、e-Stat（政府統計）からデータ取得！URL発行から一覧作成まで一気に処理してみた！

# はじめに
Excel処理の自動化をするのに、KNIMEを使うことが多く、いっそWEBAPIの処理にもKNIMEが使えないか、と思い立ち、やってみました。
ちなみに、使い勝手でいえばPostmanの方が優しいし、分かりやすいけど、KNIMEのメリットとして、URL作成からデータ取得、一覧化、データの整形、そして分析まで一気通貫でやれてしまうところに期待しています。
まずは、タイトルの通り、URL発行から一覧作成まで作ってみました。
#前準備
KNIMEってなに？という方は、手前味噌ですが、Excel処理を自動化した記事を書いているので、[こちら](https://lifeupperco.com/post-186/)をご参照ください。

さて、実際の準備ですが、KNIMEをインストールして使えるようにすること（ [上の記事参照](https://lifeupperco.com/post-186/) ）、そして[政府統計のサイト](https://www.e-stat.go.jp/)からappIdを発行してもらうことです。
メールアドレス、サイトURL等が必要になりますが、サイトURLはそんなに厳しくチェックしてなさそう。
準備ができたら、KNIMEのワークフローを作っていきます。

#KNIMEの実装
簡単に流れを書くと、

　①テーブルにURLを構成するID、値を入力する。
　②取得したJSONの前処理する。
　③取得した結果から項目名と値を抽出する。
　④値を一覧にしてからコードを項目名に変換など、整形する。

こんな感じです。

##①URL入力から作成まで
まずはこんな感じでURL入力から、APIに送信するURL作成までを説明します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570274/dc67c1d6-e53d-426e-bc8f-0a934fb4ed18.png)

URL登録は、テーブルを使います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570274/5e920f81-94d4-4525-3475-89d731a80273.png)

Row0は、メインのURLを入力し、後から結合することを意識して、2列目に「？」を入れています。

ID行は、条件項目のIDを、Value行は、条件の値を入れています。
Row1は認証のためのappIdを入力しています。

こうすると、条件項目（ID）と値（Value）が見やすく、入力しやすいかな、と。

条件は複数入力されることを想定して、列数分ループする、ChunkLoopを使い、ID列とValue列を結合後、末尾に「＆」を付けます。
ただし、Row0は「＆」が不要なので、「？＆」は「＆」に変換します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570274/32e5a8a3-d5c1-4b9e-d718-50981c76d553.png)

結合した結果は、Value列に上書きします。

そのあと、一旦整列（ID振り直し）した後、一つのURLとして結合するために、GroupByを使いますが、Groupとして認識させるためにIDを同じ値に修正（グループ用ID作成）します。
最後に、一律で追加した「＆」のうち、URL末尾の「＆」を削除（余分な文字列の削除）します。

ちなみに、今回のリクエストは、e-Statにサンプルとして記載されている、東京都の情報を取得する条件になります。

##②APIリクエストから取得後、編集前まで
続いて作ったURLを使って、e-Statから情報を取得し、それを編集する前までです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570274/d7001bba-ae07-e81e-b1bc-6f180b912f88.png)

それぞれのアイコンの出力は下記の通りです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570274/9ef5d10d-1e5d-43bf-3294-c450addedf4e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570274/a15b7292-4d28-3879-19b5-7fe427268769.png)
結果は、String Valueに保存されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570274/63a50a2b-adac-a83c-adf3-310ef07c4621.png)
String valueをJSONに変換した結果、JSONという項目ができました。
ただし、値が「？」になっていて見えませんが、実際には値が入っています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570274/80c0a979-32c7-9d41-bec6-2387b7abc34d.png)
JSON以外の項目は不要なので、除外します。

##③結果を項目名と値に分割
得られた結果には、値だけでなく、表の名称や意味、項目名など、様々な情報が含まれます。
本来、取得する際に、条件を絞って取得した方がデータ量、負荷、参照のしやすさなど、多くの面でメリットがあるんですが、とりあえず取得してから編集しました。

トライ＆エラーにワクワクする人、きっと良い酒飲めると思います！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570274/4ff0b8d7-a54e-95ed-ba1a-5ee6a5bfe809.png)
上が値の流れ、下が項目の流れです。
まず上から。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570274/6c5d2af5-1c17-43bb-eb8b-075f400dd10d.png)
JSONから値を抽出するのに、JSON Pathを設定しています。
Pathに記載の通り、GET_STATS_DATA→STATISTICAL_DATA→DATA_INF→VALUE→（行数）→項目名で取得しています。

ちなみに、おススメの設定方法ですが、プレビュー画面で取得したいところをクリックすると、背景が青く塗られるので、「Add JSONPath」をクリックすれば、その項目を追加できるので、楽です。

これで、項目ごとに行が分かれ、その行の中でリスクと化されたデータができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570274/51d7fd06-c3f4-1c89-4c21-5d97180acc5e.png)
カンマ区切りで値がつながっていますね。
これをUngroupすると、一覧になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570274/6306fc67-0288-a5af-61f4-94168a2df5e2.png)
ここまでは簡単でした。
ただ、これだけだと、コードで表現されているので、意味が分かりません。

そこで、コードを項目名に変換するのに、結果データから項目名とコードを取得します。

まずは項目名を含む、「CLASS_OBJs」を取得します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570274/92296bb4-8cf1-d57a-315e-efbdf74df614.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570274/a06d08b8-f709-bdc3-e4cd-d44f30a77521.png)
「CLASS_OBJs」を展開します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570274/9db0314d-3a69-1b53-a45c-5f8450a04839.png)
データ種別、項目、都道府県、調査年度があります。
そこからさらに分解します。
この時、都道府県だけ、東京都を指定していたため、単項目になっており、同一の処理ができませんでした。。。
（よく見ると、「”CLASS”:」の後のかっこが「[」（複数項目）と「{」（単項目）で違います）

そのため、Splitterで分けてから処理しました。

まずは複数項目です。
下記はJSON Path の設定です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570274/3efbf133-556f-e2bf-6995-b081260b37bb.png)
出力結果です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570274/5010207f-b73d-d3ba-4657-fe48ef516f5c.png)

次が単項目です。
下記はJSON Path の設定です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570274/eb855257-a6c4-7591-905b-b96c7010dfdf.png)
idやnameなど、項目の前に[*]がないのは東京都一つしかないからです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570274/b92f1251-a3e3-368a-b9e4-fc310904e002.png)
次に処理を合流させるため、複数項目と単項目を結合します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570274/3badacac-5332-a9ac-b8ff-c5cdd6fdf790.png)
値を展開して、「？」を補完した結果が下記です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570274/2bbd5c9b-6e9f-316a-7dba-80e4190d3068.png)
一部、補完しきれていない項目がありますが、問題ないため、無視。
なぜかというと、欲しい項目がidとnameで、その２つしか補完対象にしていないからです。

##④コード変換から出力まで（最後）
JOINを使ってコード変換後、不要な項目を削除します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570274/686ac0e4-1a42-a68f-0c57-84f04b6040ba.png)
JOINの設定は下記で、コード（下記では「＠cat01」）と項目名を合わせたいので、項目名テーブルの「＠code」を照会します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570274/b9701f34-5653-4948-8673-083a2e8e1c34.png)
全ての項目をJOINした結果が下記です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570274/beb3e644-5310-0c7e-7682-10b50469cb04.png)
整列したり、欲しい項目（「＠time」から右の項目群）だけ残したりするため、Column Resorter、Column Filter、Column Rename、RowIDを使って整形します。

その結果が下記です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570274/70f334cb-1833-7631-3597-bafb33c13fba.png)
最初は基礎データの人口総数です。
人口が減っている日本ですが、東京都はご覧の通り、右肩上がりなのが分かります。
他にも指標データとして、国内銀行預金残高（人口１人当たり）といったデータもあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570274/9e83166a-c4a4-c7f3-b3ee-43eb36fe3bed.png)
東京都在住の方は、預金額でいうとほぼ右肩上がりですね。

#おわりに
URLの作成から結果の取得、一覧化まで、一通りKNIMEでできました。
あとは、そのままKNIMEでデータ分析するも良し、一旦Excelに書き出してから編集しても良し、ということで、結構使えるんじゃないかと思います。

せっかく政府統計のデータを取得したので、今度は分析や仮設検証もしてみたいと思いますが、今日はここまでにさせていただきます。

[こちら](https://lifeupperco.com) でブログも書いていますので、よろしければのぞいてみてください。
生活に根付いた情報や仕事についてなんかも書いています。

*[LifeUpperBlog!](https://lifeupperco.com)*