[連載] フリーソフトによるデータ解析・マイニング 第17回
Rと判別分析
1.判別分析とは
私たち人間は毎日五感を通じて入力される膨大なデータを処理している。その中で最も多いのは、識別(discrimination)、分類(classification)、認識(recognition)に関する処理である。例えば、新聞や本などを読むときには、視覚を通じて入力されたデータと学習したデータとの照合を行い、その文字の読み方、文字・単語の意味などを識別・認識する。識別に関する能力は人間のみならず、他の動物も持っている。
このような識別・認識に関することを機械的に実現する研究分野がパターン認識(pattern
recognition)である。パターン認識の典型的な例としては、郵便番号による手紙の自動分類や指紋・顔照合によるセキュリティ管理などがあげられる。
パターン認識は、コンピュータに事前に入力・記憶させたデータと識別すべきデータとの一致度を何らかのモデルによって計算する。その中、最も古典的な手法は、判別分析(discriminant analysis)である。
判別分析は、個体(あるいは対象が)がどのグループに属するかが明確である学習データを用いて判別モデルを構築し、そのモデルを用いて所属不明の個体(テスト用データ)がどのグループに帰属するかを判別する方法である。
古典的判別分析には、距離(あるいは類似度)による判別と判別関数による判別分析などの方法がある。
判別分析では、所属不明の個体が2つのグループのいずれに属するかを判別する問題を2群判別分析、3つ以上のグループのいずれかに属するかに関する判別問題を多群判別分析とよぶ。
判別問題における学習データは、次の表のようにどの個体がどのグループに属するかに関する情報が必要である。グループに関する情報は、回帰分析の被説明変数に対応するが、回帰分析の場合は被説明変数が量的であるのに対して、判別分析のグループに関する変数は質的変数である。
表1 グループ
、
に関する学習用データ
|
個体 |
変 数 |
グループ情報 |
|
|
|
|
|
|
|
|
表1の中の
はグループ
に属する
番目の個体の
番目の変数である。グループ
に属する個体は
個、グループ
に属する個体は
個である。
判別分析の問題では、グループを識別するためのモデル(規則、あるいは関数など)を求めるためのデータセット(学習データ)とそのモデルを用いて判別、あるいは評価を行うデータセット(テストデータ)が必要である。
2.距離による判別分析
ここでは、説明の便利のため2群判別分析を例とする。距離による判別分析では、まず2つのグループ
と
の中心
、
を求める。中心として最も多く用いられているのはグループの平均ベクトルである。
グループ
、
のそれぞれの平均ベクトルを
、
とする。
![]()
![]()
ここの![]()
は次のように定義されている。
![]()
![]()
![]()
![]()
(ただし
=1〜
)
次に所属不明の個体からグループ
、
の中心までの距離を求め、所属不明の個体は距離の小さい方のグループに属すると判断する。
今、所属不明の個体
があるとする。
![]()
個体
からグループ
の中心
までの距離を
、グループ
の中心
までの距離を
とする。
距離による判別分析では、
ならば個体
はグループ
に、
ならば個体
はグループ
に属すると判断する。
判別すべき個体が2つのグループの中心から等距離にある特殊な場合は、判別不能である。
このような距離を用いた判別分析法は、グループ数が3以上の場合にも簡単に拡張することができる。またデータに関しては、どのような確率分布に従っているかのような条件を必要としないのが長所である。
距離の測度としては、Rにはユークリッド距離、市街距離、マハラノビス距離などの関数が用意されている。
マハラノビス(mahalanobis)距離は,多変量データ解析の書物に必ず登場する距離で,マハラノビス汎距離とも呼ぶ。マハラノビス距離は次ぎのように定義されている。
![]()
式の中の
はデータセット、
はグループの中心、
はそのグループの分散共分散行列、
は分散共分散行列の逆行列である。
Rにはマハラノビス距離を求める関数mahalanobisがある。その書き式を次に示す。
mahalanobis(
,
,
)
実例を用いて説明するため、Rの中に用意されているirisデータを用いることにする。データirisに関しては本誌のNo.117(p.87)に説明されている。help(iris)コマンドを実行すると英文による説明を読むことができる。
ここでは問題を簡単にするため、irisデータの第1行から第50行までのsetosaという品種、第101行から第150行までのvirginicaという品種のデータを用いる。
データirisの第1列から第4列まではそれぞれアヤメのがく片の長さと幅、花弁の長さと幅に関する計測データで、第5列(Species)は品種(グループ)を表す質的データである。
>data(iris)#バージョン2.0以後は必要ではない
>iris[c(1,51,101),]
Sepal.Length
Sepal.Width Petal.Length Petal.Width Species
1
5.1 3.5
1.4 0.2 setosa
51 7.0
3.2 4.7
1.4 versicolor
101 6.3
3.3
6.0 2.5 virginica
まずirisの中のsetosaとvirginicaの品種別のデータセットseto、virgiを作成する。品種ごとにデータセットを作成するので、グループの属性を示すSpecies列は必要がない。
>
seto<-subset(iris[1:50,],select=-Species)
>
virgi<-subset(iris[101:150,],select=-Species)
seto、virgiはそれぞれ50行のデータである。ここでは、各データセットの1〜45行を学習データとし、残りの5行(46〜50)をテストデータとする。
次に学習用データの平均ベクトルと分散共分散行列を求める。
> seto.m<-apply(seto[1:45,],2,mean)
>
virgi.m<-apply(virgi[1:45,],2,mean)
>seto.v<-var(seto[1:45,])
>virgi.v<-var(virgi[1:45,],)
次のコマンドを実行するとテストデータseto[46:50]と両グループ(seto[1:45,]、virgi[1:45,])の平均とのマハラノビス距離が求められる。
>D1<-mahalanobis(seto[46:50,],seto.m,seto.v)
>D2<-mahalanobis(seto[46:50,],virgi.m,virgi.v)
同様な方法でvirgi[46:50,]と両グループの中心までのマハラノビス距離を求め、どのグループに属するかを判別することができる。
説明の便利のため、ここでは学習用のデータとテスト用のデータを恣意的に前の45行と後の5行に分けているが、現実問題では、もっと説得力のある方法を取るべきである。
マハラノビス距離の定義からわかるように、マハラノビス距離を求めるためには、学習データの分散共分散行列の逆行列を求める必要がある。しかし、すべてのデータの分散共分散行列の逆行列が求められるとは限らない。
3.判別関数による判別分析
判別関数による判別分析は、線形関数と非線形関数による判別分析に分けられる。
(1) 線形判別分析
線形判別分析(Linear Discriminant Analysis)は、グループ分けの境界が直線、あるいは超直面であり、次のような線形関数を用いてグループの所属の判別を行う方法である。
判別関数=![]()
判別関数は、グループ間の分散とグループ内の分散の比を最大化することで求めることができる。
RのパッケージMASSの中にこのアプローチによる判別分析の関数オブジェクトldaがある。
>library(MASS)
関数ldaの詳細については、help(lda)で読むことができる。次にldaの最も簡潔な書式を示す。
lda(formula, data)
formulaには、回帰分析の場合と同様、「グループの識別変数~ 変数」のように記述する。
ここでもRの中のirisデータを用いて、ldaの使用法について説明する。
@ データセットの作成
前項では説明の便利のため、irisの2種類のデータを用いたがここでは3種類のirisを用いて3群判別分析を行う。
まずデータirisから、学習データとテストデータを作成する。その作成方法はいろいろ考えられるが、ここでは奇数行と偶数行に二分することにする。
>even.n<-2*(1:75)-1
>train.data<-iris[even.n,]
>test.data<-iris[-even.n,]
上記のコマンドで150行の中から行番号が奇数である75行を学習データ(train.data)、残りの偶数行のデータをテストデータ(test.data)とするデータセットが作成される。
>train.data[,5]<-Iris.lab
Sepal.Length Sepal.Width
Petal.Length Petal.Width Species
1
5.1 3.5
1.4 0.2 S
51
7.0 3.2
4.7 1.4 C
101 6.3 3.3 6.0
2.5
V
A 判別関数を求める
学習データセットを次ぎのように用いると判別分析に必要となる統計量が求められる。ただし、次の書き式は学習データセットの中の変数をすべて用いた場合の書き方である。学習データセットの中の変数の1部分を用いる際には、
のように用いる変数を記号「+」でつなぐ。
>(Z<- lda(Species~ .,data=train.data))
(2) 非線形判別分析
古典的な非線形判別分析では、2次式を含む非線形関数を用いる方法がある。RのパッケージMASSの中には2次式による判別分析の関数qdaが用意されている。 関数qdaの使用方法は、ldaとほとんど同じである。
一般化線形モデルで紹介した、目的変数が質的変数であるロジスティック回帰も非線形判別分析の一つの方法である。
判別関数のアプローチによる判別分析は、属性を示す変数の数が多くなると判別関数の構築が難しくなる。
4. 交差確認
判別分析やパターン認識の分野では、データセットから学習用のデータとテスト用のデータに分けてモデルの構築と評価をするのに交差確認(cross validation:交差検証、交差妥当化とも訳されている)という方法が広く知られている。
交差確認では、データセット全体をn部分(サブデータセット)に均等に分割し、そのうちの1つをテスト用のデータとして残し、それ以外のn-1つを学習用のデータとして用いる。
データセットをn部分に分割したときをn重交差確認(n-fold cross validation)法と呼ぶ。n重交差確認法では、一つのデータセットに対し、n回のモデルの構築とテスト(確認、検証)を行い、そのn回のテスト結果を全体の評価に用いる。
関数lda、qdaでは、データセットから1つの個体を除いて学習を行い、学習データに用いていない1つの個体で判別モデルの評価を行う作業を、すべての個体に対して繰り返す交差確認(leave-one-out cross-validation)の引数CVが用意されている。これは、n重交差確認のnが個体の数に等しい特殊なケースである。
デフォルトではCV=FALSEになっている。引数CV=Tにすると1つを除いた交差確認による結果が返される。次にirisデータを用いた1つを除いた交差確認の結果を示す。
>
iris.CV<-lda(Species~.,data=iris,CV=T)
>(lda.tab<-
table(iris[,5],iris.CV$class))
setosa
versicolor virginica
setosa 50 0 0
versicolor 0
48 2
判別率と誤判別率は次のコマンドで求めることができる。
>
sum(lda.tab[row(lda.tab)==col(lda.tab)])/sum(lda.tab)
[1] 0.98
> sum(lda.tab[row(lda.tab)!=col(lda.tab)])/sum(lda.tab)
[1] 0.02
個体数が十分大きくない古典的な判別分析では、1つの個体を除いた交差確認法が多く用いられているが、ニューラルネットワーク、決定木、サポートベクトルマシンのようなパターン認識の方法では、一般のn重交差確認法が多く用いられている。
nをいくつにするべきであるかは、用いるデータのサイズに依存するため明確な基準がなく、n=2、3、4、5、10が多く用いられているのが現状である。
残念ながら、判別関数lda、qdaにはleave-one-out
cross-validation以外の交差確認の機能が用意されていない。