RとRStudioのインストールからpsychの使い方、クラスター分析までやってみる

機械学習の準備等でRを使う必要が出てきたため、入門してみた。

# 環境インストール(Macで実施)
## Rのインストール
https://cran.ism.ac.jp/bin/macosx/
ここにアクセスし、最新版のR-3.3.0.pkgをダウンロードしてきて実行するとインストールされる。
インストール後の確認。

```
$ r

R version 3.3.0 (2016-05-03) -- "Supposedly Educational"
Copyright (C) 2016 The R Foundation for Statistical Computing
Platform: x86_64-apple-darwin13.4.0 (64-bit)

R は、自由なソフトウェアであり、「完全に無保証」です。
一定の条件に従えば、自由にこれを再配布することができます。
配布条件の詳細に関しては、'license()' あるいは 'licence()' と入力してください。

R は多くの貢献者による共同プロジェクトです。
詳しくは 'contributors()' と入力してください。
また、R や R のパッケージを出版物で引用する際の形式については
'citation()' と入力してください。

'demo()' と入力すればデモをみることができます。
'help()' とすればオンラインヘルプが出ます。
'help.start()' で HTML ブラウザによるヘルプがみられます。
'q()' と入力すれば R を終了します。

>
```

## RStudioのインストール
Rをインストールすれば、Rを使っての分析は可能だけど、R用のIDEがあるためこれを使ってみる。
https://www.rstudio.com/

こちらもdmgをダウンロードしてApplicationsにコピーするとすぐに使えるようになる。

こんな感じで、plotで視覚的にグラフを出したり、変数の中身を確認したりといろいろ便利。
<img width="1277" alt="スクリーンショット 2016-05-25 13.10.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/29379/d323b5d0-67b1-9472-9ebd-b2e1d5aa73fa.png">

# 基本的なコマンド
## 初歩的なやつ

```r
> mean(x)    # 平均
> sd(x)      # 標準偏差
> var(x)     # 分散
> median(x)  # 中央値
> min(x)     # 最小値
> max(x)     # 最大値
> range(x)   # 範囲
```

## データの標準化
統計で言う標準化とは、元のデータに対して平均0、標準偏差1のデータに直すこと。
データの単位とか桁が大きく違う場合に、標準化をすることで統計的に比較しやすい単位にすることができる。

下記が標準化変量を求める方法。標準化変量は簡単な式で出せる。

```math
z_i = \frac{x_i - μ_i}{σ_i}
```

```r
> scale(x)
```

## データの読み込み
csvファイルを読み込む。
サンプルデータとして、[こちら](http://iit.kke.co.jp/MarketingScience/Exercise/AnalysisSample/cluster_sample01.htm)のデータを借りる。

```rb
> dat <- read.csv("/Users/xxxxxx/Desktop/Cluster_sample01.csv", header=TRUE, sep=",", row.names = 1)
> dat
                           Sense Dignified Youthful   Trust Familiarity Advanced
TOYOTA                   4.14286   4.42857  4.03571 6.14286     5.57143  5.39286
NISSAN                   4.92857   3.71429  4.85714 5.10714     5.57143  5.07143
HONDA                    4.82143   3.67857  5.82143 5.03571     5.42857  5.53571
FORD                     3.50000   4.17857  3.42857 3.78571     3.03571  3.25000
MERCEDES\357\274\215BENZ 4.53571   6.42857  2.92857 5.75000     2.60714  4.28571
BMW                      5.28571   5.67857  3.89286 5.28571     3.07143  4.25000
                         Technique Creative  Sporty Security
TOYOTA                     6.00000  4.75000 4.03571  5.92857
NISSAN                     5.21429  4.67857 4.75000  5.00000
HONDA                      5.71429  5.32143 5.64286  4.75000
FORD                       3.78571  4.17857 3.89286  3.60714
MERCEDES\357\274\215BENZ   5.42857  4.50000 3.57143  5.71429
BMW                        5.14286  4.46429 4.60714  5.35714
```

```row.names = 1```によって1列目が行名になるようになるようである。
これをしないと、後のクラスター分析とかで"数値じゃない"とエラーがでる。

## ビジュアル系
ヒストグラムが表示される。視覚的に便利。

```r
hist(dat$Sense)
```

グラフの色のしても出来るみたい。

## psychライブラリを使用して記述統計量を出力する
調べてると心理学系？の話で出てくるみたいだけど、便利な関数がたくさんありそうなのでちょっと使ってみた。
関数一つで記述統計量がずらっと出てきて便利。

こんな感じでパッケージをインストール出来る。RStudioならTools->Install PackagesでGUIでも可能。

```rb
> install.packages("psych")
also installing the dependency 'mnormt'

trying URL 'https://cran.rstudio.com/bin/macosx/mavericks/contrib/3.3/mnormt_1.5-4.tgz'
Content type 'application/x-gzip' length 89901 bytes (87 KB)
==================================================
downloaded 87 KB

trying URL 'https://cran.rstudio.com/bin/macosx/mavericks/contrib/3.3/psych_1.6.4.tgz'
Content type 'application/x-gzip' length 3271310 bytes (3.1 MB)
==================================================
downloaded 3.1 MB

tar: Failed to set default locale
tar: Failed to set default locale

The downloaded binary packages are in
	/var/folders/hj/s0l55f5j7h7c8r9h40d_bm4h0000gn/T//RtmpFxXxj8/downloaded_packages
> 
```

```r
> library('psych')
> describe(dat)
            vars n mean   sd median trimmed  mad  min  max range  skew kurtosis   se
Sense          1 6 4.54 0.64   4.68    4.54 0.58 3.50 5.29  1.79 -0.43    -1.45 0.26
Dignified      2 6 4.68 1.12   4.30    4.68 0.90 3.68 6.43  2.75  0.50    -1.72 0.46
Youthful       3 6 4.16 1.04   3.96    4.16 1.06 2.93 5.82  2.89  0.39    -1.50 0.42
Trust          4 6 5.18 0.80   5.20    5.18 0.53 3.79 6.14  2.36 -0.54    -1.10 0.33
Familiarity    5 6 4.21 1.44   4.25    4.21 1.88 2.61 5.57  2.96 -0.03    -2.26 0.59
Advanced       6 6 4.63 0.87   4.68    4.63 0.85 3.25 5.54  2.29 -0.37    -1.61 0.35
Technique      7 6 5.21 0.77   5.32    5.21 0.42 3.79 6.00  2.21 -0.84    -0.81 0.31
Creative       8 6 4.65 0.38   4.59    4.65 0.21 4.18 5.32  1.14  0.56    -1.06 0.16
Sporty         9 6 4.42 0.75   4.32    4.42 0.64 3.57 5.64  2.07  0.43    -1.45 0.30
Security      10 6 5.06 0.83   5.18    5.06 0.71 3.61 5.93  2.32 -0.61    -1.21 0.34
> 
```

## クラスター分析もやってみる

```r
> result <- hclust(dist(dat), method="ward.D")
> plot(result)
```

クラスター分析は様々な方法があるようだが、ここではサンプルとしてウォード法というメソッドを指定してみる。この他のメソッドやkmeans法などの非階層型クラスタリングの関数も用意されているみたい。
plot関数により以下のような図がすぐに表示された。

<img width="568" alt="Screen Shot 2016-05-26 at 9.58.56 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/29379/8e2155aa-9c78-e4e3-7638-ef92e427032d.png">

尚、```cutree```関数によりクラスターの階層を指定した情報を取得することが出来る。

```r
> cutree(result, 3)
                  TOYOTA                   NISSAN                    HONDA 
                       1                        1                        1 
                    FORD MERCEDES\357\274\215BENZ                      BMW 
                       2                        3                        3 
> cutree(result, 2)
                  TOYOTA                   NISSAN                    HONDA 
                       1                        1                        1 
                    FORD MERCEDES\357\274\215BENZ                      BMW 
                       2                        2                        2 
> cutree(result, 1)
                  TOYOTA                   NISSAN                    HONDA 
                       1                        1                        1 
                    FORD MERCEDES\357\274\215BENZ                      BMW 
                       1                        1                        1 
> 
```

使い方はすぐに慣れるけど、使いこなすのが大変そう。
もう少しいろいろいじってみたい。