CODEDRAGON ㆍDevelopment/AI
File Info
twittersns.R
R을 활용한 소셜 네트워크 분석
R 프로그래밍 언어 패키지 중 igraph패키지를 이용하여 분석하겠습니다.
R을 활용하여 트위터 검색을 통한 소셜 네트워크 분석을 수행하여 보겠습니다.
· 전체 코딩
· 트위터에서 검색할 용어와 개수 설정하기
· igraph 패키지 설치하기
· 노드간 관계 네트워크 만들기
· Followers 가져오기
· 소셜 네트워크 그래프를 그리기 위한 스크립트
· 결과 보기
전체 코딩
콘텐츠에서 보여주는 전체적인 코딩은 다음과 같이 4부분이 서로 연결되어 있습니다.
1 |
트위터에서 검색할 용어와 개수를 가져오고 |
2 |
노드간 관계네트웍을 만드는 부분 |
3 |
관계 네트웍에서 특정 팔로워를 가져오는 부분 |
4 |
그래프로 그리는 부분으로 나누어 있고 |
트위터에서 검색할 용어와 개수 설정하기
> search.term <- '#Rstats' > |
twitter API를 통해 트위터에서 검색할 용어를 #Rstats로 정의힙니다.
> search.size <- 50 > |
최대 검색할 개수를 50개로 제한한다는 것입니다.
igraph 패키지 설치하기
http://codedragon.tistory.com/5020
> library(igraph)
다음의 패키지를 부착합니다: ‘igraph’
The following object is masked from ‘package:stringr’:
%>%
The following objects are masked from ‘package:stats’:
decompose, spectrum
The following object is masked from ‘package:base’:
union
> library(twitteR) > |
igraph와 twitterR 패키지르 임포트 합니다.
> search.results <- searchTwitter(search.term,n=search.size) > |
트위터에서 #Rstats 이라는용어를 가지는 트위터를 50개 찾아 search.results에 저장합니다.
노드간 관계 네트워크 만들기
> vl <- vector() > for(twt in search.results) vl <- c(vl,screenName(twt)) > |
변수인 vl에 백터함수를 할당하여 초기화하고 검색된 결과의 사용자 이름을 가져옵니다.
그리고 + vl <- c(vl,screenName(twt))로 기존의 vl에 검색된 결과의 사용자 이름을 추가하여 새로운 vl벡터를 생성합니다.
이는 소셜 네트워크의 노드 리스트를 만드는 과정에 해당합니다.
> vl <- as.data.frame(table(vl)) > colnames(vl) <- c('user','tweets') > |
각 사용자의 노드를 계산하고 데이터에 대한 이름을 제공합니다.
> g <- graph.empty(directed=TRUE) > g <- add.vertices(g,nrow(vl),name=as.character(vl$user), tweets=vl$tweets) > |
변수 g에 노드가 추가되어 노드 간 관계 네트워크가 만들어집니다.
Followers 가져오기
관계 네트웍에서 특정 팔로워를 가져오는 부분
> V(g)$followers <- 0 > |
앞에서 정의된 관계 네트워크 g에서 followers들을 초기화합니다.
> getUser('Biff_Bruise')$getFollowers(n=10) $`4825230375` [1] "TableauBot"
$`2521030569` [1] "AnalyticsJamie"
$`4203110169` [1] "FatPandaDesign"
$`4198327332` [1] "YITechnology"
$`186337391` [1] "sohail_here"
$`834530292408975360` [1] "AudaciousData"
$`2901465833` [1] "CorsairsIn"
$`4629231746` [1] "Louise489111"
$`1650571814` [1] "HCDI_Inc"
> |
특정 사용자의 follower들을 가져오는 스크립트입니다.
특정 사용자인 'Biff_Bruise'의 Follower 10명을 가져온다는 의미입니다.
for (usr in V(g)) { tuser <- getUser(V(g)$name[usr+1]) print(paste("Getting info on",screenName(tuser))) V(g)$followers[usr+1] <- followersCount(tuser) followers.list <- getUser(V(g)$name[usr+1])$getFollowers() for (tflwr in followers.list) { if (screenName(tflwr) %in% V(g)$name) g <- add.edges(g,c(as.vector(V(g)[ name == screenName(tflwr) ]),usr)) } print('Sleeping 10 min...') } |
for (usr in V(g)) { tuser <- getUser(V(g)$name[usr+1]) print(paste("Getting info on",screenName(tuser))) |
스크립트로 이름에 의한 사용자의 정보를 가져옵니다.
V(g)$followers[usr+1] <- followersCount(tuser) |
총 follower의 수를 계산합니다.
followers.list <- getUser(V(g)$name[usr+1])$getFollowers() for (tflwr in followers.list) { if (screenName(tflwr) %in% V(g)$name) |
스크립트를 입력하면 follower들이 많이 접속합니다.
g <- add.edges(g,c(as.vector(V(g)[ name == screenName(tflwr) ]),usr)) } print('Sleeping 10 min...') } |
화살표 끝을 추가
for문 실행결과
> for
(usr in V(g)) { |
> |
소셜 네트워크 그래프를 그리기 위한 스크립트
> g$layout <- layout.fruchterman.reingold(g) > |
그래프의 레이아웃을 설정합니다.
> V(g)$size = log( V(g)$followers ) * 1.8 > V(g)$label=V(g)$name > V(g)$label.cex = 0.6 > |
그래프의 크기와 라벨 이름과 사이즈를 지정합니다.
그래프의 크기는 총 follower의 수에 근거해 사이즈를 결정합니다. 다시 말해 노드의 크기는 follower 수의 로그 값( 1.8)에 비례하게 설정한다는 것입니다. 또한 label 이름(V(g)$name)과 사이즈(0.6)를 지정합니다.
> tcolors <- rev(heat.colors(max(V(g)$tweets))) > V(g)$color <- tcolors[ V(g)$tweets ] > |
노드의 색이 검색된 결과에 나타난 트위터의 개수를 반영한다는 것을 나타냅니다.
> E(g)$arrow.size <- 0.3 > |
화살표 끝을 지정합니다.
> E(g)$curved <- FALSE > E(g)$color <- 'blue' > |
곡선이 없고 선 색깔을 파란색으로 지정하였습니다. 대칭 연결을 읽기 쉽게 만들었습니다.
결과 보기
그래프 살펴보기
> plot(g) |
노드의 크리로 부터 각 사용자의 Follwer의 수를 유추할 수 있습니다.
'Development > AI' 카테고리의 다른 글
The Map of Mathematics (0) | 2017.05.24 |
---|---|
Introduction to financial Engineering with R(금융공학) (0) | 2017.05.17 |
Seeing Theory - 확률과 통계 학습 (0) | 2017.05.07 |
pixmap 패키지 설치하기, pixmap 패키지 임포트 (0) | 2017.04.29 |
The Art of R Programming: A Tour of Statistical Software Design (0) | 2017.04.23 |