정치 성향을 예측하는 법, SNS 데이터와 네트워크 분석으로 시작하기
Section 1. 트위터에서 형성된 정치 담론 구조 이해하기
이번 튜토리얼 시간에는 트위터 데이터를 NetMiner 5에서 새롭게 제공하는 그래프 머신러닝 알고리즘 중 하나인 GraphSAGE 모델을 적용하여 유저의 정치적 성향을 예측해보겠습니다.
트위터에서는 특정 캠페인이나 특별한 의사를 표현할 때 ‘해시태그’를 자주 사용하며, 자신의 의견에 공감하거나 지지하는 트윗은 리트윗(공유)하는 특성이 있습니다. 이러한 리트윗 활동을 통해 비슷한 성향의 유저들이 자연스럽게 하나의 그룹을 형성하는 경향을 보입니다. 이러한 SNS 유저의 행동 패턴을 활용하면, 특정 후보A에 대한 지지 혹은 반대 성향을 예측하는 모델을 구성할 수 있습니다.
A. 트위터 데이터 소개
먼저, 이번 분석에서 사용된 유저 노드셋 데이터에 대한 소개를 드리겠습니다.

총 578개의 노드들로 구성되어 있습니다.
LABEL(user id), Real Name, Description, 트윗글(랜덤) 등과 같은 유저의 기본 정보에 대한 내용과 게시글에서 사용된 주요 해시태그 102개, 해당 게시글이 후보 A에 대한 지지 또는 반대 여부를 나타내는 ‘후보 지지/반대’ 칼럼이 유저의 속성 정보로 들어와 있습니다.
다음은 유저 간 리트윗 네트워크 데이터에 대한 소개를 드리겠습니다.

총 4,250개의 링크(네트워크)로 구성되어 있습니다.
Source 노드와 Taget 노드는 각각 유저 ID를 의미하고 Weight는 Source 노드의 유저와 Target 노드의 유저 간의 리트윗 횟수를 의미합니다.
예를 들어, u-1231442396992294912 유저와 u-1256159510126710785 유저끼리는 1번의 리트윗 관계를 갖고 있고, u-52586704 유저와 u-67319787 유저는 10번의 리트윗 관계를 가진다고 해석할 수 있습니다.
B. 후보 A에 대한 여론의 분위기는? - 지지 vs 반대 현황 파악하기
먼저, 후보 A에 대한 지지/반대 현황에 대해서 파이차트로 분포를 확인하도록 하겠습니다.
Visualize > Chart
우측 패널에서 시각화하고자 하는 Dataset을 선택합니다.
Chart Type에서 Pie Chart를 선택합니다.
Y axis를 ‘후보 지지/반대’ 속성을 선택하고 Run Layout을 클릭합니다.

[후보 A 여론 현황]
지지 여론은 117명, 반대 여론은 201명, 지지 또는 반대 의견을 밝히지 않은 여론은 260명이었습니다.
이번에는 네트워크 시각화를 통해 우저 간 리트윗 네트워크 현황을 확인하도록 하겠습니다.
Visualize > Network > 1 Mode
우측 패널에서 노드셋과 1-mode Network(리트윗 네트워크)를 선택합니다.
레이아웃 알고리즘을 선택하고 Run Layout을 클릭합니다.
Style의 Node 탭에서 노드의 색상을 반대는 빨간색, 지지는 파란색, undefined는 초록색으로 변경합니다.
Style의 Link 탭에서 링크의 굵기를 WEIGHT 값에 따라 달라지도록 설정합니다.

[유저 간 리트윗 네트워크 현황]
네트워크 시각화를 확인했을 때, 정치적 성향이 비슷한 노드끼리 군집을 이루는 형태가 나타난 것을 확인할 수 있었습니다.
Section 2. 리트윗 관계를 이용한 네트워크 분석
A. 커뮤니티 별 지지/반대 현황
유저 간 리트윗 데이터로 Louvain 커뮤니티 분석을 실시하고 각 커뮤니티 별 후보 A에 대한 지지/반대 분포를 확인하도록 하겠습니다.
- Network > Subgroup > Community > Louvain
1-mode Network(리트윗 네트워크)를 선택합니다.
방향성이 없는 네트워크이므로 Symmetrize 체크하지 않습니다.
Use Weight를 체크하여 단순 연결 수가 아닌 연결 강도 기반의 커뮤니티 구조를 도출합니다.

[Louvain Community 분석 결과]
총 4개의 커뮤니티가 생성되었습니다.
[T]Community(Louvain) 하단의 Add to Dataset > Node Attribute를 클릭하고 OK 버튼을 클릭하면 커뮤니티 분석 결과가 유저 노드셋의 속성으로 추가가 된 것을 확인할 수 있습니다.
1번 커뮤니티를 빨간색, 2번 커뮤니티를 파란색, 3번 커뮤니티를 노란색, 4번 커뮤니티를 초록색으로 지정하고 네트워크 시각화를 통해 커뮤니티 분포 현황을 확인하도록 하겠습니다.

[Louvain Community 시각화]
Section 1에서 확인했던 네트워크 시각화와 비교했을 때, 1,3,4번 커뮤니티는 후보 A에 대한 반대 여론 위주로 구성되었고 2번 커뮤니티는 후보 A에 대한 찬성 여론 위주로 구성된 것을 확인할 수 있습니다.
B. 리트윗 네트워크의 영향력 구조 파악하기: 중심성 분석
유저 간 리트윗 데이터로 중심성 분석을 수행한 다음 마찬가지로 분석 결과를 유저의 노드셋의 속성 정보로 추가하도록 하겠습니다.
Network > Centrality > Degree/Closeness/Betweenness
1-mode Network(리트윗 네트워크)를 선택합니다.
Use Weight/Wasserman-Faust Adjustment/Use the Weight as Distance를 체크합니다.
방향성이 없는 네트워크이므로 In/Out Centrality 값이 동일합니다.
[T]Degree Centrality 하단의 Add to Dataset > Node Attribute를 클릭하고 In-Degree & Closeness/Betweenness Centrality를 체크한 후 OK 버튼을 클릭하면 연결/근접/매개 중심성 분석 결과가 유저 노드셋의 속성으로 추가가 된 것을 확인할 수 있습니다.

[In-Degree Centrality]

[In-Closeness Centrality]

[Betweenness Centrality]
Section 3. 리트윗 구조로 알아보는 정치 성향 예측: GraphSAGE 모델로 예측하기
Section 1에서 ‘후보 지지/반대’ 수의 분포를 확인했을 때, 지지/반대 여부를 밝히지 않은 유저의 수가 260명이었습니다.
따라서, 그래프 머신러닝 알고리즘 중 하나인 GraphSAGE 모델을 사용해서, 지지/반대 여부가 확인된 318명의 유저 데이터를 학습에 사용하고, 이를 바탕으로 나머지 260명의 후보 A에 대한 지지 여부를 예측해보겠습니다.
A. 분석을 위한 첫 걸음: 학습/테스트 데이터 나누기

유저 노드셋 화면에서 마우스 우클릭 시 나타나는 Open In Excel 버튼을 클릭합니다.
Excel 창이 열리면 네트워크 분석 결과까지 포함된 유저 노드셋이 나타납니다.
후보 지지/반대 칼럼에 값이 부여된 노드와 값이 없는 노드들을 각각 훈련, 검증 데이터로 분리하고 NetMiner 5로 불러옵니다.
※ 데이터를 불러올 때, Choose Data Type의 More 옵션에서 Community(Louvain) Partition 칼럼의 Value Type을 TEXT로 변경 후에 최종적으로 Import 해야 합니다.
※ Query를 이용하여 데이터를 분할할 수 있습니다. “후보 지지/반대” != ( 또는 ==) Null 을 적용하면 위 절차와 동일하게 값이 부여된 노드와 값이 없는 노드들로 분리가 됩니다.
B. GraphSAGE 모델 학습하기
먼저, 유저가 사용한 해시태그 속성만을 이용해서 GraphSAGE 모델을 학습해보겠습니다.
Machine Learning > Learn (Graph) > GraphSAGE
훈련 데이터에 해당하는 1-mode Network(리트윗 네트워크)를 선택합니다.
Variable to Predict에 종속변수인 ‘후보 지지/반대’ 속성을 지정합니다.

Variables to Include for Prediction에 102개의 해시태그만 체크 후 Select 버튼을 클릭합니다.
Pre-process 에서 결측치 처리 조건과 텍스트 데이터 처리 조건을 지정합니다.

평가 방식은 k-Fold Cross Validation으로 지정하고 10을 입력합니다.

Main process에서 GraphSAGE 모델의 파라미터들을 새롭게 설정합니다.

Run process를 클릭하여 GraphSAGE 모델을 실행합니다.
학습 결과를 확인 후 Save Model 버튼을 클릭하여 학습한 모델을 저장합니다.

[GraphSAGE 학습 결과 화면]
동일한 절차대로 해시태그와 중심성 분석 결과를 같이 학습한 모델, 해시태그와 커뮤니티 분석 결과를 같이 학습한 모델, 해시태그와 중심성 분석&커뮤니티 분석 결과를 같이 학습한 모델을 생성 후 총 4개 모델의 성능을 비교합니다.

[해시태그]

[해시태그 + 중심성 분석]

[해시태그 + 커뮤니티 분석]

[해시태그 + 중심성 분석 + 커뮤니티 분석]
해시태그와 커뮤니티 분석 결과를 활용한 GraphSAGE 모델의 정확도가 가장 낮은 성능을 보인 반면, 해시태그 & 커뮤니티 분석 & 중심성 분석 결과를 모두 활용한 GraphSAGE 모델의 성능이 가장 높은 것을 확인할 수 있었습니다.
C. 저장된 학습 모델로 실제 데이터를 예측
이제, 가장 성능이 좋았던 4번째 학습 모델을 이용하여 후보 A의 지지 또는 반대 의견을 밝히지 않았던 260명의 여론을 예측하도록 하겠습니다.
Machine Learning (머신러닝) > Inference (추론하기)
우측 패널 Analysis 에서 분석 종류 Graph를 선택하고 Data Item 에는 값이 할당되지 않은 260명의 유저들 간의 네트워크 데이터(1-mode Network)를 선택합니다.

Main process 에서 Select Model 버튼을 선택하고 저장했던 4번째 모델을 선택합니다.

모델 추론결과는 [T]Prediction Table 에서 확인하실 수 있습니다.

[추론 결과]
이처럼 학습된 GraphSAGE 모델을 실제 데이터에 적용함으로써 비어 있는 값을 예측하할 수 있고, 숨어 있던 인사이트가 드러나고, 타겟 전략 수립 등 보다 정밀한 의사 결정이 가능해집니다.
※ 예측용 데이터는 학습 모델에 사용했던 학습 데이터와 동일한 데이터 구조를 가져야 합니다. 즉, 예측용 데이터와 호환되는 학습 모델이 없으면 아무것도 표시되지 않습니다. 학습 모델의 독립 변수가 예측용 데이터에 존재해야 합니다.
※ 관련 튜토리얼
☞ NetMiner 5 빠르게 시작하기(Quick Tour)
