전주대학교 이기훈교수

.

마케팅자료분석

학부_마케팅자료분석 게시글의 상세 화면
R SNA
작성일: 2019-06-10 조회수: 383 작성자: 이기훈
첨부 : R SNA.zip 파일의 QR Code R SNA.zip  R SNA.zip

SNA 코드 

 

# igraph 패키지 설치

install.packages("igraph")

library(igraph)

 

# 간단한 예제의 실행

#edges <- c(1,2,2,3,3,1)

edges

g<-graph(edges, n=max(edges), directed=F)

g[]

g

plot(g, layout = layout.fruchterman.reingold, vertex.label=V(g)$number,edge.arrow.size=0.5)

plot(g, vertex.color ="green", vertex.size = 40, edge.color= 'red')

 

# Degree의 계산

degree(g, mode='all')

degree(g, mode='in')

degree(g, mode='out')

diameter(g, directed=F, weights=NA)

edge_density(g,loops=F)

closeness(g, mode='all', weights=NA)

betweenness(g, directed=T, weights=NA)

 

# 한글 출력위한 함수

Sys.setlocale("LC_CTYPE", "ko_KR.UTF-8")

 

# 데이터 불러오기

edges <- read.csv(file.choose(), header=T) #한글명 디렉토리 읽지못함 주의

edges

nodes <- read.csv(file.choose(), header=T)

nodes

 

# edge 파일에서 첫번째 줄과 두번째 줄만 사용

edgeslist <- data.frame(edges$Source, edges$Target)

edgeslist

 

#네트워크 작성

net <-graph.data.frame(edgeslist, vertices=nodes,

directed=F)

V(net) # vertex, node 확인

E(net) # edge, link 확인

#V(net)$label <- V(net)$Label # nodes 화일의 Label 변수를 vertex 의 label 변수로 저장

#V(net)$label

V(net)$degree <- degree(net) # node의 degree를 계산하여 vertex 의 degree 변수로 저장

V(net)$degree

plot(net, vertex.label=V(net)$label)

 

# 차수가 일정 값 이상인 경우에만 그림그리기

cut_dgree <- 3 # 차수기준값 설정

r_net <- delete.vertices(net,V(net)[degree < cut_dgree]) # 차수가 기준값보다 작은 node는 제거하기

V(r_net)

E(r_net)

V(r_net)$label

plot(r_net, vertex.label=V(r_net)$label)

 

# Network diagram 그리기

plot(net, vertex.color = nodes$Cat, vertex.size = V(net)$degree*0.7, vertex.label=V(net)$label,

vertex.label.cex=0.7, edge.color= 'red', layout=layout.fruchterman.reingold)

plot(r_net, vertex.color = nodes$Cat, vertex.size = V(r_net)$degree*0.7, vertex.label=V(r_net)$label,

vertex.label.cex=0.7, edge.color= 'red', layout=layout.fruchterman.reingold) # 축소된 네트워크

 

plot(net, vertex.color ="green", vertex.size = V(net)$degree*0.7, vertex.label=V(net)$label,

vertex.label.cex=0.7, edge.color= 'red', layout=layout.graphopt)

plot(r_net, vertex.color ="green", vertex.size = V(r_net)$degree*0.7, vertex.label=V(r_net)$label,

vertex.label.cex=0.7, edge.color= 'red', layout=layout.graphopt) # 축소된 네트워크

 

plot(net, vertex.color ="green", vertex.size = V(net)$degree*0.7, vertex.label=V(net)$label,

vertex.label.cex=0.7, edge.color= 'red', layout=layout.kamada.kawai)

plot(r_net, vertex.color ="green", vertex.size = V(r_net)$degree*0.7, vertex.label=V(r_net)$label,

vertex.label.cex=0.7, edge.color= 'red', layout=layout.kamada.kawai) #축소된 네트워크 

 

# community 나누는 법

cnet <- cluster_edge_betweenness(net)

plot(cnet, net, vertex.color ="green", vertex.size = V(net)$degree*0.7, vertex.label=V(net)$Label,

vertex.label.cex=0.7, edge.color= 'red', layout=layout.kamada.kawai)

 

#tkplot(net)

 

# Two Mode Data 인식하기

bipartite.mapping(net)

V(net)$type <- bipartite.mapping(net)$type #type를 지정함

V(net)$color <- ifelse(V(net)$type, "lightblue", "salmon") #type에 따라 색상을 달리함

V(net)$shape <- ifelse(V(net)$type, "circle", "square") #type에 따라 모양을 달리함

E(net)$color <- "lightgray"

plot(net,layout=layout.graphopt, vertex.size=7, vertex.label.cex=0.6)

 

# 사람-질병으로 되어있는 네트워크를 질병-질병 네트워크로 바꿈

bipartite_matrix <- as_incidence_matrix(net) #발생빈도 행렬로 전환함

bipartite_matrix

t(bipartite_matrix) #전치행렬을 구함

Disease_matrix_prod <- t(bipartite_matrix) %*% bipartite_matrix #X'X행렬 구함

diag(Disease_matrix_prod) <- 0 #대각원소는 모두 0으로 변환함

Disease_matrix_prod

 

# adjacency 행렬로 네트워크 구성

Disease_mode <- graph_from_adjacency_matrix(Disease_matrix_prod, mode = "undirected", weighted = TRUE)

Disease_mode

E(Disease_mode)

V(Disease_mode)

E(Disease_mode)$weight

V(Disease_mode)$degree <- degree(Disease_mode)

V(Disease_mode)$degree

V(Disease_mode)[degree>10]

#V(Disease_mode)$label <- V(net)$Label

V(Disease_mode)$label

plot(Disease_mode)#, vertex.label=nodes$Label[!is.na(nodes$Cat)])

plot(Disease_mode, vertex.label=V(net)$Label)

 

# 차수가 일정 값 이상인 경우에만 그림그리기

cut_dgree <- 3 # 차수기준값 설정

r_Disease_mode <- delete.vertices(Disease_mode,V(Disease_mode)[degree < cut_dgree]) # 차수가 기준값보다 작은 node는 제거하기

V(r_Disease_mode)

E(r_Disease_mode)

V(r_Disease_mode)$label

plot(r_Disease_mode) #, vertex.label=V(r_Disease_mode)$label)

 

 

r_Disease_mode <-delete.vertices(Disease_mode,V(Disease_mode)[degree<20])

V(r_Disease_mode)$label

plot(r_Disease_mode, vertex.color ="green", vertex.size = V(net)$degree*0.7, vertex.label=V(Disease_mode)$label,

vertex.label.cex=0.7, edge.color= 'red', layout=layout.kamada.kawai)

plot(Disease_mode, vertex.color ="green", vertex.size = V(net)$degree*0.7,

vertex.label.cex=0.7, edge.color= 'red', layout=layout.fruchterman.reingold)

#tkplot(Disease_mode)

 

R_net <-delete.vertices(net,V(net)[degree<5])

V(r_net)$label <- nodes$Label