R을 활용한 소셜 네트워크 분석(트위터; twitter) - 트위터에서 검색할 용어와 개수 설정하기, igraph 패키지 설치하기, 노드간 관계 네트워크 만들기, Followers 가져오기, 소셜 네트워크 그래프를 그..

CODEDRAGON Development/Big Data, R, ...

반응형


 

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)) {
+   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...')
+ }
[1] "Getting info on ayshwaryas"
[1] "Sleeping 10 min..."
[1] "Getting info on barnambora"
[1] "Sleeping 10 min..."
[1] "Getting info on BigDataSciTweet"
[1] "Sleeping 10 min..."
[1] "Getting info on BruceSnowdeal"
[1] "Sleeping 10 min..."
[1] "Getting info on ccjjclark"
[1] "Sleeping 10 min..."
[1] "Getting info on davidengaut"
[1] "Sleeping 10 min..."
[1] "Getting info on ddjolles"
[1] "Sleeping 10 min..."
[1] "Getting info on dogvile"
[1] "Sleeping 10 min..."
[1] "Getting info on ecuervog"
[1] "Sleeping 10 min..."
[1] "Getting info on EnvPolicyCenter"
[1] "Sleeping 10 min..."
[1] "Getting info on hexheadtn"
[1] "Sleeping 10 min..."
[1] "Getting info on hostmicrobe"
[1] "Sleeping 10 min..."
[1] "Getting info on iamVaalPaiyan_"
[1] "Sleeping 10 min..."
[1] "Getting info on InsiderRisk"
[1] "Sleeping 10 min..."
[1] "Getting info on JCarlosjRamirez"
[1] "Sleeping 10 min..."
[1] "Getting info on JoelMcBI"
[1] "Sleeping 10 min..."
[1] "Getting info on josephsirosh"
[1] "Sleeping 10 min..."
[1] "Getting info on jufa"
[1] "Sleeping 10 min..."
[1] "Getting info on jumpjoe78"
[1] "Sleeping 10 min..."
[1] "Getting info on KerkhoffLab"
[1] "Sleeping 10 min..."
[1] "Getting info on KristinHenry"
[1] "Sleeping 10 min..."
[1] "Getting info on manueltard"
[1] "Sleeping 10 min..."
[1] "Getting info on MartinSteinUSA"
[1] "Sleeping 10 min..."
[1] "Getting info on MetaDhanesh"
[1] "Sleeping 10 min..."
[1] "Getting info on mitchdata"
[1] "Sleeping 10 min..."
[1] "Getting info on NoSQLDigest"
[1] "Sleeping 10 min..."
[1] "Getting info on pepetapia44"
[1] "Sleeping 10 min..."
[1] "Getting info on pilarcubas"
[1] "Sleeping 10 min..."
[1] "Getting info on pilarhe19"
[1] "Sleeping 10 min..."
[1] "Getting info on ProteomicsNews"
[1] "Sleeping 10 min..."
[1] "Getting info on RandiRLudwig"
[1] "Sleeping 10 min..."
[1] "Getting info on ricardokriebel"
[1] "Sleeping 10 min..."
[1] "Getting info on rkjoseph"
[1] "Sleeping 10 min..."
[1] "Getting info on rmflight"
[1] "Sleeping 10 min..."
[1] "Getting info on s3rgionava"
[1] "Sleeping 10 min..."
[1] "Getting info on shawnnfraser"
[1] "Sleeping 10 min..."
[1] "Getting info on suresh_pokharel"
[1] "Sleeping 10 min..."
[1] "Getting info on tstou10"
[1] "Sleeping 10 min..."
[1] "Getting info on UWBotany"
[1] "Sleeping 10 min..."
[1] "Getting info on vgpiyer"
[1] "Sleeping 10 min..."
[1] "Getting info on vivekhpatil"
[1] "Sleeping 10 min..."
[1] "Getting info on WonderMixTape"
[1] "Sleeping 10 min..."
[1] "Getting info on YourStatsGuru"
[1] "Sleeping 10 min..."
[1] "Getting info on NA"
[1] "Sleeping 10 min..."
There were 31 warnings (use warnings() to see them)

>

 

 

소셜 네트워크 그래프를 그리기 위한 스크립트

 

> 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의 수를 유추할 수 있습니다.


 


 

반응형