큰 데이터셋의 경우, 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에서 시각화에 집중할 수 있습니다.
'Python, PySpark' 카테고리의 다른 글
Python networkx (1) | 2024.10.10 |
---|---|
how to visualize the customer page visit pattern on app? (0) | 2024.09.21 |
PCA와 PLS 차이점(챗지피티 설명) (0) | 2024.09.21 |
파이토치 CNN 분석 (2) | 2024.08.28 |
Jupyterlab에서 텍스트 파일 미리보기(encoding='euc-kr') (0) | 2024.07.15 |