オープンデータスゴイで目黒区データを加工してみた件

こんにちは！Riekoです。
Tableau界隈で有名な「オープンデータスゴイ」はご存じでしょうか？

## オープンデータスゴイとは

私はオープンデータスゴイの中の人ではないので、
まずはこちらをご覧くださいませ

[オープンデータスゴイ](https://sites.google.com/view/opendatasugoi)

ざっくりと言えば、
Tableauのエキスパートの集合体であるVIZZIESによる、
オープンデータとコミュニティの力を使って、
可視化や分析して地域貢献しよう！というプロジェクトです
（↑適当に言ってるだけなのでVIZZIESの方間違ってたら指摘してください）

## Round4!施設データを分析しよう

これまでRound1から錚々たる分析・可視化が行われてきたのですが、
今回は東京都目黒区の施設データです。
「施設データってなんやねん」って最初は思った（VISSIESさんごめんなさい）のですが、
保育所、交番、障碍者施設などなど目黒区の管轄にあるあらゆる施設をキーにして、
いつできたのか？何の用途なのか？建物名は？土地面積は？
といった、よく見ると目黒区の福祉や地域事情を表す、
夢とロマン（？）が詰まったデータです。

## どんなデータ？
百聞は一見に如かず、Excelファイルを切り取ってお見せすると、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3666377/2091661c-ae88-271a-4dc4-19259e86612f.png)

うん、長い。テキストが長い。
でもひとまず第1正規化はされてるので、そこは安心しました。
（第1正規化できてないと、見た瞬間拒否反応起こしちゃうので...）

さていよいよ、Prep君に読んでもらいましょう

## Prepで見てみる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3666377/99c3c319-3442-ef57-28e8-537c1944ebfc.png)



...おわかりいただけただろうか.....

私のようなアラフォーにもわかるように、大事なところを切り取りましょう

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3666377/68d8f355-6da5-2071-37d2-63fdbaf00761.png)

「列数って190あんねん」

某スーパーモデルの声が聞こえました。
もうこうなると目視で全部確認って不可能なんよ。
でもこれ、実務あるあるなんよ。
列数がせいぜい20未満とか親切設計なのは、サンプルスーパーストアだけなんよ。

がしかし、既に整形し終えたつわものの仲間がたくさんいるので、
強い意志を持ち、加工の道へと歩んだのでした。
（めでたしめでたし）

## で、どうしたか

ここでは詳細な加工の内容は紹介しません。
そもそも私の加工結果が正しいのかもよくわかりません。
私が何をしたか、めちゃめちゃざっくりご紹介すると、

1. みんな大好き横持データはピボット解除
1. ファクトテーブルとマスタに分ける（マスタは「建物・土地」と「施設」）
1. 欠損値はみんなNULLにしてしまった（いいのか？）
1. 和暦は西暦に変換（chatGPT君、ありがとう！）
1. 「建物・土地」に表記ゆれがあり過ぎたので、先人の知恵により名寄せ

などなどです。

あとやりたかったけどやれてないこととしては

1. 「H3.1.1~R3.1.1」みたいなテキストデータを「開始日」と「終了日」に分けて全部DATEにする
1. バリアフリー適合状況列の「エレベーター、トイレ...」みたいなのを、全部SPLITしてピボットして縦持ちにする

どちらも時間かかりすぎるので今回はスコープ外としました。
正直、完璧に綺麗なデータにしようと思ったら時間がいくらあっても足りません。
実務でやれと言われたらやるしかないけど、あくまで練習なので...
ただ、実務でやるのも辛いので、
もしかしたら「完璧に綺麗なデータを作る」よりも
「必要な列だけ必要な人が取り出して、使いたいように加工する」方がいいのではないかと思いました。
「バリアフリー適合状況」に関しては、個人的にVizづくりに挑戦したいと思ったので、
別途バリアフリーだけのマートを作りたいと思いました。

で、今回作ったフローの全体像はこちらです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3666377/73b0d8f6-58a1-d75f-9597-450fae6cc428.png)

## 今回の加工で感じたこと10選

今回のフロー加工を通じて色々学びましたが、ざっくりあげるとこんな感じです。

1. 要るかわからないけどとりあえず列残しておく、のはありなのか
2. 項目の定義があるだけでも助かる。今の実務はない
3. 耐震のテキストデータは課題。でもこれをちゃんとすればいい分析ができそう
4. 建ぺい率と容積率の「・」はどういう意味なの不明で置いてる。
5. 今回はエキスパートがやってくれたけど、実務だと自分でユーザーとデータ定義を確認するやり取りが必要
6. データ定義は chatGPT 便利すぎる。でも実務では会社情報教えてくれない
7. 名寄せは、値のグループより計算フィールドによる上書きの方が正確かも
8. 土地名とか土地 ID はないのか。土地を一意に識別できない
9. データの発生元は？どっかの RDB から取得？手作業？
10. CASE 文は or 使える！

では、多いので一個一個さらっとピックアップ。

### 1.要るかわからないけどとりあえず列残しておく、のはありなのか

列、多いんですよね。そんなに要るか？みたいな。
なので要らない列はさっさと削除しておいた方がいいと思うのです。
勿論その方がパフォーマンスも良くなるし。
でも、「誰かが使うから」とか「いつか使うから」とかで残してること多いと思うんですよね。
実務でも、使わない列いっぱいあります。
自分は使わないけど、「いつか」「誰か」使うから残す。
それは果たしてベストプラクティスなのか？と思うわけです。
とりあえず必要な列だけ残して、後から要るとなったら復活、というのはできないのかな？とも思うのですが、いかがでしょうか？

### 2.項目の定義があるだけでも助かる。今の実務はない
今回テーブル定義書的なものを頂いておりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3666377/6b60b967-8c88-94ca-5cfc-d976ae46681b.png)

全部見たい方は[こちら](chrome-extension://efaidnbmnnnibpcajpcglclefindmkaj/https://www.city.meguro.tokyo.jp/documents/725/2shisetsuitiranmikata.pdf)

これが非常に助かりました。
でも、実務ではこういうの無いこともあるんですよね。
だからこういうのちゃんとすること、がめっちゃ大切だと感じました。
ただ、中には、こういうのもあるので、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3666377/487aad60-5fd8-6a1a-cf8b-3ab596ea207b.png)

いや、ちょっと待って（ください）
色々足りてない（ですよ）、というのもありました。
皆さん、テーブル定義はちゃんとしましょう。明日のみんなと自分のために。

### 3.耐震のテキストデータは課題。でもこれをちゃんとすればいい分析ができそう

「耐震診断」という列があってですね。
Prepのプロファイルペインで上の方見るとこんな感じなんですね

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3666377/3646eb8b-f8c1-3c31-a876-507e86f95b39.png)


あ～はいはい、耐震診断やった年の和暦ね。
西暦に直して備考欄に分ければ余裕じゃね？
と思うじゃないですか。
ところがどっこい、下にスクロールすると

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3666377/e366105c-3340-5b3e-a559-98d3cfa189fc.png)

んんん？まじか～
学校の場合、校舎と体育館で耐震診断年度別なんですね。
これをどう分けるか？
思いつく限りではSPLITしてピボットして縦持ちにするくらいなんですが、
いいアイデアあれば教えてください。
ちなみになんでこの列に着目したかというと、
私今住んでるマンション旧耐震なんですよね。
理事会でも地震来たら怖い怖いってみんな言ってて。
なので「公共施設の防災耐性とは？」みたいなViz作ったら面白いなと思いました。
ただ「新耐震以降」でまとめられてる値をどう扱うかが課題ですね。
（新耐震のマンションに住んでる方は富豪だと思ってます）

### 4.建ぺい率と容積率の「・」はどういう意味なの不明で置いてる。

「建ぺい率」って何やねん？
とまずそこからなのですが、
chatGPTに聞いてみると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3666377/a29969c1-4e6c-71d9-29ed-ef3b679dff1b.png)

だそうです。
一戸建てで言うと「庭が広いか」「家が広いか」みたいな感じですかね。
（そもそも今回は一戸建てではない、というのは置いといて）

で、そのデータがですよ、Prepで見るとこうなってるわけですよ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3666377/ab417395-5b0c-2ea4-9fcb-4864cd1ced12.png)

いやいやいやいや.....
「50・60%」、50なのか60なのかどっちなんだい？ってわけですよ。
とりえあえずchatGPTに聞くと

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3666377/905c8807-03f6-aa3a-daf2-9f75a217b8a6.png)


とのことですが、「ほんまかいな」っていう、正直あんまり信じられないので、スルーすることにしました。詳しい方、教えてください。

### 5.今回はエキスパートがやってくれたけど、実務だと自分でユーザーとデータ定義を確認するやり取りが必要

今回、多くの表記ゆれが発生していました。
が、事前にPrepエキスパートkomatsuさん（@antipop1）とVIZZIESでありPrep Starのもりたさん（@hiroakimo_tw）が、目黒区さんと相談して統一してくださいました。
それがこれ↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3666377/3c16c6e1-3d34-7c94-c43f-698da5b87358.png)

いや～神過ぎる。
名寄せはそこそこ大変だったけど、
「信じられるものがある」というのが何よりの心の支えで、
1ステップずつ頑張って取り組めました。
でもこういうのって実務ではかなり大事な部分で、
整合が取れていないデータの部分を、ユーザーと確認して認識を合わせていく、
（決して「あなたたちのデータ~~汚い~~整ってないですよ」なんて言ってはいけない）
そういうプロセスもかなり大事だな～いやむしろ根幹だな～って思いました。

### 6.データ定義は chatGPT 便利すぎる。でも実務では会社情報教えてくれない
さきほどの「建ぺい率」のように、
分からない用語をchatGTPに片っ端から聞きまくりました。
まあ完全に合ってるか分からないけど、そこはもう信じるしかないです。
でも、実務って、生成AI教えてくれないんですよね。
なぜなら殆ど会社情報だから。
会社情報を学習させてるスーパーカスタマイズAIがいたらいいのですが、
それが実現する未来はまだまだ先かも。
特に私のような立場弱い人間はユーザーさんや上司になかなか会社情報聞けないので、
AIが助けてくれたら1000倍楽なのにな～と思ってました。

### 7.名寄せは、値のグループより計算フィールドによる上書きの方が正確かも
こちらは単にPrepのtipsです。
Prepには、「値のグループ」といって手作業で特定の値を置換できる機能もあるのですが、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3666377/016b7bbf-1703-b50f-3aaa-6a5b662c33ee.png)
置換というものは値に対して行うもので、
特定の行だけ置換するのはまた別の話になってくるんですね。
上記画像の「建物備考」とかだと表全体で一意（一個しかない）のが多いので「値のグループ」使ってもOKなのですが、
「-」を置換したいってなると、特定の行だけでなく他の行の「-」が全部置き換わってしまうので、そういう場合は計算フィールドで列を上書きしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3666377/3ffc56b0-771f-f27e-fdef-7cb82b8a721f.png)

ちなみにこの方法だと一気に色んな行を置換できるので、
ステップ数を減らすのにも使えると思いました。
まぁ、計算式書くのめんどくさいので値のグループも結構使ってしまったのですが....

### 8.土地名とか土地 ID はないのか。土地を一意に識別できない
このデータ加工でマスタに分けるってなったとき、
だいたい表と先ほどの定義書さらっとみて「施設」「建物」「土地」の3つに分けられると思ったんですね。
で、実際分けたのですが、土地がこんな感じなわけです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3666377/3e00d409-69b4-9f5b-2c90-51cab37a7e56.png)

え？主キー何？ってなりません？
そう、「土地を一意に識別する何か」が何もない、そう何もないのですよ。

なのでこれはもう諦めて、「建物・土地」マスタを作りました。
ん～でも建物と土地って別じゃないのかな？
同じ土地でも建物が違う、みたいな？
その辺もドメイン知識がないのでよくわからないです....
そういうわけでなんとなくもやもやしたのでした。

### 9.データの発生元は？どっかの RDB から取得？手作業？

今回結構たくさんのデータなので、もしかしてDBに貯めてあるのかな？と思ったのですが、
実際どうなんでしょう？
値の型が曖昧な部分もあるし、でもこういうデータこそ正規化してデータレイクなり貯めていく必要があるのでは？と思いました。
オープンデータ、私の愛する大阪市でもがっつり活用されていますが、
その辺のデータ基盤やデータマネジメントの実態が気になったのでした。

### 10.CASE 文は or 使える！
こちらは勉強会で学んだPrepのCASE TRUEの書き方についてです。
PrepのCASE文はSQLとは少し違っているのですが、CASEの後にTRUEを書けばWHENの後に条件文が書けることを勉強会で知りました。
詳しくはこちらをどうぞ

[Tableau Prep Tips集２２　ーCASE関数ー](https://note.com/tableauprep_user/n/n76b60bd690af)

で、今回やりたかったのは、私が作成したファクトテーブル（っぽいやつ）の「費目分類」を作る式で、
結果的にこのような計算フィールドを作りました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3666377/c7ed650c-f32e-47e0-6986-2bde2849b00d.png)

最初、orを使ったらエラーが出ると思って、勉強会でもそう発言したのですが、
それはタイプミスによるエラーで、
ちゃんと動くことが分かりました！
やはりCASE文、便利ですね！
（知っている方からしたら当たり前すぎてすみません）

### （番外編）正解はない
データ加工に正解、ないんですよね。
でも毎週Preppin Dataやっていると、正解があるので、正解と合えばOK!ってなってました。
でも、実務でのデータ加工は正解が与えられていない。
与えられていたらそもそもやる必要がない。
というわけで今回「正解のないデータ加工」に取り組めたのは、貴重な経験でした。
人生に正解がないのと同様、データ加工・分析・可視化etcすべてにおいて正解はない。
なんかかっこいいこと言っている気分になります。

## おわりに
なんかとても長くなってしまいましたが、
長文に付き合ってくださった方ありがとうございます！

オープンデータってすっごい面白いし、
サンプルじゃなく実際のデータって本当実世界を反映しているなって思いました。
また、改めてデータ加工が好きだなって実感しました。
（データって手段であってそれ自体目的でないので、データ加工が好きというのも微妙な気がしますが）

ではまた、次回もお楽しみに！

追伸：オープンデータスゴイRound4、ぜひチャレンジしてください！

https://x.com/hiroakimo_tw/status/1885140305596567591

Rieko