今回のテーマは 多次元尺度構成法 (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が物理的な距等,厳密な距離関係に向いている,非計量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("Yamaguchi","Hiroshima","Tottori","Ssimane","Okayama")
result.cmd <- cmdscale(chu_goku,2)
plot(result.cmd,type="n")
text(result.cmd,colnames(chu_goku))
非計量なMDSはMASSパッケージのisoMDS関数を使います。
library(MASS)
今回も前回と同じ,KOCの芸人距離行列をターゲットにします。
# データを読み込みます。owarai1.csvを使ってください。
# 一列目は評定者の名前が入っているので除外します
dat <- read.csv("owarai1.csv",fileEncoding = "UTF-8")
# t()はtranspose(転置)の関数で,行と列をひっくり返します
dat.dist <- dist(t(dat[,-1]),method="euclidian")
dat.dist
## アキナ カミナリ 相席スタート スリムクラブ ハライチ
## カミナリ 43.41659
## 相席スタート 16.88194 33.52611
## スリムクラブ 32.72614 35.52464 31.49603
## ハライチ 28.49561 46.11941 27.65863 37.13489
## スーパーマラドーナ 34.87119 42.79019 28.47806 39.20459 23.79075
## さらば青春の光 30.78961 31.38471 19.87461 39.86226 30.62679
## 和牛 47.30750 37.93415 37.80212 53.15073 44.49719
## 銀シャリ 28.80972 36.56501 24.14539 38.63936 22.27106
## スーパーマラドーナ さらば青春の光 和牛
## カミナリ
## 相席スタート
## スリムクラブ
## ハライチ
## スーパーマラドーナ
## さらば青春の光 27.31300
## 和牛 33.10589 28.31960
## 銀シャリ 20.14944 20.24846 30.69202
これを元に,MDSをしてみます。
result.iso <- isoMDS(dat.dist,k=2)
## initial value 7.256674
## iter 5 value 5.508022
## iter 10 value 5.085214
## iter 15 value 5.016502
## iter 15 value 5.014382
## iter 15 value 5.013850
## final value 5.013850
## converged
result.iso
## $points
## [,1] [,2]
## アキナ 16.234685 4.5599662
## カミナリ -6.756912 -24.9748213
## 相席スタート 4.750735 -1.5823185
## スリムクラブ 24.050961 -15.9084908
## ハライチ 6.210246 15.9794996
## スーパーマラドーナ -5.403409 13.7553791
## さらば青春の光 -9.194414 -0.4752412
## 和牛 -28.000058 2.2876800
## 銀シャリ -1.891833 6.3583470
##
## $stress
## [1] 5.01385
ここで,$points
とあるのは地図の座標です。
ところで,誰が二次元と決めたのでしょう? おかしなことをいうように思えるかもしれませんが,地図は二次元ですが,地球は三次元。数学的にはn次元空間というのもありえます。 心の空間は縦横に広がっているという決まりもありません。 数学的には何次元でもあり得るので,逆に二次元は少なすぎるということもあります。三次元,四次元と次元が増えて行ったほうが表現できる情報は多く,データもよりうまく再現できます。ただし,増えすぎると直感的にはわかりにくくなる。そこで,このバランスをどうとるのか,というのが問題になります。
MDSはデータと理論的な地図との距離を$stress
という適合度で表現します。
今回は5.01385とでました。isoパッケージの特徴で, stressがパーセンテージで表現されていることに注意して,参考となる大きさを見てみましょう。 (参考;[連載] フリーソフトによるデータ解析・マイニング 第27回Rと多次元尺度法
5.01は「0.05 よい(good)」なので,よしとしましょうか。 プロットしましょう。
plot(result.iso$points,type="n")
text(result.iso$points,row.names(result.iso$points))
スリムクラブと和牛のネタが両極に位置しています。ハライチとカミナリも両極ですね。このことから次元にどういう意味があるか考えてもいいかもしれません。
もちろんこれも前回同様,評定者の方を地図にして考えることもできます。 色々な表現方法があることを理解し,イメージしてみてください。
地図を描くことができれば,地図の意味を読み取ったり,地図の上に情報を書き加えたりすることができます。MDSでどんなことができるか,少しご紹介します。
## initial value 0.000000
## final value 0.000000
## converged
## $points
## [,1] [,2] [,3] [,4]
## 1 -203.169295 -42.5233449 9.7040167 2.3687038
## 2 -232.056579 3.8149666 -9.2372729 12.1928218
## 3 45.486848 -42.0379794 5.4199241 5.7647548
## 4 -113.492690 -11.0895851 -18.1208816 15.5899094
## 5 335.425708 -22.3989182 -4.8099385 -2.6086928
## 6 -147.912914 -28.1779918 -2.2955071 11.1410792
## 7 183.261878 -39.7308868 -14.1440378 -8.2341751
## 8 -105.988662 -26.0128557 5.4569408 10.3868476
## 9 88.783116 13.2494547 -8.3581800 11.1403166
## 10 246.382438 -24.8679480 -0.9302963 3.5677307
## 11 -119.255793 -48.4902692 -9.7919175 -3.0005138
## 12 -206.088281 -4.8773910 -7.1751219 -2.5665123
## 13 152.929249 -26.3854843 -4.8671160 5.2109207
## 14 59.013247 -30.3632440 -5.7461809 0.1920359
## 15 -184.294161 -28.8084918 -3.6832277 6.6598321
## 16 -248.397790 24.4998739 -28.0373700 14.7727019
## 17 2.688398 -22.9243608 -15.7581467 6.9695723
## 18 -101.609528 22.1551308 -4.1090039 4.7157847
## 19 88.996118 7.2624368 12.8209007 -4.5618102
## 20 274.353884 -1.7772232 9.0194771 0.6662412
## 21 -6.790480 34.2195280 10.9156187 4.4721604
## 22 -198.138459 -55.4652853 -5.3654959 -12.1263526
## 23 -277.019964 -4.3089768 10.8527024 1.7195980
## 24 213.593021 14.6791710 -3.5344914 3.2551628
## 25 -265.564962 3.4415520 -9.6919756 -6.5646307
## 26 301.716845 14.1260078 26.0963534 4.6330909
## 27 156.687964 11.0035370 -2.1275836 -0.3951575
## 28 -208.732949 31.4549213 -6.9809482 -8.8059923
## 29 81.788736 4.4912465 -4.2945285 -0.3861387
## 30 219.564767 12.9391261 -11.3844470 -3.7225652
## 31 -233.887559 12.0562986 15.8411312 -1.7284427
## 32 -225.599279 30.9647115 -0.3010930 -7.9898273
## 33 -234.811257 20.4549980 0.3857944 0.4489860
## 34 -239.450936 -27.8122199 14.6073590 -1.8954032
## 35 -68.562867 22.1378191 4.1865686 8.3353740
## 36 -293.651142 13.1992331 2.4046920 7.2420642
## 37 -105.898117 32.4859159 -18.4769571 -2.9942608
## 38 1.057944 15.4149063 8.3873134 -6.5003560
## 39 -207.242005 -26.1355788 -20.1651438 -2.6995717
## 40 205.844044 -3.1651199 5.9671435 2.1355332
## 41 231.946212 -9.3052004 -1.4689358 -5.3264329
## 42 240.822106 1.2262361 -9.0268103 -4.8952906
## 43 -244.736972 5.4218288 4.6487091 -9.6659323
## 44 361.895199 2.8416289 -1.5320267 -0.2557883
## 45 329.187907 -1.3359634 -0.1716320 -1.2202112
## 46 376.218866 -2.5376073 -1.4481418 -2.2279315
## 47 -273.324355 14.0230580 -13.6932439 0.8389767
## 48 -159.509809 -0.6700883 -25.2779294 -17.7662819
## 49 13.006671 12.6272756 -7.1630162 4.5741318
## 50 170.650177 15.0917059 -0.4514835 1.1967478
## 51 274.435940 -17.6604737 -1.4674405 -0.9891072
## 52 -121.618092 29.0344863 -13.0068323 -7.1231538
## 53 345.667658 6.9590156 3.8411940 2.7178539
## 54 242.328612 13.7058726 -8.6010978 -1.6077564
## 55 175.099580 12.4249958 3.2896317 0.8876657
## 56 -202.496839 45.5448438 13.4334209 -0.5695758
## 57 -62.262623 -35.8931634 6.0290794 4.0555195
## 58 -58.057814 21.1664159 6.2107052 -4.9161584
## 59 -139.319726 -8.9547715 1.8863249 -3.0412060
## 60 -71.559481 -5.4049563 -1.9660639 -7.5252987
## 61 145.017560 -17.1198788 4.4023560 -11.7192481
## 62 -113.460646 -6.7018065 -8.4926510 -2.3277787
## 63 -165.572112 36.8561454 10.6274430 -3.9158485
## 64 107.114508 -1.2540691 2.3858338 -6.8645172
## 65 116.336921 29.4757409 -5.3729735 -0.1991741
## 66 -304.153297 -4.6336514 23.4229400 -13.9222031
## 67 120.037378 1.6454511 31.5659506 -3.8457436
## 68 -205.372462 -16.4665978 16.7934206 6.3602373
## 69 172.246472 36.5973318 5.2814353 5.0817881
## 70 185.200544 28.2258734 -2.4109060 12.1485122
## 71 -105.845440 -3.3818131 14.6034884 2.3149169
## 72 222.164020 -7.8806529 -2.1935624 -2.2032472
## 73 137.129210 6.2286411 5.2475405 -5.8963433
## 74 -133.048558 -34.1159928 24.1516515 7.6284061
## 75 173.805140 17.0754931 -13.4898072 -2.1368558
## 76 76.686010 -10.8049301 2.0601160 -4.0749944
## 77 -91.636678 4.8732719 8.1932212 12.7491458
## 78 -194.980321 16.3786247 6.4810193 -3.1186422
##
## $stress
## [1] 5.106277e-12