読者です 読者をやめる 読者になる 読者になる

アクチュアリーはデータサイエンスの夢を見るか

Rで保険数理と機械学習をやっています

線形判別分析について(スイス銀行紙幣①)

はじめまして。

当ブログでは小生の独学した内容(主に機械学習)などについて備忘録をかねてまとめていきたいと考えています。多分に誤りが含まれることが予想されますので、お含みおきください。また、先人の皆様にとっては稚拙な内容にはなりますが、至らぬ点についてはご指導頂ければ幸いです。

 

今回は線形判別分析をとりあげます。データは次の論文のものを以下のサイトから孫引きします。

Flury, B. and Riedwyl, H. (1988). Multivariate Statistics, A Practical Approach, Cambridge University Press

http://mo161.soci.ous.ac.jp/@d/DoDStat/MethodsList/MultivariateAnalysis_allj.html

スイス銀行紙幣について、紙幣の横の長さ、紙幣の縦の長さ(左側)、縦の長さ(右側)、下部マージン、上部マージン、対角線の長さ、真札か偽札かの7つが変数となっているデータです。

 

データの散布図は次の通りです。

f:id:r_std:20160503082222p:plain

赤色が真札、緑色が偽札を示しています。さて、このデータを基にスイス銀行紙幣の真偽を定量的に判別するにはどうしたらよいでしょうか?

今回取り上げる線形判別分析は、各群団からの中心の距離(マハラノビス距離)によって判別を行う手法です。今回はスイス銀行紙幣のデータを真札群と偽札群の2群で判別するので、真札の平均からの距離と偽札の平均からの距離を比較して、距離が小さい方に判別を行います。

次の図は下部マージンと対角線の長さの2変数に絞った場合の線形判別を図示した例になります。

f:id:r_std:20160503154158p:plain

線形判別は各群団間の分散が等しいという前提に基づいた手法であることに注意が必要になります。中心からの距離だけに注目しているため、群団ごとの分布の裾の厚薄には対応できていないことが弱点です。一般的には偽札の方が製造精度が低いことが考えられるため、線形判別はフィットしづらいのではないかという予想のもと実行してみます。

200件のデータを100件ずつ学習用、テスト用に分けて実行したところ、テスト結果は次の通りとなりました。

> table(test_lda$class,test_y)
test_y
 0 1
0 49 0
1 1 50

等分散の前提に基づく線形判別分析でも、判別率99%という予想に反して良い結果が出ました。 

 

今回のソースは次の通りです。

```R
#データの読み込み
sb=read.csv("sbnote.csv")

#学習用データの区分
sb_train=rbind(sb[1:50,],sb[101:150,])
sb_test=rbind(sb[51:100,],sb[151:200,])

#散布図を描く
y=sb$class
x=sb[,-7]

pairs(x,main="銀行紙幣の散布図",pch = 21, bg=y+2)

#線形判別分析
train_x=sb_train[,-7]
train_y=sb_train$class
sb_lda=lda(train_x,train_y,prior=c(0.5,0.5))
sb_pred=predict(sb_lda)

#学習用データの結果
table(sb_pred$class,train_y)

#テスト用データの結果
test_x=sb_test[,-7]
test_y=sb_test$class
test_lda=predict(sb_lda,test_x)
table(test_lda$class,test_y) ```