ネットワーク分析におけるコミュニティ抽出
この記事はR言語 Advent Calendar 2023 シリーズ2の18日目の記事です。
ネットワーク分析にコミュニティ抽出という手法があります。まあ、クラスター分析ですね。
Rのigraphパッケージには以下のコミュニティ抽出の方法が実装されています。
- ラベル伝播法 cluster_label_prop()
- ウォークトラップ cluster_walktrap()
- 辺媒介法 cluster_edge_betweenness()
- 貪欲アルゴリズム cluster_fast_greedy()
- スペクトラル最適化法 cluster_leading_eigen()
- 焼きなまし法 cluster_spinglass()
- インフォマップ法 cluster_infomap()
- ルーバン法 cluster_louvain()
- ライデン法 cluster_leiden()
どんなふうにコミュニティ抽出されるか試してみましょう。
ライブラリー呼び出し。
library(conflicted) library(tidyverse) library(igraph) library(igraphdata)
有名な空手クラブのデータで試します。
data(karate) karate |> plot()
コミュニティ抽出
cl_lp <- karate |> cluster_label_prop()# ラベル伝播法 cl_wt <- karate |> cluster_walktrap() # ウォークトラップ法 cl_eb <- karate |> cluster_edge_betweenness() # 辺媒介法 cl_fg <- karate |> cluster_fast_greedy() #貪欲アルゴリズム cl_sp <- karate |> cluster_leading_eigen() #スペクトラル最適化法 cl_sg <- karate |> cluster_spinglass() |> with_seed(1234, code=_) # 焼きなまし法 cl_im <- karate |> cluster_infomap() |> with_seed(1234, code=_) # インフォマップ法 cl_lo <- karate |> cluster_louvain() |> with_seed(1234, code=_) # ルーバン法 cl_le <- karate |> cluster_leiden() |> with_seed(1234, code=_) #ライデン法
結果を描画
plot(cl_lp, karate, main = "ラベル伝播法", layout = layout_with_kk) plot(cl_wt, karate, main = "ウォークトラップ法", layout = layout_with_kk) plot(cl_eb, karate, main = "辺媒介法", layout = layout_with_kk) plot(cl_fg, karate, main = "貪欲アルゴリズム", layout = layout_with_kk) plot(cl_sp, karate, main = "スペクトラル最適化法", layout = layout_with_kk) plot(cl_sg, karate, main = "焼きなまし法", layout = layout_with_kk) plot(cl_im, karate, main = "インフォマップ法", layout = layout_with_kk) plot(cl_lo, karate, main = "ルーバン法", layout = layout_with_kk) plot(cl_le, karate, main = "ライデン法", layout = layout_with_kk)
個人的な経験ではルーバン法がいい感じのグループ分けをしてくれるように思います。
Enjoy!