今回のテーマは 多次元尺度構成法 (MultiDimensional Scaling),略してMDSです。
前回まではクラスタリングで「まとめていく」話をしていました。変数間の距離の近いものをひとまとめにする,というものでした。 数字が似ていると近い,という話でしたが,距離があるということは,空間的に離れているということ。この空間を再現するのがMDSです。
MDSは 距離から地図を作る技術 ,ととらえてください。 少し抽象的な言い方をすると,「相対的な関係から,背景にある空間関係を見出す」とも言えます。
サンプルデータで確かめてみましょう。まずはRの持っている距離データから。
data(eurodist)
eurodist
## Athens Barcelona Brussels Calais Cherbourg Cologne
## Barcelona 3313
## Brussels 2963 1318
## Calais 3175 1326 204
## Cherbourg 3339 1294 583 460
## Cologne 2762 1498 206 409 785
## Copenhagen 3276 2218 966 1136 1545 760
## Geneva 2610 803 677 747 853 1662
## Gibraltar 4485 1172 2256 2224 2047 2436
## Hamburg 2977 2018 597 714 1115 460
## Hook of Holland 3030 1490 172 330 731 269
## Lisbon 4532 1305 2084 2052 1827 2290
## Lyons 2753 645 690 739 789 714
## Madrid 3949 636 1558 1550 1347 1764
## Marseilles 2865 521 1011 1059 1101 1035
## Milan 2282 1014 925 1077 1209 911
## Munich 2179 1365 747 977 1160 583
## Paris 3000 1033 285 280 340 465
## Rome 817 1460 1511 1662 1794 1497
## Stockholm 3927 2868 1616 1786 2196 1403
## Vienna 1991 1802 1175 1381 1588 937
## Copenhagen Geneva Gibraltar Hamburg Hook of Holland Lisbon
## Barcelona
## Brussels
## Calais
## Cherbourg
## Cologne
## Copenhagen
## Geneva 1418
## Gibraltar 3196 1975
## Hamburg 460 1118 2897
## Hook of Holland 269 895 2428 550
## Lisbon 2971 1936 676 2671 2280
## Lyons 1458 158 1817 1159 863 1178
## Madrid 2498 1439 698 2198 1730 668
## Marseilles 1778 425 1693 1479 1183 1762
## Milan 1537 328 2185 1238 1098 2250
## Munich 1104 591 2565 805 851 2507
## Paris 1176 513 1971 877 457 1799
## Rome 2050 995 2631 1751 1683 2700
## Stockholm 650 2068 3886 949 1500 3231
## Vienna 1455 1019 2974 1155 1205 2937
## Lyons Madrid Marseilles Milan Munich Paris Rome Stockholm
## Barcelona
## Brussels
## Calais
## Cherbourg
## Cologne
## Copenhagen
## Geneva
## Gibraltar
## Hamburg
## Hook of Holland
## Lisbon
## Lyons
## Madrid 1281
## Marseilles 320 1157
## Milan 328 1724 618
## Munich 724 2010 1109 331
## Paris 471 1273 792 856 821
## Rome 1048 2097 1011 586 946 1476
## Stockholm 2108 3188 2428 2187 1754 1827 2707
## Vienna 1157 2409 1363 898 428 1249 1209 2105
この距離行列からMDSによって地図を作ります。MDSは大きく分けて二種類あって,計量MDS(メトリックMDS)と非計量MDS(ノンメトリックMDS)とよばれます。
非計量MDSは距離の大小関係を条件にする分析方法で,データが順序尺度水準であれば良いとされています。計量MDSは間隔尺度水準以上でなければなりません。前者が物理的な距等,厳密な距離関係に向いている,*後者が心理的な距離等,厳密さを少し緩めた仮定をもったデータに向いている,ととらえておけばいいでしょう。
今回のデータは実測値なので,前者のMDSを使います。関数はcmdscaleです。
result.cmd <- cmdscale(eurodist,2)
plot(result.cmd,type="n")
text(result.cmd,rownames(result.cmd))
距離データから地図がかけたでしょうか。ピンとこない人は,次のサイトを参考に実際の距離を計算し,MDSしてみましょう。 次に示すのは一例です。
http://www.alles.or.jp/~halcyon/
chu_goku <- matrix(c( 0, 93.2,292.1,203.7,230.8,
93.2, 0,204.5,132.6,137.6,
291.2,204.5, 0,107.4, 98.5,
203.7,132.6,107.4, 0,120.6,
230.8,137.6, 98.5,120.6, 0),ncol=5)
colnames(chu_goku)<-c("Y","H","T","S","O")
result.cmd <- cmdscale(chu_goku,2)
plot(result.cmd,type="n")
text(result.cmd,colnames(chu_goku))
距離データは素データから作ることも可能。 こちらのページ(http://www1.doshisha.ac.jp/~mjin/R/27/27.html)を参考に,アヤメのデータから距離行列を作って分析してみます。
data(iris)
summary(iris)
## Sepal.Length Sepal.Width Petal.Length Petal.Width
## Min. :4.30 Min. :2.00 Min. :1.00 Min. :0.1
## 1st Qu.:5.10 1st Qu.:2.80 1st Qu.:1.60 1st Qu.:0.3
## Median :5.80 Median :3.00 Median :4.35 Median :1.3
## Mean :5.84 Mean :3.06 Mean :3.76 Mean :1.2
## 3rd Qu.:6.40 3rd Qu.:3.30 3rd Qu.:5.10 3rd Qu.:1.8
## Max. :7.90 Max. :4.40 Max. :6.90 Max. :2.5
## Species
## setosa :50
## versicolor:50
## virginica :50
##
##
##
head(iris[,-5]) #ラベルの部分を除く記法
## Sepal.Length Sepal.Width Petal.Length Petal.Width
## 1 5.1 3.5 1.4 0.2
## 2 4.9 3.0 1.4 0.2
## 3 4.7 3.2 1.3 0.2
## 4 4.6 3.1 1.5 0.2
## 5 5.0 3.6 1.4 0.2
## 6 5.4 3.9 1.7 0.4
iris.dist <-dist(iris[,-5],method="euclidean")
iris.cmd<-cmdscale(iris.dist)
plot(iris.cmd,type="n")
text(iris.cmd,labels=iris[,5],col=unclass(iris[,5]))
非計量なMDSはMASSパッケージのisoMDS関数を使います。
library(MASS)
例えば次のようなデータがあったとします(数値は変えてくれて結構!)。
ARASHI <- data.frame(list(names=c("Ohno","Sakurai","Aiba","Nino","Matujin"),
speed=c("3" ,"5" ,"4" ,"4" ,"7" ),
looks=c("3" ,"3" ,"4" ,"5" ,"6" ),
pretty=c("5" ,"4" ,"2" ,"6" ,"1" )))
ここから距離行列を作ってプロットしてみましょう。
A.dist <- dist(ARASHI[2:4])
result.iso <- isoMDS(A.dist,k=2)
## initial value 4.866698
## final value 0.000000
## converged
result.iso$stress #MDSの当てはまり評価
## [1] 2.504e-14
plot(result.iso$points,type="n")
text(result.iso$points[,1],result.iso$points[,2],ARASHI$names)
このように,印象評定のデータから類似度を計算し,分析に用いることもできます。実際マーケティングなんかでは使われてたりします。