関係を使用するデータ ソースでの分析のしくみ
複数の関連するテーブルを持つデータ ソースを使用すると、Tableau での分析の動作に影響します。複数の関連付けられたテーブルがそれぞれ独立したドメインを持ち、ネイティブの詳細レベルを保持するため、フィールドをビューにドラッグした結果は次のようになります。
- データが自然な詳細レベルでクエリされます。
- Viz に関連するデータだけがクエリされます。
- テーブル間の関係がクエリの結果に影響します。Viz を作成する流れは、データ モデル内でテーブル同士がどのように関連付けられているか、あるいは直接関連付けられていないかによって異なる場合があります。
データ ソースの機能強化の概要とリレーションシップの使用の概要については、この 5 分間のビデオを参照してください。
注: このビデオで示されている関係を編集するためのインターフェースは、現在のリリースとは少し異なりますが、同じ機能を備えています。
関係のしくみの詳細については、「関係を気軽に使ってみる」および次の Tableau ブログ投稿を参照してください。
- 関係 (パート 1): Tableau に新しいデータ モデルを導入する(新しいウィンドウでリンクが開く)
- 関係 (パート 2): ヒントとテクニック(新しいウィンドウでリンクが開く)
- 関係 (パート 3): 複数の関連するテーブルを横断して質問する(新しいウィンドウでリンクが開く)
また、「Tableau が関係を導入した理由」(新しいウィンドウでリンクが開く)など、「アクション分析」(新しいウィンドウでリンクが開く)で関係に関するビデオ ポッドキャストも参照してください。詳細については、ライブラリ(新しいウィンドウでリンクが開く)の [ビデオ ポッドキャスト] をクリックしてください。
Tableau バージョン 2024.2 以降では、Tableau データ モデルは、マルチファクト関係を通じてマルチファクト分析と共有ディメンションをサポートします。詳細については、「マルチファクト関係データ モデルについて」(新しいウィンドウでリンクが開く)、「マルチファクト関係モデルを使用するとき」(新しいウィンドウでリンクが開く)、「マルチファクト関係データ モデルの構築」(新しいウィンドウでリンクが開く)を参照してください。
注: Tableau では、単一テーブルのデータ ソースを引き続き作成できます。結合、ユニオン、カスタム SQL などの組み合わせを使用して論理テーブルを作成できます。Tableau で単一テーブルの分析を行う動作は、これまでと変わっていません。ディメンションとメジャーの混合を含む単一の論理テーブル上の分析は、Tableau 2020.2 以前と同様に機能します。
分析に関する考慮事項
関係の検証
分析用のデータ モデルを検証するには、いくつかのオプションがあります。データ ソースのモデルを作成する際は、シートに移動して Viz を作成し、レコード数、期待するデータ、一致しない値、Null 値、重複するメジャー値を調べることをお勧めします。異なるテーブルにまたがってフィールドを操作して、すべてが期待どおりに表示されることを確認してください。
検索対象:
- データ モデル内のリレーションシップで、テーブルに合った適切なフィールドが使用されていますか?
- 複数の一致するフィールド ペアを追加すると、関係がより正確になりますか?
- 異なるディメンションやメジャーをビューにドラッグするとどうなりますか?
- 予期される行数が表示されますか?
- [パフォーマンス オプションの設定] の何かを変更した場合、想定したとおりの値が Viz に表示されますか? そうならない場合は、設定を確認するか既定値にリセットできます。
関係とデータ モデルを検証するためのオプションは次のとおりです。
- すべてのテーブルにはレコードの数が、そのテーブルの詳細レベルに、TableName(Count) フィールドとして含まれています。テーブルのレコード数を表示するには、[カウント] フィールドをビューにドラッグします。すべてのテーブルの数を表示するには、[データ] ペインで各テーブルの [カウント] フィールドを選択し、[表示形式] の [テキスト テーブル] をクリックします。
- [データ] ペインの [データの表示] をクリックして、テーブルごとの行数とデータ数を確認します。また、関係の作成を始める前に、分析前や分析中にデータ ソースからデータを表示すると、各テーブルの範囲を把握するのに役立ちます。詳細については、参照元データの表示を参照してください。
- ディメンションを行にドラッグして、ステータス バーの [行数] を確認します。一致しない値を表示するには、[分析] メニューをクリックし、[テーブル レイアウト] > [空の行を表示] または [空の列を表示]を選択します。また、Viz に表示されているいずれかのテーブルから、[<YourTable>(カウント)] などのさまざまなメジャーをビューにドラッグすることもできます。これにより、そのテーブルのディメンションのすべての値が表示されるようになります。
ヒント: 関係に対して生成されるクエリを表示するには、Tableau Desktop のパフォーマンス レコーダーを使用します。
- [ヘルプ] メニューをクリックし、[設定とパフォーマンス] > [パフォーマンス記録の開始] を選択します。
- ビューにフィールドをドラッグして Viz を作成します。
- [ヘルプ] メニューをクリックし、[設定とパフォーマンス] > [パフォーマンス記録の停止] を選択します。[Performance Recording (パフォーマンス記録)] ワークブックが自動的に開きます。
- パフォーマンスの概要ダッシュボードの [時間で並べ替えられたイベント] で、[クエリの実行] バーをクリックし、以下のクエリを表示します。
より高度なもう 1 つのオプションは、GitHub にある Tableau Log Viewer(新しいウィンドウでリンクが開く) を使用することです。end-protocol.query を使用すると、特定のキーワードでフィルタリングできます。詳細については、まず GitHub にある「Tableau Log Viewer の Wiki ページ」(新しいウィンドウでリンクが開く)を参照してください。
ディメンションのみの視覚化
関連テーブルを含む複数テーブル のデータ ソースを使用する場合: ディメンションのみの viz を作成すると、Tableau は内部結合を使用するため、一致しないドメイン全体は表示されません。
ディメンション値の部分的な組み合わせを表示するには、次の方法を使用します。
- [空の行/列を表示] を使用して、すべての可能な行を表示します。[分析] メニューをクリックし、[テーブル レイアウト] > [空の行を表示] または [空の列を表示] を選択します。この設定では、[日付] フィールドと [数値ビン] フィールドの高密度化もトリガーされますが、高密度化は不要な場合があります。
- Viz に表示されているいずれかのテーブルから、[<YourTable>(カウント)] などのメジャーをビューに追加します。これにより、そのテーブルのディメンションのすべての値が表示されるようになります。
詳細については、ディメンションと一致しない値の動作に驚いた場合と複数テーブルの分析のトラブルシューティングも参照してください。
LOD 計算および式を使用する状況
Tableau はテーブルの詳細レベル (LOD) を認識できるので、LOD 計算を使用して結合による不要な重複を除去する必要はありません。
LOD calcs を使用して次の目的を実行する場合もあります。
- ソース テーブル内の不要な重複の処理
- マルチレベル集計の計算(合計の平均など)
- コホート分析の実行 (例えば、各顧客の最初のオーダー日の計算)
LOD 計算に単一テーブルのディメンションが含まれている場合、その LOD 計算は [データ] ペインの所有テーブルに表示されます。
複数テーブルの分析例
次の一連の例は、複数の関連するテーブルにまたがるデータのクエリ方法を示しています。この複数テーブルのデータ ソースには、俳優が出演した映画での役柄を示す短いリストが含まれています。
[Appearance (出演)] テーブルの各行は、ある俳優が特定の映画である役柄を演じたことを意味します。このデータ セットで俳優に指定できる [出演] 回数は 0 以上です。
リレーションシップのしくみの詳細については、Tableau ブログ投稿を参照してください。
例 1: 結合データと関連データでの単一の質問の分析
Tableau 2020.2 より前では、データ ソースは、単一テーブルか、単一の非正規化テーブルに結合またはユニオンされた複数テーブルでした。Tableau 2020.2 以降では、Tableau は複数テーブルのデータ ソースに対して、個々の正規化データを認識して保持します。つまり、テーブル データは分離した状態を保ち、各テーブルは固有の詳細レベルを維持します。次の例は、単一テーブルのデータ ソースと複数テーブルのデータ ソースでは、分析がどのように異なるかを示しています。
この例は、映画データを含む 3 つのテーブル ([Appearance (出演)]、[Actors (俳優)]、[Movies (映画)]) を示しています。

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

このようにデータを単一テーブルにまとめる方法を、非正規化または平坦化と呼びます。
この結合済みのデータは平坦化されたデータです。各行は、俳優が出演した映画の役柄で構成されています (たとえば、John Rhys-Davies (ジョン・リス=デイヴィス) は The Return of the King (王の帰還) で 2 つの役柄を演じたため、対応する 2 つの行があります)。したがって、データの粒度は映画内の役柄のレベルになります。複数の行に関連する情報は複製されています。『The Return of the King (王の帰還)』の公開日が 2 回出てくるのは、データ セットにこの映画の役柄が 2 つ含まれているためです。John Rhys-Davies (ジョン・リス=デイヴィス) の身長は、彼が出演した役柄/映画の一意の組み合わせが 5 つあるため、リストに 5 回出現します。
したがって、この平坦化されたデータには、注意すべき特性がいくつかあります。たとえば、俳優の身長を出演した映画の平均興行収入でプロットするには、[身長] を列に、[興行収入] を行にドラッグし、[興行収入] の平均を算出するとよいでしょう。しかし、既定のビューでこれを行うと正しい結果にならないようです。ここで、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 が参照する詳細レベルを変更できます。計算 [LOD Gross (LOD 興行収入)] を {FIXED [Movie] : MIN([Gross (USD millions)])} として作成した後、その新しい [LOD Gross (LOD 興行収入)] フィールドの平均をビューで使用できます。
この LOD 式は、「各映画について興行収入の最小値を返す」という意味です。これにより、映画と俳優によってビューを構築した場合でも映画ごとの興行収入が常に返されるため、重複の問題が解消されます。

これで数字は正しくなりました。John Rhys-Davies (ジョン・リス=デイヴィス) の身長は 185 cmで、このデータ セットにある彼の出演映画の平均興行収入は 970.3 です。正しい値が返されたことを確認する前に、データが複製されたしくみと、Tableau でデータが集計されたしくみを理解しておく必要があります。
複数のテーブルにある正規化されたデータ
関係の作成は結合の作成と似ていますが、データを単一のテーブルに平坦化する代わりに、Tableau はテーブル間の関係を認識したままでいます。情報は各テーブルから適切な詳細レベルで取り出され、他のデータに関連付けられます。
[データ ソース] ページに、平坦化されたテーブルの "完全な" グリッド ビューが表示されることはなく、それ自体存在しません。Tableau は 3 つのテーブルをすべてそのまま保持し、単に関係を確立するだけで、ビューで必要なデータを必要に応じて集めます。

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

例 2: 単一テーブルからのディメンション
ビジュアライゼーション内のディメンションが単一テーブルから取得される場合は、1 つのテーブルだけがクエリされてドメイン全体の結果が表示されます。メジャーを追加した後も、引き続きドメイン全体が表示されます。
たとえば、前述の [映画出演] データ ソースを使用し、ビジュアライゼーションに [俳優] フィールドを追加すると、結果は次のようになります。

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

COUNT 集計を使用して [出演俳優] フィールドをビューに取り込むと、それはメジャーとなり、俳優ごとの出演回数を表示するビューが生成されます。Sigourney Weaver (シガニー・ウィーバー) は出演していませんが、彼女の名前はビューに表示されたままです。
![[列] シェルフのメジャーとして [出演俳優] フィールドがあり、出演回数なしで俳優がリストアップされた棒グラフになっています。](Img/data_model_multi_ex2c.png)
例 3: 複数のテーブルからのディメンション
Tableau は、複数のテーブルに基づくディメンションがビュー内にある場合、それらすべてのディメンションを関連付けるテーブルを基準にしてドメイン (値の範囲) を表示します。その結果、例 1 で見たディメンション値の一部は変化します。
たとえば、[Movies (映画)] テーブルからフィールドを Viz にドラッグすると、クエリが変更されます。[Movies (映画)] テーブルと [Actors (俳優)] テーブルは [Appearance (出演)] テーブルによって関連付けられているため、このクエリでは [Appearance (出演)] テーブルに存在する俳優/映画のペアだけが返されます。

Sigourney Weaver (シガニー・ウィーバー) は、このデータセットでは出演がないため (つまり、データセット内のどの [映画] にも関連付けられていないため)、[俳優] と [映画] の組み合わせからなる Viz には表示されません。

例 4: ディメンションで分割できないメジャー
メジャーをディメンションで分割できない場合、そのメジャーは当該のディメンション間でレプリケートされます。
次のビジュアライゼーションは、映画ごとの合計興行収入を示しています。どちらのフィールドも [映画] テーブルからのものなので、Tableau は [映画] テーブルだけをクエリします。

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

このビジュアライゼーションに [俳優] を追加すると、このデータにはさらに詳細な情報が含まれていないため、Tableau は [俳優] によって [映画の興行収入] を分割できないことを認識します。代わりに、Tableau は各映画の [映画の興行収入] を表示し、それを俳優ごとに複製します。

例 5: メジャーに階層的に関連付けられていないディメンション
前のビジュアライゼーションから [Movie (映画)] ディメンションを削除すると、各俳優の [Movie Gross (映画の興行収入)] メジャーの合計がクエリされます。その結果、俳優が出演したすべての映画について集計された [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 では、クエリを内部結合に最適化できます。 特定のシナリオによっては、この内部結合を論理テーブル内の物理結合としてモデル化することが適切な場合があります。メジャーが含まれるテーブルを使用してディメンション テーブルをフィルターする場合は、メジャー レプリケーションを追加する必要がないため、このモデル化は特に強力です。 |
