非プログラマーのためのインフォマティクス入門。(仮)

非プログラマーがインフォマティクスについて勉強したことを記録します。主にKNIMEというソフトを使用しています。

非プログラマーのためのインフォマティクス入門。(仮)

【KNIME】ノード紹介:Joiner 〜2つのテーブルをくっつけよう〜

今回はJoiner を紹介したいと思います。スーパー基本操作に関しては過去記事【超入門シリーズ(全3回)】に書いてみました。必要に応じて参照いただければと思います。

【超入門(1/3)】KNIMEの使い方 〜エクセルファイルを読んでみよう(Excel Reader)〜 - 非プログラマーのためのインフォマティクス入門。(仮)

【超入門(2/3)】KNIMEの使い方 〜欲しい行だけ抽出しよう(Row filter, splitter)〜 - 非プログラマーのためのインフォマティクス入門。(仮)

【超入門(3/3)】KNIMEの使い方 〜エクセルファイルとして書き出してみよう(Excel Writer)〜 - 非プログラマーのためのインフォマティクス入門。(仮)

 

Joiner

さて本題です。"Joinerは2つの異なるテーブルを照合しながらくっつける"ノードです。Excelでいうところのvlookupに近いんですかね?何かを入力することで動的?に情報を表示させるような入力フォーム作成時などにはvlookupを用いたExcelが有効かと思いますが、そういう使い方をするものではありません。

文章では分かりにくいので、キャプチャを載せます。おそらく一目瞭然かと思います。

f:id:sumtat:20170726213106p:plainJoinerには入口▶︎が2つあります。上の入口▶︎には【名前】【性別】【都道府県】をまとめたエクセルファイル、下の入口▶︎には【名前】【年齢】【会員番号】をまとめたエクセルファイルを入力情報として繋げています。これを名前をキーにして1つのテーブルにまとめましょう!というのがjoinerの使い方です。

ちなみに

  • 上▶︎のテーブルを"left table"
  • 下▶︎のテーブルを"right table"

という呼び方をするのがjoinerの仕様です。

 

<おまけ>

いずれのノードも選択していない(黒枠が付いていない)状態で、作業エリアのどこでもよいので右クリックメニューを開くとNew Workflow Annotationというのがあります。

これを選択すると作業エリアにメモが貼れます。またメモ書き以外にも、キャプチャのように囲み枠として使うことも可能です。色や背景色なども設定可能ですよ。

 

さて本題に戻って、joinerの設定を見ていきましょう。

f:id:sumtat:20170726214749p:plainまずくっつけ方(join mode)を選択します。

これ、超重要項目です!

算数・数学で習った?ベン図(オリンピックのマークみたいなやつ)のイメージで私は考えています。

Inner join

両方のテーブルに共通のものはくっつける(片方にしかないものは捨てる

Left Outer join

上▶︎のテーブル情報は全て残し、くっつけられる下▶︎のテーブル情報をくっつける

Right Outer join

下▶︎のテーブル情報は全て残し、くっつけられる上▶︎のテーブル情報をくっつける

Full Outer join

両方のテーブルに共通のものはくっつけるが、片方にしかないものも捨てない

という設定になります。

次にAdd rowをクリックし、現れたプルダウンのなかから照合したいカラムを選びます。今回の場合は両方とも【名前】です。

f:id:sumtat:20170726215902p:plainapply-OK後、実行すると次のような結果になります。

f:id:sumtat:20170726221017p:plain4つのmodeのイメージは掴んで頂けるのではないかと思います。が、今回の場合Right outer join, Full outer joinの結果には違和感を感じますね。その原因は、出来上がったテーブルからRight table由来の【名前】の情報が欠落してしまっている点にあると思います。

これはjoinerの設定で回避可能です。

joinerの設定画面上部のColumn Selectionを選択してください。下の方に"Joining Columns Handling"という部分があります。デフォルトではRemove joining columns form bottom input ("right table")にチェックが入っています→だからRight table由来の【名前】(joinのキーとなるカラム:joining column)が消えた。ですのでここを適当な条件に変更すればOKです。Right outer joinの場合はremove...top input、Full outer joinの場合は両方チェックを外すのがいいかな?と思いますが、場合により使い分けてくださいね。

f:id:sumtat:20170726223035p:plain両方のチェックを外して実行した、Full outer joinの結果では【名前】の欄が2つできています。これは"Column aggregator"というノードなどを用いて1つにまとめることができます(解説はまたの機会にしましょう)。途中で取り上げませんでしたが、Column settingの画面で、Always include all columnsのチェックを外し、カラム名をExclude(赤枠)、Include(緑枠)に振り分けることで、くっつけるカラムを選ぶこともかのうです(たとえば会員番号はくっつけないとか)。

 

簡単に2つのテーブルをくっつけることが可能ですが、joinerの前後でデータ(行・row)の数を必ず確認する癖をつけておくと良いと思います。キーとなるカラムに重複する(今回の場合、同姓同名がいるという意味)データがある場合や、2つのテーブルの重なり合いの度合いにより、join後のデータの数は増減します。

分かりやすい例として

  • left tableのキーとなるカラムに重複はない(今回の場合、同姓同名がいないという意味)→例えば10件
  • right tableのキーとなるカラムに重複がある(今回の場合、同姓同名がいるという意味)

という状態の2つをLeft outer joinでくっつけると、データ数が10より増えることになります(right tableに重複がなければデータ数は10のはず)。

すんすんすーんと何も考えずに進めすぎると、なんだか意味のわからないデータを扱うことになってしまいますので。

 

1操作行うごとに、その結果を気軽に確認できるのもKNIMEのよいところだと思います。

*似たようなフリーソフトにrapid minerとか、有償のソフトでpipeline pilotとか色々ありますが、結果の確認はKNIMEがやりやすいと感じます。

…rapid minerは一旦端っこまで繋いでやらないと行けないし、pipeline pilot はHTML viewerとかいちいち繋がないといけないし。もちろん、それぞれ良いところもありますが、途中のデータ確認という点ではKNIMEに1票です。

 

さて、今回のサンプルデータ内に【会員番号】というカラム名

"アルファベット" + "ー" + "数字"

というものを用意してみました。次回はこれを"ー"という特定の1文字の前後に分ける方法を紹介しようと思います。