データを集計していると、ある列の値をキーにして2つの表をマージしたいことがあります。Excelでこれを行おうとすると、vlookupのような関数をつかったり、VBAプログラミングをしたりとかなり面倒な作業です。数行のプログラミングでこの作業を簡単に行う方法を説明します。
特定の列の値をキーにして2つの表を結合(マージ)したい
仕事で表を扱う場合、別々のシステムから取得した表を、ある列の値をキーにしてマージしたいことがあります。例えば以下のような場合です。
tableA | tableB |
tableAにはEmailと漢字の姓(姓)、tableBにはEmailとローマ字の姓(Lastname)が入っています。このときに、tableAとtableBにあるすべてのデータをEmailをキーに一意で、1つの表にまとめたいときがあります。ほしいのは以下のような表です。
tableAに存在するがtableBに存在しないデータ(okada@pmail.com、hirata@pmail.com)と、tableBに存在するがtableAに存在しないデータ(nakamura@pmail.com)があるため、結合する場合には注意が必要です。
経験したことがある人はわかると思いますが、このような作業をExcelでやるのは意外と面倒です。
キーとなるEmailをユニークにしておかなければならなかったり、ソートしておかないとvlookupがうまく機能しないとか、片方のテーブルにない値があるとエラーになるとかです。Excelで正しい結果を得るためには、それなりの配慮、前処理、複数回のマニュアル操作が必要です。
これをもっと簡単にやる方法はないか?というのが本記事の内容です。
Excel以外の選択肢は?
さて、Excelが面倒、できないとなるとプログラミングをする必要があります。
現在データサイエンスで主流のプログラミング言語は「Python」です。Pythonは汎用的なプログラム言語であり、様々なタスクに利用できますが、ライブラリを読み込んだりセットアップが意外と面倒です。エンジニアには苦にはならないと思いますが、プログラミングに慣れていない、文系出身のビジネスマンが利用するには少々ハードルが高いかもしれません。
そのような人でも比較的使いやすいのは、「MATLAB」というプログラミング言語です。
MATLABは、数値計算やデータ可視化を行うための高レベルのプログラミング言語および環境で、主に技術計算や科学技術分野で広く使用されています。
そう言われると、専門的なエンジニアのみが使う言語のように思われがちですが、実は一般のビジネスマンでも役立つ用途があります。それは表データの加工です。
MATLAB (Matrix Labratory)は、その名前の由来通り、行列(matrix)演算を容易に行えるよう設計されています。つまり、行列=表の扱いが他のプログラミング言語に比べて非常に楽なのです。
製品版は 個人利用のインストール版であれば 17,000円/年とそれなりの値段ですが、MATLAB Onlineと呼ばれるオンライン環境であれば、機能や時間に制限はあるものの、無料で利用することが可能です。
<MATLAB Online 無料版の機能制限> (出典: MATLAB Onlineのバージョン)
1 か月の利用可能時間 | 1 か月あたり 20 時間 |
ストレージ | 5 GB |
連続計算時間 | 15 分 |
非アクティブ時のアイドルタイムアウト | 15 分 |
MATLABを使うと表データの操作がどのくらい簡単なのか、具体的にみてみましょう。
MATLABで表の結合(マージ)を行う方法は?
データベースでテーブル(表)を扱うとき、2つのテーブルの結合の仕方には大きく分けて2つの方法があります。
外部結合 (Outer Join) | 2つの表のどちらかに存在するデータを1つの表にまとめます。 |
内部結合(Inner Join) | 2つの表の両方に存在するデータを1つの表にまとめます。 |
両者の違いについての詳しい説明はこちらのサイトにあります。「内部結合と外部結合の違いとは?」
今回の作業は、Emailがどちらかの表にある行をすべて残すので、「外部結合」となります。
MATLABで外部結合を行う関数は、その英語名の通り、”outerjoin”関数です。
使い方は、MATLABのドキュメンテーションに書かれていますが、記述が専門的であるため初めての方にはとっつきにくいことでしょう。以下にできるだけわかりやすく説明します。
MATLABで、tableAとtableBの外部結合を行い、表Tを作成したい場合、以下のように1行のコマンドで記述します。
T = outerjoin(tableA, tableB, ‘MergeKeys’, true); |
このコマンドを実行すると、以下のように”ほぼ”期待通りの出力となります。
”ほぼ”と書いているのは、日本語の列名が”x__”と英語に変換されているためです。
MATLABでは日本語の列名は、テーブルに取り込むときに英語に変換されてしまいます。
表を読み込むときには列名に注意が必要です。
コマンドの中にある ’MergeKeys’というのは、2つの表からキーとなる列(この場合は’Email’)を一意にまとめることを指定しています。tableAもしくは tableBのどちらかにEmailが存在すれば、結合された表にデータが残ります。
それでは、MergeKeysを指定しないとどうなるのでしょうか?
以下のコマンドを実行してみます。
T = outerjoin(tableA, tableB); |
結果は、tableA、tableBそれぞれのEmailの列が1つにマージされず、別々の列 “Email_A”, “Email_B”となって表が結合されます。
その他の結合の仕方は?
2つの表(テーブル)の結合の仕方には、外部結合の他に内部結合があります。
内部結合の場合には、両方の表に共通するキー(この場合はEmail)の値をもつ列のみがマージされます。
MATLABで2つの表の内部結合を行うには、innerjoin関数を使います。
MATLABで、tableAとtableBの内部結合を行い、表Tを作成したい場合、以下のように1行のコマンドで記述します。
T = innerjoin(tableA, tableB); |
このコマンドを実行すると、以下のような結果となります。(注:前出のtableAの姓の列名を”Kanji”に変えています)
片方の表にしか存在しないデータは、残らず、tableAとtableBの両方に存在するEmailについて表が結合されています。