見出し画像

内閣府のコロナ対策サイトのデータを題材にして、WindowsのjqでJSON→CSVの変換をしてみよう

こんにちは、Qoalaの中の人です。連日 自粛率や人出について報道されていますが、先日ふと「どこかに人流のデータはあるのかな?」とググってみたところ、内閣府の特設サイトに行き着きました。

この内閣府のサイト、公官庁のサイトには珍しく(失礼!)WEBリテラシーとデータリテラシーが高い感じでGoodです。Javascriptで描画されるデータダッシュボードが見やすく、かつそれらの元データはオープンデータとしてURLにクエリを打ち込むことでJSON形式でダウンロードできます(ドロップダウンリストなどの検索GUIはない)。
特に印象的だったのは、閲覧者の大半は非エンジニアであると思われるのにデータフォーマットとしてCSVではなくJSONを選択している点でした。今後はこういったケースが増えてくると思われますので、これを機に普段JSONに触れることのない経営企画部・営業部の方など向けに、Windows端末でJSONをCSVに変換しExcelで分析する手順を共有させていただこうと思った次第です。

JSONってなに?何が便利なの?

JSONは JavaScript Object Notation の略で、現在のウェブサイトの動的な表現には不可欠なJavaScriptというプログラミング言語の書き方に沿ったデータ定義方法です。なので、エンジニアの方にとっては馴染みのある表現方法でデータを取り扱えるメリットがあります。一方で、CSVなどの表形式のデータに比べてパッと見てデータの内容を把握しづらいというデメリットもあります。
例えば以下の画像は先述の内閣府のオープンデータをブラウザ(chrome)で開いた様子ですが、これを見てすぐに内容を理解することは困難です。(クリックすると内閣府のオープンデータが表示されます)

画像1

このままではExcelなどの表計算ソフトにインポートすることはできませんので、お馴染みのCSVに変換する必要があります。

JSONをCSVに変換するコマンド jq

JSONを人が見やすいCSVに変換するには jq というコマンドを使います。早速、以下の手順でインストールしてみましょう。

1. 公式サイトからWindows用のexeファイルをダウンロードしてください。

画像2

2. ダウンロードしたファイルを jq.exe という名前に変えてください(このあとコマンドを打つ時に楽になります)

3. C:\WINDOWS\system32 にjq.exeを移動してください。

4. スタートメニューにcmdコマンドプロンプトの意)と打ち、コマンドプロンプトを実行してください。

画像3

5. コマンドプロンプト上で jq --version と打って、以下のようにバージョン情報が返ってきたらインストール成功です。

画像4


コマンドプロンプトでJSONデータにアクセスしてみる

コマンドプロンプトで特定のWEBサイトの情報(ソース)を表示するには curl (cURL) を使います。このコマンドを使って、内閣府のオープンデータにアクセスしてみましょう。
内閣府のサイトを見ていると、「オープンデータはこちらから」という表示がいくつかあります。今回は以下の画像の赤線で示した地域別人口変動分析のデータについて、対象を「東京都新宿駅周辺」にして見てみましょう。

画像5

ブラウザのURLバーに https://opendata.corona.go.jp/api/ReductionRate?dataName=東京都新宿駅周辺 と打ち込み、それをコマンドプロンプトのcurlコマンドにコピペして実行すると、以下のような結果が表示されると思います。

画像6

訳が分かりませんね(笑)。これをjqによって見やすいCSVに変換していきます。

curl の内容を jq で整形してCSVに変換する

先ほどの curl コマンドの末尾に
| jq -r "."
を付けて実行してみましょう。すると、以下のように少し見やすく整形された結果が返ってきます。
※ -r は文字列の引用符を除外するオプションです。

>curl https://opendata.corona.go.jp/api/ReductionRate?dataName=%E6%9D%B1%E4%BA%AC%E9%83%BD%E6%96%B0%E5%AE%BF%E9%A7%85%E5%91%A8%E8%BE%BA | jq -r "."
{
 "errorInfo": {
   "errorFlag": "0",
   "errorCode": null,
   "errorMessage": null
 },
 "itemList": [
   {
     "date": "2021/08/08",
     "dataType": "12",
     "dataName": "東京都新宿駅周辺",
     "comparisonPreDay": "-12.5",
     "comparisonPreDeclare": "5.1",
     "comparisonPreSpread": "-34.1"
   },
    
~~~~~~~~(省略)~~~~~~~~

ここから先は、階層化されたJSONから必要なデータだけをどんどん取り出していく、いわば解体作業です。
末尾を
| jq -r ".[]"
に変えると、以下の結果になります。先ほどの出力結果に比べて、一つ階層が減ったのがお分かりいただけると思います。

>curl https://opendata.corona.go.jp/api/ReductionRate?dataName=%E6%9D%B1%E4%BA%AC%E9%83%BD%E6%96%B0%E5%AE%BF%E9%A7%85%E5%91%A8%E8%BE%BA | jq -r ".[]"
{
 "errorFlag": "0",
 "errorCode": null,
 "errorMessage": null
}
[
 {
   "date": "2021/08/08",
   "dataType": "12",
   "dataName": "東京都新宿駅周辺",
   "comparisonPreDay": "-12.5",
   "comparisonPreDeclare": "5.1",
   "comparisonPreSpread": "-34.1"
 },
 
~~~~~~~~(省略)~~~~~~~~

今回欲しいのは"date"…から始まる実際のデータを含む階層で、"errorFlag"...から始まる一番上の階層は不要なので、もう一段 階層を減らすために末尾を
| jq -r ".[] | .[]"
とします。

>curl https://opendata.corona.go.jp/api/ReductionRate?dataName=%E6%9D%B1%E4%BA%AC%E9%83%BD%E6%96%B0%E5%AE%BF%E9%A7%85%E5%91%A8%E8%BE%BA   | jq -r ".[] | .[]"
0
null
null
{
 "date": "2021/08/08",
 "dataType": "12",
 "dataName": "東京都新宿駅周辺",
 "comparisonPreDay": "-12.5",
 "comparisonPreDeclare": "5.1",
 "comparisonPreSpread": "-34.1"
}

~~~~~~~~(省略)~~~~~~~~

欲しい階層まで辿り着きましたので、ここからはデータの中身を取得していきます。結論から言うと、末尾を
| jq -r ".[] | .[] | select(.date?) | [.date, .dataType, .dataName, .comparisonPreDay, .comparisonPreDeclare, .comparisonPreSpread]"
とします。 select(.date?) の部分は先ほど削除した "errorFlag..." パートの残骸によってエラーが発生することを防ぎます。その後ろの [.date, ...] という部分で取得したい項目を指定します。

>curl https://opendata.corona.go.jp/api/ReductionRate?dataName=%E6%9D%B1%E4%BA%AC%E9%83%BD%E6%96%B0%E5%AE%BF%E9%A7%85%E5%91%A8%E8%BE%BA | jq -r ".[] | .[] | select(.date?) | [.date, .dataType, .dataName, .comparisonPreDay, .comparisonPreDeclare, .comparisonPreSpread]"

[
 "2021/08/08",
 "12",
 "東京都新宿駅周辺",
 "-12.5",
 "5.1",
 "-34.1"
]

~~~~~~~~(省略)~~~~~~~~

最後に、これまでのコマンドの末尾に
| @csv" >> C:\Users\owner\Downloads\sample_data_shinjuku.csv
を付けて、任意のフォルダにCSVファイルとして保存し、完了です。

>curl https://opendata.corona.go.jp/api/ReductionRate?dataName=%E6%9D%B1%E4%BA%AC%E9%83%BD%E6%96%B0%E5%AE%BF%E9%A7%85%E5%91%A8%E8%BE%BA | jq -r ".[] | .[] | select(.date?) | [.date, .dataType, .dataName, .comparisonPreDay, .comparisonPreDeclare, .comparisonPreSpread] | @csv" >> C:\Users\owner\Downloads\sample_data_shinjuku.csv

例として、同様の手順で新規感染者数のJSONデータもCSV変換し、人流データと組み合わせてExcelでグラフ化してみた結果が以下の画像です。内閣府のサイトには他にもいくつかオープンデータがあるようですので、興味のあるJSONデータで jq の練習をしてみると良いのではないかと思います。

画像10


(おまけ)CSVの文字コードを修正する

Windowsで保存したCSVファイルを開くと、以下の画像のように文字化けすることがあります。

画像7

こんなときは 右クリック メニューの「プログラムから開く」から「メモ帳」でファイルを開いて、「名前を付けて保存」の文字コードを「ANSI」に変換して保存してください。

画像8

すると、文字化けが解消されます。

画像9

以上、お読みいただきありがとうございました!