今回のテーマは 多次元尺度構成法 (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))

plot of chunk unnamed-chunk-2

距離データから地図がかけたでしょうか。ピンとこない人は,次のサイトを参考に実際の距離を計算し,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))

plot of chunk unnamed-chunk-3

距離データは素データから作ることも可能。 こちらのページ(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]))

plot of chunk unnamed-chunk-4

非計量な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)

plot of chunk unnamed-chunk-7

このように,印象評定のデータから類似度を計算し,分析に用いることもできます。実際マーケティングなんかでは使われてたりします。

MDSのまとめ

本日の課題