짜리몽땅 매거진

[Python] 상관분석하고 네트워크 차트로 시각화하기 본문

Data/Python

[Python] 상관분석하고 네트워크 차트로 시각화하기

쿡국 2025. 1. 4. 17:26

앱서비스의 DB와 로그데이터를 활용해 각 유저와 기능 관련 수치들을 변수로 설정한 뒤 상관분석을 진행하면, 어떤 기능들이 상호 연관성이 높은지 쉽게 파악해 추후 새로운 전략을 짜는데 용이하게 활용할 수 있다. 더불어 상관분석 결과를 '상관계수 네트워크 차트' 형태로 시각화한다면 한 눈에 파악하기 쉽다. 

 

그래서 오늘은 실제 앱서비스 데이터를 바탕으로 위 과정을 실습해보자. 

* 실제 기업 데이터로, 수치는 비공개 처리합니다.

 

1. 라이브러리 호출 및 데이터 불러오기

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

df_merged = pd.read_csv('상관분석 데이터.csv')

 

날짜를 인덱스로 설정해 각 유저별 기능별 수치를 사전에 전처리한 데이터를 불러온다.

 

2. 상관분석 진행

# 분석 대상 칼럼 리스트
target_columns = [
    'project_consumedTime', 'project_daily_count', 'project_total_count', 'project_total_consumedTime',
    'participateOnHotVote', 'vote_daily_count', 'vote_total_count', 'daily_participateOnHotVote',
    'total_participateOnHotVote', 'fortune_daily_count', 'fortune_total_count', 'daily_noti_count',
    'total_noti_count', 'credit_scale', 'daily_creit_count', 'total_credit_count',
    'daily_scale_sum', 'total_scale_sum'
]

# 상관계수 계산
correlation_matrix = df_merged[target_columns].corr()

# 히트맵 시각화
plt.figure(figsize=(12, 10))
sns.heatmap(correlation_matrix, annot=True, fmt=".2f", cmap="coolwarm", cbar=True, square=True)
plt.title("Correlation Heatmap of Selected Columns")
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()

 

데이터셋의 칼럼 중 상관분석을 진행할 변수를 선언한 뒤, 상관분석을 진행한다. 상관분석 결과는 우선 히트맵으로 시각화하여 확인한다.

 

3. 상관계수 네트워크 차트 시각화

import networkx as nx

# 상관계수 계산
correlation_matrix = df_merged[target_columns].corr()

# 네트워크 그래프 생성
G = nx.Graph()

# 노드 추가
for column in target_columns:
    G.add_node(column)

# 상관계수를 기반으로 엣지 추가
for i in range(len(correlation_matrix)):
    for j in range(i+1, len(correlation_matrix)):  # 대각선 이하만 고려
        corr_value = correlation_matrix.iloc[i, j]
        if corr_value != 0:  # 상관계수가 0이 아닌 경우에만 엣지 추가
            # 선 색상 및 두께 설정
            edge_color = 'red' if corr_value > 0 else 'blue'
            edge_width = abs(corr_value) * 5  # 절대값에 비례해 두께 조정
            G.add_edge(
                correlation_matrix.index[i],
                correlation_matrix.columns[j],
                weight=edge_width,
                color=edge_color
            )

# 색상과 두께 속성 가져오기
edges = G.edges(data=True)
colors = [edge[2]['color'] for edge in edges]
weights = [edge[2]['weight'] for edge in edges]

# 네트워크 시각화
plt.figure(figsize=(12, 12))
pos = nx.spring_layout(G, seed=42)  # 노드 위치를 spring layout으로 배치
nx.draw_networkx_nodes(G, pos, node_size=700, node_color="lightgrey")
nx.draw_networkx_labels(G, pos, font_size=10, font_color="black")
nx.draw_networkx_edges(G, pos, edge_color=colors, width=weights)
plt.title("Correlation Network Graph")
plt.axis('off')
plt.show()

 

변수 간 상관계수를 네트워크 차트로 시각화하면 더 한 눈에 파악하기 쉽다. 이를 위해 양의 상관관계인 변수는 붉은색, 음의 상관관계인 변수는 푸른색 선으로 구역을 잇고, 상관관계가 클수록 선의 두께가 두꺼워지도록 시각화하는 코드를 작성했다. 결과는 아래 이미지와 같다.

위 시각화 결과는 변수가 너무 많은 탓에 가시성이 떨어진다. 따라서 Apache Superset이나 Tableau와 같은 시각화 전용 툴을 활용하면 아래와 같이 좀 더 깔끔한 차트로 제작할 수 있다.