Rによるデータ分析

Rによる多次元尺度構成法

多次元尺度構成法 は、知る人ぞ知るのような手法ですが、便利なものです。 目立たないながら、重要な部分でも使えます。

多次元尺度構成法には、いくつかあり、下記のRの実施例ではsammonという方法にしているのですが、 cmdscaleの場合、 主成分分析 と結果は同じになります。 2次元のマップでサンプルの仲間分けをしたい場合は、sammonのある多次元尺度構成法が良いと思います。

一般的な多次元尺度構成法

Rを使った 多次元尺度構成法 の実施例になります。 下記は、コピーペーストで、そのまま使えます。 この例では、入力データは量的データになっていることを想定しています。 質的データがあるとエラーになります。

距離データをスタートにする場合

この例では、Cドライブの「Rtest」というフォルダに、 「Data1.csv」という名前でデータが入っている事を想定しています。
mds

library(MASS)# ライブラリを読み込み
library(som)
# ライブラリを読み込み
library(ggplot2)
# パッケージの読み込み#
setwd("C:/Rtest")
# 作業用ディレクトリを変更
Data1 <- read.csv("Data1.csv", header=T)
# データを読み込み
Data11 <- Data1[,2:5]
# 距離データのある列を指定。この例は2から5列目の場合
Data11_dist <- as.matrix(Data11)
# データを行列型に変換
sn <- sammon(Data11_dist)
# 多次元尺度構成法
output <- sn$points
# 多次元尺度構成法によって、得られた2次元データの抽出
Data <- cbind(output, Data1) 
# 元データと多次元尺度構成法の結果を合わせる。
ggplot(Data, aes(x=Data[,1], y=Data[,2],label=Name)) + geom_text()
# Nameを使った言葉の散布図
mds
A、B、Cのグループと、D単独に分かれるはずで、だいたいそんな感じにはなりました。

多次元データをスタートにする場合

この例では、Cドライブの「Rtest」というフォルダに、 「Data1.csv」という名前でデータが入っている事を想定しています。
k-means

library(MASS)# ライブラリを読み込み
library(som)
# ライブラリを読み込み
setwd("C:/Rtest")
# 作業用ディレクトリを変更
Data1 <- read.csv("Data1.csv", header=T)
# データを読み込み
Data11 <- normalize(Data1[,1:3],byrow=F)
# 標準化する列を指定。この例は1から3列目の場合
Data11_dist <- dist(Data11)
# サンプル間の距離を計算
sn <- sammon(Data11_dist)
# 多次元尺度構成法
output <- sn$points
# 得られた2次元データの抽出
Data <- cbind(output, Data1)  # 元データと多次元尺度構成法の結果を合わせる。
Data$Index <-row.names(Data)
# Indexという名前の列を作り、中身は行番号にする
library(ggplot2)
# パッケージの読み込み#
ggplot(Data, aes(x=Data[,1], y=Data[,2],label=Name)) + geom_text()
# Nameを使った言葉の散布図
sammon
期待通りに4つのグループに分かれました。

「sammon」ではなく、「cmdscale」にしたのが左の図で、「isoMDS」にしたのが右の図になります。 期待通りに4つのグループに分かれるのは同じでしたが、isoMDSの場合は、同じグループの上3桁は同じ数字になるほど近くに配置されました。 そのため、グラフで文字が重なっています。
cmdscale isoMDS

ネットワーク式の多次元尺度構成法

ネットワーク式の多次元尺度構成法 の実施例です。

距離データをスタートにする場合

この例では、Cドライブの「Rtest」というフォルダに、 「Data1.csv」という名前でデータが入っている事を想定しています。
mds

library(igraph) #ライブラリを読み込み
setwd("C:/Rtest")
# 作業用ディレクトリを変更
Data1 <- read.csv("Data1.csv", header=T)
# データを読み込み
Data11 <- Data1[,2:5]
# 距離データのある列を指定。この例は2から5列目の場合
Data12 <- as.matrix(Data11)
# データを行列型に変換
Data12 <- (max(Data12) - Data12)
# すべてのデータを符号を逆にする。
diag(Data12) <- 0
# 対角成分は0にする
Data12 <- Data12 / max(Data12) * 10
# 0から10の間のデータにする。
GM4 <- graph.adjacency(Data12,weighted=T, mode = "undirected")
# グラフ用のデータを作成
plot(GM4, edge.width=E(GM4)$weight)
# グラフを作成

mds
A、B、Cのグループと、D単独に分かれるはずで、だいたいそんな感じにはなりました。

多次元データをスタートにする場合

多次元データをスタートにする場合は、 高次元を2次元に圧縮して可視化 の方法として使えます。

この例では、Cドライブの「Rtest」というフォルダに、 「Data1.csv」という名前でデータが入っている事を想定しています。
k-means

library(igraph) #ライブラリを読み込み
setwd("C:/Rtest")
# 作業用ディレクトリを変更
Data1 <- read.csv("Data1.csv", header=T)
# データを読み込み
Data10 <- Data1[,1:3]
# 分析する列を指定。この例は1から3列目の場合
Data11 <- (Data10 - apply(Data10,2,min))/(apply(Data10,2,max)-apply(Data10,2,min))
# すべての変数のデータを、0から1の間のデータにする。
Data12 <- as.matrix(dist(Data11))
# サンプル間の距離を計算して行列形式にする
Data12 <- (max(Data12) - Data12)
# すべてのデータを符号を逆にする。
diag(Data12) <- 0
# 対角成分は0にする
Data12 <- Data12 / max(Data12) * 10
# 0から10の間のデータにする。
hist(Data12)
# グラフにするデータをヒストグラムにする。
mds
Data12[Data12< 8] <- 0
# 8未満の場合は0にする(非表示にするため)
GM4 <- graph.adjacency(Data12,weighted=T, mode = "undirected")
# グラフ用のデータを作成
plot(GM4, edge.width=E(GM4)$weight)
# グラフを作成

mds
期待通りに4つのグループに分かれました。

多次元データをスタートにする場合のコードには、ヒストグラムでデータをチェックして、「8未満の場合は0」というコードが入っています。 「8未満の場合は0」というコードを入れないと、下図のようになり、ゴチャゴチャして来ます。 もともとこの手法を使うときは、近いものを見つけたい時なので、遠いものとの線は切っておいても、問題はないかと思います。 なお、距離データをスタートにする場合でも、同じように遠いものとの線を切ることができます。
mds



参考文献

同志社大学 金明哲先生のページ
cmdscale、sammon、isoMDSの詳しい説明があります。
https://www1.doshisha.ac.jp/~mjin/R/Chap_27/27.html




Tweet データサイエンス教室