큰 데이터셋의 경우, 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에서 시각화에 집중할 수 있습니다.

반응형

고객의 `page_id` 이동 정보를 분석하고, 세션 내에서 페이지 간의 연결을 시각화하는 작업을 Python의 `networkx`를 사용해 구현할 수 있습니다. 아래는 이를 위한 예제 코드입니다.

### 예제 코드

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

# 샘플 데이터프레임 생성
data = {
    'session_id': [1, 1, 1, 2, 2, 3, 3, 3],
    'customer_id': [101, 101, 101, 102, 102, 103, 103, 103],
    'page_id': ['home', 'product', 'cart', 'home', 'checkout', 'home', 'product', 'cart']
}

df = pd.DataFrame(data)

# 페이지 이동 정보를 담은 그래프 생성 함수
def build_page_transition_graph(df):
    # 세션별로 그룹화하여 페이지 이동 순서를 파악
    G = nx.DiGraph()  # 방향 그래프를 사용하여 페이지 이동을 나타냄
    
    for session, group in df.groupby('session_id'):
        pages = group['page_id'].tolist()
        # 각 세션 내 페이지 이동을 간선으로 추가
        for i in range(len(pages) - 1):
            G.add_edge(pages[i], pages[i+1])
    
    return G

# 그래프 생성
G = build_page_transition_graph(df)

# 페이지 이동의 연결 강도 계산 (간선의 가중치 추가)
for (u, v) in G.edges():
    if G.has_edge(u, v):
        if 'weight' in G[u][v]:
            G[u][v]['weight'] += 1
        else:
            G[u][v]['weight'] = 1

# 그래프 시각화 함수
def plot_graph(G):
    pos = nx.spring_layout(G)  # 그래프의 레이아웃 설정
    weights = [G[u][v]['weight'] for u, v in G.edges()]  # 간선의 가중치
    
    plt.figure(figsize=(10, 7))
    nx.draw_networkx_nodes(G, pos, node_color='skyblue', node_size=2000)
    nx.draw_networkx_edges(G, pos, width=weights, edge_color='gray', arrows=True)
    nx.draw_networkx_labels(G, pos, font_size=12, font_color='black')

    plt.title('Page Transition Graph')
    plt.show()

# 그래프 시각화
plot_graph(G)

# 연결이 많이 된 page_id 추출
most_connected_pages = sorted(G.degree, key=lambda x: x[1], reverse=True)
print("Most connected pages:", most_connected_pages)
```

### 코드 설명
1. **데이터 생성**: `session_id`, `customer_id`, `page_id`로 구성된 데이터프레임을 만듭니다.
2. **`build_page_transition_graph` 함수**: 각 세션 내에서 페이지 이동 정보를 추출하여 방향성 그래프(DiGraph)를 만듭니다.
   - 각 세션의 페이지 이동이 간선으로 추가됩니다.
3. **간선 가중치 계산**: 페이지 이동이 얼마나 자주 발생했는지, 간선의 가중치로 설정합니다.
4. **`plot_graph` 함수**: `networkx`와 `matplotlib`을 사용해 페이지 이동 네트워크를 시각화합니다.
5. **가장 많이 연결된 페이지 추출**: 페이지별 연결 강도를 기준으로 정렬해 가장 많이 연결된 페이지를 출력합니다.

### 결과:
- 이 코드는 각 세션에서 페이지 간의 이동을 시각적으로 보여주며, 페이지 이동 횟수에 따른 간선의 굵기가 조정됩니다.
- 또한, 가장 연결이 많이 된 페이지도 출력됩니다.

반응형

도메인 지식보다는 챗지피티로 대변되는 생성형 AI로 인햐서 ML도 퇴물이 된다는 생각이 들었다. 대부분 딥러닝과 LLM이 대세가 되었는데 아직 이 분야는 내게 개념상의 이해이지 빠르게 코딩하고 이해해서 모델을 개발할만한 역량은 갖고 있지 않다. 전통적인 통계나 분류 모델을 주로 만들어온 사람들의 자리가 빠르게 사라지는 느낌이 들었다.

업무상 서울대 공대 회의 다녀오고 오후에는 채용면접 실무 담당자로 참석하느라 바빴고 이제 정말 새로운 시대가 왔구나 생각이 든다. 2017년부터 이러한 변화가 있었는데 나는 이걸 따라갈 플랫폼을 도입하고 조직을 꾸려나가는 일을 하느라 바빴는데 그러느라 중요한 알고리즘과 기술동향을 따라가지 못한 것이 이렇게 큰 충격을 줄줄은 몰랐다.

이전 회사가 그렇게 빨리 사업철수를 할줄은 몰랐다. 물론 남아 있는 선택을 하거나 비슷한 분석가 업무를 한 사람들도 있지만, 바깥 세상이 이렇게 AI로 미쳐 돌아갈 줄은 몰랐다는 것도 있겠지.

반응형

'내 이야기' 카테고리의 다른 글

좀 쉬고 싶은데  (1) 2024.10.05
피곤한데 잠이 안오네  (0) 2024.09.28
난 어떻게 살아야 할까?  (0) 2024.09.26
둘째 재수학원 마지막 학원비 납부 완료  (3) 2024.09.23
번아웃이 올려나  (2) 2024.09.13

 공부해야 할 것들은 많고 틈틈이 따라가기에도 바쁜 형편이다. 저녁에는 검도 도장 가서 운동하고, 밤에는 책보고 낮에는 회사에서 일하고 살고 있다. 전에 회사 다닐때에도 공부를 안한 것은 아니었는데, 지금처럼 방향을 잡고 줄기차게 한방향으로 공부한 적은 없구나.

반응형

'내 이야기' 카테고리의 다른 글

퇴물이 된 느낌.  (1) 2024.10.10
피곤한데 잠이 안오네  (0) 2024.09.28
난 어떻게 살아야 할까?  (0) 2024.09.26
둘째 재수학원 마지막 학원비 납부 완료  (3) 2024.09.23
번아웃이 올려나  (2) 2024.09.13

 얼마전에 키보드를 키크론 저소음 적축 리시버를 새로 장만했다. 재작녀에 구매할 때 잘못 사서 리시버가 없어서 유선으로만 사용했는데 나름 키감이 좋아서 이번에는 저소음 적축으로 구매했는데 생각보다 색감이 달라서 적응중이다. 그래도 소음이 아주 적고 무겁지만 그래도 오랫동안 키보드를 두드리고 있어도 어깨가 아프지 않고 기분이 좋아진다는 것이 가장 좋은 점이다. 이전 버전도 저소음 적축이라고 해서 샀는데 키감도 소리도 전혀 다르다. 왜 그런가 고민하다가, 그 시간에 그냥 일이나 하고 책이나 좀더 보자 생각하면서 지내고 있다.

반응형

'내 이야기' 카테고리의 다른 글

퇴물이 된 느낌.  (1) 2024.10.10
좀 쉬고 싶은데  (1) 2024.10.05
난 어떻게 살아야 할까?  (0) 2024.09.26
둘째 재수학원 마지막 학원비 납부 완료  (3) 2024.09.23
번아웃이 올려나  (2) 2024.09.13

 예전 회사 다닐 때에는 의무감도 있었고 주변에서 지켜보는 사람들이 많아서 어느 정도 노력을 하면서 살았고 한 번도 포기하지 않았다. 그러나 이 회사로 옮기고 나서는 가끔은 포기하고 싶은 생각을 해본다. 아니, 포기보다는 내가 이 직장에 맞는 것인지 아니면 내가 일하는게 정말 가치가 있는 것인지에 대한 고민을 하고 있다. 예전에는 주어진 일을 좀더 잘 해보려고, 재미있는 일도 만들고 사람들과 함께 해보려고 생각했는데 요즘에는 이래저래 고민이 많다.

 

 난 어떻게 살아야 할까? 이직하고 항상 고민했던 내용이다. 첫 2년은 최선을 다하고 노력하는 삶을 살아왔지만 점점 지쳐가는 것은 사실이다. 뭔가 새롭고 멋진 무언가를 해야 하는데 내가 과연 그것을 할 수 있는 사람인지 과연 월급값은 하는지 고민을 하고 있다.

반응형

'내 이야기' 카테고리의 다른 글

좀 쉬고 싶은데  (1) 2024.10.05
피곤한데 잠이 안오네  (0) 2024.09.28
둘째 재수학원 마지막 학원비 납부 완료  (3) 2024.09.23
번아웃이 올려나  (2) 2024.09.13
맥북에어 M1 재사용 시작합니다.  (0) 2024.09.06

+ Recent posts