1. 判別分析
    1. データの読み込み
      まず,csv形式と呼ばれる,個々のデータがコンマで区切られた形式の データファイルを読み込む.
      1. メニューの「データ」から, 「データのインポート」→ 「テキストファイルまたはクリップボードから」を選ぶ.



      2. 読み込んだデータに R 用の名前(データセット名)を指定して, ファイルの形式の詳細を指定する.下の例では,@データセット名が「dexam」, Aファイルの1行目に変数名があることをチェック,Bフィールドの区切り記号が カンマであること(フィールドとは,データファイルの列のこと), C小数点の記号がピリオドであること,を指定している.これらを指定してから, 一番下の「OK」ボタンを押す.



      3. 読み込むデータファイルを指定する.



      4. 読み込んだデータの中身を確認しよう. メニューの下にある「データセットの編集」ボタンを押すと, 読み込んだデータが表示され,修正もできる.データを見るだけなら, 「データセットを表示」ボタンでもいいが,そのボタンを押すと ハングアップする不具合があるみたいだから,押さないように.




          読み込んだデータセットは,5つの変数 x1,x2,x3,x4,g をもち, 最初の4つは実数値をとり,最後の g は文字 A,B,C の3つの値をとる ことが確認できる.


    2. 散布図行列を表示する
      読み込んだデータの変数 x1,x2,x3,x4 をペアにして, 散布図の表(散布図行列)を描くことにする.ただし,変数 g により データをグループ分けして,散布図の点をグループごとに違うマークで 描くことにする.
      1. メニューの「グラフ」から, 「散布図行列」を選ぶ.



      2. 表示対象の変数 x1,x2,x3,x4 を選ぶ.連続した複数の変数を 選ぶときは,Shift キーを利用しよう(x1 をクリックして,Shift キーを 押しながら,x4をクリックする). 各散布図に最小2乗法による直線を表示するか,散布図の中心を通る滑らかな 曲線(平滑線)を描くかを指定することができる.さらに,行列の対角線上に 描くグラフの種類を指定することができる.ここでは,密度プロットを 選んである.また,変数 g により決まるグループごとにマークの形状を 変えるため,「層別のプロット」ボタンを押そう.



      3. 層別に使う変数として g が選択されていることを確認して, 「OK」ボタンを押す..



      4. 散布図行列のダイアログに戻るので, 「OK」ボタンを押す..



      5. グループごとに異なるマークや色で区別された散布図行列が 描かれた.グループが明確に分かれている散布図がどれで,分かれていない グループがどれか確認しよう.また,対角線のヒストグラムが 複数のコブがあるかどうか確認しよう.複数のコブが存在する 変数は,グループ分けするときに有効な変数であることが予想される.



    3. 判別分析
      1. 準備として,スクリプトウィンドウに "attach(dexam)" と入力して, 「実行」ボタンを押す.こうと,データフレーム dexam の変数を dexam$x1 など指定しないで,x1 とするだけでよくなる.



      2. 次に 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] とする.



      3. 分散共分散行列と同様,グループごとに平均を求め,変数 m に代入しよう. A グループは m$A,あるいは,m[1] などとすることは上と同様.
        ※ R の新しいバージョンでは,列ごとの平均を求める場合は,mean ではなくて, colMeans にしなければならなくなっているので, m<-by(dexam[,1:4],g,colMeans) と しないとエラーがでる.



      4. 判別対象のデータ(1,0,-1,1) を変数 y1 に代入する.
        ※ 数値の組(ベクトル)はc(数値,数値,....,数値)と表す.



      5. データ y1 から各グループの平均 m$A, m$B,m$C までのマハラノビス距離を求める.



        出力ウィンドウを見ると,グループ B までの距離が 95.23... で, 最小であることがわかる. したがって,y1は B から出現したと判断する.



      6. y2=(1,1,0,1),y3=(-0.3,-2.4,-0.8,0.2) についても同様に,各グループの平均までの マハラノビス距離を求め,どのグループまでが最も 近いか調べよう.



        出力ウィンドウをみると,y2はグループ A,y3はグループ C から出現したと 判断できる.



      7. 次に,Fisher の B-W 法により次元縮小をして,判別を行う. この判別方法を正準判別分析ということがある. MASS というライブラリーを読み込み, lda という関数を利用しよう.関数 lda は色々な 使い方があるが,最初にモデル式 g~x1+x2+x3+x4 を入れて, 次にデータセット名を入れて使うことにする.ここで, モデル式 g~x1+x2+x3+x4 は,グループを表す変数 g を 4つの変数 x1,x2,x3,x4を使って判別する関数を 求めることを意味していて,プラス記号 + には数学的な 意味はない.




        判別分析の結果を代入した,dexam.lda の中を表示する.



      8. dexam.lda の中には,各グループにデータ数の比率 (Prior probabilities of groups:),グループの平均 (Group means:),判別関数の係数(Coefficients of linear discriminants:) などが含まれている.



      9. 第1判別得点によるデータの分布をグループ別に表示するには, "plot(dexam.lda,dimen=1)" と入力して,「実行」ボタンを押せばよい.



      10. 第1判別得点によるグループごとの分布を見ると, グループAは他のグループと分離しているようにみえるが, BとCは少し重なりがあるように見える.



      11. 第1判別得点と第2判別得点の散布図をグループ分けして見るには, "plot(dexam.lda,dimen=2)" と入力して,「実行」ボタンを押せばよい.



      12. 第1判別得点と第2判別得点の散布図では,BとCのグループもほぼ 分離していることがわかる.



      13. 判別対象のデータ 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を指定すると列方向.



      14. 出力ウィンドウを見ると,y1とAの平均までの距離が 10.34309 で 最小.つまり,y1はA から出現したと判断する.



      15. 同様に y2 について行うと,Cまでの距離 29.44920 が最少で, C から出現したと判断できる.





      16. 同様に y3 について行うと,Cまでの距離 0.03020619 が最少で, C から出現したと判断できる.





      17. 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" と 入力すればよい.



      18. まず,各データがどのグループに属するのかの 判別結果 dexam.lpredict を表示した結果が,次の 通りである.$class の後の A,B,C の文字が 各データがどのグループに属するかを判別した結果である.



      19. さらに,正しいグループ名を表す変数 dexam$g との関係を 表にまとめた結果を見ると,本当はグループ A なのに C と判別したものが2つあることが分かる.正しく判別したものの 確率は 95.93% で,逆に誤判別確率は 約4% であることがわかる.



      20. 各データがマハラノビスの距離による判別で,どのグループに属するかを 判別するために,"dexam.qda<-qda(g~x1+x2+x3+x4,dexam)" と B-W 法のときと同じように入力する.さらに,その判別関数による 判別結果を求めるために "dexam.qpredict = predict(dexam.qda)" と 入力しよう.そうすると,dexam.qpredict の中に各データがどの グループに属するか判別した結果が代入される.それを用いて, 正しいグループとの関係を上と同様に表にすると, 正しく判別した確率は 100%,つまり,誤判別確率は 0% であることがわかった.