[R] データセットirisのクラスター分析 - methodによる正答率の違いを網羅的に

 Rをインストールできたら、実験データやマーケティングデータの解析に良く使うデータ解析にクラスター分析があります。

## クラスター分析とは
　クラスター分析とは、異なるものが混ざりあっている集団の中から互いに似たものを集めて集落（クラスター）を作り、対象を分類するという方法の総称です。
　クラスター分析は、あらかじめ分類の基準が決まっておらず、分類のための外的基準や評価が与えられていない「教師無しの分類法」です。
　クラスター分析には、大きく分けると階層クラスター分析、非階層クラスター分析の2種類の方法があります。どちらの解析でもいくつかのメソッドがあり、どれを選ぶのが良いか悩ましいところですが、結局デフォルトの設定や、quiitaの記事などで採用されているメソッドで試してみたりしています。
　この報告では、データセットirisで階層的クラスター分析の各メソッドによるクラスター分析結果と実際の分類のspeciesと照合して正答率を比較してみました。
まず、クラスター分析をしてみたい方は最後の参照の記事をご覧ください。

## データセットirisについて
データセットirisはRやPythonなどで機械学習のトレーニングで扱われる最も有名なデータかもしれません。
3種類の花、各50サンプルずつで計150サンプル、がく片と花びらの幅と長さに関する4つの特徴量からなるデータです。

##環境
Windows10
R 3.6.1

### データセットirisの内容の確認
```r:iris
str(iris)  
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481830/47cec8a3-af75-12c2-e319-3c1ef73e5987.png)
サンプル数が150
5つの変数、Sepal.Length、Sepal.Width、Petal.Length、Petal.Width、Speciesがあります。Speciesはアヤメの分類ですので、クラスター分析ではこれを除いた、４つの変数で分析を行い、Speciesの値と比較します。

### irisの階層的クラスター分析のメソッドによる違いのスクリプト作成について
階層的クラスター分析するには、まずデータからサンプル間の距離行列を計算します。
この距離行列の関数distには、methodとして"euclidean", "maximum", "manhattan", "canberra", "binary", "minkowski" の6種から選べます。
距離行列からクラスター分析を行う関数hclustにはmethodが"ward.D", "ward.D2", "single", "complete", "average" (= UPGMA), "mcquitty" (= WPGMA), "median" (= WPGMC) , "centroid" (= UPGMC)　の8種から選べます。
関数distのmethodとhclustのmethodの組み合わせは 6 x 8 =48種類あることになります。これらをfor文による繰り返しで網羅的に実際の分類値に対する正答率を計算しました。

### スクリプト
```r:hclust
# 関数distとhclustのメソッドのベクトル作成
methods.dist <- c("euclidean", "maximum", "manhattan", "canberra", "binary","minkowski")
num.methods.dist <- length(methods.dist)

methods.hclust <- c("ward.D", "ward.D2","single", "complete", "average", "mcquitty", "median", "centroid") 
num.methods.hclust <- length(methods.hclust)

df.iris <- iris[ , 1:4]  #lengthとwidthを代入
answer <- iris[,5] 　　 #speciesを代入
ratio <- rep(0, num.methods.hclust) 　#正答率の値を代入するベクトルratio

#最初のdistのmethodでのクラスター分析結果
correct.answer.rate <- rep(0, num.methods.hclust)
dist.iris <- dist(df.iris, method = methods.dist[1]) 
for (i in 1:num.methods.hclust){
  #階層的クラスター分析
  hc.iris <- hclust(dist.iris, method = methods.hclust[i]) 
  result <- cutree(tree=hc.iris, k=3)
  table <- table(answer, result)
  correct.answer.rate[i] <- (table[1,1] + table[2,2] + table[3,3])/150
}

#distのmethodの2番目以降でのクラスター分析結果を追加
#df.ratio.add <- data.frame(methods.hclust, ratio)
correct.answer.rate.add <- rep(0, num.methods.hclust)

for (j in 2:num.methods.dist){
  #サンプル間の距離行列を算出してdist.irisに代入
  dist.iris <- dist(df.iris, method = methods.dist[j])  
  for (i in 1:num.methods.hclust){
    #階層的クラスター分析
    hc.iris <- hclust(dist.iris, method = methods.hclust[i]) 
    result <- cutree(tree=hc.iris, k=3)
    table <- table(answer, result)
    correct.answer.rate.add[i] <- (table[1,1] + table[2,2] + table[3,3])/150
  }
  correct.answer.rate <- cbind(correct.answer.rate, 　　　correct.answer.rate.add)
}

correct.ratio <- round(correct.answer.rate, 2)　#小数点2桁以下で四捨五入
colnames(correct.ratio) <- methods.dist　　#列名を代入
rownames(correct.ratio) <- methods.hclust　#行名を代入
write.csv(correct.ratio, "階層的クラスター分析正答率.csv")　
formattable::formattable(correct.ratio) #表形式で表示
```
### 実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481830/860fec61-0f4e-4fd0-0ccd-ef1dacd3aa11.png)

デフォルトのeuclidianとward.Dあるいはaverageの組み合わせでの正答率は91%でしたが、canberraとwar.d2あるいはcompleteでの組み合わせの正答率が96%と最高になりました。
なぜ、このような結果になるのか確認したいですが、難しそうですね。各データの分散の状態とirisの実際の分類方法が関係しているのではないかと推測しています。

binaryは多分データ形式が違うのでしょうね。どのようなデータに使うのかわかりましたら、またどこかで掲載します。

### 距離の種類
　専門ではないので、説明はネットの引用です。
#### euclidean Distance
お馴染みの通常のユークリッド空間での距離。

#### maximum distance
Chebyshev distance、チェス盤距離とも呼ばれている。
[wikipedia](https://ja.wikipedia.org/wiki/%E3%83%81%E3%82%A7%E3%83%93%E3%82%B7%E3%82%A7%E3%83%95%E8%B7%9D%E9%9B%A2)　によれば
>  幾何学における距離概念のひとつ。各座標の差（の絶対値）の最大値を2点間の距離とする。

#### manhattan distance
[wikipedia](https://ja.wikipedia.org/wiki/%E3%83%9E%E3%83%B3%E3%83%8F%E3%83%83%E3%82%BF%E3%83%B3%E8%B7%9D%E9%9B%A2) によれば
> 幾何学における距離概念のひとつ。各座標の差（の絶対値）の総和を2点間の距離とする。

#### canberra distance
[キャンベラ距離を使う](http://www.thothchildren.com/chapter/59b5255b75704408bd43007e)　によれば、
> キャンベラ距離は原点周りの重み付きのマンハッタン距離となっている. 原点付近で違いに敏感な距離

#### binary distance
ネットで良い説明が見つからず
RのdistのDocumentationからそのまま記しておきます。
(aka asymmetric binary): The vectors are regarded as binary bits, so non-zero elements are ‘on’ and zero elements are ‘off’. The distance is the proportion of bits in which only one is on amongst those in which at least one is on.

#### minkowski distance
引数p=1でマンハッタン距離、p=2でユークリッド距離です。デフォルトではp=2のようで、ユークリッド距離と同じになります。

関数hclustのメソッドについては参照をご覧ください。


##参照
R言語でクラスタリングしてみた
https://qiita.com/Haruka-Ogawa/items/fcda36cc9060ba851225
Rとクラスター分析（１）
https://www1.doshisha.ac.jp/~mjin/R/Chap_28/28.html