すべての始まり
DATASaberをチャレンジしてから、ずっとこのコンビニ勢力図に憧れていた。
こうデータを自在に取得できて、可視化もサクサクできたら、世の中のことをより深く分析できて新しい事実をキャプチャできる自由があるんだろうなあ、と。
私もそうなりたい。よし、チャレンジしよう!
ピュアなモチベーションが地獄の門を開いたとは、このとき私は気づいていなかった。
まずは手持ちの知識、スキルで勝負する
ひとまずトライしてみよう。
にゃんこそばさんのコンビニ勢力図は、Yahoo!ローカルサーチAPIから取得した、とのことだったので、私もそこから取得した。
pythonを書く必要があり、そこらへんはわからなかったので同じチームでpython書ける人に補助してもらいながらデータ抽出してもらった。
よっしゃ、これからやっとはじまるな?
緯度、経度も設定して・・・と
住所のカラムも地理的役割>市区町村で設定してあげれば・・・でるはず!
Addressをキャンバスにドロップダウンすれば・・・どうだ?
あれま・・・何も出ない・・・
え、したら緯度、経度をX,Y軸にもっていって、ディメンション「Name」をドロップすれば地図になるか?
オイ?
東京の輪郭は見えるが、ちがう。あ、荒川が流れてる右上の部分はちゃんとコンビニがないのがわかる。荒川の輪郭が見えて面白い。東京都の右側ってこんなにコンビニなかったっけか?
さてと、どうしようか。
地図データ表示するための基礎知識を復習する
そもそもtableau上で地図データを表示するための前準備がバカだったのだろうか、いや、そうに違いない。地理的役割与えればなんとかなるって考えてるだけだから、知識の修正が必要そうだな。
復習として、サンプルスーパーストアのデータを見てみるか。
あのデータだったら、こんなふうにイメージ通り都道府県の表示をすることもできたし。
なるほど、地図データが国/都道府県/市区町村に分かれているんだな?
なるほど、住所をそのままぶっこんでそのまま地理的役割を無理やり当てはめようとしていたところがまずかったのか。
よし。では一度難易度を下げて、東京23区の家賃相場の比較マップを作ってみよう。
エクセルでデータを用意して・・・
Publicに入れてあげて・・・
都道府県のカラムには、「都道府県/州」の地理的役割を与えて・・・
23区には、「市区町村」の地理的役割を与えてあげて・・・
よし、あとは都道府県と1LDKのメジャーをドロップするだけだ!
あれまぁ
難易度を下げたつもりが、さらに新しい宿題を生んでしまった。
このままだと23区の表示おろか、全国コンビニ勢力図を作るうえで、都道府県の粒度でしか分析できず、より細かい市区町村別までの粒度では表示できなくなってしまう。うむむ・・・。
ググるか。
「市区町村」ではなく、「群」を選べ??
Tableau マップについてというサポートサイトがあり、日本の地図データサービスについて記載があるようなので、確認してみた。
・・・ん・・・?
この説明だと、市区町村の表示がサポートされていないわけではなく、市区町村では点だけの表示になってしまい、群であれば領域での表示ができるということか??
ほんとか???
ほんとだ(唖然)
これ、初見殺しすぎでしょ。領域で表示したいときは、群でないと表示できないのか・・・
そしたら、さっき地理的役割を地区町村に設定したとき、点しか表示されなかったのは正常だったのか。
したら、サンプルスーパーストアで地理的役割を群に設定したらどうなるんだろうか?
サンプルスーパーストアで群を使って表示トライしてみたら、ふりかけみたいになっちゃった。登録がない地域以外は全部消えちゃうのね。。。(日本地図全体を表示しつつ、データに記載ある群も表示したい場合はどうすればいいか、とまた新しい宿題ができたけど、一度無視しておく)(ところで、179個が不明って一体なんだ??)
大阪に絞って、コンビニ勢力図を作成してみる
なるほど、応用すべきことは
①住所のデータを、国/都道府県/市区町村、の列に分けてあげると地図データとして表示できる
②市区町村の粒度まで表示したい場合は、地理的役割にて市区町村ではなく群を選ぶ。市区町村だと点だけの表示になり、領域での表示にならない
の2点だな。
ではまず①のとおり、取得したデータの住所が十把一絡げになってしまっているので、国/都道府県/市区町村に分けてあげよう。
こうしてあげて(整形に15分食った、エクセル使い慣れてない)
できたー!!・・・あれま・・・?
なんか真ん中が抜けてるな。大阪市がごっそり抜けてる?
コンビニ×市区町村でマトリクス表にして出力してみたが、大阪市のデータは存在する。なぜだ?
「場所の編集」に「不明な場所を修正してください」とあるな。見てみるか。
なるほど。堺市と大阪市がごっそり抜けてたから、真ん中が抜けていたのか。ここをしっかり紐づけてあげれば、地図データとして表示できるな?
うわー堺市と大阪市の中にこんなに区があったのか。住所データの成型を再度しないといけないな。
エクセル上で市区町村の抽出に工夫入れないといけなかったか。これは勉強になるし、これ以上にジオコーディングは沼なんだろうな。
データ整形中・・・(さらに時間食ってしんどい)
できた!「○○個が不明」との表示もないから、全部表示できた。ひとまずクリアした!なんとかして地図データを表示することができた!ここまでが長かった・・・。
よし、続いて、「各市区町村にて、数が一番多いコンビニチェーン」を表示させるか。これが全くイメージつかないな・・・。
いよいよ、優勢コンビニチェーンを表示させるための準備にチャレンジする
手順を立てるか。
①コンビニ店舗数を表示する
②最大コンビニ店舗数を表示する
③そのコンビニはどこなのか、表示する
やってみよう
まずは①の、市区町村×コンビニのマトリクス表でのコンビニ店舗数を表示することができた
②の最大コンビニ数も表示することができた。
最後に、IIFとFIXED使って、最大コンビニ数に該当するコンビニを表示すれば、できるだろう。
FIXEDで最大コンビニ数を表示させ、IIFにて最大コンビニ数に該当するディメンション「コンビニ」を表示させるようにすれば、可能でしょう。
なぜだ~~。できなかった・・・残念・・・しんどい・・・。
(30分ほど調べた)
(が、死んだ。わからない。)
・・・めのまえがまっくらになった・・・
(1か月試しては諦め、試しては諦めを繰り返しておりました・・・)
【DATASaberの師匠らに相談】原因は、クエリパイプラインの理解不足
地獄を彷徨い1か月、DATAsaber師匠の方々に相談してみた。
お師匠「最後のエラー分に関しては、クエリパイプラインが問題です。未来の値で、過去をFIXEDできないです。」
お師匠「FIXEDの引数は物理的な情報を与えないといけないので表計算結果であるWindow_Maxとかの戻り値は入れれませんね。」
クエリパイプライン・・・?
未来・・・?過去・・・?
表計算の結果は入らない・・・?
クエリパイプラインはDATAsaberのOrdealの中で勉強していたつもりだったが、ここで理解不足が顕著になった。ツケが回ってきた。
お師匠「まずクエリパイプラインとは、ベルトコンベアで流れていく工場のラインみたいなものです」
「下流で処理したものを上流に持ってくることはできない」
「WINDOW_MAXは表計算のため、FIXEDにて結果を出力することができないんです」
ここの部分、Tableauの根幹を理解するうえでとても重要なので、クエリパイプラインの基礎に立ち返りつつ、なぜ私が作成した計算フィールドが動かなかったのか説明する。
下記クエリパイプラインを使用しながら説明する。
上記画像引用元:[Tableau Tips]Tableauの計算順序(クエリパイプライン)の覚え方と、もっと細かい情報|みのる (note.com)
※引用元のブログにて「図は商用利用以外であれば引用/転載しても問題ないが、本noteへのリンクを張ってほしい」との説明があったので、使わせていただきました。みのるさん、ありがとうございます。
クエリパイプラインとは、元データがVizとして可視化されるまで、どのような処理が順序立てて行われるかを表してくれる。
詳しい説明はぜひ画像引用元のブログ、あるいは出回っているクエリパイプラインの説明のほうが数倍わかりやすいが、ひとまずここで念頭に入れるべきは、処理の後戻りができない、ということだ。
そして、私が犯したミスは、後戻りをしようとしたのだ。
今回のケースでいうと、表計算にて集計したWINDOW_MAXを、FIXEDにて引っ張りだそうとしたことでエラーが生じた。だから、エラー文にて、「詳細レベルの式には、表計算やATTR関数を含めることはできません。」と表示がしたのだ。
もう少し、サンプルスーパーストアのデータを使って実例も用意しつつ説明する。
{ FIXED [市区町村]: SUM(売上) } これは出力可能だ。
FIXEDはデータソース上での処理で、集計の一部であるSUMもデータソース上で行われるため、こちらのFIXED計算式は出力可能だ。
{ FIXED [市区町村] : COUNTD([オーダーID])} これも出力可能だ。
COUNTD(個別のカウント)は、SUMと同様に集計関数になるため、データソース上で処理されるため、FIXEDで粒度をそろえて集計することができる。
ちなみに、同様の集計関数でAVG(平均)も使えるため、
{ FIXED [顧客 Id]: AVG([売上])} も出力可能だ。
では、各都道府県にて、で一番売上を上げたサブカテゴリの金額を表示するときはどうだろうか。LODで表現できるだろうか。
{ FIXED [都道府県]: WINDOW_MAX(SUM([売上]))} これは表示できないのである
なぜかというと、WINDOW_MAXは表計算関数になるため、データベース上での処理ではなく、tableau上の処理になってしまう。tableau上の処理を、データベースに戻してFIXEDで計算しようとしている、つまりベルトコンベアを逆走してしまっているのである。
だから、表示できないのである。
さらに言うと、今回用意した大阪コンビニデータは、メジャーの情報がなく、各コンビニ店舗がどこのコンビニチェーンで、どの市区町村にあるのか、というディメンションデータしかない。そのため、できるのはCOUNTDで個別カウントするくらいが関の山だ。
・・・そういうことだったのか・・・
そういうわけで、クエリパイプラインを念頭においた作成の仕方を行っていく。
ついにできた!大阪コンビニ勢力図
手始めに計算フィールド「コンビニ店舗数」にて、コンビニの数をカウントする計算フィールドを用意する。市区町村×コンビニでのマトリクス表にて、各セルのコンビニ店舗数を表示することができた。
地理的役割を群に指定したディメンション「市区町村」を表示させる。
次に、ディメンション「コンビニ」を、マーク「色」にドラッグアンドドロップする。
フィルターに計算フィールド「コンビニ店舗数」(COUNT([コンビニ]))をドロップし、簡易表計算からランクを指定してあげる。
市区町村の軸でのランキングではなく、コンビニの軸でのランキングで表示させたいので、「コンビニ」にチェックを入れる。
おー!できたー!!ついに!うれしい!!なるほど、クエリパイプラインの最後の方にある表計算フィルタ(RANK)を使って、1位のコンビニチェーンのみ表示しているのか。
ついに要件への達成が近づいてきた!!
↓作成したVIZ
いよいよ全国に反映してみる
大阪だと、ファミリーマート一色になってしまい楽しくないので、群馬、栃木から西を表記してみる(力量不足でデータがこれくらいしいか取れなかった)
まあまあ穴が多かったので、場所の修正を行っていく
多いな、19個だからなんとかなりそうなものの。
群の中でもさらに町と分かれているケースもある。これは難しい。
今回は虫食い地図になるけど諦める。データ抽出の際、いくつか設定してあげてたら問題はなかったかな。正直時間がないので、今回は諦めて、虫食い地図で表示することにする。
この表記揺れの問題、ほかの皆さんどう解決してるんだろう・・・?今後の宿題にして頭に止めておこう。
まず、ディメンション「コンビニ」をマーク「色」にドラッグアンドドロップする。
つづいて、フィルータに計算フィールド「コンビニ店舗数」(COUNT([コンビニ]))をドラッグアンドドロップする。
ひとまず、この状態で適用する。
つづいて、表計算を追加、から設定を行っていく。
計算タイプは「ランク」に設定し、特定のディメンションにて「コンビニ名」を選択する。
最後に、フィルターの編集、をクリックし、1位のみ出力されるように設定してあげると・・・
わあああ・・・ついに出来ました。ありがとうございます!!
↓作成したVIZがこちらになります。
無理にFIXEDで抽出しようとするのは万能ではなく、しっかりとクエリパイプラインに準じて、柔軟に対応する必要もある・・・ということですね。本当に勉強になりました。
まとめ
すごい長ったらしくなってしまった。ここまで読んでいただいたみなさん、ありがとうございます。
Tableauの機能面を説明しているブログはわんさかあったので、今回私は奮闘記を書いてみました。これほどまでに奮闘するとは・・・涙
このクエリパイプラインをしっかり理解し、かつ使いこなすためには時間がかかった。
しっかり理解するためには、①LODを使用しているVizの写経、②自前で設定したテーマでLODを使用したVizを作成する、が肝要だと思う。
①の写経は特に効果があったので、おススメの写経VIZを下記紹介しておきます。
以上、長くなってしまいましたが、読んでいただきありがとうございます。