Power BI 및 R을 사용한 소셜 네트워크 분석: 사용자 지정 시각적 개체 가이드
게시 됨: 2022-07-22소셜 네트워크 분석은 다양한 전문적 요구를 충족시키는 중요한 도구가 되었습니다. 표적 마케팅과 같은 기업 목표를 알리고 보안 또는 평판 위험을 식별할 수 있습니다. 소셜 네트워크 분석은 또한 기업이 내부 목표를 달성하는 데 도움이 될 수 있습니다. 소셜 네트워크 분석은 직원 행동과 회사의 여러 부분 간의 관계에 대한 통찰력을 제공합니다.
조직은 소셜 네트워크 분석을 위해 다양한 소프트웨어 솔루션을 사용할 수 있습니다. 각각은 장단점이 있으며 다른 목적에 적합합니다. 이 문서에서는 오늘날 가장 일반적으로 사용되는 데이터 시각화 도구 중 하나인 Microsoft의 Power BI에 중점을 둡니다. Power BI는 많은 소셜 네트워크 추가 기능을 제공하지만 R에서 사용자 지정 시각적 개체를 탐색하여 보다 강력하고 유연한 결과를 생성합니다.
이 튜토리얼은 기본 그래프 이론, 특히 방향성 그래프에 대한 이해를 전제로 합니다. 또한 이후 단계는 Windows에서만 사용할 수 있는 Power BI Desktop에 가장 적합합니다. 독자는 Mac OS 또는 Linux에서 Power BI 브라우저를 사용할 수 있지만 Power BI 브라우저는 Excel 통합 문서 가져오기와 같은 특정 기능을 지원하지 않습니다.
시각화를 위한 데이터 구조화
소셜 네트워크 생성은 연결(에지) 데이터 수집으로 시작됩니다. 연결 데이터에는 원본 노드 와 대상 노드 (가장자리의 양쪽 끝에 있는 노드)라는 두 가지 기본 필드가 있습니다. 이러한 노드 외에도 데이터를 수집하여 일반적으로 노드 또는 에지 속성으로 표시되는 보다 포괄적인 시각적 통찰력을 생성할 수 있습니다.
1) 노드 속성
- 모양 또는 색상 : 사용자의 유형(예: 사용자의 위치/국가)을 나타냅니다.
- Size : 사용자의 팔로워 수와 같은 네트워크의 중요성을 나타냅니다.
- 이미지 : 사용자의 아바타와 같은 개별 식별자로 작동
2) 모서리 속성
- 색상 , 획 또는 화살촉 연결 : 두 사용자를 연결하는 게시물 또는 트윗의 감정과 같은 연결 유형을 나타냅니다.
- 너비 : 연결 강도를 나타냅니다(예: 주어진 기간 동안 두 사용자 사이에서 관찰된 멘션 또는 리트윗 수).
이러한 속성이 어떻게 작동하는지 보기 위해 소셜 네트워크 시각적 개체의 예를 살펴보겠습니다.
또한 노드 또는 에지 속성을 통해 쉽게 표현할 수 없는 기타 정보를 지원할 수 있으므로 호버 텍스트를 사용하여 위의 매개변수를 보완하거나 대체할 수 있습니다.
Power BI의 소셜 네트워크 확장 비교
소셜 네트워크의 다양한 데이터 기능을 정의했으므로 Power BI에서 네트워크를 시각화하는 데 사용되는 4가지 인기 있는 도구의 장단점을 살펴보겠습니다.
확대 | Arthur Graus의 소셜 네트워크 그래프 | 네트워크 내비게이터 | ZoomCharts의 고급 네트워크(Light Edition) | R을 사용한 맞춤형 시각화 |
---|---|---|---|---|
동적 노드 크기 | 예 | 예 | 예 | 예 |
동적 가장자리 크기 | 아니 | 예 | 아니 | 예 |
노드 색상 사용자 정의 | 예 | 예 | 아니 | 예 |
복잡한 소셜 네트워크 처리 | 아니 | 예 | 예 | 예 |
노드의 프로필 이미지 | 예 | 아니 | 아니 | 예 |
조정 가능한 줌 | 아니 | 예 | 예 | 예 |
상위 N 연결 필터링 | 아니 | 아니 | 아니 | 예 |
호버에 대한 사용자 정의 정보 | 아니 | 아니 | 아니 | 예 |
가장자리 색상 사용자 정의 | 아니 | 아니 | 아니 | 예 |
기타 고급 기능 | 아니 | 아니 | 아니 | 예 |
Arthur Graus의 Social Network Graph, Network Navigator 및 ZoomCharts의 Advanced Networks(Light Edition)는 모두 간단한 소셜 네트워크를 개발하고 첫 번째 소셜 네트워크 분석을 시작하는 데 적합한 확장입니다.
그러나 데이터를 생생하게 만들고 시선을 사로잡는 시각적 개체로 획기적인 통찰력을 발견하거나 소셜 네트워크가 특히 복잡한 경우 R에서 사용자 지정 시각적 개체를 개발하는 것이 좋습니다.
이 사용자 지정 시각화는 자습서의 R에서 소셜 네트워크 확장의 최종 결과이며 R에서 제공하는 다양한 기능과 노드/에지 속성을 보여줍니다.
R을 사용하여 Power BI용 소셜 네트워크 확장 빌드
R을 사용하여 Power BI에서 소셜 네트워크를 시각화하는 확장 프로그램을 만드는 것은 5가지 개별 단계로 구성됩니다. 그러나 소셜 네트워크 확장을 구축하기 전에 데이터를 Power BI에 로드해야 합니다.
전제 조건: Power BI용 데이터 수집 및 준비
Twitter 및 Facebook 데이터를 기반으로 하는 테스트 데이터 세트로 이 튜토리얼을 따르거나 자신의 소셜 네트워크를 진행할 수 있습니다. 우리의 데이터는 무작위로 추출되었습니다. 원하는 경우 실제 Twitter 데이터를 다운로드할 수 있습니다. 필요한 데이터를 수집한 후 Power BI에 추가합니다(예: Excel 통합 문서를 가져오거나 데이터를 수동으로 추가). 결과는 다음 표와 유사해야 합니다.
데이터를 설정했으면 사용자 지정 시각화를 만들 준비가 된 것입니다.
1단계: 시각화 템플릿 설정
Power BI 시각화를 개발하는 것은 간단하지 않습니다. 기본 시각적 개체에도 수천 개의 파일이 필요합니다. 다행히 Microsoft는 몇 줄의 코드만으로 필요한 인프라 지원 파일을 제공하는 pbiviz
라는 라이브러리를 제공합니다. 또한 pbiviz
라이브러리는 모든 최종 파일을 .pbiviz
파일로 다시 패키징하여 시각화로 Power BI에 직접 로드할 수 있습니다.
pbiviz
를 설치하는 가장 간단한 방법은 Node.js를 사용하는 것입니다. pbiviz
가 설치되면 시스템의 명령줄 인터페이스를 통해 사용자 지정 R 시각적 개체를 초기화해야 합니다.
pbiviz new toptalSocialNetworkByBharatGarg -t rhtml cd toptalSocialNetworkByBharatGarg npm install pbiviz package
toptalSocialNetworkByBharatGarg
를 시각화에 원하는 이름으로 바꾸는 것을 잊지 마십시오. -t rhtml
은 pbiviz
패키지에 R 기반 HTML 시각화를 개발하기 위한 템플릿을 생성해야 함을 알립니다. 패키지에 작성자 이름 및 이메일과 같은 필드를 아직 지정하지 않았기 때문에 오류가 표시되지만 이 문제는 자습서의 뒷부분에서 해결할 것입니다. pbiviz
스크립트가 PowerShell에서 전혀 실행되지 않는 경우 먼저 Set-ExecutionPolicy RemoteSigned
를 사용하여 스크립트를 허용해야 할 수 있습니다.
코드를 성공적으로 실행하면 다음 구조의 폴더가 표시됩니다.
폴더 구조가 준비되면 사용자 지정 시각화를 위한 R 코드를 작성할 수 있습니다.
2단계: R에서 시각화 코딩
첫 번째 단계에서 생성된 디렉토리에는 기본 코드로 구성된 script.r
이라는 파일이 있습니다. (기본 코드는 R에서 사용 가능한 iris
샘플 데이터베이스를 사용하여 Petal.Length
에 의한 Petal.Species
의 히스토그램을 그리는 간단한 Power BI 확장을 생성합니다.) 코드를 업데이트하지만 주석이 달린 섹션을 포함하여 기본 구조를 유지합니다.
우리 프로젝트는 세 가지 R 라이브러리를 사용합니다.
- DiagrammeR: 텍스트에서 그래프 생성
- visNetwork: 대화형 네트워크 시각화 제공
- data.table: data.frame과 유사한 데이터 구성 지원
라이브러리 사용을 반영하기 위해 script.r
의 Library Declarations
섹션에 있는 코드를 교체해 보겠습니다.
libraryRequireInstall("DiagrammeR") libraryRequireInstall("visNetwork") libraryRequireInstall("data.table")
다음으로 Actual code
섹션의 코드를 R 코드로 교체합니다. 시각화를 만들기 전에 먼저 데이터를 읽고 처리해야 합니다. Power BI에서 두 가지 입력을 가져옵니다.
-
num_records
: 네트워크에서 상위 N 개의 연결만 선택하도록 숫자 입력 N (표시되는 연결 수를 제한하기 위해) -
dataset
: 우리의 소셜 네트워크 노드와 에지
플로팅할 N 개의 연결을 계산하려면 Power BI가 기본적으로 단일 숫자 값 대신 벡터를 제공하기 때문에 num_records
값을 집계해야 합니다. max
와 같은 집계 함수는 다음 목표를 달성합니다.
limit_connection <- max(num_records)
이제 dataset
를 사용자 정의 열이 있는 data.table
객체로 읽습니다. 가장 빈번한 연결을 테이블 상단에 배치하는 내림차순으로 데이터 세트를 값별로 정렬합니다. 이렇게 하면 num_records
와의 연결을 제한할 때 플롯할 가장 중요한 레코드를 선택할 수 있습니다.
dataset <- data.table(from = dataset[[1]] ,to = dataset[[2]] ,value = dataset[[3]] ,col_sentiment = dataset[[4]] ,col_type = dataset[[5]] ,from_name = dataset[[6]] ,to_name = dataset[[7]] ,from_avatar = dataset[[8]] ,to_avatar = dataset[[9]])[ order(-value)][ seq(1, min(nrow(dataset), limit_connection))]
다음으로, 고유한 사용자 ID( uid
)를 생성하고 각 사용자에게 할당하고 이를 새 테이블에 저장하여 사용자 정보를 준비해야 합니다. 또한 총 사용자 수를 계산하고 해당 정보를 num_nodes
라는 별도의 변수에 저장합니다.
user_ids <- data.table(id = unique(c(dataset$from, dataset$to)))[, uid := 1:.N] num_nodes <- nrow(user_ids)
다음을 포함한 추가 속성으로 사용자 정보를 업데이트하겠습니다.
- 팔로워 수(노드 크기).
- 레코드 수입니다.
- 사용자 유형(색상 코드).
- 아바타 링크.
R의 merge
기능을 사용하여 테이블을 업데이트합니다.
user_ids <- merge(user_ids, dataset[, .(num_follower = uniqueN(to)), from], by.x = 'id', by.y = 'from', all.x = T)[is.na(num_follower), num_follower := 0][, size := num_follower][num_follower > 0, size := size + 50][, size := size + 10] user_ids <- merge(user_ids, dataset[, .(sum_val = sum(value)), .(to, col_type)][order(-sum_val)][, id := 1:.N, to][id == 1, .(to, col_type)], by.x = 'id', by.y = 'to', all.x = T) user_ids[id %in% dataset$from, col_type := '#42f548'] user_ids <- merge(user_ids, unique(rbind(dataset[, .('id' = from, 'Name' = from_name, 'avatar' = from_avatar)], dataset[, .('id' = to, 'Name' = to_name, 'avatar' = to_avatar)])), by = 'id')
또한 생성된 uid
를 원본 데이터세트에 추가하여 나중에 코드 from
사용자 ID to
검색할 수 있습니다.
dataset <- merge(dataset, user_ids[, .(id, uid)], by.x = "from", by.y = "id") dataset <- merge(dataset, user_ids[, .(id, uid_retweet = uid)], by.x = "to", by.y = "id") user_ids <- user_ids[order(uid)]
다음으로 시각화를 위한 노드 및 에지 데이터 프레임을 생성합니다. 노드의 style
과 shape
(채워진 원)을 선택하고 user_ids
테이블의 올바른 열을 선택하여 노드의 color
, data
, value
및 image
속성을 채웁니다.
nodes <- create_node_df(n = num_nodes, type = "lower",, color = user_ids$col_type, shape = 'circularImage', data = user_ids$uid, value = user_ids$size, image = user_ids$avatar, title = paste0("<p>Name: <b>", user_ids$Name,"</b><br>", "Super UID <b>", user_ids$id, "</b><br>", "# followers <b>", user_ids$num_follower, "</b><br>", "</p>") )
유사하게, 우리의 edge' from
, to
및 color
속성에 해당하는 dataset
테이블 열을 선택합니다.
edges <- create_edge_df(from = dataset$uid, to = dataset$uid_retweet, arrows = "to", color = dataset$col_sentiment)
마지막으로 노드 및 에지 데이터 프레임이 준비되면 visNetwork
라이브러리를 사용하여 시각화를 만들고 나중에 기본 코드에서 사용할 p
라는 변수에 저장해 보겠습니다.
p <- visNetwork(nodes, edges) %>% visOptions(highlightNearest = list(enabled = TRUE, degree = 1, hover = T)) %>% visPhysics(stabilization = list(enabled = FALSE, iterations = 10), adaptiveTimestep = TRUE, barnesHut = list(avoidOverlap = 0.2, damping = 0.15, gravitationalConstant = -5000))
여기에서는 visOptions 및 visPhysics에서 몇 가지 네트워크 시각화 구성을 사용자 지정합니다. 자유롭게 문서 페이지를 살펴보고 원하는 대로 이러한 옵션을 업데이트하십시오. 이제 Actual code
섹션이 완료되었으며 p = ggplotly(g);
줄을 제거하여 Create and save widget
섹션을 업데이트해야 합니다. 우리 자신의 시각화 변수 p
를 코딩했기 때문입니다.
3단계: Power BI용 시각화 준비
이제 R에서 코딩을 완료했으므로 Power BI에서 사용할 시각화를 준비하기 위해 지원 JSON 파일을 일부 변경해야 합니다.
capabilities.json
파일부터 시작하겠습니다. 여기에는 확장의 데이터 소스 및 기타 설정과 같이 시각적 개체에 대한 시각화 탭에 표시되는 대부분의 정보가 포함됩니다. 먼저 dataRoles
를 업데이트하고 기존 값을 데이터 dataset
및 num_records
입력에 대한 새 데이터 역할로 교체해야 합니다.
# ... "dataRoles": [ { "displayName": "dataset", "description": "Connection Details - From, To, # of Connections, Sentiment Color, To Node Type Color", "kind": "GroupingOrMeasure", "name": "dataset" }, { "displayName": "num_records", "description": "number of records to keep", "kind": "Measure", "name": "num_records" } ], # ...
capabilities.json
파일에서 dataViewMappings
섹션도 업데이트하겠습니다. 입력이 준수해야 하는 conditions
을 추가하고 새 데이터 역할 및 해당 조건과 일치하도록 scriptResult
를 업데이트합니다. 변경 사항은 scriptResult
아래의 select
섹션과 함께 conditions
섹션을 참조하십시오.
# ... "dataViewMappings": [ { "conditions": [ { "dataset": { "max": 20 }, "num_records": { "max": 1 } } ], "scriptResult": { "dataInput": { "table": { "rows": { "select": [ { "for": { "in": "dataset" } }, { "for": { "in": "num_records" } } ], "dataReductionAlgorithm": { "top": {} } } } }, # ...
dependencies.json
파일로 넘어갑시다. 여기에서는 Power BI가 필요한 라이브러리를 식별하고 설치할 수 있도록 cranPackages
아래에 세 개의 추가 패키지를 추가합니다.
{ "name": "data.table", "displayName": "data.table", "url": "https://cran.r-project.org/web/packages/data.table/index.html" }, { "name": "DiagrammeR", "displayName": "DiagrammeR", "url": "https://cran.r-project.org/web/packages/DiagrammeR/index.html" }, { "name": "visNetwork", "displayName": "visNetwork", "url": "https://cran.r-project.org/web/packages/visNetwork/index.html" },
참고: Power BI는 이러한 라이브러리를 자동으로 설치해야 하지만 라이브러리 오류가 발생하면 다음 명령을 실행해 보세요.
install.packages(c("DiagrammeR", "htmlwidgets", "visNetwork", "data.table", "xml2"))
마지막으로 시각적 개체에 대한 관련 정보를 pbiviz.json
파일에 추가해 보겠습니다. 다음 필드를 업데이트하는 것이 좋습니다.
- 비주얼의 설명 필드
- 시각적 개체의 지원 URL
- 시각적 개체의 GitHub URL
- 저자의 이름
- 저자의 이메일
이제 파일이 업데이트되었으며 명령줄에서 시각화를 다시 패키징해야 합니다.
pbiviz package
코드가 성공적으로 실행되면 dist
디렉터리에 .pbiviz
파일이 생성되어야 합니다. 이 튜토리얼에서 다루는 전체 코드는 GitHub에서 볼 수 있습니다.
4단계: 시각화를 Power BI로 가져오기
Power BI에서 새 시각화를 가져오려면 Power BI 보고서(기존 데이터에 대한 보고서 또는 테스트 데이터에 대한 필수 구성 요소 단계에서 만든 보고서)를 열고 시각화 탭으로 이동합니다. ... [추가 옵션] 버튼을 클릭하고 파일에서 시각적 개체 가져오기 를 선택합니다. 참고: 시각화 탭을 표시하려면 먼저 브라우저에서 편집 을 선택해야 할 수 있습니다.
시각화 폴더의 dist
디렉터리로 이동하고 .pbiviz
파일을 선택하여 시각적 개체를 Power BI에 원활하게 로드합니다.
5단계: Power BI에서 시각화 만들기
가져온 시각화를 이제 시각화 창에서 사용할 수 있습니다. 시각화 아이콘을 클릭하여 보고서에 추가한 다음 관련 열을 dataset
및 num_records
입력에 추가합니다.
프로젝트 요구 사항에 따라 시각화에 추가 텍스트, 필터 및 기능을 추가할 수 있습니다. 또한 예제 프로젝트가 사용 가능한 기능의 모든 사용 사례를 다룰 수 없기 때문에 시각화를 더욱 향상시키는 데 사용한 세 가지 R 라이브러리에 대한 자세한 문서를 살펴보는 것이 좋습니다.
다음 소셜 네트워크 분석 업그레이드
최종 결과는 사용자 지정 Power BI 시각화를 생성할 때 R의 강력함과 효율성에 대한 증거입니다. 다음 데이터 세트에서 R의 사용자 지정 시각적 개체를 사용하여 소셜 네트워크 분석을 시도하고 포괄적인 데이터 통찰력으로 더 현명한 결정을 내립니다.
Toptal 엔지니어링 블로그는 이 기사에 제공된 코드 샘플을 검토해 준 Leandro Roser에게 감사를 표합니다.