큰 데이터셋의 경우, SQL에서 페이지 이동 정보를 사전에 요약하여 Python으로 가져오는 방식이 훨씬 효율적일 수 있습니다. 이 방법은 각 `page_id`에서 `next_page_id`로의 전환이 얼마나 자주 발생했는지를 미리 계산한 후, Python에서 그래프 형태로 시각화할 수 있습니다.

SQL 단계에서 요약된 데이터를 만드는 방법은 `GROUP BY`와 `COUNT()`를 활용하여 각 페이지 간 전환 빈도를 집계하는 것입니다.

### 1. SQL로 페이지 이동 요약하기

다음 SQL 쿼리는 `page_id`에서 `next_page_id`로의 전환 빈도를 사전에 계산합니다.

```sql
-- Teradata에서 page_id와 next_page_id의 전환을 요약한 SQL 쿼리
SELECT 
    page_id,
    next_page_id,
    COUNT(*) AS transition_count
FROM (
    SELECT 
        session_id,
        page_id,
        LEAD(page_id) OVER (PARTITION BY session_id ORDER BY event_time) AS next_page_id
    FROM 
        your_table
) t
WHERE next_page_id IS NOT NULL
GROUP BY page_id, next_page_id;
```

#### 쿼리 설명:
- **`LEAD()`**: `page_id`의 다음 페이지를 가져옵니다.
- **`GROUP BY`**: `page_id`와 `next_page_id`별로 그룹화하여 전환 빈도를 계산합니다.
- **`COUNT(*)`**: 각 전환(`page_id` -> `next_page_id`)이 발생한 횟수를 집계합니다.

이렇게 사전에 전환 빈도를 요약하면, 큰 데이터셋도 효율적으로 처리할 수 있습니다.

### 2. Python에서 요약된 데이터로 그래프 그리기

이제, 요약된 데이터를 Python으로 가져와서 페이지 이동을 시각화합니다.

```python
import pandas as pd
import networkx as nx
import matplotlib.pyplot as plt
from sqlalchemy import create_engine

# Teradata 연결 설정 (SQLAlchemy 사용)
engine = create_engine('teradata://username:password@host:port/dbname')

# SQL 쿼리로 요약된 데이터 불러오기
query = """
SELECT 
    page_id,
    next_page_id,
    COUNT(*) AS transition_count
FROM (
    SELECT 
        session_id,
        page_id,
        LEAD(page_id) OVER (PARTITION BY session_id ORDER BY event_time) AS next_page_id
    FROM 
        your_table
) t
WHERE next_page_id IS NOT NULL
GROUP BY page_id, next_page_id;
"""

# Teradata에서 데이터를 읽어와 DataFrame으로 저장
df = pd.read_sql(query, engine)

# 엣지 리스트 만들기 (page_id -> next_page_id)와 가중치 추가
edges = df[['page_id', 'next_page_id', 'transition_count']].values.tolist()

# NetworkX 그래프 객체 생성
G = nx.DiGraph()

# 엣지와 가중치를 그래프에 추가
for edge in edges:
    G.add_edge(edge[0], edge[1], weight=edge[2])

# 그래프 시각화 설정
plt.figure(figsize=(8, 6))
pos = nx.spring_layout(G)

# 노드 및 엣지 시각화
nx.draw(G, pos, with_labels=True, node_color='skyblue', node_size=3000, font_size=12, font_weight='bold', edge_color='gray', arrows=True)

# 엣지 가중치(전환 빈도) 표시
edge_labels = nx.get_edge_attributes(G, 'weight')
nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels)

# 그래프 보여주기
plt.title('Page Transitions with Frequency')
plt.show()
```

### 코드 설명:
1. **Teradata에서 요약된 데이터 가져오기**: SQL 쿼리에서 페이지 전환 빈도(`transition_count`)를 포함한 데이터를 Python으로 가져옵니다.
2. **엣지 리스트 생성**: `page_id`, `next_page_id`, 그리고 전환 빈도(`transition_count`)를 포함한 리스트를 생성합니다.
3. **그래프에 가중치 추가**: 각 엣지에 페이지 간 전환 빈도를 가중치로 추가합니다.
4. **NetworkX 그래프 시각화**: 페이지 간 이동을 그래프로 나타내고, 각 엣지에 전환 빈도를 라벨로 표시합니다.

### 요약:
- **SQL에서 요약**: Teradata SQL에서 페이지 이동 전환을 미리 집계하여 전환 빈도를 계산합니다.
- **Python에서 시각화**: 요약된 데이터를 `NetworkX`로 시각화하며, 각 전환 빈도를 엣지 가중치로 표시합니다.

이 방법은 데이터가 매우 클 때도 효율적으로 처리할 수 있으며, SQL에서 최대한 전처리를 진행하여 Python에서 시각화에 집중할 수 있습니다.

반응형

+ Recent posts