- 判別分析
- データの読み込み
まず,csv形式と呼ばれる,個々のデータがコンマで区切られた形式の
データファイルを読み込む.
- メニューの「データ」から,
「データのインポート」→
「テキストファイルまたはクリップボードから」を選ぶ.
- 読み込んだデータに R 用の名前(データセット名)を指定して,
ファイルの形式の詳細を指定する.下の例では,@データセット名が「dexam」,
Aファイルの1行目に変数名があることをチェック,Bフィールドの区切り記号が
カンマであること(フィールドとは,データファイルの列のこと),
C小数点の記号がピリオドであること,を指定している.これらを指定してから,
一番下の「OK」ボタンを押す.
- 読み込むデータファイルを指定する.
- 読み込んだデータの中身を確認しよう.
メニューの下にある「データセットの編集」ボタンを押すと,
読み込んだデータが表示され,修正もできる.データを見るだけなら,
「データセットを表示」ボタンでもいいが,そのボタンを押すと
ハングアップする不具合があるみたいだから,押さないように.
読み込んだデータセットは,5つの変数 x1,x2,x3,x4,g をもち,
最初の4つは実数値をとり,最後の g は文字 A,B,C の3つの値をとる
ことが確認できる.
- 散布図行列を表示する
読み込んだデータの変数 x1,x2,x3,x4 をペアにして,
散布図の表(散布図行列)を描くことにする.ただし,変数 g により
データをグループ分けして,散布図の点をグループごとに違うマークで
描くことにする.
- メニューの「グラフ」から, 「散布図行列」を選ぶ.
- 表示対象の変数 x1,x2,x3,x4 を選ぶ.連続した複数の変数を
選ぶときは,Shift キーを利用しよう(x1 をクリックして,Shift キーを
押しながら,x4をクリックする).
各散布図に最小2乗法による直線を表示するか,散布図の中心を通る滑らかな
曲線(平滑線)を描くかを指定することができる.さらに,行列の対角線上に
描くグラフの種類を指定することができる.ここでは,密度プロットを
選んである.また,変数 g により決まるグループごとにマークの形状を
変えるため,「層別のプロット」ボタンを押そう.
- 層別に使う変数として g が選択されていることを確認して,
「OK」ボタンを押す..
- 散布図行列のダイアログに戻るので,
「OK」ボタンを押す..
- グループごとに異なるマークや色で区別された散布図行列が
描かれた.グループが明確に分かれている散布図がどれで,分かれていない
グループがどれか確認しよう.また,対角線のヒストグラムが
複数のコブがあるかどうか確認しよう.複数のコブが存在する
変数は,グループ分けするときに有効な変数であることが予想される.
- 判別分析
- 準備として,スクリプトウィンドウに "attach(dexam)" と入力して,
「実行」ボタンを押す.こうと,データフレーム dexam の変数を
dexam$x1 など指定しないで,x1 とするだけでよくなる.
- 次に dexam の 1列目から4列目 ([,1:4]) について,つまり,変数
x1,x2,x3,x4について,分散共分散行列を求めて,変数 v に
入れよう.ただし,変数 g の値 A,B,C により分けられるグループ
ごとに求めることにする."by(データ,グループ分け変数,演算)"の
形で,グループごとに平均 mean や和 sum,分散 var などが計算できる.
結果は変数 v に代入されるが,A グループの分散は v$A,あるいは,
v[1] と指定すればよい.B,C グループについても同様に,
v$B,あるいは,v[2],v$C,あるいは,v[3] とする.
- 分散共分散行列と同様,グループごとに平均を求め,変数 m に代入しよう.
A グループは m$A,あるいは,m[1] などとすることは上と同様.
※ R の新しいバージョンでは,列ごとの平均を求める場合は,mean ではなくて,
colMeans にしなければならなくなっているので,
m<-by(dexam[,1:4],g,colMeans) と
しないとエラーがでる.
- 判別対象のデータ(1,0,-1,1) を変数 y1 に代入する.
※
数値の組(ベクトル)はc(数値,数値,....,数値)と表す.
- データ y1 から各グループの平均 m$A, m$B,m$C までのマハラノビス距離を求める.
出力ウィンドウを見ると,グループ B までの距離が 95.23... で,
最小であることがわかる.
したがって,y1は B から出現したと判断する.
- y2=(1,1,0,1),y3=(-0.3,-2.4,-0.8,0.2) についても同様に,各グループの平均までの
マハラノビス距離を求め,どのグループまでが最も
近いか調べよう.
出力ウィンドウをみると,y2はグループ A,y3はグループ C から出現したと
判断できる.
- 次に,Fisher の B-W 法により次元縮小をして,判別を行う.
この判別方法を正準判別分析ということがある.
MASS というライブラリーを読み込み,
lda という関数を利用しよう.関数 lda は色々な
使い方があるが,最初にモデル式 g~x1+x2+x3+x4 を入れて,
次にデータセット名を入れて使うことにする.ここで,
モデル式 g~x1+x2+x3+x4 は,グループを表す変数 g を
4つの変数 x1,x2,x3,x4を使って判別する関数を
求めることを意味していて,プラス記号 + には数学的な
意味はない.
判別分析の結果を代入した,dexam.lda の中を表示する.
- dexam.lda の中には,各グループにデータ数の比率
(Prior probabilities of groups:),グループの平均
(Group means:),判別関数の係数(Coefficients of linear discriminants:)
などが含まれている.
- 第1判別得点によるデータの分布をグループ別に表示するには,
"plot(dexam.lda,dimen=1)" と入力して,「実行」ボタンを押せばよい.
- 第1判別得点によるグループごとの分布を見ると,
グループAは他のグループと分離しているようにみえるが,
BとCは少し重なりがあるように見える.
- 第1判別得点と第2判別得点の散布図をグループ分けして見るには,
"plot(dexam.lda,dimen=2)" と入力して,「実行」ボタンを押せばよい.
- 第1判別得点と第2判別得点の散布図では,BとCのグループもほぼ
分離していることがわかる.
- 判別対象のデータ y1 と各グループの平均の距離を
第1判別得点と第2判別得点を用いて計算するには,
次のように入力すればよい.ここで,
dexam.lda$scaling には判別関数の係数を列ベクトルに
する行列で,t(dexam.lda$scaling)はその転置行列,
さらに,%*%は行列の積を表すので,
(t(dexam.lda$scaling)%*%(y1-m$A))^2 は
y1 とグループ A の平均 m$A の第1判別得点の差の2乗と
第2判別得点の差の2乗を成分とする列ベクトル.
"apply(行列,1or2,計算)"で行列の行方向(1)か列方向(2)に
計算をすることを意味する.1or2 で1を指定すると行方向,
2を指定すると列方向.
- 出力ウィンドウを見ると,y1とAの平均までの距離が 10.34309 で
最小.つまり,y1はA から出現したと判断する.
- 同様に y2 について行うと,Cまでの距離 29.44920 が最少で,
C から出現したと判断できる.
- 同様に y3 について行うと,Cまでの距離 0.03020619 が最少で,
C から出現したと判断できる.
- B-W法による判別関数を用いて,各グループからのデータが
どのグループから出現したか判別してみる.
"dexam.lpredict = predict(dexam.lda)" でその判別結果が計算され,
その結果を文字 dexam.lpredict に代入している.その結果を
見るには dexam.lpredict と入力して「実行ボタン」を押せばよい.
さらに,各データに対する判別結果と元々どのグループに属しているか
を表す変数 dexam$g を表にまとめるために,
"tabl = table(dexam.lpredict$class, dexam$g)" と入力しよう.
その結果を見るには,tabl と入力すればよい.さらに,
表の対角成分が正しく判別したデータの個数であるが,その比率を
求めるために
"(tabl[1,1]+tabl[2,2]+tabl[3,3])/sum(tabl)*100" と
入力すればよい.
- まず,各データがどのグループに属するのかの
判別結果 dexam.lpredict を表示した結果が,次の
通りである.$class の後の A,B,C の文字が
各データがどのグループに属するかを判別した結果である.
- さらに,正しいグループ名を表す変数 dexam$g との関係を
表にまとめた結果を見ると,本当はグループ A なのに
C と判別したものが2つあることが分かる.正しく判別したものの
確率は 95.93% で,逆に誤判別確率は 約4% であることがわかる.
- 各データがマハラノビスの距離による判別で,どのグループに属するかを
判別するために,"dexam.qda<-qda(g~x1+x2+x3+x4,dexam)" と
B-W 法のときと同じように入力する.さらに,その判別関数による
判別結果を求めるために "dexam.qpredict = predict(dexam.qda)" と
入力しよう.そうすると,dexam.qpredict の中に各データがどの
グループに属するか判別した結果が代入される.それを用いて,
正しいグループとの関係を上と同様に表にすると,
正しく判別した確率は 100%,つまり,誤判別確率は 0% であることがわかった.