마케팅자료분석
R SNA |
---|
작성일: 2019-06-10 조회수: 383 작성자: 이기훈 |
첨부 : 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 |