データを探索していると、現在のデータフレームの列に、別のデータフレームの列の情報を追加したいことがよくあります。
そこで、Exploratoryでは、Excelの「Vlookup」や、SQLの「Join」のように、列ヘッダーメニューから簡単にデータを「結合」することが可能です。
なお、結合には以下のように、様々な種類があります。
そして結合の方法によって、得られる結果は変わってきます。
そこでこのノートでは、結合のタイプごとに、どのような結果を得られるかを見ていき、それぞれの結合の使い方を簡単に紹介いたします。
これはエクセルの「Vlookup」やSQLの「Left Outlier Join(左外部結合)」と同等の処理を実現します。
いらない
「左外部結合(Left Join)」は現在のデータフレームを保持して、結合したいデータフレームに結合可能な「キー」がない時はNA(欠損値)となります。
緑のテーブルは現在(結合元)のデータフレームを表しており、青いテーブルは結合したい(結合先)データフレームを表しています。
結合元のデータフレームの「航空会社」列を、結合したいデータフレームの「航空会社コード」列と照合して、「航空会社名」の列の情報を取ってきたいものとします。
緑色の結合元のデータフレームの1行目には「AA」という航空会社があり、青色の結合先データフレームの1行目にも「AA」という航空会社コードがあります。
また「UA」関しても同じことが言えます。このように両方に同じ値を持つ場合は「航空会社名」の情報を取得することが可能です。
一方で結合元のデータフレームの2行目の「AB」という値は、結合したいテーブルにはありません。そういった時は「航空会社名」列に結果が返らず、NA(欠損値)となるわけです。
「右外部結合(Right Join)」は共通の値(キー)をもたない行に対する結果が「左外部結合(Left Join)」とは異なります。
結合先のデータフレームの行を全て保持して、現在のデータフレームにマッチするキーがない時はNA(欠損値)を返します。
なお結合元のデータフレームに、結合先のデータフレームとマッチするキーがない時はその行は削除されます。
これは左外部結合(Left Join)と右外部結合(Right Join)の両方を兼ね備えた結合です。
完全外部結合では、現在(結合元)のデータフレームおよび、結合したい(結合先)データフレームの全ての行を保持して、マッチするキーがない時はNAを返します。
内部結合は完全外部結合(Full Join)とは逆の動き方をするため、マッチするキーがある行のみを保持します。
結合に対する理解をさらに深めたい場合、下記の2つのデータをダウンロードして、実際にそれぞれの結合をお試しいただけます。
ここからは、「フライトの遅延」をメインのデータフレームとして、各結合のタイプの動き方を紹介します。
フライトの遅延のデータは以下ようになっており、1行が1つのフライトを表しています。
また「航空会社」列の2文字コードは、それぞれ航空会社を表しているのですが、このままでは、それぞれの航空会社が、航空会社なのかよくわかりません。
しかし、今回はありがたいことに2文字の航空会社のコードと会社名の対応表である「航空会社コード」という別のデータフレームがあります。
そこで、それぞれの結合タイプを利用して、このデータフレームを「フライトの遅延」のデータフレームに「結合」していきます。
そのため、まずは「フライトの遅延」のデータフレームをテーブルビューから開きます。
まずは左外部結合(Left Join)から始めていきます。
「航空会社」列の列ヘッダーメニューから「結合(列を追加する/Join)」を選択します。
すると、「結合(列を追加する/Join)」のダイアログが開くので、「左外部結合(Left Join)」を選択します。
続いて、「結合先データフレーム」に「航空会社コード」を選択します。
そして現在のデータフレームと結合先データフレーム、両方の列を選択します。これらの列は2つのデータフレームで一致する「キー」を持つ列です。
結合元データフレームと結合先データフレームのキー列の設定が完了したら、「プレビュー」ボタンをクリックして、結合結果のプレビューの確認が可能です。
プレビュー内で青色でハイライトされている列は結合元のデータフレームを表しており、結合される列はオレンジ色でハイライトされます。
また、列名の下にあるバーにマウスカーソルを合わせることで、結合される列の欠損値がどの程度あるかの確認が可能です。この機能によって結合がうまくできているのかを確認できます。
なお、デフォルトの設定では結合先データフレームの全ての列が結合されます。
もし、結合する列を選択したいときには、「結合する列を選択」ボタンをクリックします。
すると、結合する列を指定するダイアログが表示されますので、今回は、「本社所在地」の列を取り除きます。
結合が設定が完了したら、実行をボタンをクリックします。
結合結果を確認すると、画面の左のメニューで、結合元データフレームがハイライトされていることと、追加された列がオレンジ色にハイライトされていることを確認できます。
ここからは、他の結合タイプを見ていきたいのですが、その際、あらかじめ、今回の結合した結果のデータを使って、フライトの遅延に関する集計表を作成しておくと、結果の違いが分かりやすいので、以下のように、チャートテーブルで集計テーブルを作成しておきます。
すると、航空会社が「VX」の場合、対応する「航空会社名」ないことが分かります。
ここからは、他の結合がどのように動くか見ていきます。
「結合(列を追加する/Join)」ステップのトークンをクリックして、結合ダイアログの設定を切り替えて、それぞれの結果を確認します。
「右外部結合(Right Join)」を選択して実行します。
先程、確認したピボットテーブルに戻ると、「右外部結合(Right Join)」を実行した結果でピボットテーブルが更新されていることを確認できます。
なお、航空会社が「MQ」「US」「YV」の場合、データが1行しかないことと、結合元データに存在していた列の「出発遅延」が欠損値になっていることが分かります。
これは「フライト遅延」のデータフレームに対応する値がない場合でも、「右外部結合(Right Join)」によって結合先である「航空会社コード」のデータフレームには、「MQ」「US」「YV」の値のすべての行が保持されるためです。
「内部結合(Inner Join)」に「結合タイプ」を切り替えると、「左外部結合(Left Join)」で表示されていた航空会社「VX」は表示されなくなり、「右外部結合(Right Join)」で表示されていた「MQ」、「US」、および「YV」も表示されなくなります。
これは内部結合が、2つのデータフレーム間で一致するキー列だけがある行だけを保持するためです。
「完全外物結合(Full Join)」に「結合タイプ」を切り替えると、両方のデータフレームのすべての行を保持します。
データを探索していると、別のデータフレームのデータをもとに、データをフィルタしたいことも生じます。
そういった時には「セミ結合(Semi Join)」や「アンチ結合(Anti Join)」といったデータがフィルターされるタイプのJoin(結合)が有効です。
これらの結合タイプは、「左外部結合(Left Join)」などの結合タイプとは異なり、結合先のデータフレームから列を取得(結合)するわけではありません。その代わりに、結合先のデータフレームのデータはフィルタのためだけに利用されるため、「フィルタ結合」と呼ばれます。
「セミ結合(Semi Join)」は、現在のデータフレームの行のうち、結合先のデータフレーム内に一致する値を持つ行のみを保持します。
上記の例では、青の結合先データフレームの「航空会社コード」に「AA」と「UA」があるため、セミ結合(Semi Join)を実行すると、メインデータフレームの「航空会社」が「AA」と「UA」の行のみが残ります。
「セミ結合(Semi Join)」と逆の動きをするのが、アンチ結合(Anti Join)で、結合先に一致する値がない行のみ残ります。
サンプルデータに先程利用した、こちらのデータを利用します。
例えば、最も頻繁に利用される上位10都市のフライト遅延データのみを表示したいとします。
これを行うために、まずはメインデータフレームから分岐したブランチのデータフレームを作成して、上位10都市のリストを作成します。
「フライトの遅延」のデータソースのステップから「ブランチの作成」アイコンをクリックして、ブランチのデータフレームを作成します。
新しく作成したブランチのデータフレームでは、2つのことを実施します。
まずは初めに「集計(Summarize)」機能を利用して各都市のフライト数を集計して、次に、フライド数の多い上位10都市にデータをフィルタしまあす。
列ヘッダーメニューから「集計」を選択します。
「グループ化」に「出発都市」、値に「(行の数)」を選択します。
続いて、値の列名を「フライト数」に変更し実行します。
これで、各都市から出発するフライトの数を集計できました。
「フライト数」の列ヘッダーメニューから「フィルタ」、「上位 Nのみを残す」を選択します。
値に「10」と入力し、実行します。
これで、最もフライト数が多い上位10都市のリストを作成できました。
続いて、メインのデータフレームに戻ります。
「出発都市」の列ヘッダーメニューから「結合(列を追加する/Join)」を選択します。
すると結合ダイアログが表示されるので、「結合タイプ」に「セミ結合(Semi Join)」を選択し、結合先データフレームに先程のブランチのデータフレームを選択します。
さらに両方のデータフレームのキー列に「出発都市」を選択し、実行します。
「セミ結合(Semi Join)」のステップを追加することができ、その結果の行数が3529行であることが確認できます。
サマリビューに移動して、「出発都市」のチャートを作成します。
バーチャートを利用することで、フライト数の多い上位10都市を確認できます。
さらにチャート「ピン」を「結合」ステップの前のステップに移動すると、すべての都市を含むバーチャートが表示されます。
もう一度、上位10都市のみに絞り込んだ結合ステップに「ピン」を戻します。
「セミ結合(Semi Join)」のステップのトークンをクリックして、結合ダイアログを開きます。
結合タイプを「アンチ結合(Anit Join)」に変更し実行します。
すると、フライト数の多い上位10の都市以外のデータのみのチャートが表示されます。
「列名に接尾語を足す」のオプションでは、同じ列名のものが結合元、結合先のどちらにもあった際に、接尾語を指定できるオプションとなっています。
列名に接尾語を使用しなかった場合、同じ列名があった時には以下のように結合元は「.x」が付き、結合先には「.y」がつくようになっています。