ホーム > ライブラリー > Teradata Insight > データマイニング・ヒッチハイクガイド > 第6回:データの操作、結合
山本 泰史
マーケティング統括部
マーケティング部 スペシャリスト
(前回からの続き)
データを取得する際の SQL に演算子や関数を組み入れることによって、複数のカラムを合成したインスタントのカラムや、カラムから本来得たい値を直接的に取得することが可能です。演算子の代表といえば四則演算: + (足す)、- (引く)、(*) (掛ける)、/ (割る)ですが、これらはこのように組み入れることが可能です。
| SELECT | 役務収入 + 利息収入 AS 総収入 |
| FROM | 収入 |
| WHERE | 総収入 > 100,000 ; |
ここで総収入のデータカラムは元々存在しないのですが、役務収入と利息収入の値を足してインスタントに合成して取得しています。また、関数としては以下のようなイメージです。日立市に住んでいる顧客の数を返すことになります(上記の例同様、顧客数というカラムは存在しないため、インスタントに作成しています)。他の関数としては AVG(平均値)、SUM(合計値)、MAX(最大値)、MIN(最小値)等が挙げられます。
| SELECT | COUNT(顧客番号) AS 顧客数 |
| FROM | 顧客 |
| WHERE | 居住地域 = 日立市 ; |
異なるテーブル間に存在する複数のカラムを、同一の表の中に表現したい場合、データの結合(JOIN)を行ないます。データマイニングにおいて必要となるデータセットの多くは単一の表であることを求め、一方でデータベース内のデータは複数のテーブルに分かれて蓄積されているため、これらを結合する必要があります。そして、データマイニングに利用する結合には大きく、以下 4つの種類があります(*6)。
データの結合を行なう際の足がかりとなるのは、外部キーです。あるテーブルで外部キーになっているカラムと、他のテーブルで主キーになっているカラムが同一であれば、この同一性を足がかりに結合を行うことが可能となります。以下は、内部結合の例です。
| SELECT | 顧客番号, 性別名称 |
| FROM | 顧客 INNER JOIN 性別 |
| ON | 顧客.性別番号 = 性別.性別番号 ; |
SELECT 以降で、最終的に欲しいカラムを明示しています。しかしながらこの 2つのカラムはそれぞれ別のテーブルに存在するため、結合をしなければなりません。そのため、ON句にて[テーブル名].[カラム名] = [テーブル名].[カラム名]と指定して、結合させる外部キーと主キーを明示させています。結合に用いるカラムは、必ずしも取得する(SELECT に含める)必要はありません。これによって、顧客番号と性別名称を単一の表にまとめることが可能となります。構文はそれぞれ異なりますが、その他の 2. から 4. の結合形態に関しても、このように同一のカラムとなっているキー同士をつなぎ合わせることによって結合結果を得ることが出来ます。
以下をご覧ください。

NULLはブランク、つまり何もないということを意味します。値が 0 であるということとは異なります。ここから、顧客番号と性別名称の表を作成したいとしましょう。結合形態に応じて、得られる結果は異なります。
| 内部結合の場合: | [101 | 女性] |
| 左外部結合の場合: | [101 | 女性] [102 | NULL] [103 | NULL] |
| 右外部結合の場合: | [101 | 女性] [NULL | 男性] |
| 全外部結合の場合: | [101 | 女性] [102 | NULL] [NULL | 男性] [103 | NULL] |
内部結合の場合、両方にキーとして同じ値があるもののみを結合の対象として返します。これに対して全外部結合は、同じ値があるもの、ないものを問わず、結合結果を返します。これに対して、左外部結合は左側にある顧客テーブルの性別番号を基準にするため、値としては 0 と 2 しか結合の対象として考慮しません。これに対して右側外部結合では、右側にある性別テーブルの性別番号を基準にするため、値として 0 と 1 しか結合の対象として考慮しないということになります。ここで言っている左、右とは、上述した SQL文においてイコールで結んでいるカラム、そして JOIN で結んでいるテーブルが、イコールを基準にしたときに左側にあるか、右側にあるかを意味しています。従って右左を入れ替えて、さらに結合の形態を右左で変更すれば同じ結果が得られます。
通常データマイニングにおいては、それぞれの顧客を行の単位として用いるケースが多いと思います。この場合は常に顧客を識別できる識別子を常に最初(つまり左側)に配置し、それを有するテーブルとカラムを左側に配置し、左側を基準にして LEFT OUTER JOIN を行なえば、顧客を基準として、各顧客の変数を並べていくことが可能となります。つまり常に左側を基準としておくことによって、利用する結合を LEFT OUTER JOIN に限定できます。
以上、データの取得、操作、結合について説明をしていきました。これらの手法を利用することによって、データウェアハウスから必要となるデータセットを作成することが可能となります。重ね重ねになりますが、構文を覚える必要はありません。求めたいデータセットのイメージに対してどのような手順でアプローチすれば良いのかが理解できれば、データマイニングを行なうには充分です。
ついでと言っては何ですが、図3 に存在する NULL値、性別区分情報に存在しない 2 という値は明らかにおかしく、これらに関してはデータマイニングを行なう際に考慮が必要です。前者は本来必要なデータ値がセットされていないということであり、後者に関してはデータそのものが誤って蓄積されているということを意味します。これ以外にもありえない値が入力されているケースや、全体の傾向から考えて特殊なケースと思われる値(外れ値と呼ばれます)が存在する場合があります。この際にはデータの修正を行ない、利用に値するデータにする必要があります。選択肢としては、以下が考えられます。
残念ながら、このうちのどれを選択すべきかをシステマティックに規定することはできません。また、一見おかしいと思えても、それが事実であり、それこそが発見したい知識である場合もあります。データマイニングで行ないたいのは、データ全体が説明してくれる傾向をモデルとして理解することです。従って上述の処理によって全体の傾向に大きな影響を与えない方法を選択すべきです。例えば 1,000万件のデータの中に 3行だけおかしなデータが存在するのであれば、1. もしくは 2. を選択しても大勢に影響はないかもしれません。ある特定のカラムにおける歯抜けがあまりにひどいのであれば、1. もしくは 2. を選択することは出来ず、3. を検討しなければなりませんが、一方でそのカラムをどうしても含めたいと思っており、最頻値、最小値、平均値等で置き換えても、さしたる影響をモデルに与えないのであれば 4.も選択肢となります。
*6: 実際にはこれ以外に、自己結合(SELF JOIN)、内積結合(CROSS JOIN)が存在しますが、ここでは割愛します。