オープンデータの人口情報をPowerBIに地図に表現するまで | ライタス株式会社

代表の箕谷です。 成り行きでオープンデータに関する会合や、イベントに一時参加することが多かった時期がありますが、最近ご無沙汰している感じでちょっと浦島太郎です。 弊社は八王子市に本店がありますので、八王子市の人口データを地図にプロットしてみようというお題です。その時の記録を以下に残してみようと思います。

第1章 作業方針を検討する

まずは、お題目からどのような方法で解決できるかを検討します。 今回は「八王子市の地区別人口分布をPowerBIで表現する」をゴールにしようと思います。 PowerBIの概要等は、本記事では割愛しまして、データをどのように取り込めるのか、地図上にマッピングするためにどのような作業が必要なのかというところから紹介します。

作業方針としては、以下のようになるかなと思います。

  • 地区別人口データの収集
  • PowerBIで取り込めるデータへの整形
  • 地図マッピングに必要な緯度経度情報の収集
  • PowerBIへの取り込みとデータリンク付け
  • ダッシュボード完成

第2章 データソースの収集

第1節 データのあるところを探す

まずはデータがないと始まりませんが、人口データが公開されている場所を調べます。

一般的には総務省統計局から取得することになると思うのですが、推計値や都道府県レベルのデータになってしまうので、ちょっと扱いにくいです。

https://www.stat.go.jp/data/jinsui/

八王子市では、オープンデータを公開していて、町丁別世帯数及び人口が公開されていますが、各区画の人数で合算されているので、いまいち使いにくいです。

https://www.city.hachioji.tokyo.jp/hachiouji/jinko/004/index.html

年齢別データも公開されているので、こちらからGETしてくることにします。 https://www.city.hachioji.tokyo.jp/hachiouji/jinko/003/p030701.html

ここからデータを取得します。 今回は完全自動化は目指していませんので、とりあえず最新のExcel ファイルをGETしてくることにします。


第2節 データを使いやすい形に変換する

とってきたExcelになっているので、データとしては何とか処理できると思いますが、PowerBIで使うには、データの配置が悪すぎるので、データとして使いやすい形式(1行1データ)に修正していきます。

年齢別データは、"なぜか"隠しシートになっている"データ"あるので、これを料理していきます。


さすがにここはVBAで実行していくしかなかったので、力業で解決していきます。

1列目に町名を残しているのは、あとで地図にマッピングするためです。

町名に対応する緯度経度を取得する

いわゆるジオコーディングですが、弊社取引先の情報試作室相良様謹製のジオコーディングツールを使ってみたいと思います。 このジオコーディングは、ローカルでもPythonで稼働できるという優れものですが、今回は公開されているAPI経由でコマンドラインベースで取得しようと思います。

https://www.info-proto.com/jageocoder/

まずは町名一覧は、町丁別世帯数及び人口のデータソースからとってくることにして、PowerShellのシェルを使って取得します。 PowerShellに、以下コマンドを実行すると緯度を取得できます。

SHELL> $res = Invoke-RestMethod -Method Get -Uri "https://jageocoder.info-proto.com/geocode?addr=東京都八王子市"
SHELL> $res.node.x
139.316075
SHELL> $res.node.y
35.66657

これをうまく繰り返せば取得できそうだということで、こんなシェルを組んでみます。

$fileName = "city.txt"
$file = (Get-Content -Encoding utf8 $fileName) -as [string[]]
$geoURL = "https://jageocoder.info-proto.com/geocode?addr=東京都八王子市"
$Datas=@()
foreach ($line in $file) {
    $Data = New-Object PSObject | Select-Object city, lot, lat
    $Data.city = $line
    $query = $geoURL + $line
    $tlot = Invoke-RestMethod -Method Get -Uri $query
    $Data.lat = $tlot.node.x
    $Data.lot = $tlot.node.y
    $Datas += $Data
}
$OutputFilename = "geo.csv"
$Datas | Export-Csv $OutputFilename -Encoding Default

Google APIを使うパターンはこちらが参考になると思います。 https://www.northdetail.co.jp/blog/1478/

第3章 PowerBIでダッシュボードを作成する

第1節 データ取り込み

PowerBIでデータを取り込んでいきます。 この辺は、基本的な使い方になろうかと思いますので割愛します。

第2節 男女データから合計行を作成する

この章も割愛しますが、クイックメジャーで作成するのが楽だと思います。

第3節 町名データと緯度経度データをリンクさせる

まずはリレーションを張っていきます。


タイトル行がいい加減なのはご愛敬ですが、住所名称と緯度経度の値が紐づけばOKです。 紐づかない場合は、データが重複していたり(1敗)、町名の数字が全角になっていたり(1敗)しているので、変換していきながら調整していきます。 私の場合は、サクラエディタで一括置換を活用しながら対応していましたが、VSCodeとかで調整してもいいと思いますし、元データから抜いてくるときにVBAとかで調整してもいいと思います。

第4節 地図タイルにデータを設定する

ここまで来てやっとメインディッシュですが、地図タイルの使い方で結構苦労しました。 地図ビジュアルには、「マップ」と「塗り分け地図」の2種類がありますが、基本的な使い方は(たぶん)一緒です。 ただ、「塗り分け地図」のほうは、市レベルまでなら行けそうなのですが、町名データになったときに追従してくれず、今回作成したーデータ以外に郵便番号データと紐づけたものが必要になってくるかもしれません。

https://learn.microsoft.com/ja-jp/power-bi/visuals/power-bi-visualization-filled-maps-choropleths?tabs=powerbi-desktop

設定は単純なんですが、こんな感じです。


デフォルトはバブル表示なので、いまいち感ありますが、マウスオーバーするとデータが見える分便利かもしれません。

ヒートマップにすると、少し傾向がつかみやすいかもしれません。 ただ、この場合は、マウスオーバーさせてもデータは出てこなくなります。


第4章 作ってみての感想

オープンデータの取り回しは、プログラム的に回避したところが悔しいですが、クレンジングが必要という意味では、いまのところやむなしというのが現実であるということを改めて実感しました。

とはいえ、それっぽいデータが地図に乗るのは、見ていて楽しいので、やっぱりオープンデータは地図ありきになる傾向があるのもうなずけます。

今回はPower BIを使ったというところですが、Tableauとかでも当然似たようなことができるはずなので、得意なBIツールで遊んでみてはいかがでしょうか。

[参考] データクレンジングツールの活用

今回は結局使っていないのですが、データクレンジングツールというものが世の中にあります。

Alteryxは知り合いのデータサイエンティストもおすすめしていたので、機会があれば使ってみたいと思っています。

https://help.alteryx.com/ja

コメント

このブログの人気の投稿

Firefoxを起動したら、Couldn't load XPCOM. というエラーが出る時の対処法 | ライタス株式会社

[Virus Error]と件名に挿入されたメール

マテビュー(マテリアライズドビュー:Materialized View)のせいで、表領域が削除ができない | ライタス株式会社