Rでt-SNEを使ってみた(高次元データの圧縮)


#はじめに
先日、t-SNEによる高次元データの圧縮(2次元か3次元に落として可視化)というものを知り、[こちらの記事](https://qiita.com/g-k/items/120f1cf85ff2ceae4aba)にわかりやすくまとめてあるのを拝見しました。
ひとまず実践ということで、[Rtsne](https://cran.r-project.org/web/packages/Rtsne/Rtsne.pdf)パッケージを用いたmtcarsの可視化に挑戦した結果が本稿になります。

#データ
今回はRのサンプルデータとして用意されているmtcars(燃費等の11次元データ)を用いますが、
アメリカ車、ヨーロッパ車、日本車に分けて可視化してみたかったので、Regionという列を加えています。

|                  |  mpg| cyl|  disp|  hp| drat|    wt|  qsec| vs| am| gear| carb|Region |
|:-------------------|----:|---:|-----:|---:|----:|-----:|-----:|--:|--:|----:|----:|:------|
|Mazda RX4           | 21.0|   6| 160.0| 110| 3.90| 2.620| 16.46|  0|  1|    4|    4|JP     |
|Mazda RX4 Wag       | 21.0|   6| 160.0| 110| 3.90| 2.875| 17.02|  0|  1|    4|    4|JP     |
|Datsun 710          | 22.8|   4| 108.0|  93| 3.85| 2.320| 18.61|  1|  1|    4|    1|JP     |
|Hornet 4 Drive      | 21.4|   6| 258.0| 110| 3.08| 3.215| 19.44|  1|  0|    3|    1|US     |
|Hornet Sportabout   | 18.7|   8| 360.0| 175| 3.15| 3.440| 17.02|  0|  0|    3|    2|US     |
|Valiant             | 18.1|   6| 225.0| 105| 2.76| 3.460| 20.22|  1|  0|    3|    1|EU     |
|Duster 360          | 14.3|   8| 360.0| 245| 3.21| 3.570| 15.84|  0|  0|    3|    4|US     |
|Merc 240D           | 24.4|   4| 146.7|  62| 3.69| 3.190| 20.00|  1|  0|    4|    2|EU     |
|Merc 230            | 22.8|   4| 140.8|  95| 3.92| 3.150| 22.90|  1|  0|    4|    2|EU     |
|Merc 280            | 19.2|   6| 167.6| 123| 3.92| 3.440| 18.30|  1|  0|    4|    4|EU     |
|Merc 280C           | 17.8|   6| 167.6| 123| 3.92| 3.440| 18.90|  1|  0|    4|    4|EU     |
|Merc 450SE          | 16.4|   8| 275.8| 180| 3.07| 4.070| 17.40|  0|  0|    3|    3|EU     |
|Merc 450SL          | 17.3|   8| 275.8| 180| 3.07| 3.730| 17.60|  0|  0|    3|    3|EU     |
|Merc 450SLC         | 15.2|   8| 275.8| 180| 3.07| 3.780| 18.00|  0|  0|    3|    3|EU     |
|Cadillac Fleetwood  | 10.4|   8| 472.0| 205| 2.93| 5.250| 17.98|  0|  0|    3|    4|US     |
|Lincoln Continental | 10.4|   8| 460.0| 215| 3.00| 5.424| 17.82|  0|  0|    3|    4|US     |
|Chrysler Imperial   | 14.7|   8| 440.0| 230| 3.23| 5.345| 17.42|  0|  0|    3|    4|US     |
|Fiat 128            | 32.4|   4|  78.7|  66| 4.08| 2.200| 19.47|  1|  1|    4|    1|EU     |
|Honda Civic         | 30.4|   4|  75.7|  52| 4.93| 1.615| 18.52|  1|  1|    4|    2|JP     |
|Toyota Corolla      | 33.9|   4|  71.1|  65| 4.22| 1.835| 19.90|  1|  1|    4|    1|JP     |
|Toyota Corona       | 21.5|   4| 120.1|  97| 3.70| 2.465| 20.01|  1|  0|    3|    1|JP     |
|Dodge Challenger    | 15.5|   8| 318.0| 150| 2.76| 3.520| 16.87|  0|  0|    3|    2|US     |
|AMC Javelin         | 15.2|   8| 304.0| 150| 3.15| 3.435| 17.30|  0|  0|    3|    2|US     |
|Camaro Z28          | 13.3|   8| 350.0| 245| 3.73| 3.840| 15.41|  0|  0|    3|    4|US     |
|Pontiac Firebird    | 19.2|   8| 400.0| 175| 3.08| 3.845| 17.05|  0|  0|    3|    2|US     |
|Fiat X1-9           | 27.3|   4|  79.0|  66| 4.08| 1.935| 18.90|  1|  1|    4|    1|EU     |
|Porsche 914-2       | 26.0|   4| 120.3|  91| 4.43| 2.140| 16.70|  0|  1|    5|    2|EU     |
|Lotus Europa        | 30.4|   4|  95.1| 113| 3.77| 1.513| 16.90|  1|  1|    5|    2|EU     |
|Ford Pantera L      | 15.8|   8| 351.0| 264| 4.22| 3.170| 14.50|  0|  1|    5|    4|US     |
|Ferrari Dino        | 19.7|   6| 145.0| 175| 3.62| 2.770| 15.50|  0|  1|    5|    6|EU     |
|Maserati Bora       | 15.0|   8| 301.0| 335| 3.54| 3.570| 14.60|  0|  1|    5|    8|EU     |
|Volvo 142E          | 21.4|   4| 121.0| 109| 4.11| 2.780| 18.60|  1|  1|    4|    2|EU     |

#使ってみた
基本的にはRtsneのExampleに従ってやってみます。`?Rtsne`を参照。

```r
library(Rtsne)
library(ggplot2)
library(dplyr)

mt<- read.csv("mtcars.csv")#csvで上記表データ読み込み
mtmtrx<- mt[,2:12] %>% as.matrix()#解析したい部分をmatrixに変換

set.seed(718)

tsne_out <- Rtsne(mtmtrx,pca=TRUE,perplexity=8,theta=0)#perplexityは任意の値
tsne_value<-as.data.frame(tsne_out$Y)
p<-ggplot(tsne_value,aes(V1,V2,col=mt$Region))+geom_point()+
     stat_ellipse(type = "norm",linetype=1)
p
```
出来た図がこちらです。
![mtcrs.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/683885/d653a693-be7c-bfec-ca9e-1f32985177e9.png)

群ごとに差がありそうなのが意外でしたね。
どのパラメーターが寄与しているのか私には分かりませんが、日本車とアメ車には違いがあるように見てとれます。
せっかくなのでPERMANOVAも実施してみます。([pairwise.adonis](https://github.com/pmartinezarbizu/pairwiseAdonis)を使用)

```r
pairwise.adonis(mt[,2:12],mt$Region)

#結果
     pairs Df  SumsOfSqs   F.Model        R2 p.value p.adjusted sig
1 JP vs US  1 0.68760533 53.930876 0.7823907   0.001      0.003   *
2 JP vs EU  1 0.08870433  2.843071 0.1301589   0.100      0.300    
3 US vs EU  1 0.51090113 20.716426 0.4632845   0.001      0.003   *
```
なるほど、たしかに日本車とアメ車は違うっぽいですね。
アメ車とヨーロッパ車の違いはあまり図からは読み取れませんでしたが、*p*値は有意なようです。

#さいごに
私自身分かっていない部分も多いです(特に適切なperplexityについて)が、tSNEなかなか面白いですね。
revise等あればお願いします! enjoy!