Rによるデータ分析

Rによるベイジアンネットワーク

ベイジアンネットワーク のRによる実施例です。

このページは、現時点では ベイジアンネットワークによるデータの構造解析 の方法だけをまとめています。 因果関係の分析として使われる方法になります。

データの読み込み

library(bnlearn)
setwd("C:/Rtest")
Data <- read.csv("Data.csv", header=T)

データの前処理

ベイジアンネットワークでは、変数の型によって、結果が変わります。 変数の意味を考えながら、方針を決めると良いです。 また、型の違いと結果の違いを考察をすることで、データが表している現象の理解が深まることもあります。

質的変数の処理

質的変数は、characterとして自動認識されているとエラーになるため、因子型(factor)に変換します。

for (i in 1:ncol(Data)) {
if (class(Data[,i]) == "character") {
Data[,i] <- as.factor(Data[,i])
}
}

整数型が含まれる場合

整数型が含まれる場合、integerとして自動認識されるため、数値型(numeric)か、因子型(factor)に変換する必要があります。 例えば、数字の大きさに特別な意味がない場合は、因子型にすると良いです。

数値型にする場合です。
for (i in 1:ncol(Data)) {
if (class(Data[,i]) == "integer") {
Data[,i] <- as.numeric(Data[,i])
}
}

因子型にする場合です。
for (i in 1:ncol(Data)) {
if (class(Data[,i]) == "integer") {
Data[,i] <- as.factor(Data[,i])
}
}

数値型を因子型に変換する場合

ベイジアンネットワークは、数値型だけや、数値型と因子型が混ざっていてもできるようになっていますが、 すべて因子型の方が、良い分析になることがあります。以下は、数値型は因子型にする方法です。

なお、もともと整数型の変数は、上記の整数型の処理で、数値型にするか、因子型にするのかで、このコードの結果は変わります。 因子型にしていれば、このコードでは何も変わりません。

for (i in 1:ncol(Data)) {
if (class(Data[,i]) == "numeric") {
Data[,i] <- droplevels(cut(Data[,i], breaks = 3, include.lowest = TRUE))
}
Data[,i] <- as.factor(Data[,i])
}

データの構造解析

以下は、グラフの描画も一行のコードに入っています。

alphaがある手法は、0.05がデフォルトです。 この数字を小さくすると、結び付く部分が減って来ます。

標準グラフ

BN

plot(pc.stable(Data, alpha = 0.05),main = "PC")

plot(gs(Data, alpha = 0.05),main = "GS")

plot(iamb(Data, alpha = 0.05),main = "IAMB")

plot(fast.iamb(Data, alpha = 0.05),main = "Fast-IAMB")

plot(inter.iamb(Data, alpha = 0.05),main = "Inter-IAMB")

plot(iamb.fdr(Data, alpha = 0.05),main = "IAMB-FDR")

plot(mmpc(Data),main = "MMPC")

plot(si.hiton.pc(Data),main = "SI-HITON-PC")

plot(hpc(Data),main = "HPC")

plot(hc(Data),main = "HC")

plot(tabu(Data),main = "Tabu")

plot(mmhc(Data),main = "MMHC")

plot(h2pc(Data),main = "H2PC")

plot(rsmax2(Data),main = "RSMAX2")

plot(chow.liu(Data),main = "Chow_Liu")

plot(aracne(Data),main = "ARACNE")


上記はすべてbnlearnです。 これは、BNSLのライブラリになります。
library(BNSL)
plot(bnsl(Data),main = "BNSL")


これは、dealのライブラリになります。
library(deal)
pre.network <- network(Data)
prior.dist <- jointprior(pre.network)
update <- learn(pre.network, Data, prior.dist)
post.network <- autosearch(getnetwork(update), Data, prior.dist, trace=FALSE)
plot(getnetwork(post.network),main = "deal")

igraph

グラフを、ベイジアンネットワークのライブラリに入っている機能ではなく、igraphで作る方法です。 dealのものは、igraphに渡すデータの出し方がわからないで下記に含まれていません。
BN

library(igraph)

plot(graph.data.frame(pc.stable(Data, alpha = 0.05)$arcs),main = "PC")

plot(graph.data.frame(gs(Data, alpha = 0.05)$arcs),main = "GS")

plot(graph.data.frame(iamb(Data, alpha = 0.05)$arcs),main = "IAMB")

plot(graph.data.frame(fast.iamb(Data, alpha = 0.05)$arcs),main = "Fast-IAMB")

plot(graph.data.frame(inter.iamb(Data, alpha = 0.05)$arcs),main = "Inter-IAMB")

plot(graph.data.frame(iamb.fdr(Data, alpha = 0.05)$arcs),main = "IAMB-FDR")

plot(graph.data.frame(mmpc(Data)$arcs),main = "MMPC")

plot(graph.data.frame(si.hiton.pc(Data)$arcs),main = "SI-HITON-PC")

plot(graph.data.frame(hpc(Data)$arcs),main = "HPC")

plot(graph.data.frame(hc(Data)$arcs),main = "HC")

plot(graph.data.frame(tabu(Data)$arcs),main = "Tabu")

plot(graph.data.frame(mmhc(Data)$arcs),main = "MMHC")

plot(graph.data.frame(h2pc(Data)$arcs),main = "H2PC")

plot(graph.data.frame(rsmax2(Data)$arcs),main = "RSMAX2")

plot(graph.data.frame(chow.liu(Data)$arcs),main = "Chow_Liu")

plot(graph.data.frame(aracne(Data)$arcs),main = "ARACNE")


library(BNSL)
plot(graph.data.frame(bnsl(Data)$arcs),main = "BNSL")


参考文献

Rと事例で学ぶベイジアンネットワーク」 Marco Scutari ・Jean-Baptiste Denis 著 共立出版 2022
Rのパッケージとして、deal、catnet、pcalg、abnが紹介されています。


bnlearn

bnlearnのページ
bnlearnの作者(Marco Scutari氏)のホームページです。 コンパクトにまとまっています。
https://www.bnlearn.com


bnlearnのCRANのマニュアル
bnlearnの詳細が書かれています。
https://cran.r-project.org/web/packages/bnlearn/bnlearn.pdf


deal

データマイニング入門 :Rで学ぶ最新データ解析」 豊田秀樹 編著 東京図書 2008
dealの使い方があります。


RPubs Rでベイジアンネットワークメモ
上記のコードは、このページを参考にさせていただきました。
https://rpubs.com/hoxo_m/21327


BNSL

BNSLには、有向グラフだけでなく、無向グラフを作る機能もありますが、上記の例は有向グラフだけです。


BNSLの概要
BNSLの作者(鈴木 譲 氏)による解説です。 BNSLの無向グラフの機能は、変数が大量にあっても高速に計算できることが強みのようです。 bnlearnとの比較もあります。
https://prs.ism.ac.jp/useRjp/?plugin=attach&refer=2017%E5%B9%B4%E5%BA%A6%20%E3%83%87%E3%83%BC%E3%82%BF%E8%A7%A3%E6%9E%90%E7%92%B0%E5%A2%83R%E3%81%AE%E6%95%B4%E5%82%99%E3%81%A8%E5%88%A9%E7%94%A8&openfile=2017-11-25.pdf


BNSLのCRANのマニュアル
BNSLの詳細が書かれています。
https://cran.r-project.org/web/packages/BNSL/BNSL.pdf



Tweet データサイエンス教室