Rによるデータ分析

Rによるクロス集計表の3部グラフ

3部グラフ の例です。

関係を表す値が関係の強さを表している場合

3部グラフ

3部グラフ を作る方法です。

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

library(MASS) # パッケージを読み込み
setwd("C:/Rtest")
# 作業用ディレクトリを変更
Data <- read.csv("Data.csv", header=T, row.names=1)
# データを読み込み
pc <- corresp(Data,nf=min(ncol(Data),nrow(Data)))
# コレスポンデンス分析
pc1 <- pc$cscore
# スコアを読み取り
pc1 <- transform(pc1 ,name1 = rownames(pc1), name2 = "A")
# 行名を追加
pc2 <- pc$rscore
# スコアを読み取り
pc2 <- transform(pc2 ,name1 = rownames(pc2), name2 = "B")
# 列名を追加
Data1 <- rbind(pc1,pc2)
# データを結合
round(pc$cor^2/sum(pc$cor^2),2)
# 寄与率を求める。
QM 

# 「Data1」というデータは、下のようになっています。これをこの後のグラフ作成に使います。
QM

MaxN = 5# 使用する固有値の数を指定
library(igraph)
# パッケージを読み込み
library(sigmoid)
# パッケージを読み込み
Data1p = Data1[,1:MaxN]
# 分析対象のデータを抽出
names(Data1p) = paste(names(Data1p),"+",sep="")
# 列名を変更
DM.matp = apply(Data1p,c(1,2),relu)
# 0以下の値は0に変換
Data1m = -Data1[,1:MaxN]
# 分析対象のデータを抽出。符号を反転
names(Data1m) = paste(names(Data1m),"-",sep="")
# 列名を変更
DM.matm = apply(Data1m,c(1,2),relu)
# 0以下の値は0に変換
DM.mat =cbind(DM.matp,DM.matm)
# プラス側とマイナス側を合体
DM.mat <- DM.mat / max(DM.mat) * 10
# 値が0から10になるように変換
DM.mat[DM.mat < 4] <- 0
# 絶対値が4未満の場合は0にする(非表示にする)
DM.g<-graph_from_incidence_matrix(DM.mat,weighted=T)
# グラフ用のデータを作る
V(DM.g)$color <- c("steel blue", "orange")[V(DM.g)$type+1]
# 色を変える
V(DM.g)$color[1:ncol(Data)] <- "red"
# 色を変える。ncol(Data)はAの要素の数
V(DM.g)$shape <- c("square", "circle")[V(DM.g)$type+1]
# マークの形を変える
plot(DM.g, edge.width=E(DM.g)$weight)
# グラフを作る
QM

関係を表す値が質的データの場合

表の値は、質的データの場合です。

行の項目名が1列目、列の項目が2列目、値が3列目になるようにデータを並べ変えてから使います。

3部グラフ

library(tidyr) # ライブラリの読み込み
library(dplyr)
# ライブラリの読み込み
library(igraph)
# ライブラリの読み込み
setwd("C:/Rtest")
# 作業用ディレクトリを変更
Data <- read.csv("Data.csv", header=T)
# データを読み込み
Data1 <- tidyr::gather(Data, key="Name2", value = Val, -Name)
# 縦型に変換(Nameの列以外を積み上げる)
Data21 <- Data1
# 縦型に変換(Nameの列以外を積み上げる)
Data21[,2] <- NULL #
# データから2列目を消す
Data22 <- Data1[,2:3] #
# 1列目のないデータを作る
names(Data22)[1] <- "Name"
# 列名を変更
Data31 <- count(group_by(Data21,Data21[,1:2],.drop=FALSE)) #
# 重複している組み合わせを集計
Data32 <- count(group_by(Data22,Data22[,1:2],.drop=FALSE)) #
# 重複している組み合わせを集計
Data4 <- rbind(Data31,Data32)
# データを縦に結合
Data5 <- Data4

Data5$n <- Data4$n/max(Data4$n)*5
# 辺の太さを調整
DM.g<- graph.data.frame(Data5[,c(1,2)], directed = F)
# グラフ用のデータを作る
E(DM.g)$weight <-Data5[[3]]
# 辺のデータを取る
plot(DM.g, edge.width=E(DM.g)$weight)
# グラフを作る


この結果は、解釈しにくいですが、とりあえずデータがグラフになりました。



Tweet データサイエンス教室