Rによるデータ分析

Rによる個々のカテゴリの類似度の分析

個々のカテゴリの類似度の分析 の方法です。

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

量的変数だけの場合は、変数の非線形の関係を分析する方法として使えます。

コレスポンデンス分析ベースの分析

コレスポンデンス分析多次元尺度構成法 の合わせ技の方法です。

library(dummies) # ライブラリを読み込み
library(MASS)
# 作業用ディレクトリを変更
library(ggplot2)
# パッケージの読み込み#
setwd("C:/Rtest")
# 作業用ディレクトリを変更
Data <- read.csv("Data.csv", header=T)
# データを読み込み
for (i in 1:ncol(Data)) {
# ループの始まり。データの列数を数えて同じ回数繰り返す
if (class(Data[,i]) == "numeric") {
# 条件分岐の始まり
Data[,i] <- droplevels(cut(Data[,i], breaks = 5,include.lowest = TRUE))
# 5分割する場合。量的データは、質的データに変換する。
}
# if文の処理の終わり
}
# ループの終わり
Data_dmy <- dummy.data.frame(Data)
# ダミー変換
pc <- corresp(Data_dmy,nf=nf=min(ncol(Data),nrow(Data)))
# コレスポンデンス分析
pc1 <- pc$cscore
#
pc1 <- transform(pc1 ,name1 = rownames(pc1))
# 行名を追加
round(pc$cor^2/sum(pc$cor^2),2)
# 寄与率を求める。
QM 

# 上の例では、7番目以降の固有値は寄与率が低いので、この後の解析から外すことにします。

MaxN = 6# 使用する固有値の数を指定
Data11 <- pc1[,1:MaxN]
# 項目のある列を指定
Data11_dist <- dist(Data11)
# サンプル間の距離を計算
sn <- sammon(Data11_dist)
# 多次元尺度構成法
output <- sn$points
# 得られた2次元データの抽出
Data2 <- cbind(output, pc1)  # 元データと多次元尺度構成法の結果を合わせる。
ggplot(Data2, aes(x=Data2[,1], y=Data2[,2],label=name1)) + geom_text()
# Nameを使った言葉の散布図
QM
近いプロットは、類似度の高いものです。 グラフの縦軸と横軸には、特に意味がありません。

アソシエーション分析ベースの分析

アソシエーション分析ネットワークグラフ の合わせ技の方法です。

setwd("C:/Rtest") # 作業用ディレクトリを変更
library(arules)
# ライブラリを読み込み
library(dummies)
# ライブラリを読み込み
library(igraph)
#ライブラリを読み込み
library(ggplot2)
# ライブラリを読み込み
Data <- read.csv("Data.csv", header=T)
# データを読み込み
for (i in 1:ncol(Data)) {
# ループの始まり。データの列数を数えて同じ回数繰り返す
if (class(Data[,i]) == "numeric") {
# 条件分岐の始まり
Data[,i] <- droplevels(cut(Data[,i], breaks = 5,include.lowest = TRUE))
# 5分割する場合。量的データは、質的データに変換する。
}
# if文の処理の終わり
}
# ループの終わり
Data <- dummy.data.frame(Data)
# ダミー変換
Data3 <- as(Data, "matrix")
# マトリックス形式にする
Data4 <- as(Data3, "transactions")
# トランザクション形式にする
ap <- apriori(Data4, parameter = list(support = 5/nrow(Data), maxlen = 2, minlen = 2))
# 連関規則の作成。
ap_inspect <- inspect(ap)
# 連関規則の抽出
ap_inspect$set <- paste(ap_inspect$lhs,"->",ap_inspect$rhs)
# 出力用のデータに行を追加
#棒グラフを描くための処理
ap21 <- head(ap_inspect[order(ap_inspect$support, decreasing=T),],20)
# support(支持度:同時確率)上位20位までの抽出
ggplot(ap21, aes(x=support, y=reorder(set, support))) + geom_bar(stat = "identity")
# 上位20セットの棒グラフを描く
ap22 <- head(ap_inspect[order(ap_inspect$confidence, decreasing=T),],20)
# support(確信度:条件付き確率)上位30位までの抽出
ggplot(ap22, aes(x=confidence, y=reorder(set, confidence))) + geom_bar(stat = "identity")
# 上位20セットの棒グラフを描く
ap23 <- head(ap_inspect[order(ap_inspect$lift, decreasing=T),],20)
# lift(リフト)上位20位までの抽出
ggplot(ap23, aes(x=lift, y=reorder(set, lift))) + geom_bar(stat = "identity")
# 上位20セットの棒グラフを描く
#ネットワークグラフ
ap31<- graph.data.frame(ap21[,c(1,3)], directed = F)
# グラフ用のデータを作成
plot(ap31)
# 支持度のグラフを作成
ap32<- graph.data.frame(ap22[,c(1,3)])
# グラフ用のデータを作成
plot(ap32)
# 確信度のグラフを作成
ap33<- graph.data.frame(ap23[,c(1,3)])
# グラフ用のデータを作成
plot(ap33)
# リフトのグラフを作成

下のグラフは、いずれも確信度のグラフです。
Decision Tree Decision Tree
矢印はデータの包含関係を表しているだけで、因果関係は表していません。( if-thenルールと因果関係の関係 に、この話は詳しくまとめました。)

パラメータの設定の考え方

上のコードでは、下記の考え方でパラメータを設定しました。 ベストかどうかはわかりません。

個々のカテゴリの相関分析

個々のカテゴリの相関分析 の実施例は下記になります。 (下記は、コピーペーストで、そのまま使えます。 この例では、Cドライブの「Rtest」というフォルダに、 「Data.csv」という名前でデータが入っている事を想定しています。 このコードの前に、ライブラリ「dummies」と「reshape」と「ggplot2」のインストールが必要です。

下の表は一部で、実際は106行分あります。 データは、質的データと量的データが混ざったものです。 量的データは、 1次元クラスタリング で質的データに変換して分析することにしています。 こうすると、 決定木 と併用しやすくなります。
Decision Tree

setwd("C:/Rtest") # 作業用ディレクトリを変更
library(dummies)
# ライブラリを読み込み
Data <- read.csv("Data.csv", header=T)
# データを読み込み
for (i in 1:ncol(Data)) {
# ループの始まり。データの列数を数えて同じ回数繰り返す
if (class(Data[,i]) == "numeric") {
# 条件分岐の始まり
Data[,i] <- droplevels(cut(Data[,i], breaks = 5,include.lowest = TRUE))
# 5分割する場合。量的データは、質的データに変換する。
}
# if文の処理の終わり
}
# ループの終わり
Data_dmy <- dummy.data.frame(Data)
# ダミー変換
corr <- cor(Data_dmy)
# 相関行列を作る

#ここまでが分析用のデータの作成。この後は、いろいろなグラフの作成。まず相関行列のヒートマップから。
library(reshape)
# ライブラリを読み込み
library(ggplot2)
# ライブラリを読み込み
corr2 <-corr
# 相関行列を作る
corr3 <- melt(corr2)# グラフ用のデータに変換
ggplot(corr3, aes(X1, X2, fill = value)) + geom_tile() + scale_fill_gradient(low = "white", high = "blue")
# グラフにする

#棒グラフ
corr2[upper.tri(corr2,diag=TRUE)] <- 0
# 出力用のデータに変換
corr4 <- melt(corr2)
# 出力用のデータに変換
corr4$set <- paste(corr4$X1,"_",corr4$X2)
# 出力用のデータに行を追加
corr4 <- corr4[order(corr4$value, decreasing=T),]
# 出力用のデータをソート
ggplot(head(corr4,10), aes(x=value, y=reorder(set, value))) + geom_bar(stat = "identity")
# 上位10セットの棒グラフを描く

#ネットワークグラフ
library(igraph)
#ライブラリを読み込み
corr5 <-corr
# 相関行列を作る
diag(corr5) <- 0
# 対角成分は0にする
corr5[corr5<0.1] <- 0
# 相関係数が0.1未満の場合は0にする(非表示にするため)
corr5 <- corr5*10
# 一番大きな値が10になるように修正(パスの太さを指定するため)
corr6 <- graph.adjacency(corr5,weighted=T, mode = "undirected")
# グラフ用のデータを作成
plot(corr6, edge.width=E(corr6)$weight)
# グラフを作成

Decision Tree Decision Tree Decision Tree
YA、YB、YCが、それぞれ密接な関係を持つカテゴリを持っていることと、YBについては、3つのカテゴリでグループを作っていることがわかりました。

Tweet データサイエンス教室