1. ํ๋ก์ ํธ ์ฃผ์ ์ ์
1.1 ์ฃผ์ ์ ์ ์ด์
์ ์ ํ ๋ฐ์ดํฐ๋ ‘football’ ๋ฐ์ดํฐ์ ์ผ๋ก, ๋ํ ๋ด์ ๋ฏธ์์ถ๊ตฌ ํ๋ค์ ๊ฒฝ๊ธฐ์ ๋ํ ๋คํธ์ํฌ๋ฅผ ๋ธ ๋ฐ์ดํฐ์ ์ด๋ค. ๋น ๋ฐ์ดํฐ๋ฅผ ์ด์ฉํ ๋คํธ์ํฌ ๋ถ์ ๋ฐ ๋งํฌ์์ธก์ ์คํฌ์ธ ์ฐ์ ์์๋ ์ข ์ข ์ฐ์ด๊ณ ์๋ค. ์ผ๊ตฌ์ฒ๋ผ ์ ํํ ํ์จ์ด ๊ณ์ฐ๋์ง ์๋ ๋ฏธ์์ถ๊ตฌ์ ๊ฐ์ ์คํฌ์ธ ์์๋ ํนํ ๋คํธ์ํฌ ๋ถ์ ๋ฐ ๋งํฌ์์ธก์ด ์ค์ํ๊ฒ ๋ ์ค๋ฅด๊ณ ์๋ค. ์๋ํ๊ณผ์ ๊ด๊ณ๋ฅผ ๋ถ์์ ํตํด ์ ์๋ค์ ๋ฅ๋ ฅ์ ํ๊ฐํ ์ ์์ ๊ฒ์ด๋ฉฐ, ๋คํธ์ํฌ ๋ถ์์ ํตํด ์นํจ ์ฌ๋ถ๋ฅผ ๋ณด๋ค ์ฝ๊ฒ ์์ธกํ ์ ์์ ๊ฒ์ด๋ค. ๊ทธ ์ ์์ ๋ฅ๋ ฅ์ ํ๊ฐํ์ฌ ์ด์ ๋ฃ๋ฅผ ๊ฒฐ์ ํ๊ณ , ๊ทธ ํ์ ๊ฐ์น๋ฅผ ๊ฒฐ์ ํด์ผํ๋ ๋ฏธ์์ถ๊ตฌ์์๋ ํนํ ๋คํธ์ํฌ ๋ถ์์ด ์ค์ํ๋ค๊ณ ์๊ฐ๋๋ค. ๋ฐ๋ผ์ ์ค์ ๋ก ์์ ๋ด ์งํํ๋ ๋คํธ์ํฌ ๋ถ์์ ํตํด ๋ฏธ์์ถ๊ตฌ ํ๋ค์ ๋คํธ์ํฌ ๋ถ์์ ์งํํด ๋ณด๊ณ ์ถ์๊ณ , ๋ ๋์๊ฐ ๋งํฌ ์์ธก๊น์ง ์งํํ ์ ์๋์ง ๋ฐ ํด๋น ์์ธก ๊ฒฐ๊ณผ๊ฐ ์๋ฏธํ๋ ๋ฐ๋ ๋ฌด์์ผ์ง ํ๊ตฌํด ๋ณด๊ธฐ ์ํ์ฌ ํด๋น ์๋ฃ๋ฅผ ๋ถ์ ๋ฐ์ดํฐ์ ์ผ๋ก ๊ฒฐ์ ํ์๋ค.
2. ๋คํธ์ํฌ ๋ถ์
R์์ ‘igraph’, ‘statnet’ ํจํค์ง๋ฅผ ์ด์ฉํ์ฌ ๋คํธ์ํฌ ๋ถ์์ ์งํํ์๋ค.
๋ณธ ๊ฒ์๊ธ์ ๋คํธ์ํฌ ๋ถ์ ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ๋ค. ๋ฐ์ดํฐ ์์ง, ๋ฐ์ดํฐ ๊ตฌ์ฑ์ ์ค๋ช ํ ๋ค, ๋คํธ์ํฌ๋ฅผ ์๊ฐํ ํ๋ค. ์ดํ ๋คํธ์ํฌ์ degree๋ฅผ ํ์ธํ๊ณ , ๋คํธ์ํฌ์ Closeness Centrality (๊ทผ์ ์ค์ฌ์ฑ)์ Betweenness Centrality (๋งค๊ฐ ์ค์ฌ์ฑ)์ ๊ณ์ฐํ๋ค. ์ต์ข ์ ์ผ๋ก ๋คํธ์ํฌ ์์ Clique์ Cluster๋ฅผ ํ์ธํ๊ณ ๋งํฌ๋ฅผ ์์ธกํ ๊ฒ์ด๋ค.
2.1 ๋ฐ์ดํฐ ์์ง
http://www-personal.umich.edu/~mejn/netdata/ ์์ ์์งํ gmlํ์์ ‘football’ ๋ฐ์ดํฐ์ ์ ์ด์ฉํ์ฌ ๋ถ์์ ์งํํ์๋ค.
2.2 ๋ฐ์ดํฐ ๊ตฌ์ฑ
๋ฐ์ดํฐ๋ Undirected Graph๋ก 115๊ฐ์ node ์, 613๊ฐ์ Edges ๋ก ๊ตฌ์ฑ๋์ด ์๋ค.
2.3 ๋คํธ์ํฌ ์๊ฐํ
football ํ๋ณ๋ก์ ๋คํธ์ํฌ๋ฅผ ๊ทธ๋ํ๋ก ํํํ์๋ค. R plot์ ์ด์ฉํ ์๊ฐํ ๊ทธ๋ฆผ์ [๊ทธ๋ฆผ 1]๋ก, Gephi๋ฅผ ์ด์ฉํ์ฌ ์๊ฐํ ํ ๊ทธ๋ฆผ์ [๊ทธ๋ฆผ 2]๋ก ๋ํ๋๋ค.
#ํ์ํ ํจํค์ง ๋ค์ด ๋ฐ ์คํ
install.packages("igraph")
install.packages("statnet")
library(igraph)
library(statnet.common)
#๋ฐ์ดํฐ ์ฝ๊ธฐ ์ ํ์ง 3_ํ์ฅ์๊ฐ gml
g <- read.graph("C:\\Users\\my\\Desktop\\network_data\\football.gml")
plot(g, vertex.label.cex=1)
g plot ์ดํด๋ณธ ๊ฒฐ๊ณผ
2.4 ๋คํธ์ํฌ ์ค์ฌ์ฑ ๋ถ์
2.4.1 Degree ๊ณ์ฐ ๋ฐ ๋คํธ์ํฌ ๊ทธ๋ํ ์์ฑ
๋คํธ์ํฌ์ degree 10๊ฐ๋ฅผ [๊ทธ๋ฆผ 3]์ผ๋ก ๋ํ๋๋ค. ๋คํธ์ํฌ ์์์ ๊ด๊ณ์ ์ ๋๊ฐ ๋์์๋ก degree๊ฐ์ด ์ปค์ง๋ ๊ฒ์ ํ์ธํ ์ ์์ผ๋ฉฐ, ์ด๋ฅผ ์ง๊ด์ ์ผ๋ก ๋ํ๋ด๊ธฐ ์ํด ๋ ธ๋์ ํฌ๊ธฐ๋ฅผ ๋ณํ์์ผฐ๋ค. ์ด๋ฅผ R๊ณผ Gephi ๋๊ฐ์ tool์ ์ด์ฉํ์ฌ ๋ํ๋ด์ด ๋ณด์๋ค. ๊ฐ๊ฐ [๊ทธ๋ฆผ 4]์ [๊ทธ๋ฆผ 5]๋ฅผ ํตํด ํ์ธํ ์ ์๋ค.
# ๋
ธ๋ ์ฐ๊ฒฐ ์(Degree)
degree<-igraph::degree(g,mode="out")
plot(g)
degree_vcount<-vcount(g)
degree_centralization<-centralization.degree(g)
V(g)$size<-igraph::degree(g)*10 ## ๋
ธ๋ ํฌ๊ธฐ ํค์ฐ๊ธฐ
plot(g, vertex.label.cex=1)
degree
2.4.2. Closeness Centrality (๊ทผ์ ์ค์ฌ์ฑ) ๊ณ์ฐ ๋ฐ ๋คํธ์ํฌ ๊ทธ๋ํ ์์ฑ
๋คํธ์ํฌ์ ๊ทผ์ ์ค์ฌ์ฑ ๋ถ์์ ํด๋ณด์๋ค. ์ด๋ ๊ฐ ๋ ธ๋ ๊ฐ์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ทผ๊ฑฐ๋ก ์ค์ฌ์ฑ์ ์ธก์ ํ๋ ๋ฐฉ๋ฒ์ด๋ค. ์ง์ ์ ์ผ๋ก ์ฐ๊ฒฐ๋ ๋ ธ๋๋ง ๊ณ์ฐํ๋ Degree์๋ ๋ฌ๋ผ, ๊ฐ์ ์ ์ธ ์ฐ๊ฒฐ ๋ ธ๋๊น์ง ๊ณ์ฐํ๋ ๋ฐฉ๋ฒ์ด๋ค. ๊ทผ์ ์ค์ฌ์ฑ ๋ถ์์ ๊ทผ์ ์ค์ฌ์ฑ์ด ๋์์๋ก ์์ ๋ ์งํ๊ฒ ํ์ํ๋ฉฐ, ์ด๋ [๊ทธ๋ฆผ 6]์ ํตํด ํ์ธํ ์ ์๋ค.
# ๊ทผ์ ์ค์ฌ์ฑ์ค์ฌ์ฑ(closeness)
clo <- igraph::closeness(g)
clo.score<-round((clo-min(clo))*length(clo)/max(clo))+1
clo.colors<-rev(heat.colors(max(clo.score)))
# Degree ํฌ๊ธฐ์ ๋ฐ๋ผ ๋
ธ๋ ํฌ๊ธฐ ๋ณํ
V(g)$color<-clo.colors[clo.score]
plot(g, vertex.label.cex=1)
2.4.3 Betweenness Certrality (๋งค๊ฐ ์ค์ฌ์ฑ) ๊ณ์ฐ ๋ฐ ๋คํธ์ํฌ ๊ทธ๋ํ ์์ฑ
๋คํธ์ํฌ ๋ด์์ ํ ๋ ธ๋๊ฐ ๋ด๋นํ๋ ์ค๊ฐ ๋งค๊ฐ์ ์ญํ ์ ์ ๋๊ฐ ์ด๋์ ๋ ๋๋์ง ๋งค๊ฐ ์ค์ฌ์ฑ์ ๊ณ์ฐํ๋ค. ํน์ ๋ ธ๋๊ฐ ๋ค๋ฅธ ๋ ธ๋๋ค๊ณผ์ ์ต๋ค ๊ฒฝ๋ก ์์ ์์์๋ก ๋งค๊ฐ ์ค์ฌ์ฑ์ด ํฌ๊ฒ ๋ํ๋๊ณ , ์ด๋ฅผ ์๊ฐ์ ์ผ๋ก ์์๋ณด๊ธฐ ์ํด ๋งค๊ฐ ์ค์ฌ์ฑ์ด ํด์๋ก ๋ ์งํ์์ผ๋ก ํํํ์ฌ [๊ทธ๋ฆผ 7]๊ณผ ๊ฐ์ด ๋ํ๋๋ค.
# ๋งค๊ฐ ์ค์ฌ์ฑ์ค์ฌ์ฑ(betweeness)
btw<-igraph::betweenness(g)
btw.score<-round(btw)+1
btw.colors<-rev(heat.colors(max(btw.score)))
V(g)$color<-btw.colors[btw.score]
plot(g, vertex.label.cex=1)
btw
2.5 ๋คํธ์ํฌ ํด๋ฌ์คํฐ
๋คํธ์ํฌ ์์์ clique์ ํด๋ฌ์คํฐ๋ฅผ ํ์ธํ๋ค. Clique์ ํฌ๊ธฐ๋ฅผ ํ์ธํ๊ณ , ๊ฐ์ฅ ํฐ clique๋ฅผ ์ ์ ํ๋ค. ์ ์ ๋ clique๋ฅผ ๋คํธ์ํฌ ๊ทธ๋ํ์์ ํฉ๊ธ์์ผ๋ก ํ์ํ ๊ฒ์ด๋ค. ์ด๋ [๊ทธ๋ฆผ 8]์ ํตํด ํ์ธํ ์ ์๋ค. ์ด๋ฅผ ํตํด ํฉ๊ธ์์ผ๋ก ํ์๋ ๋ ธ๋๋ ๋ค๋ฅธ ๋ ธ๋์ ๋นํด์ ๋์ฑ ๊ด๊ณ์ ์ ๋๊ฐ ๊น๋ค๋ ๊ฒ์ ์ ์ ์์ ๊ฒ์ด๋ค. ํ์ฌ footballํ๋ค์ ๋ชจ๋ ํฉ๊ธ์์ผ๋ก ํํ๋๋ฏ๋ก, ๋ชจ๋ ํ๋ค๊ณผ ์๋ก ์ฐ๊ฒฐ๋์ด ์๊ณ , ๊ด๊ณ๊ฐ ๋์ผํ๊ฒ ๊น์์ ์ ์ ์๋ค.
# density
graph_density<-graph.density(g)
plot(g)
# cluster
clusters<-clusters(g)
clusters(g)$csize
# clique
clique<-cliques(g) ## clique ๋ฆฌ์คํธ
clique_length<-sapply(cliques(g), length) ## clique์ ์ซ์๋ฅผ ๋ณด์ฌ์ค
largest_clique<-largest_cliques(g) ## ๊ฐ์ฅ ํฐ clique ๋์ถ
# ์ ๊ทธ๋ํ์ clique๋ฅผ ํฉ๊ธ์์ผ๋ก ํ์
vcol <- rep("grey80", vcount(g))
vcol[unlist(largest_cliques(g))] <- "gold"
plot(as.undirected(g), vertex.label=V(g)$name, vertex.label.cex=1, vertex.color=vcol)
3. ๋งํฌ ์์ธก
์ค์ ๋ก ์ฐ๊ฒฐ๋ ๋คํธ์ํฌ๋ฅผ ๋ถ์ํ๋ ๋ฐ์์ ๋ ๋์๊ฐ ๋ณธ ๊ฒ์๊ธ์ ํ๋์ ๋ ธ๋๊ฐ ๋ค๋ฅธ ์ด๋ค ๋ ธ๋์ ์ฐ๊ฒฐ๋ ํ๋ฅ ์ ์์ธกํ๋ค. ์ฆ ์กด์ฌํ์ง ์๋ ๋ ธ๋ ์ฌ์ด์ ๊ด๊ณ๋ฅผ ์์ธกํ๊ณ ํ๋จํ ์ ์๋ค๋ ๊ฒ์ด๋ค. ๋ฐฉ๋ํ ๋ฐ์ดํฐ ์์์ ์ด์๊ฐ๋ ์์ฆ์๋ ๋คํธ์ํฌ ์ฌ์ด์ ๊ด๊ณ๋ฅผ ๋์ถํ๋ ์ค์์ฑ์ด ์ฆ๋๋๊ณ ์๋ค.
๋ณธ ๊ฒ์๊ธ์์๋ ๊ฑฐ๋ฆฌ ๊ธฐ๋ฐ์ ๋งํฌ ์์ธก์ ์ํํ๋ค. ๋จผ์ hierarchical random graph model๋ก ๊ณ์ธต ํํ์ ๊ทธ๋ํ๋ฅผ ๋จผ์ ์์ฑํ๊ณ , ์ฐ๊ฒฐ๋์ง ์์ edge๋ฅผ ํ๋ฅ ๋ก ๊ณ์ฐํ์ฌ ์ฐ๊ฒฐ๋ ๊ฐ๋ฅ์ฑ์ด ๋์ edge๋ฅผ ์ ์ํ๋ ๋ฐฉ์์ด๋ค. ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ๊น์ด ๋ ธ๋์ผ์๋ก ํ์ ์ธต๋ถํฐ ์ฐ๊ฒฐ๋์ด ์๊ณ , ๊ฑฐ๋ฆฌ๊ฐ ๋จผ ๋ ธ๋๋ค์ ์์ ์ธต์์ ์ฐ๊ฒฐ๋จ์ ์ ์ ์๋ค. ์ด ๊ฒฐ๊ณผ๋ฅผ csvํ์ผ๋ก ์ ์ฅํ์์ผ๋ฉฐ, ์ ์ฅ๋ ํ์ผ์ ๋ด์ฉ ์ค ์ผ๋ถ๋ฅผ [๊ทธ๋ฆผ 9]์ ๋ํ๋๋ค.
# Link Prediction
predicted <- predict_edges(g)
V(g)$name
a1 <- predicted$edges
a2 <- predicted$prob
a3 <- cbind(a1, a2)
colnames(a3) = c("from", "to", "prob")
write.csv(a3, "link_prediction.csv")
๋งํฌ ์์ธก ๊ฒฐ๊ณผ๋ฅผ ์ดํด๋ณด๋, 3๋ฒ ๋ ธ๋์ 12๋ฒ๋ ธ๋๊ฐ ์ฐ๊ฒฐ๋ ํ๋ฅ ์ 0.2677, 2๋ฒ ๋ ธ๋์ 3๋ฒ ๋ ธ๋๊ฐ ์ฐ๊ฒฐ๋ ํ๋ฅ ์ 0.246118, 3๋ฒ ๋ ธ๋์ 8๋ฒ ๋ ธ๋๊ฐ ์ฐ๊ฒฐ๋ ํ๋ฅ ์ 0.219546์ผ๋ก ๋ํ๋ฌ๋ค. ์ด๋ 3๋ฒ ๋ ธ๋์ 12๋ฒ ๋ ธ๋๊ฐ ์ฐ๊ฒฐ๋ ๊ฐ๋ฅ์ฑ์ 26.7%, 3๋ฒ ๋ ธ๋์ 8๋ฒ ๋ ธ๋๊ฐ ์ฐ๊ฒฐ๋ ๊ฐ๋ฅ์ฑ์ 21.9% ๋ผ๊ณ ํด์ํ ์ ์๋ค.
4. ๊ฒฐ๋ก
๋ณธ ๋ ํฌํธ์์๋ ๋คํธ์ํฌ ๋ถ์ ๋ฐ ๋งํฌ ์์ธก์ ์ํํ์๋ค. Degree, Closeness Centrality, Betweenness Centrality๋ฅผ ๊ณ์ฐํ์ฌ ๋คํธ์ํฌ๋ฅผ ๋ถ์ํ๊ณ , cluster๋ฅผ ํตํด ์ฃผ clique๋ฅผ ํ์ธํด ๋ณด์๋ค. ๋คํธ์ํฌ ๋ถ์ ๋ฐ ์์ธก ์ํ ๊ฒฐ๊ณผ, ์ค์ ๋ฐ์ดํฐ ๊ฐ์ ์กด์ฌํ๋ ๋คํธ์ํฌ๋ฅผ ๋ค์ํ ์ธก๋ฉด์์ ๋ถ์ํด ๋ณผ ์ ์์๊ณ , ์ด๋ฅผ ํตํด ์กด์ฌํ์ง ์๋ ๋คํธ์ํฌ์ ํํด์ ์ฐ๊ฒฐ๋ ์๋ ์๋ ๊ฐ๋ฅ์ฑ์ ๊ณ์ฐํ์ฌ ๋งํฌ๋ฅผ ์์ธกํด ๋ณผ ์ ์์๋ค.
๊ฒฐ๊ณผ๋ฅผ ๋ณด์์ ๋, ํ์ฌ ๋คํธ์ํฌ๊ฐ ์ง์ ์ ์ผ๋ก ์ฐ๊ฒฐ๋์ด ์์ง ์์ 3๋ฒ ๋ ธ๋์ 12๋ฒ ๋ ธ๋ ์ฌ์ด์ ์ฐ๊ฒฐ ๊ฐ๋ฅ์ฑ์ ์์ธกํ ์ ์์๋ค. ์์ธกํ๊ธฐ ํ๋ ๋ฏธ์์ถ๊ตฌ์ ๊ฐ์ ์คํฌ์ธ ๋ถ์ผ์์ ์ด์ฒ๋ผ ๋คํธ์ํฌ ๋ถ์ ๊ธฐ๋ฒ ๋ฐ ๋งํฌ ์์ธก์ ์ด์ฉํจ์ผ๋ก์จ ์๋ก์ด ๋คํธ์ํฌ๋ฅผ ๋ฐ๊ฒฌํ๊ณ , ์ด๋ฅผ ํตํด ์ ์์ ๋ฅ๋ ฅ, ์น๋ฅ ๋ฑ์ ์์ธกํจ์ผ๋ก์จ ์คํฌ์ธ ์ฐ์ ์ ๊ฐ์น๋ฅผ ๋์ผ ์ ์์ ๊ฒ์ด๋ค.
๋ง์น๋ฉฐ...!
Clique๋ฅผ ํ์ธํด ๋ณด์์ ๋, ๋ชจ๋ football ํ์ ์๋ก ์ฐ๊ฒฐ๋์ด์๊ณ , ๊ด๊ณ๊ฐ ๋์ผํ๊ฒ ๊น๋ค๊ณ ๋ํ๋ ๊ฒ์ด ์กฐ๊ธ ์์ฌ์ค๋ฝ๋ค. ๋ด๊ฐ ๋ถ์์ ์ํ๋์ง์ ๋ํ ์๊ตฌ์ฌ์ด ๋ ๋ค ใ ๋คํธ์ํฌ ๋ถ์ ๋ํ, ๋ค์ํ ํ์ฌ์ ์ธ์ฌํ ํน์ ํ๋ก์ ํธ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํ ์์คํ ์ผ๋ก ๋ง์ด ์ฐ์ผ ๊ฒ ๊ฐ๋ค. ์ค๋ฌด์์ ์ฌ์ฉ๋ ๋, ๋ด๊ฐ ์ค์ค๋ก ๊ตฌํํ ์ ์์ ๋๊น์ง ๊ณต๋ถํด๋ด์ผ๊ฒ ๋ค ๋ค. :)