인공지능

📢 입소문 확산 시뮬레이션: 네트워크와 시계열 변화까지!

존카터 2025. 7. 15. 16:41

1️⃣ 시뮬레이션 목표

이번 포스팅에서는 20명의 사람과 랜덤 친구 관계 네트워크를 기반으로 입소문이 퍼지는 과정을 시뮬레이션합니다.

✅ 네트워크 구조 생성 (people.csv + friendship.csv)
✅ 소문 전파 규칙 정의 및 단계별 확산
✅ 시간에 따른 확산 현황 시각화
✅ 시계열 그래프로 전파 속도 확인

실제 SNS 소문, 바이럴 마케팅, 감염병 확산과 동일한 구조로 이해할 수 있는 모델입니다.


2️⃣ 데이터 준비

people.csv (노드 정보)

IDNameAgeGenderCity

P1 Alex 34 Male Seoul
P2 Chris 28 Female Busan
... ... ... ... ...
P20 Rowan 38 Female Gwangju

friendship.csv (엣지 정보)

Source Target
P1 P2
P1 P5
P3 P7
... ...
P19 P20

👉 friendship.csv는 네트워크 상에서 누가 누구와 연결되어 있는지 알려주는 친구 관계 데이터입니다.


3️⃣ 네트워크 구성

NetworkX를 이용해 친구 관계 네트워크를 구성하고, 시각화합니다.

import networkx as nx
import pandas as pd
import matplotlib.pyplot as plt

# CSV 불러오기
df_people = pd.read_csv('people.csv')
df_friendship = pd.read_csv('friendship.csv')

# 네트워크 생성
G = nx.Graph()
G.add_nodes_from(df_people['ID'])
G.add_edges_from(zip(df_friendship['Source'], df_friendship['Target']))

# 시각화
plt.figure(figsize=(6,6))
pos = nx.spring_layout(G)
nx.draw(G, pos, with_labels=True, node_color='lightblue', edge_color='gray')
plt.title("👥 친구 관계 네트워크")
plt.show()

✅ 출력: 20명이 랜덤으로 연결된 친구 네트워크


4️⃣ 소문 전파 규칙 정의

  • 초기 1명이 소문을 알고 있음 (무작위 선택)
  • 소문 아는 사람은 30% 확률로 친구에게 전파
  • 매 시점마다 확산 현황을 업데이트
import random

spread_prob = 0.3
initial_node = random.choice(list(G.nodes))
infected = {initial_node}  # 초기 소문자

spread_history = [len(infected)]  # 시계열 데이터 저장

for t in range(1, 11):  # 10단계 확산 시뮬레이션
    new_infected = set(infected)
    for node in infected:
        for neighbor in G.neighbors(node):
            if neighbor not in infected and random.random() < spread_prob:
                new_infected.add(neighbor)
    infected = new_infected
    spread_history.append(len(infected))

spread_history → 시간(t)에 따른 소문 아는 사람 수 저장


5️⃣ 시계열 그래프

plt.plot(range(len(spread_history)), spread_history, marker='o')
plt.xlabel('시간 (t)')
plt.ylabel('소문을 아는 사람 수')
plt.title('⏳ 입소문 확산 시계열 변화')
plt.grid()
plt.show()
  • 초기엔 느리게 확산되다가
  • 연결성이 높은 노드를 만나면 급속도로 확산됩니다.


6️⃣ 네트워크 확산 단계별 시각화

for t in range(len(spread_history)):
    plt.figure(figsize=(6,6))
    node_colors = ["red" if node in list(infected)[:spread_history[t]] else "lightgray" for node in G.nodes]
    nx.draw(G, pos, with_labels=True, node_color=node_colors, edge_color='gray')
    plt.title(f"📢 t={t} 소문 전파 현황")
    plt.show()
  • t=0 → 초기 소문자 1명만 빨간색
  • t 증가 → 점점 더 많은 노드가 빨간색으로 변함

7️⃣ 결과 해석

확산 속도는 네트워크 밀도 & 전파 확률에 따라 달라짐
허브 역할 노드(연결 많은 노드)에 소문이 닿으면 급속 확산
네트워크 구조가 입소문 성공 여부에 중요한 영향을 미침


8️⃣ 실무 응용

분야 활용
SNS 마케팅 바이럴 확산 경로 분석
감염병 모델링 사람 간 접촉 네트워크로 확산 예측
조직 커뮤니케이션 정보전달 병목 파악