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 마케팅 | 바이럴 확산 경로 분석 |
| 감염병 모델링 | 사람 간 접촉 네트워크로 확산 예측 |
| 조직 커뮤니케이션 | 정보전달 병목 파악 |
'인공지능' 카테고리의 다른 글
| 🎥 OpenCV 입문: 이미지 & 동영상 데이터 불러오기 (6) | 2025.07.17 |
|---|---|
| 📝 입소문 시뮬레이션 코드, 진짜 쉽게 이해하기! (5) | 2025.07.15 |
| 🚚 물류 최적 운송경로 계산 & 네트워크 가시화 (3) | 2025.07.14 |
| 💰 물류 운송비용 함수 작성 & 최적화 (4) | 2025.07.11 |
| 물류 최적화의 첫걸음: NetworkX로 가중치 네트워크 그리기 (2) | 2025.07.08 |