🍊

DATA Saber挑戦中にハマった技術的な話を紹介する

2023/04/17に公開

はじめに

  • 2023年2月末からDATA Saber認定制度というものに挑戦しています。Tableauを使っている人は耳にしたことがあるかもしれませんが,Tableau操作テクはもちろん,組織内・ひいては世界にデータ利活用の文化を広めるために何ができるか,ということを学び実践し伝えることをミッションとしています。
  • そしてDATA Saberになるためには2種類の課題をクリアする必要があります。
    • ひとつが10個の技術試験。
    • もうひとつがコミュニティポイント50ptというもので,イメージだと伝承試験。身の回りのコミュニティを成長させる活動が求められます。
  • この後者のコミュニティ活動にブログ執筆が含まれていまして,ここでは備忘録兼道標として,DATA Saber認定制度挑戦中に自分が沼にハマった技術的な話を書き残したいと思います。
  • DATA Saber認定制度に挑戦する方々に少しでも参考になれば幸いです。

Tableau Desktopの操作についての話

  • 各問題に関わるテクニックについてはDATA Saber制度創始者のKTさんのチャンネルを見ていただいたほうが丁寧に知識を得られるのでおすすめです。
  • 以下ではその前段階のようなところで自分がつまずいたことを3点書こうと思います。

地理的役割を階層的に与える方法

  • Tableauは地理の区域ごとに色分けができます。これぞVisualizeって感じですね。サンプル - スーパーストアでいう都道府県ピルに地理的役割(Geographic Role)を与えて,緯度経度を自動生成して地図を背景にしてプロットする,というイメージです。
    • 都道府県による色分け
  • で,ここから都道府県別でなく"地域"別に色分けしたい,とします。
    • 地方による色分け
  • そのとき,"都道府県"と同様,"地域"(近畿地方とか)にも地理的役割を与えたいのですが,Tableauにデフォルトで入っているものの中に"地域"に当てはまるものがありません。
    • デフォルトで選択できる「地理的役割(Geographic Role)」
      • デフォルトの地理的役割
    • 「国/地域」を選択しても認識不可となってしまいます。
      • 国地域を選択した場合
    • 公式ドキュメント: Tableau マップについてでも,都道府県と市区町村はあれど,地域は対応していない,とあります。(2023/04/17時点)
      • 公式ドキュメントでの説明
  • ではどうやって"地域"にも地理的役割をもたせるか,ですが,まず"都道府県"に地理的役割を与えて,それを引用する形で,各"地域"に地理的役割をもたせます
  • この順序の通り,先に"都道府県"に地理的役割を与えていると,"地域"に地理的役割を与える際,デフォルトにはない項目が追加されています。
    • 都道府県に地理的役割を与えた後
    • これを選択して地理的役割を与えると,自動的に階層が作成され,地域ごとに区切った地図上の表示ができるようになります。
  • ここで"地域"と"都道府県"の関係を表で見てみると,各"地域"に"都道府県"が内含されている状態です。
    • 地域と都道府県の関係を表でみる
    • つまり,各"都道府県"を各"地域"に振り分けてまとめて,地図上に表示できる形(上の写真)にしている,ということになります。
    • これを活用すれば,自分の好きな振り分け方でまとめることができます。例では,グループ機能を使って海に面している/いない都道府県をまとめています。
      • 海なし海あり都道府県_map
      • 海なし海あり都道府県_table
  • かつ,"地域"と"都道府県"が階層関係になるため,Date型のピルを年->四半期->月->日と深堀りしていくように,最初は地域でみていて,そこから都道府県へと深堀りすることができるようになります。
  • 上で書いた公式ドキュメントがこの記事の執筆中に見つかったので,遠回りにはなりましたがこの記事書いてよかったなと思います。

テーブルの結合とリレーションをどう構築するか

  • 複数のテーブル同士をつなげるときに特に使用頻度が高い(と思う)のが,結合とリレーションです。違いを理解するのも難しいしどう操作してそれを実現するのかもつまずきました。
  • で,ここでは結合とリレーションをどうTableau上で実現させるかを書きます。
  • まずリレーションですが,
    • ExcelやCSVのようなファイルであればファイル内のシートが併記されるので,1つ目のシートをドラッグアンドドロップ,2つ目のシートをそのにドラッグしてきます。
      • リレーションの初手
      • ちなみにすぐ下に置くとユニオンといってまさしく縦方向にならべるつなげ方になります
        • ユニオンの初手
    • すると橙色の線が出てくるのでそこでドロップして,そのあと下側でどうリレーションさせるかを定義します。
    • つまり,1つ目のテーブルと2つ目のテーブルが何をもって関係しているかを指定します。例えば違う列名をもったものだと自動でくっつかないので,ここで指定できます。
    • リレーションを定義する
  • では結合はどうするのか,ですが,
    • 1つ目のシートをドロップしたあと,「開く(Open)」を選択します
      • 結合の初手
    • そのあとテーブルをリレーション同様もってこようとすると,橙色の線ではなく枠が登場するので,ここにドロップします。
      • 結合の第二手
    • そのあと,結合を考える際にはお馴染みのベン図が登場し,リレーションのときと同様に,どうテーブル同士をつなげるか,を定義します。
      • 結合の第三手
  • 自分の勘違いは,2つ目のシートをドロップしたあとの操作でこの結合画面が出てくるものだと思いこんでいたことで,かなり時間を費やしました。
    • 個人的には「開く(Open)」っていう書き方が結合の画面にいくものだと認識しにくいので別のものにしてほしいです。すみません次からちゃんと説明書読みます

Date型ピルと裏で動いている関数について

  • 結論から述べると単にDATEPART()DATETRUNC()の話なのですが,まずは次の画像を御覧ください。同じピルで同じ折れ線グラフなのに,異なるグラフになっています。
    • Aのパターン
      • Aのパターン
    • Bのパターン
      • Bのパターン
  • ここにDATEPART()DATETRUNC()の違いが効いてきます。
  • まずDATEPART()ですが,
    • こちらは不連続(Dimension)タイプのDate型ピルをシンプルに列もしくは行シェルフにもってきて,プラスボタンで深堀りしたあと,ピルをダブルクリックしてみます。
    • すると,内部ではDATEPART()関数が使われているようです。
    • 日付ピルの中身がDATEPARTの場合
    • 「PART」というとおり,日付の一部分を切り出してくるもので,たとえば"2020年10月10日"も"2021年10月10日"も,「月」部分は「10月」です。ピルもデフォルトが青色で不連続型(Discrete)です。
  • ではこのDATEPART()の代わりにDATETRUNC()を使うとどうなるのでしょうか。
    • DATEPART()のときの最初の手順でもってきたピルをダブルクリックして関数を入力してみます。
      • 日付ピルの中身がDATETRUNCを入力する
    • するとピルが緑色,つまり連続型(Continuous)に変わり,シェルフの末尾に移動しました。
      • DATETRUNCに変更した直後のシート
    • ただしTableauのにくいところは,連続型のデータであっても不連続に変更できる(できてしまう)ことです。
      • DATETRUNCを不連続型に変更する
    • すると見た目がDATEPART()と同じ名前のついた青色のピルになりました。
      • DATETRUNCを不連続型に変更した後
    • ただこれらを比べると,情報量が違います。DATETRUNC()に書き換えたピルは月の情報だけでなく年の情報も持っています。
    • DATETRUNC()の"TRUNC"はプログラミングする人や英語圏の方は馴染みが深いのだと思うのですが,"truncate"の略で,「切り捨てる」という意味だそうです。
    • 例えば,"2020年10月10日"を月で切り捨てると"2020年10月(の初日)"になり,"2021年10月10日"を月で切り捨てると"2021年10月(の初日)"になり,異なるデータになります。
    • (データソースによっては一番最初のピルの時点で連続(Continuous)タイプの日付データですが,この場合,シェルフにもっていった時点でDATETRUNC()関数が使われます。)
  • この話は関数に触れなくても実現できます。その話をするべく,冒頭の話に戻りましょう。
  • まず売上を分析するとして,売上ピルをシェルフにもっていき,そのあとDimension型の日付ピルをシェルフにもっていき,日付ピルのほうはドリルダウンして月ピルだけにします(ここではDATEPART()が使われている)。すると横軸は月のみになり,年の情報がなくなります。
    • Aのパターン
  • ここで月(オーダー日)ピルを右クリックして,2種類あるうちの後半のほうの「月」を左クリックします。(「5月」と「2015年5月」と注釈が書かれているうちの後者です。年の情報が維持されているのでDATETRUNC()が使われそうなのが伺い知れます)。
    • ピルから関数を書かずにDATETRUNCへ変更する
  • すると月(オーダー日)ピルが緑色になり,グラフも元の12点から48点に増えます。これは年の情報が加わったためです。
    • 2015年5月を選択した後
  • さらにこのピルを不連続型(Discrete)にしてみましょう。すると横軸が再び変化しました。これが一番最初に示したもう一つのグラフです。
    • 不連続型に変更する
    • Bのパターン
  • ちなみに,DATEPART()によって抜き出してきた年と月をそれぞれ文字列にしてつなげることで,DATETRUNC()を使ったときのような出力はできますが,できるならDATETRUNC()を使ってスマートにVizを作りたいですね。
    • 無理やりDATETRUNCっぽくする
  • というわけで,DATEPART()DATETRUNC()の違いをお話ししました。デフォルトの操作ではどうにもならない部分は,やはり知識を身に着けていく必要がありますね。

おわりに

  • Tableau,上のことでつまずかずにいろんな機能使えるようになれればもっと使い道も広がると思うのでもっと触っていければと思います。

Discussion