Rによるデータ分析

Rによる連関係数を使った主成分分析

連関係数を使った主成分分析 のRによる実施例です。 Rによる連関係数分析 と前半部分は同じです。

実施例


データは、上のようなものです。 サンプル数は、約1000あります。 A、B、C、Dは、3水準系の直交表です。 独立しています。

Eは、1行目が「E2」となっている以外は、並び方が、Dと、まったく同じになっています。

連関係数行列の作成

基本的に質的変数を扱う方法ですが、量的変数は 1次元クラスタリング の方法で、質的変数に変換するコードが入っているので、 質的・量的が混合していたり、量的変数だけでも使えるようにしてあります。

library(vcd) #ライブラリを読み込み
setwd("C:/Rtest")
# 作業用ディレクトリを変更
Data <- read.csv("Data.csv", header=T)
# データを読み込み
Data1 <- Data
# 1次元クラスタリングの出力先を作る
n <- ncol(Data1)
# データの列数を数える
for (i in 1:n) {
# ループの始まり。データの列数を数えて同じ回数繰り返す
if (class(Data1[,i]) == "numeric") {
# 条件分岐の始まり
Data1[,i] <- droplevels(cut(Data1[,i], breaks = 5,include.lowest = TRUE))
# 5分割する場合。量的データは、質的データに変換する。
}
# if文の処理の終わり
}
# ループの終わり
GM2 <- matrix(0,nrow=n,ncol=n)
# 出力先を作る
for (i in 1:(n-1)) {
# ループの始まり
for (j in (i+1):n) {
# ループの始まり
cross<-xtabs(~Data1[,i]+Data1[,j],data=Data1)
# 分割表の作成
res<-assocstats(cross)
# 連関分析
cramer_v<-res$cramer
# クラメールの連関係数の抽出
GM2[i,j] <- cramer_v
# クラメールの連関係数の書き込み
GM2[j,i] <- cramer_v
# クラメールの連関係数の書き込み
}
# ループの終わり
}
# ループの終わり
rownames(GM2)<-colnames(Data1)
# 行名をつける
colnames(GM2)<-colnames(Data1)
# 列名をつける
diag(GM2) <- 1
# 対角成分を1にする

固有値分析

GM3 <- GM2
GM3[GM3 < 0.01] <- 0
# 連関係数の小さいものは0にする。

Eigen_analysis <- eigen(GM3)
# 固有値分析
EA1 <- Eigen_analysis$values/sum(Eigen_analysis$values)
# 全体への、各主成分の寄与率?
EA1

元のデータと主成分の関係

EA2 <- round(((sweep(Eigen_analysis$vectors, MARGIN=2, sqrt(Eigen_analysis$values), FUN="*")))^2,4) # 各変数への、各主成分の寄与率
rownames(EA2)<-colnames(Data1)
# 列名をつける
EA2


# A、B、Cには、ひとつの主成分だけが対応しています。 D、Rは、2つの主成分が寄与率0.5ずつで対応しています。

library(igraph)
pc4<-round(EA2,1)
colnames(pc4)<- colnames(as.data.frame(pc4))
pc4<-pc4*10
DM.g<-graph_from_incidence_matrix(pc4,weighted=T)
V(DM.g)$color <- c("steel blue", "orange")[V(DM.g)$type+1]
V(DM.g)$shape <- c("square", "circle")[V(DM.g)$type+1]
plot(DM.g, edge.width=E(DM.g)$weight)

ノウハウ

GM2からGM3を作るところがノウハウになっています。

GM2で、値の小さな連関係数を0にしておかないと、けっこう効いてしまい、本当は、ないところに関係があるような結果になってしまいます。





Tweet データサイエンス教室