인공지능

물류 최적화의 첫걸음: NetworkX로 가중치 네트워크 그리기

존카터 2025. 7. 8. 10:12
  • 물류 시스템 = 창고 ↔ 공장 간 물류 흐름의 집합
  • 이를 네트워크(그래프) 로 시각화하면:
    • 전체 흐름을 한눈에 파악
    • 병목 & 비용구간 발견
    • 효율적 개선안 도출

✅ 오늘의 목표: 가중치가 적용된 네트워크 그래프 그리기


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/네트워크 분석 패킷 흐름, 서버 연결 가시화

✅ 데이터만 바꾸면 어디든 쓸 수 있는 만능 기법!