カテゴリーが/区切りで1列に記録されているのを何とかする
今日は少し軽めのTipsというか、特定の条件下での対処法の自分用のメモというか。
福岡市のオープンデータの中に屋台基本情報データセットがあります。
(FUKUOKA HAKATA YATAIの基礎データでしょうか?)
こちらのデータは緯度・経度まで含まれていて、今後の題材に活用するに良さそうだなあと思っているのですが、カテゴリーの列には「ラーメン/焼きラーメン/焼き鳥/おでん/餃子」のように、複数のジャンルが1レコードとして記録されていました。
その記録の仕方でも「ラーメンか焼きラーメンのどっちかが食べられればいいな」といったニーズには応えられるので、「明確に間違い」というわけではありませんが、私が近々作ってみようかなと思っているVizでは例えば「焼きラーメン」を出す屋台だけを絞って表示する、といった形にしたいなあと思ったので、Tableau側で何とかできないかと試してみた次第です。
なお、これから紹介する手法はデータ全体におけるカテゴリー数がそこまで多くない場合に有効です。
また、最初の方の手順はテキストエディタやExcel上で作業するので、純粋にTableau側だけで完結するものでもありません。
まずはカテゴリーがいくつあるのか数えてみる
- 先ほども書いたように、カテゴリーの値は「ラーメン/焼きラーメン/焼き鳥/おでん/餃子」という形になっているため、その列だけを別途テキストエディタに抜き出して、/を改行コードに置換します。
- 101軒の屋台のカテゴリー=101レコードが、394行のカテゴリー=394レコードに分解されました。
- このレコードをExcel上にコピーして、ピボットテーブルでデータの個数を数えることで、重複したカテゴリー名を12個のカテゴリーにまとめ直すことができました。
※テキストエディタなどの機能で重複レコードを削除するといった作業で代替してもかまいません。
※余談ですが、101軒のうち最も多くカバーされているのは「おでん」で81軒のようです。
パラメーターとCONTAINS関数でカテゴリーのフィルターっぽいものを作る
Tableauに屋台基本情報データセットから取得したsetai.csvを読み込みます。
この時点では、元のデータのとおりカテゴリーには「ラーメン/焼きラーメン/焼き鳥/おでん/餃子」といった形で値が格納されています。
……ということは、CONTAINS関数を使えば何とかなるのでは?と思いました。
途中の試行錯誤は省略しますが、最終的には
- パラメーターに、絞り込みたいカテゴリ名(12個)を用意しておく。ここではユーザーに選択させるためにパラメーター名を「食事ジャンルを選択」としました。
- 次に、計算フィールドで
IF CONTAINS([カテゴリー(末尾/)],[食事ジャンルを選択]) THEN [食事ジャンルを選択] END
- これによって、ユーザーが[食事ジャンルを選択]パラメーターで「焼きラーメン」を選んだ場合、元データのカテゴリー列に「焼きラーメン」を含むレコードのみを絞り込む、ということを実現できます。
※ここではカテゴリーに「焼きラーメン」を含まない屋台はNULLとなっていますが、地図表現などに置き換えればNULLの屋台は表示されなくなります。
なお、少々アドホックな処理ですが、[カテゴリー(末尾/)]計算フィールドは[カテゴリー]+"/"
という式にしています。
これは、パラメーターに/を用意することで「すべて」を表示するようにしたかったのですが、例えば「餃子」1本でやっているような場合にはカテゴリーの列の値に「/」が含まれていないので、カテゴリーが単一の場合でも「餃子/」という文字列になるようにして/を含めるようにしています。
※ちなみに、厳密にはこのCONTAINS手法だと、「焼きラーメンはあるが『ラーメン』はない」ところ(「明太中毒」など4軒の屋台が該当)も「ラーメン」で拾っちゃいますが、今回はあくまで手法の紹介・メモということでそのまま含めています。
軽めのTips……?
画像を除いたテキスト量はそんなに多くないから、軽めち言うたら軽めたい!
コメント