関係を使用する複数テーブルのデータ ソースでの分析動作

複数の関連するテーブルを持つデータ ソースを使用すると、Tableau での分析の動作に影響します。複数の関連付けられたテーブルがそれぞれ独立したドメインを持ち、ネイティブの詳細レベルを保持するため、フィールドをビューにドラッグした結果は次のようになります。

  • データが自然な詳細レベルでクエリされます。
  • Viz に関連するデータだけがクエリされます。
  • テーブル間の関係がクエリの結果に影響します。Viz の構築フローは、データ モデル内でのフィールドのテーブルの相互関係や、直接関連しているかどうかによって異なる可能性があります。

データ ソースの機能強化の概要とリレーションシップの使用の概要については、この 5 分間のビデオを参照してください。

: このビデオで示されている関係を編集するためのインターフェースは、現在のリリースとは少し異なりますが、同じ機能を備えています。

関係のしくみの詳細については、「関係を気軽に使ってみる」および次の Tableau ブログ投稿を参照してください。

また、「Tableau が関係を発明した理由(新しいウィンドウでリンクが開く)」など、Action Analytics(新しいウィンドウでリンクが開く) からの関係に関するビデオ ポッドキャストも参照してください。詳細については、ライブラリ(新しいウィンドウでリンクが開く)の [ビデオ ポッドキャスト] をクリックしてください。

: Tableau では、単一テーブルのデータ ソースを引き続き作成できます。結合、ユニオン、カスタム SQL などの組み合わせを使用して論理テーブルを作成できます。Tableau で単一テーブルの分析を行う動作は変更されていません。ディメンションとメジャーの混合を含む単一の論理テーブル上の分析は、Tableau 2020.2 以前と同様に機能します。

分析に関する考慮事項

関係の検証

分析用のデータ モデルを検証するには、いくつかのオプションがあります。データ ソースのモデルを作成する際は、シートにアクセスしてそのデータ ソースを選択し、Viz を構築して、レコード数、想定されるデータ、一致しない値、NULL 値、繰り返されるメジャー値を調べることをお勧めします。さまざまなテーブルのフィールドを使用して、すべてが想定したとおりに表示されることを確認してください。

検索対象:

  • データ モデル内のリレーションシップで、テーブルに合った適切なフィールドが使用されていますか?
  • 複数の一致するフィールド ペアを追加すると、関係がより正確になりますか?
  • 異なるディメンションやメジャーをビューにドラッグするとどうなりますか?
  • 予期される行数が表示されますか?
  • パフォーマンス オプションの設定の一部を既定の設定から変更した場合、想定したとおりの値が Viz に表示されますか? そうならない場合は、設定を確認するか既定値にリセットできます。

関係とデータ モデルを検証するためのオプションは次のとおりです。

  • すべてのテーブルにはレコードの数が、そのテーブルの詳細レベルに、TableName(Count) フィールドとして含まれています。テーブルのレコード数を表示するには、[カウント] フィールドをビューにドラッグします。すべてのテーブルの数を表示するには、[データ] ペインで各テーブルの [カウント] フィールドを選択し、[表示形式] の [テキスト テーブル] をクリックします。
  • [データ] ペインの [データの表示] をクリックして、テーブルごとの行数とデータ数を確認します。また、関係の作成を始める前に、分析前や分析中にデータ ソースからデータを表示すると、各テーブルの範囲を把握するのに役立ちます。詳細については、参照元データの表示を参照してください。
  • ディメンションを行にドラッグして、ステータス バーの行数を確認します。一致しない値を表示するには、[分析] メニューをクリックし、[テーブル レイアウト] > [空の行を表示] または [空の列を表示]を選択します。また、Viz で表されるテーブルの 1 つから <YourTable>(カウント) など、さまざまなメジャーをビューにドラッグすることもできます。これにより、そのテーブルのディメンションのすべての値が表示されます。

ヒント: 関係に対して生成されるクエリを表示する場合は、Tableau Desktop のパフォーマンス レコーダーを使用できます。

  1. [ヘルプ] メニューをクリックし、[設定とパフォーマンス] > [パフォーマンス記録の開始] を選択します。
  2. ビューにフィールドをドラッグして Viz を作成します。
  3. [ヘルプ] メニューをクリックし、[設定とパフォーマンス] > [パフォーマンス記録の停止] を選択します。[Performance Recording (パフォーマンス記録)] ワークブックが自動的に開きます。
  4. パフォーマンスの概要ダッシュボードの [時間で並べ替えられたイベント] で、[クエリの実行] バーをクリックし、以下のクエリを表示します。

より高度なもう 1 つのオプションは、GitHub にある Tableau Log Viewer(新しいウィンドウでリンクが開く) を使用することです。end-protocol.query を使用して、特定のキーワードにフィルターを適用できます。詳細については、まず GitHub にある Tableau Log Viewer の Wiki ページ(新しいウィンドウでリンクが開く)をご覧ください。

ディメンションのみの視覚化

関連テーブルを含む複数テーブル のデータ ソースを使用する場合: ディメンションのみの viz を作成すると、Tableau は内部結合を使用するため、一致しないドメイン全体は表示されません。

ディメンション値の部分的な組み合わせを表示するには、次の方法を使用します。

  • [空の行/列を表示] を使用して、すべての可能な行を表示します。[分析] メニューをクリックし、[テーブル レイアウト] > [空の行を表示] または [空の列を表示] を選択します。この設定では、[日付] フィールドと [数値ビン] フィールドの高密度化もトリガーされますが、高密度化は不要な場合があります。
  • Viz で表されているテーブルの 1 つから <YourTable>(カウント) などのメジャーをビューに追加します。これにより、そのテーブルのディメンションのすべての値が表示されます。

詳細については、ディメンションと一致しない値の動作に驚いた場合複数テーブルの分析のトラブルシューティングも参照してください。

LOD 計算および式を使用する状況

Tableau は入力テーブルの詳細レベル (LOD) を認識するため、LOD calcs を使用して、結合による不要な重複を除去する必要はありません。

LOD calcs を使用して次の目的を実行する場合もあります。

  • ソース テーブル内の不要な重複の処理
  • マルチレベル集計の計算(合計の平均など)
  • コホート分析を行うには(例えば、各顧客の最初の注文日を計算する)

LOD 計算の次元に単一のテーブルのフィールドが含まれている場合、その LOD 計算はデータ ペインの所有テーブルに表示されます。

複数テーブルの分析例

次の一連の例は、複数の関連するテーブルにまたがるデータのクエリ方法を示しています。この複数テーブルのデータ ソースには、俳優が出演した映画での役柄を示す短いリストが含まれています。

[Appearance (出演)] テーブルの各行は、ある俳優が特定の映画である役柄を演じたことを意味します。このデータ セットで各俳優に指定できる出演回数は 0 以上です。

リレーションシップのしくみの詳細については、Tableau ブログ投稿を参照してください。

例 1: 結合データと関連データでの単一の質問の分析

Tableau 2020.2 以前にデータに接続した場合、データ ソースは、単一テーブルで構成されるか、単一の非正規化テーブルに結合またはユニオンされた複数テーブルで構成されていました。Tableau 2020.2 以降では、複数テーブルのデータ ソースの正規化データを認識して保持します。テーブル データは分離したままであり、各テーブルはネイティブの詳細レベルを維持しています。次の例は、単一テーブルのデータ ソースと複数テーブルのデータ ソースでは、分析がどのように異なるかを示しています。

この例は、映画データを含む 3 つのテーブル ([Appearance (出演)]、[Actors (俳優)]、[Movies (映画)]) を示しています。

これらのテーブルを結合する際は、Actor = Actor を使用して [Appearance (出演)] テーブルを [Actors (俳優)] テーブルと、Movie = Movie を使用して [Appearance (出演)] テーブルを [Movies (映画)] テーブルと結合できます。結合が完全外部結合である場合、行は失われず、最終的な出力は次のようになります。結合句で使用されるフィールドが 2 回出現することに注意してください。

このようにデータを単一テーブルにまとめる方法を、非正規化または平坦化と呼びます。

この結合済みのデータは平坦化されたデータです。各行は、俳優が出演した映画の役柄で構成されています (たとえば、John Rhys-Davies (ジョン・リス=デイヴィス) は The Return of the King (王の帰還) で 2 つの役柄を演じたため、対応する 2 つの行があります)。したがって、データの粒度は映画内の役柄のレベルになります。複数の行に関連する情報は複製されています。The Return of the King (王の帰還) の初公開日は、この映画内の 2 つの役柄がデータ セットに存在するため、2 回出現します。John Rhys-Davies (ジョン・リス=デイヴィス) の身長は、彼が出演した役柄/映画の一意の組み合わせが 5 つあるため、リストに 5 回出現します。

したがって、この平坦化されたデータには、注意すべき特性がいくつかあります。たとえば、出演した映画の平均興行収入別に俳優の身長をプロットする場合は、[Height (身長)] を列に、[Gross (興行収入)] を行にドラッグした後、[Gross (興行収入)] の平均を取得することが想定されます。しかし、既定のビューでこれを行うと正しい結果にならないようです。ここで、John Rhys-Davies (ジョン・リス=デイヴィス) は身長 925 cm、つまり 30 フィート以上あるとみなされています。

これは、既定の集計が SUM であるためです。データ内に彼の行が 5 回出現するため、実際の身長である 185 cm の 5 倍になっています。この問題は、[Height (身長)] の集計を平均や最小値に変更することで修正できます。結果として、1 つの行の値だけが返されます (すべての行で値が同じであるため)。

集計を変更すると、身長はずっと現実的な値になります。次は、平均興行収入に注意を払う必要があります。John Rhys-Davies (ジョン・リス=デイヴィス) の身長について 5 つの行がすべてカウントされたことを覚えていることでしょう。彼が出演した映画の平均興行収入は、5 つの行の平均ではなく、3 本の映画の平均である必要があります。彼が 2 つの役柄を演じたからといって、The Return of the King (王の帰還) の興行収入を 2 回数える必要はないでしょう。しかし、そうなっていないでしょうか?

シンプルな計算により、The Lord of the Rings (ロード・オブ・ザ・リング) シリーズの平均興行収入は (869 + 923 + 1119)/3、つまり $970.3 になるはずです。しかし、散布図での値は $990.6 です。現在の平均は 5 つの行から計算されます ((869 + 923 + 923 + 1119 + 1119)/5)。

これを修正するのは、身長の問題を集計の変更によって修正したときほど簡単ではありません。詳細レベル (LOD) の式を使用して、Tableau で参照される詳細レベルを既定の [Appearance (出演)] から [Movie (映画)] のレベルに変更する必要があります。計算 [LOD Gross (LOD 興行収入)] を {FIXED [Movie] : MIN([Gross (USD millions)])} として作成した後、その新しい [LOD Gross (LOD 興行収入)] フィールドの平均をビューで使用できます。

この LOD 式は、「各映画について興行収入の最小値を返す」という意味です。これにより、映画と俳優によってビューを構築した場合でも映画ごとの興行収入が常に返されるため、重複の問題が解消されます。

これで数字は正しくなりました。John Rhys-Davies (ジョン・リス=デイヴィス) の身長は 185 cmで、このデータ セットにある彼の出演映画の平均興行収入は 970.3 です。正しい値が返されたことを確認する前に、データがレプリケートされた方法と、Tableau で表示されるデータが集計された方法を理解しておく必要があります。

複数のテーブルにある正規化されたデータ

論理テーブル間のリレーションシップの作成は結合の作成と似ていますが、必要な回数だけレプリケートを行ってデータを 1 つのテーブルに平坦化する代わりに、テーブル間のリレーションシップに関する情報を Tableau に認識させます。情報は各テーブルから適切な詳細レベルで取り出され、他のデータに関連付けられます。

[データ ソース] ページに、平坦化されたテーブルの "完全な" グリッド ビューが表示されることはなく、それ自体存在しません。3 つのテーブルはすべてそのまま Tableau 内に保持され、単にリレーションシップが確立されるだけで、ビューで必要なデータがまとめられます。

同じ散布図を作成するには、[Height (身長)] と [Gross (興行収入)] をビューにドラッグし、[Gross (興行収入)] を平均に設定するだけです。各テーブルのデータが他の関連するテーブルのデータと関連している方法が参照され、身長の表示方法 (俳優別) と平均興行収入の計算方法 (映画別) が推定されます。

例 2: 単一テーブルからのディメンション

ビジュアライゼーション内のディメンションが単一テーブルから取得される場合は、1 つのテーブルだけがクエリされてドメイン全体の結果が表示されます。メジャーを追加した後も、引き続きドメイン全体が表示されます。

たとえば、上記の [Movie Appearance (出演映画)] データ ソースを使用して、[Actor (俳優)] フィールドをビジュアライゼーションに追加すると、結果は次のようになります。

Viz 内の唯一のディメンションは [Actors (俳優)] テーブルから取得されたため、[Actors (俳優)] テーブルに対してのみクエリが実行されます。出演映画があるかどうかに関係なく、[Actors (俳優)] テーブルに出現するすべての俳優が Viz に表示されます。

[Appearance Actor (出演俳優)] フィールドをメジャーとしてビューに取り込み、COUNT 集計を適用すると、俳優ごとの出演回数を示すビューが作成されます。このデータセットでは Sigourney Weaver (シガニー・ウィーバー) に出演映画はありませんが、依然としてビューに名前があることに注目してください。

例 3: 複数のテーブルからのディメンション

ビュー内のディメンションが複数のテーブルからのものである場合、すべてのディメンションが関連付けられているテーブルが検索され、そのテーブルのドメインが表示されます。その結果、例 1 で見たディメンション値の一部は変化します。

たとえば、[Movies (映画)] テーブルからフィールドを Viz にドラッグすると、クエリが変更されます。[Movies (映画)] テーブルと [Actors (俳優)] テーブルは [Appearance (出演)] テーブルによって関連付けられているため、このクエリでは [Appearance (出演)] テーブルに存在する俳優/映画のペアだけが返されます。

Sigourney Weaver (シガニー・ウィーバー) はこのデータセットでは出演映画がないため (したがって [Movies (映画)] 内のデータに関連付けられていないため)、俳優/映画ペアの Viz には表示されません。

例 4: ディメンションで分割できないメジャー

メジャーをディメンションで分割できない場合、そのメジャーは当該のディメンション間でレプリケートされます。

次のビジュアライゼーションは、映画ごとの合計興行収入を示しています。どちらのフィールドも [Movies (映画)] テーブルから取得されるため、[Movies (映画)] テーブルだけがクエリされます。

[Movies (映画)] テーブルには、次のビジュアライゼーションに示すように、各映画の集計済みの [Gross (興行収入)] が含まれています (Infinity War (インフィニティ・ウォー) の興行収入はこのデータ セットの作成時にはわからなかったため、ゼロとして表示されています)。

このビジュアライゼーションに [Actor (俳優)] を追加すると、[Actor (俳優)] によって [Movie Gross (映画の興行収入)] を分割できないことが Tableau によって認識されます (より詳細なこの情報がデータ モデルで使用できないため)。そのため、代わりに各映画について [Movie Gross (映画の興行収入)] が表示され、俳優間でレプリケートされます。

例 5: メジャーに階層的に関連付けられていないディメンション

前のビジュアライゼーションから [Movie (映画)] ディメンションを削除すると、各俳優の [Movie Gross (映画の興行収入)] メジャーの合計がクエリされます。その結果、俳優が出演したすべての映画について集計された [Movie Gross (映画の興行収入)] が得られます。

この場合、複数の俳優が同じ映画に出演した可能性があるため、[Actor (俳優)] ディメンションと [Movie Gross (映画の興行収入)] メジャーの間に階層的なリレーションシップはありません。たとえば、Benedict Cumberbatch (ベネディクト・カンバーバッチ) と Chris Hemsworth (クリス・ヘムズワース) は共に Dr. Strange (ドクター・ストレンジ) に出演しました。この場合、Dr. Strange (ドクター・ストレンジ) の [Movie Gross (映画の興行収入)] は両方の俳優の合計に含まれます。

同じ [Movie Gross (映画の興行収入)] 値が複数の俳優の合計に含まれているため、Tableau ではこれらの値を直接合計することができません。

ただし、このビジュアライゼーションで合計が表示される際は、重複する映画を含めずに [Movie Gross (映画の興行収入)] の合計が正しく計算されます。

 

複数テーブルの分析のトラブルシューティング

複数テーブルを関連付けたテーブルでは、次の状況が考えられます。次の表に、分析のトラブルシューティング方法に関する既知のシナリオと概要を示します。

分析状況 説明
ディメンションのみの Viz の内部結合 同じビューに複数のディメンションを追加したときに、予測していたすべての値がすぐに表示されない場合があります。または、別のテーブルから Viz に新しいディメンションを追加すると、一部の値が Viz から消えることに気づく場合があります。

Tableau では、データ内に実際に存在する値の組み合わせを保持するクエリを使用します。つまり、Viz にディメンションを提供するテーブルの内部結合によって生成される行が表示されます。

ディメンション値の部分的な組み合わせを表示する場合は、[空の行/列を表示] をオンにして、すべての可能な行を表示するか、ビューに示されたテーブルの 1 つから <MyTable>(カウント) などのメジャーを追加して、そのテーブルのディメンションのすべての値を表示することができます。
計算の定数 複数テーブルのデータ ソースでは、定数値は、単一行のテーブルから取得されたかのように動作します。定数値を集計すると、集計が 1 行であるかのように動作します。Sum(10) は常に 10 に等しくなります。また、Avg(10) も常に 10 に等しくなります。Count(10) は常に 1 に等しくなります。

後方互換性を確保するために、単一論理テーブルのデータ ソースの定数値は、テーブル内の各値に対してレプリケートされるかのように動作します。

行レベルの計算の定数は、計算の行の詳細レベルを変更しません。計算 [Sales (売上)] + 10 は、[Sales (売上)] フィールドと同じテーブルから取得されたかのように動作します。
外部結合の強制 Tableau では、すべてのメジャー値が Viz に示されるため (データ内で実際に発生するすべてのディメンション値の組み合わせと一緒に)、データ内の可能なすべての値 (「一致しない NULL」を含む) を確認したい場合は、ワークシートの各テーブルからメジャーをビューに取り込むことにより、すべての値を確認することができます。
クロステーブル計算に期待するメジャー値が表示されない 計算のドメインは、その入力の内部結合です。メジャー計算のすべての入力に一致する値がない場合、それらはメジャー計算に含まれません。

行レベルの計算を作成する前に、LOD 計算を使用して、メジャー値を同じオブジェクトに移動することを検討してください。
異なる論理テーブルのフィールドを切り替える計算が予期しない結果を生成する Case ステートメント、If ステートメント、"IFNULL" などの関数を使用して、行レベルのフィールドを切り替える計算がある場合、この計算はすべての行 (行は計算の入力間の内部結合) に対して実行されるため、予期しない結果が発生する可能性があります。

行レベルの計算内で切り替えるよりも、集計値を切り替える方が適切な方法です。これにより、単一テーブルのシナリオでのパフォーマンスも向上します。

また、これはテーブルをまたいだ計算の問題にすぎないため、LOD 計算を使用してすべてのフィールドを同じテーブルに移動することもできます。

以下は行わないでください。
SUM( IF [Parameter] == "Foo" THEN [Field 1] ELSE [Field 2] END )

以下を実行します。
IF [Parameter] == "Foo" THEN SUM([Field 1]) ELSE SUM([Field 2]) END
予期しない不一致の NULL 予期していなかった NULL ディメンション値に関連付けられたメジャー値が表示されることがあります。これは、データ ソース内のリレーションシップが正しく構成されなかったことを示している可能性があります。また、メジャーが含まれるテーブルには実際に一致しない値があり、ディメンション テーブルには対応する行がないことを示している可能性もあります。

以前に間違った結合タイプを選択した場合は、このデータが失われることがありました。リレーションシップを使用すると、これらの一致しない値が保持されます。一致しない値を表示したくない場合は、フィルターを使用して、一致しない値を除外できます。
正しくない集計値 リレーションシップか結合を使用していますか? リレーションシップを使用している場合は、既定で集計が正しく計算されます。結合を使用している場合は、LOD calcs を記述して、値の重複を除去する必要があります。

リレーションシップにパフォーマンス オプションを誤って設定しましたか? パフォーマンス オプションを既定にリセットして、正しい集計が生成されるかどうかを確認してください。
ディメンションで、メジャー値がパーティション分割されるのではなく、レプリケートされる

ディメンション フィルターがメジャーのサブセットを設定しない
 リレーションシップの定義に使用されるフィールドが正しいことを確認します。
Tableau が生成するクエリが多すぎるか、左結合を多く含むクエリを生成する ログやパフォーマンスの記録を調べ、生成されたクエリの数と使用されている左結合の数を確認します。Tableau では、新しいデータ モデリング機能により、左結合が含まれるクエリや追加のクエリを生成し、一致しないメジャー値が常にビジュアライゼーションに含まれるようにします。一致しない値を表示する必要がない場合は、フィルターを使用して、ビジュアライゼーションから一致しない (NULL) 値を削除します。これで、クエリの数が少なくなります。

一致しない値がデータに含まれていないことがわかっている場合は、パフォーマンス オプションで各リレーションシップの参照整合性設定を [すべての値が一致] に設定できます。このように設定した場合も、クエリの数が少なくなります。

また、ビジュアライゼーションの複雑さを軽減し、生成されるクエリ数を減らすことができます。メジャーを削除し、フィルター コントロールを非表示にすることは、複数テーブルの関連付けられたデータのクエリを簡略化する主要な方法です。
クエリに多くのサブクエリがある ログまたはパフォーマンスの記録を調べて、Tableau が生成するクエリの複雑さを確認します。

Tableau では、必要に応じて、サブクエリを自動的に生成してデータの重複を除去し、正しい集計を生成します。これは、LOD 計算によって生成されるクエリに似ています。

データの論理テーブル間のリレーションシップに多対 1 または 1 対 1 のカーディナリティが含まれることがわかっている場合は、リレーションシップのパフォーマンス オプションでこのカーディナリティ情報を設定できます。これにより、Tableau では、重複が発生する可能性はないと認識されるため、不要なサブクエリを排除できます。
結合を使用してデータをフィルターした 2020.2 では、Tableau は一致しない値を回復します。これは、内部結合を指定した左結合を使用して、データを意図的に除外すること意味する場合があります。

この結合によって取り込まれる一致しない値を除外すると、Tableau では、クエリを内部結合に最適化できます。

特定のシナリオによっては、この内部結合を論理テーブル内の物理結合としてモデル化することが適切な場合があります。メジャーが含まれるテーブルを使用してディメンション テーブルをフィルターする場合は、メジャー レプリケーションを追加する必要がないため、このモデル化は特に強力です。
フィードバックをありがとうございます。フィードバックは正常に送信されました。ありがとうございます!