Tableau Prep で 2 番目の日付を検索する

アナリティクスでは、2 番目に発生したイベントの日付の特定が必要になることがよくあります。顧客が 2 回目に購入した日付 (これによってリピーター顧客になる) や、車のドライバーが 2 回目に交通違反を犯した日付などです。最初のイベントの日付は、最も早い日付を検索するだけなので、簡単です。2 番目の日付を検索するのはそれほど簡単ではありません。

2 つのパートから成るこのチュートリアルでは、交通違反のデータを作成し、以下の質問に回答します。

  1. 各ドライバーでの 1 回目の違反から 2 回目の違反までの日数の長さはどれほどか。

  2. 1 回目の違反と 2 回目の違反の罰金額を比較する。相関しているか。

  3. 支払額が全体で最も多いのはどのドライバーか。支払額が最も少ないのは誰か。

  4. 違反の種類が複数あるドライバーは何名いるか。

  5. 交通違反者講習会に参加したことのないドライバーでの平均罰金額がいくらか。

最初のステージでは、Tableau Prep Builder を使用して分析用にデータを再構築します。第 2 のステージ、Tableau Desktop での 2 番目の日付を使用した分析で、Tableau Desktop での分析に進みます。

このチュートリアルの目的は、最適な方法を規定して確立することではなく、現実のシナリオを背景にさまざまな概念を提示し、オプションを確認していくことです。終えるころには、データ構造による計算や分析への影響について理解が深まるだけでなく、Tableau Prep のさまざまな側面や Tableau Desktop での計算について習熟度が増しているに違いありません。

: このチュートリアルのタスクを完了するには、Tableau Prep Builder をインストールするかブラウザーで使用して、データをダウンロードする必要があります。2 番目のステージでは、Tableau Desktop もインストールする必要があります。

データ セットは Traffic Violations.xlsx です。このデータは、マイ Tableau Prep リポジトリのデータ ソース フォルダーに保存することをお勧めします。

このチュートリアルを続行する前に Tableau Prep Builder と Tableau Desktop をインストールするには、「Tableau Desktop および Tableau Prep 導入ガイドの概要」(新しいウィンドウでリンクが開く)を参照してください。または、Tableau Prep(新しいウィンドウでリンクが開く)Tableau Desktop(新しいウィンドウでリンクが開く) の無料トライアル版をダウンロードすることもできます。

データ

この例では、交通違反データについて検討します。違反 1 件につき 1 行としています。行には、ドライバーの氏名、日付、違反の種類、教習の参加が必須かどうか、罰金額が表示されます。

交通違反データ セットのプレビュー

目的のデータ構造

現在、違反 1 件につき 1 行とするデータ構造になっています。複数の違反を犯したドライバーは複数の行に表示され、どれが最初の違反でどれが 2 回目の違反かを判別するのは容易ではありません。

常習的な違反ドライバーを探すために、1 回目および 2 回目の違反の日付と、各違反の関連情報でデータ セットを分割し、ドライバー 1 人につき 1 行で情報が表示されるようにします。

目的のデータ構造のプレビュー

データの再構成

では、Tableau Prep を使用してこれを行う手順を見ていきましょう。フローを段階的に構築します。最初のフローで 1 回目の違反日を、次に 2 回目の違反日をそれぞれ導き出し、その後、目的の最終データ セットに加工します。内容に沿った Excel ファイル (Traffic Violations.xlsx) をダウンロードしたことを確認してください。

1 回目の違反日に対する最初の集計を行う

まず、Traffic Violations.xlsx ファイルに接続します。

  1. Tableau Prep Builder を開きます。

  2. [スタート] 画面から [データへの接続] をクリックします。

  3. [接続] ペインで [Microsoft Excel] をクリックします。Traffic Violations.xlsx を保存した場所に移動し、[開く] をクリックします。

  4. [フロー] ペインに [Infractions (違反)] シートが自動的に表示されます。

  5. データへの接続の詳細については、データへの接続を参照してください。

次に、1 回目の違反日をドライバーごとに特定する必要があります。これを行うには、[集計] ステップを使用して、ドライバー ID最小違反日付で構成されるミニ データ セットを作成します。

Tableau Prep で集計ステップを使用する場合、行の構成内容を定義するフィールドは グループ化したフィールドです。(今回は、Driver ID (ドライバー ID) が該当します)。グループ化したフィールドのレベルで集計および表示されるすべてのフィールドは "集計フィールド" です。(今回は、Infraction Date (違反日) が該当します)。

  1. [フロー] ペインで [違反] を選択し、プラス アイコンをクリックして、[集計] を選択します。

  2. [Driver ID (ドライバー ID)][グループ化したフィールド] ドロップ領域にドラッグします。

  3. [Infractions (違反)][集計フィールド] 領域にドラッグします。既定の集計は CNT (カウント) です。[CNT] をクリックし、集計を [最小] に変更します。

    フィールドの正しいレイアウトを示す集計ステップの構成ペイン

    これで、1 回目の違反日である、最小 (最も早い) 日付がドライバーごとに特定されます。

集計の詳細については、データのクリーニングと加工を参照してください。

  1. [フロー] ペインで [集計 1] を選択し、プラス アイコンをクリックして [クリーニング ステップ] を選択すると、集計の出力をクリーンアップできます。

  2. [プロファイル] ペインで、フィールド名 [Infraction Date (違反日)] をダブルクリックし、これを「1st Infraction Date (1 回目の違反日)」に名前変更します。

この段階では、フローとプロファイル ペインは次のように表示されます。

3 ステップのフローのビジュアル

[プロファイル] ペインのこの [クリーニング ステップ] から、データが 39 行と 2 つのフィールドのみで構成されていることが分かります。グループ化や集計に使用されないすべてのフィールドは欠落しています。しかし、元の情報の一部を保持したい場合があります。これらのフィールドをグループ化や集計に追加したり (ただし、詳細レベルが変更されるかフィールドの集計が必要になる)、このミニ データ セットを元のデータに結合したりできます (原則は [1st Infraction Date (1 回目の違反日)] の元のデータに新しい列を追加)。では結合しましょう。

  1. [フロー] ペインで [違反] を選択し、プラス アイコンをクリックして [クリーニング ステップ] を選択します。

    [違反] ステップと [集計] ステップの間の線ではなく、[違反] ステップに直接カーソルを合わせます。新しいクリーニング ステップが、分岐ではなくこの 2 つのステップの間に挿入された場合は、ツールバーの [元に戻す] 矢印を使用して、もう一度やり直してください。メニューには [挿入] ではなく [追加] と表示されます。

これにより、すべての元のデータを保持してフローが分岐します。全データから成るこのコピーに集計の結果を結合します。[Driver ID (ドライバー ID)] を結合することで、集計された最小日付が元のデータに追加されます。

  1. ステップ [Clean 2 (クリーニング 2)] を選択して [Clean 1 (クリーニング 1)] 上にドラッグし、[結合] 上でドロップします。

  2. Driver ID = Driver ID (ドライバー ID が等価の両者を内部結合する)、という既定の結合設定を満たしている必要があります。

  3. 結合の詳細については、データの結合を参照してください。

結合句のフィールドなど、フィールドによっては結合中に複製される場合があるため、結合後に関係のないフィールドをクリーンアップするのは良いアイデアと言えます。

  1. [フロー] ペインで [結合 1] を選択し、プラス アイコンをクリックして [クリーニング ステップ] を選択します。

  2. [プロファイル] ペインで、[Driver ID-1] のカードを右クリック (MacOS の場合は Ctrl を押しながらクリック) して [削除] を選択します。

  3. フィールドの順序を変更するには、[1st Infraction Date (1 回目の違反日)] のカードを [Driver ID (ドライバー ID)][Infraction Date (違反日)] の間の黒い線が表示されている場所にドラッグします。

この段階では、フローは次のようになります。

6 ステップのフローのビジュアル

下のデータ グリッドを見ると、組み合わされた新しいデータ セットが表示されています。データ セットの各行に、最小 (1 回目の) 違反日付がドライバーごとに追加されています。

1 回目の違反日フィールドを使用したデータのプレビュー

2 回目の違反日に対する 2 回目の集計を行う

2 回目の違反日も特定する必要があります。これは、違反日が最小の日付に等しいすべての行に対するフィルター、つまり、最初の日付を除去する方法で行います。次に、残った日付の最小値を別の集計ステップを使用して取り出すと、2 回目の違反日が残ります。この日付を分かりやすい名前に変更します。

: 現在、[Clean 3 (クリーニング 3)] にあるデータを今後のフローでも使用するため、別の クリーニング ステップを追加して、2 回目の違反日を取得するプロセスを準備します。これにより、クリーニング 3 のデータの現在の状態を後で使用できるようになります。

  1. [フロー] ペインで [Clean 3 (クリーニング 3)] を選択し、プラス アイコンをクリックして [クリーニング ステップ] を選択します。

  2. [プロファイル] ペインで、ツールバーから [値のフィルター] を選択します。[Infraction Date] != [1st Infraction Date] というフィルターを作成します。

  3. [1st Infraction Date (1 回目の違反日)] フィールドを削除します。

  4. [フロー] ペインで [Clean 4 (クリーニング 4)] を選択し、プラス アイコンをクリックして [集計] を選択します。

  5. [Driver ID (ドライバー ID)][グループ化したフィールド] ドロップ領域にドラッグします。[Infraction Date (違反日)][集計フィールド] 領域にドラッグし、集計を [最小] に変更します。

  6. [フロー] ペインで [集計 2] を選択し、プラス アイコンをクリックして [クリーニング ステップ] を選択します。[Infraction Date (違反日)][2nd Infraction Date (2 回目の違反日)] に名前変更します。

この段階では、フローは次のようになります。

9 ステップのフローのビュー

これで、ドライバーごとの 2 回目の違反日を特定できました。それぞれの違反 (種類、罰金、教習所) に関連する他のすべての情報を取得するために、このデータをデータ セット全体に再び結合する必要があります。

  1. [Clean 5 (クリーニング 5)] を選択して [Clean 3 (クリーニング 3)] 上にドラッグし、[結合] 上でドロップします。

  2. ここでも、Driver ID = Driver ID (ドライバー ID が等価の両者を内部結合する)、という既定の結合設定を満たしている必要があります。

  3. [フロー] ペインで [結合 2] を選択し、プラス アイコンをクリックして [クリーニング ステップ] を選択します。不要になった [Driver ID-1 (ドライバー ID-1 )][1st Infraction Date (1 回目の違反日)] の 2 つのフィールドは削除します。

この段階では、フローは次のようになります。

11 ステップのフローのビュー

1 回目と 2 回目の違反の全データ セットを作成する

先に進む前に、今までの学習を振り返って、どうすればすべてをまとめることができるか考えてみましょう。最終的に目的とする状態は、1 回目と 2 回目の違反を犯した Driver ID (ドライバー ID) の列と、日付、種類、教習所、罰金額の列がその後に表示されたデータ セットです。

目的のデータ構造のプレビュー

このためにはどうすれば良いでしょうか?

[Clean 3 (クリーニング 3)] のステップでは、各ドライバーの 1 回目の違反日が繰り返し記載された 1 列で構成される全データ セットができました。

ステップ クリーニング 3 のデータ グリッド ビュー

違反が初めてではないドライバーのすべての行を除外して、1 回目の違反のみで構成されるデータ セットを構築します。こうすると、1st Infraction Date = Infraction Date (1 回目の違反日と違反日が等価) で指定されたドライバーの情報のみが残ります。1 回目の違反の行のみが保持されるようにフィルターすると、[Infraction Date (違反日)] フィールドを削除したり、フィールド名を整理したりできます。

同様に、2 番目の集計と結合を実行すると、2 回目の違反がすべて記載された 1 列で構成される全データ セットができます。

ステップ クリーニング 6 のデータ グリッド ビュー

同様に 2nd Infraction Date = Infraction Date (2 回目の違反日と違反日が等価) フィルターを実行して、各ドライバーの 2 回目の違反に関する情報の行のみが残るようにします。ここで再び、新たに不要になった [Infraction Date (違反日)] を削除したり、フィールド名を整理したりできるようになります。

1 回目の違反日のデータ セットから始めます。

  1. [フロー] ペインで [Clean 3 (クリーニング 3)] を選択し、プラス アイコンをクリックして [クリーニング ステップ] を選択します。

    上記のステップ 10 と同様に、クリーニング 3 とクリーニング 4 の間に新しいクリーニング ステップを挿入するのではなく、分岐を追加します。

  2. この新しいクリーニング ステップを選択したまま、[プロファイル] ペインで、ツールバーから [値のフィルター] をクリックします。[1st Infraction Date] = [Infraction Date] というフィルターを作成します。

  3. [Infraction Date (違反日)] フィールドを削除します。

  4. [Infraction Type (違反タイプ)][Traffic School (教習所)]、および [Fine Amount (罰金額)] の各フィールド名の冒頭に「1st (1 回目)」を追加して名前変更します。

  5. [フロー] ペインのステップで、[Clean 7 (クリーニング 7)] をダブルクリックし、「Robust 1st (ロバスト: 1 回目)」に名前変更します。

次に、2 回目の違反で構成されるデータ セットの手順を実行します。

  1. [フロー] ペインで、最終の結合後に [Clean 6 (クリーニング 6)] を選択します。

  2. ツールバーの [値のフィルター] をクリックします。[2nd Infraction Date] = [Infraction Date] というフィルターを作成します。

  3. [Infraction Date (違反日)] フィールドを削除します。

  4. [Infraction Type (違反タイプ)][Traffic School (教習所)]、および[Fine Amount (罰金額)] の各フィールド名の冒頭に「2nd (2 回目)」を追加して名前変更します。

  5. [フロー] ペインでステップ名の [Clean 6 (クリーニング 6)] をダブルクリックし、Robust 2nd (ロバスト: 2 回目)に名前を変更します。

この段階では、フローは次のようになります。

12 ステップのフロー ペインの表示

全データ セットの作成

これで、2 つにまとめられ、すべての情報を含むデータ セットができました。このデータ セットには、ドライバーごとの 1 回目と 2 回目の違反に関する情報が含まれているため、Driver ID (ドライバー ID) で結合し直すと目的のデータ構造を作成することができます。

  1. [Robust 2nd (ロバスト: 2 回目)] を選択して [Robust 1st (ロバスト: 1 回目)] 上にドラッグし、[結合] 上でドロップします。

  2. 結合句では、Driver ID = Driver ID (ドライバー ID が等価の両者を内部結合する) を満たしている必要があります。

  3. ここでは、2 回目の違反を犯していないドライバーを除外したくないため、左結合を行う必要があります。[結合タイプ] 領域の [Robust 1st (ロバスト: 1 回目)] の横にある網掛けのない領域をクリックし、結合にします。

  4. [フロー] ペインで [結合 3] を選択し、プラス アイコンをクリックして [クリーニング ステップ] を選択します。重複する [Driver ID-1 (ドライバー ID-1)] フィールドを削除します。

これでデータが目的の状態となったため、分析に進むための出力を作成できます。

  1. [フロー] ペインで新しく追加された [Clean 6 (クリーニング 6)] を選択し、プラス アイコンをクリックして、[出力の追加] を選択します。

  2. [出力] ペインで [Output type (出力タイプ)] を .csv に変更してから、[参照] をクリックします。参照先名に「Driver Infractions (ドライバーの違反)」と入力し、該当する場所を選択してから、[許可] をクリックして保存します。

  3. ペイン下部の [フローの実行] ボタンをクリックして出力を生成します。ステータス ダイアログで [完了] をクリックしてダイアログを閉じます。

ヒント: 出力とフローの実行に関する詳細は、作業の保存と共有を参照してください。

最終的なフローは次のようになります。

完全なフローの最終的なビュー

: 次の全フロー ファイルをダウンロードして作業を確認することができます。Driver Infractions.tflx

まとめ

このチュートリアルの最初の段階では、元のデータ セットを取り出して、1 回目と 2 回目の違反日を分析するために準備することが最終目標でした。このプロセスは、次の 3 つのフェーズで構成されています。 

1 回目の違反日と 2 回目の違反日を識別

  1. 集計を作成して [Driver ID (ドライバー ID)] と最小の [Infraction Date (違反日)] が保持されるようにします。この情報と元のデータ セットを結合して、1 回目 (最小) の違反日がすべての行に表示される「中間のデータ セット」を作成します。

  2. 新しいステップでは、[1st Infraction Date (1 回目の違反日)][Infraction Date (違反日)] と同一のすべての行をフィルターします。フィルターしたデータ セットから、[Driver ID (ドライバー ID)] と最小の [Infraction Date (違反日)] が保持された集計を作成します。この情報と、最初のステップで作成した中間のデータ セットを結合します。これによって 2 回目の違反日が特定されます。

1 回目と 2 回目の違反でクリーニングしたデータ セットを構築する

  1. 中間のデータ セットに戻って分岐を作成し、[1st Infraction Date (1 回目の違反日)][Infraction Date (違反日)] と同一の行のみが保持されるようにフィルターします。これによって1 回目の違反に関するデータ セットのみが作成されます。不要になったすべてのフィールドを削除して整理し、1 回目の違反であることを示すために、必要なすべてのフィールドを名前変更します ([Driver ID (ドライバー ID)] を除く)。これで "Robust 1st (ロバスト: 1 回目)" データ セットが作成されます。

  2. 2 回目の違反日についてもデータ セットを整理します。[2nd Infraction Date (2 回目の違反日)][Infraction Date (違反日)] と同一の行のみが保持されるようにフィルターすることで、ステップ 2 の結合結果をクリーニングします。不要になったすべてのフィールドを削除して整理し、2 回目の違反であることを示すために、必要なすべてのフィールドを名前変更します ([Driver ID (ドライバー ID)] を除く)。これで "Robust 2nd (ロバスト: 2 回目)" データ セットが作成されます。

最初と 2 番目のデータ セットを 1 つのデータ セットに組み合わせる

  1. Robust 1st (ロバスト: 1 回目)Robust 2nd (ロバスト: 2 回目) のデータ セットを結合して、Robust 1st (ロバスト: 1 回目) のすべてのレコードを保持して 2 回目の違反を犯していないドライバーが欠落しないようにします。

次に、Tableau Desktop を使用したこのデータ セットの分析方法について学習します。

Tableau Desktop での 2 番目の日付を使用した分析に進みます。

: Ann Jackson の Workout Wednesday のトピック「顧客の購入額は 1 回目と 2 回目のどちらが多いか」(英語)(新しいウィンドウでリンクが開く) および Andy Kriebel の Tableau Prep のヒント「1 回目と 2 回目の購入日を求める」(英語)(新しいウィンドウでリンクが開く) は今回のチュートリアルに関し、最初の着想を与えるものとなりました。深く感謝申し上げます。これらのリンクをクリックすると、Tableau Web サイトから離れます。Tableau は外部プロバイダーによって管理されているページの正確さや最新度に関して責任を負いかねます。コンテンツに関するご質問はサイトの所有者にお問い合わせください。

フィードバックをお送りいただき、ありがとうございます。フィードバックは正常に送信されました。ありがとうございます!