ナレッジベース

Tableau Prep で重複データを削除する


発行: 11 May 2018
最終修正日: 31 Jan 2024

ご質問

Tableau Prep で重複データを削除する方法。 

さまざまな理由で重複データが発生しますが、重複を解決する最善策は場合により異なります。以下は、この記事でカバーされるシナリオです。
  • 1 対多または多対多の関係を持つ 2 つの表を結合すると、出力のメジャー バリューが重複します。
  • 2 つ以上の表をユニオンすると、一部のレコードが表間で繰り返され、その結果、重複して出力される場合があります。

環境

Tableau Prep

回答

いずれのシナリオでも、重複は「同じ値のばらつきのクリーニング (修正)」に記載された方法を使用して手動で削除できます。

クリックして手順を展開する
シナリオ 1: 結合で重複したメジャー
Tableau Prep ワークブック "duplicates from join.tfl (join.tfl からの重複)" で、"January Inventory (1 月在庫)" 表に各製品とその在庫合計が 1 回ずつリストされます。同一製品のオーダーが複数ある場合、"January Orders (1 月オーダー)" 表に製品の行が多数ある場合があります。"Sales (売上)" 表と "Inventory (在庫)" 表の結合後、メジャー [Inventory (在庫)] が重複しています。最初のフローは、この問題について示されています。

オプション 1: 結合の代わりにユニオンを使用する

注: [Inventory (在庫)] の値は、"January Orders (1 月オーダー)" のデータとは直接関係しません。集計を含まない計算を作成する場合や、高い詳細レベルで結合句からフィールドを表示するビューにおいて、このことが原因で問題が発生する場合があります。この例では [Product (製品)] です。

オプション 2: メジャー バリューを均等に分散する計算を作成する

集計ステップを使用して製品ごとのオーダー数を計算してから、そのオーダー数で在庫を割ります。すると最終結果では、在庫が各オーダーに均等に表示されます。たとえば、帽子に対して 2 つのオーダーがあります。各帽子オーダーの [Inventory (在庫)] は 100 になります。各オーダーの [New Inventory (新しい在庫)] は 50 になります。

注: 製品の一部のオーダーのみがフィルターされている場合、これにより在庫情報が正確でなくなる場合があります。
  1. 内部結合 "January Inventory (1 月在庫)" および "January Orders (1 月オーダー)" を [Product (製品)] = [Product (製品)] で作成します
  2. "Join 2 (結合 2)" から "Aggregate (集計)" を追加します
  3. "Aggregate 1 (集計 1)" ステップで、以下を実行します。
    1. いずれかの [Product (製品)] を [グループ化したフィールド] までドラッグします
    2. [Order ID (オーダー ID)] を [集計フィールド] までドラッグします
    3. [Order ID (オーダー ID)] の集計を [個別カウント] に変更します
    4. [Order ID (オーダー ID)] の名前を「Orders per Product (製品ごとのオーダー)」などに変更します
      • [Order ID (オーダー ID)] の代わりに、各行の値が一意である他の表のフィールドを使用します。
      • 一意の識別子が 1 つもない場合、集計ステップを作成する前に、各行の値を一意にするために必要なディメンションを連結する計算フィールドを作成するステップを追加します。
      • 例: STR([Order ID])+STR([Date])
  4. "Join 2 (結合 2)" を "Aggregate 1 (集計 1)" までドラッグし、"New Join (新しい結合)" の上にドロップします
  5. "Join 3 (結合 3)" ステップで、左外部結合を [Product (製品)] = [Product (製品)] で作成します
  6. "Join 3 (結合 3)" から "Step (ステップ)" を追加します
  7. "Clean 1 (クリーニング 1)" ステップで、[計算フィールドの作成…] ボタンをクリックします
  8. 開いた [計算フィールド] ダイアログ ボックスで次の操作を行い、[OK] をクリックします。
    1. 計算フィールドに名前を付けます。この例では、計算フィールドに "New Inventory (新しい在庫)" という名前が付いています
    2. 式フィールドで、次のような計算を作成します。
      [Inventory]/[Orders per Product]

オプション 3: 表の関係が 1:1 になるようにデータを集計する

  1. "January Orders 4 (1 月オーダー 4)" から "Aggregate (集計)" ステップを追加します
  2. "Aggregate 2 (集計 2)" ステップで、以下を実行します。
    1. [Product (製品)] を [グループ化したフィールド] ペインまでドラッグします
    2. [Sales (売上)]、[Quantity (数量)]、[Order ID (オーダー ID)]、および [Customer (顧客)] を [集計フィールド] ペインまでドラッグします
    3. [Customer (顧客)] フィールドで [カウント] をクリックして [個別カウント] を選択します
    4. [Order ID (オーダー ID)] フィールドで [合計] をクリックして [個別カウント] を選択します
  3. "Aggregate 2 (集計 2)" を "January Inventory 4 (1 月在庫 4)" までドラッグし、内部結合を [Product (製品)] = [Product (製品)] で作成します
注意: [Product (製品)] フィールドは、結合に使用される唯一のフィールドであるため、[グループ化したフィールド] ペインにドラッグしました。最終的な表では、製品ごとに行は 1 行です。つまり、各オーダーの詳細は失われます。



オプション 4: Tableau Desktop で FIXED 式を使用する

手順の詳細については、「LOD 計算を使用して重複データを削除する」を参照してください。

Tableau Desktop で FIXED 式を使用する利点は、詳細レベル (LOD) 式に特殊な集計規則があるということです。したがって、FIXED を使って重複が排除された在庫フィールドでは、ビューのその製品からのオーダーが 1 つだけでも複数でも、製品の完全に重複しない在庫を表示することができます。
 
クリックして手順を展開する
シナリオ 2: 同じデータを持つデータ ソースのユニオン後にデータが重複する
Tableau Prep ワークブック "duplicates from union.tfl (union.tfl からの重複)" では、"January Orders (1 月オーダー)" が 1 月のオーダーの最初のレポートです。"January Orders (corrections) (1 月オーダー (修正))" 表は、新しいオーダーと "January Orders (1 月オーダー)" に既に存在するオーダーの修正が含まれたレポートであり、後からリリースされたものです。2 つの表をユニオンすると、両方の表のすべての行が維持され、メジャーが重複して作成されます。

"duplicates from union.tfl (union.tfl からの重複)" の最初のフローは、この問題について示しています。

オプション 1: 一方の表からはすべてのデータを維持し、もう一方の表からは不一致のデータを維持する

この例では、"January Orders (corrections) (1 月オーダー (修正))" からのデータをすべて維持し、"January Orders (1 月オーダー)" からは "January Orders (corrections) (1 月オーダー (修正))" に存在しないオーダーのみ維持する必要があります。
  1. "January Orders (1 月オーダー)" と "January Orders (corrections) (1 月オーダー (修正))" 間に新しい結合を作成します
  2. "Join 1 (結合 1)" ステップで、以下を実行します。
    1. [適用した結合句] で、[Order ID (オーダー ID)] = [Order ID (オーダー ID)] の結合句を作成します
    2. [結合タイプ] で、一番左のセグメントに色が付くようにベン図のセクションをクリックします。Tableau Prep では、これを [左の不一致のみ] 結合と呼びます。
  3. "January Orders (corrections) (1 月オーダー (修正))" を "Join 1 (結合 1)" までドラッグし、表を [ユニオンの新規作成] にドロップします

オプション 2: 最新日付のレコードを維持する

たとえば、Ms. Mouse がコートをもう 1 着追加するためにオーダーを変更しましたが、この変更が誤って "January Orders (1 月オーダー)" に記録されました。正しいオーダーは最新日付のものです。
  1. "January Orders (1 月オーダー)" と "January Orders (corrections) (1 月オーダー (修正))" 間に [Order ID (オーダー ID)] = [Order ID (オーダー ID)] で完全外部結合を作成します
  2. "Join 2 (結合 2)" から "Step (ステップ)" を追加します
  3. 日付フィールドとメジャー バリューを除いて、一致するすべてのフィールドをマージします。
    1. プロファイル ペインで値を他より優先する必要があるフィールドをクリックします
    2. 一致するフィールドを Ctrl キーを押しながらクリックします
    3. いずれかのフィールドを右クリックし、[フィールドのマージ] を選択します
      • フィールドがマージされる際に、Tableau Prep で両方の値が維持されず (2 つの異なる値がある場合)、最初に選択されたフィールドに値がある場合はその値が維持されます。
      • たとえば、Ms. Horse の名前が誤って Ms. House として "January Orders (1 月オーダー)" 表に記録され、彼女の正しい名前が "January Orders (corrections) (1 月オーダー (修正))" に表示されます。その場合、[Customer (顧客)] と [Customer-1 (顧客-1)] をマージするときに、[Customer-1 (顧客-1)] を最初に選択する必要があります。
      • どのフィールドが他より優先されるかをマージされたフィールドから確認できます。名前は、[first field name & second field name (最初のフィールド名 & 2 番目のフィールド名)] のような書式になります。最初にリストされるフィールド名は、他より優先されるフィールドです。
      • 間違ったオーダーでフィールドがマージされた場合、プロファイル ペインでマージされたフィールドの名前の上にあるマージ アイコンを右クリックして [削除] を選択することにより、マージを元に戻すことができます。
    4. [計算フィールドの作成…] ボタンをクリックします
    5. 開いた [計算フィールド] ダイアログ ボックスで次の操作を実行し、[OK] をクリックします。
      1. 計算フィールドに名前を付けます。この例では、計算フィールドに "Most Recent Date (最新日付)" という名前が付いています
      2. 式フィールドで、次のような計算を作成します。
        IF [Date] > [Date-1]
        THEN [Date]
        ELSE IFNULL( [Date-1], [Date] )
        END
      3. [Date (日付)] が [Date-1 (日付-1)] を超える場合、または [Date-1 (日付-1)] よりも最近の日付である場合、上記の計算は [Date (日付)] を返します。それ以外の場合、計算は [Date-1 (日付-1)] を返します。
      4. いずれかのフィールドが NULL の場合、最初の条件は常に false になります。[Date-1 (日付-1)] が NULL の場合、IFNULL() 関数によって [Date-1 (日付-1)] が [Date (日付)] と置き換えられます。つまり、計算は常に NULL 以外の値があればそれを返すということです。
      5. [Date (日付)] と [Date-1 (日付-1)] を削除します
    6. 「New Cost (新しい費用)」などの名前を付けて、次のような計算の計算フィールドを作成します。
      IF [Date] > [Date-1]
      THEN [Cost]
      ELSE IFNULL( [Cost-1], [Cost] )
      END
      
    7. [Cost (費用)] と [Cost-1 (費用-1)] を削除します
    8. すべてのメジャーについてステップ 6 ~ 7 を繰り返します

オプション 3: すべての重複を異なる方法で処理する必要がある

  1. "January Orders (1 月オーダー)" と "January Orders (corrections) (1 月オーダー (修正))" 間に [Order ID (オーダー ID)] = [Order ID (オーダー ID)] で完全外部結合を作成します
  2. "Join 3 (結合 3)" から "Step (ステップ)" を追加します
  3. a) 両方の表に同じ値があるすべてのフィールドか、または b) 一方の表からの値を常に優先させる必要がある値のすべてのフィールドをマージします。
  4. [計算フィールドの作成…] ボタンをクリックします
  5. 開いた [計算フィールド] ダイアログ ボックスで次の操作を行い、[OK] をクリックします。
    1. 計算フィールドに名前を付けます。この例では、計算フィールドに "New Cost (新しい費用)" という名前がついています
    2. 式フィールドで、次のような計算を作成します。
      CASE [Order ID-1 & Order ID]
      WHEN 5 THEN [Date]
      WHEN 9 THEN [Date]
      ELSE IFNULL([Date-1],[Date])
      END
      
    • 上記の計算では、[Order ID-1 & Order ID (オーダー ID-1 & オーダー ID)] の値がすべて読み取られ、指定した日付フィールドが返されます。わかりやすくするために、どの ID が [Date (日付)] を返す必要があるかだけを指定し、他はすべて [Date-1 (日付-1)] か、または [Date-1 (日付-1)] が NULL の場合は [Date (日付)] を返すように ELSE ステートメントで指定します。
    • [Order ID-1 & Order ID (オーダー ID-1 & オーダー ID)] 値は、データの各行に対して一意の値を持つフィールドであるため、CASE ステートメントで使用されます。
    • つまり、将来このフローが再実行されたときに、追加された新しい ID は [Date-1 (日付-1)] を返すということでもあります。
  6. [Date (日付)] と [Date-1 (日付-1)] を削除します
  7. 個別に重複を処理する必要があるすべてのフィールドでステップ 4 ~ 6 を繰り返します
この記事で問題は解決しましたか?