- 물류 시스템 = 창고 ↔ 공장 간 물류 흐름의 집합
- 이를 네트워크(그래프) 로 시각화하면:
- 전체 흐름을 한눈에 파악
- 병목 & 비용구간 발견
- 효율적 개선안 도출
✅ 오늘의 목표: 가중치가 적용된 네트워크 그래프 그리기
1️⃣ 데이터 구조 이해하기
📄 network_weight.csv → 노드 간 가중치 정보 (엣지)
ABCDE
| 0 | 0.63 | 0.14 | ... | ... | ... |
📄 network_pos.csv → 노드 위치 정보 (좌표)
| A | B | C | D | E | |
| 0 | 0 | 0 | 2 | 2 | 1 |
| 1 | 0 | 2 | 0 | 2 | 1 |
2️⃣ 완성 코드 (바로 실행 가능)
import pandas as pd
import matplotlib.pyplot as plt
import networkx as nx
# 1. 데이터 불러오기
df_w = pd.read_csv('6장/network_weight.csv')
df_p = pd.read_csv('6장/network_pos.csv', index_col=False)
# 2. 그래프 객체 생성
G = nx.Graph()
edge_weights = []
size = 10
# 3. 노드 추가
for node in df_w.columns:
G.add_node(node)
# 4. 엣지 추가 (자기자신 X, 중복 X)
for i in range(len(df_w.columns)):
for j in range(i+1, len(df_w.columns)):
weight = df_w.iloc[i, j]
if weight != 0:
G.add_edge(df_w.columns[i], df_w.columns[j], weight=weight)
edge_weights.append(weight * size)
# 5. 노드 좌표 설정
pos = {}
for node in df_w.columns:
x = df_p[node].iloc[0]
y = df_p[node].iloc[1]
pos[node] = (x, y)
# 6. 그리기
nx.draw(G, pos, with_labels=True, font_size=16, node_size=1000,
node_color='skyblue', font_color='black', width=edge_weights)
plt.title("📦 가중치 포함 네트워크 그래프")
plt.show()
3️⃣ 결과 & 해석

| 요소 | 의미 |
| 노드 (원) | 창고 또는 공장 |
| 선 (엣지) | 물류 이동 경로 |
| 선 두께 | 이동량, 비용 등 가중치 크기 |
👉 두꺼운 선 = 더 많이 이동하거나 비용이 큰 경로 → 개선 타겟

물류 운송 경로 가시화 & iterrows() 완벽 이해
📦 1️⃣ 물류 네트워크 가시화 목표
- 창고(W1, W2, W3) → 공장(F1, F2, F3, F4) 간 운송량을 시각화
- NetworkX 로 노드 & 엣지 & 가중치 표시하기
📝 2️⃣ 사용 데이터 구조
📄 trans_route.csv
공장F1F2F3F4| W1 | 15 | 15 | 0 | 5 |
| W2 | 5 | 0 | 30 | 5 |
| W3 | 10 | 15 | 2 | 15 |
📄 trans_route_pos.csv
| W1 | W2 | W3 | F1 | F2 | F3 | F4 | |
| 0 | 0 | 1 | 2 | 4 | 4 | 4 | 4 |
| 1 | 0 | 2 | 3 | 0.5 | 1.5 | 2.5 | 3.5 |
- 행(0,1) → 각각 X, Y 좌표
- 열(W1~F4) → 노드명
🛠 3️⃣ 전체 코드
import pandas as pd
import matplotlib.pyplot as plt
import networkx as nx
# 1. 데이터 불러오기
df_trans = pd.read_csv('6장/trans_route.csv')
df_pos = pd.read_csv('6장/trans_route_pos.csv', index_col=False)
# 2. 그래프 생성
G = nx.DiGraph()
edge_weights = []
size = 0.3 # 선 두께 배율
# 3. 노드 추가
warehouses = df_trans['공장'].tolist()
factories = df_trans.columns[1:].tolist()
nodes = warehouses + factories
for node in nodes:
G.add_node(node)
# 4. 엣지 추가
for idx, row in df_trans.iterrows():
from_node = row['공장']
for to_node in factories:
weight = row[to_node]
if weight > 0:
G.add_edge(from_node, to_node, weight=weight)
edge_weights.append(weight * size)
# 5. 좌표 설정
pos = {}
for node in df_pos.columns:
x = df_pos[node].iloc[0]
y = df_pos[node].iloc[1]
pos[node] = (x, y)
# 6. 시각화
plt.figure(figsize=(10, 6))
nx.draw(G, pos, with_labels=True, node_size=1200, node_color='skyblue',
width=edge_weights, arrows=True, font_size=10)
edge_labels = nx.get_edge_attributes(G, 'weight')
nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels, font_color='red')
plt.title("🚚 물류 운송 경로 가시화 (운송량 표시)")
plt.show()
✅ 특징:
- 운송량이 선 두께 & 숫자로 표시
- 방향 있는 그래프 (창고 → 공장)
🔍 4️⃣ iterrows() 완전정복
| 구성 | 설명 |
| for idx, row in df.iterrows() | pandas의 한 줄씩 반복 방법 |
| idx | 행 번호 (0,1,2...) → 거의 안 씀 |
| row | 해당 행의 데이터 (딕셔너리 같은 Series) |
✅ row 사용법:
- row['공장'] → 창고명
- row['F1'] → 수량
👉 순서에 의존 X → 항상 컬럼명으로 꺼내기
❗ 주의:
| 잘못된 방식 | 올바른 방식 |
| row[0] | 🚫 (순서 바뀌면 오류) |
| row['공장'] | ✅ 안전함 |
💡 5️⃣ 실무 적용 팁
| 적용 | 내용 |
| 물류 네트워크 | 물류 흐름, 병목 발견 |
| 비용 절감 | 고비용 경로 개선 |
| IT/네트워크 분석 | 패킷 흐름, 서버 연결 가시화 |
✅ 데이터만 바꾸면 어디든 쓸 수 있는 만능 기법!

'인공지능' 카테고리의 다른 글
| 🚚 물류 최적 운송경로 계산 & 네트워크 가시화 (3) | 2025.07.14 |
|---|---|
| 💰 물류 운송비용 함수 작성 & 최적화 (4) | 2025.07.11 |
| 물류의 최적경로 컨설팅 테크닉 (1) | 2025.07.07 |
| 고객 데이터를 클러스터링하고 PCA로 시각화하기 (1) | 2025.07.03 |
| K-Means 클러스터링 (1) | 2025.07.03 |