udemy 머신 러닝 자연어 처리를 보면서, 이걸 고객의 페이지 이동 분석하는데 사용이 가능할 것으로 생각이 드는구나. 물론 전처리하는게 엄청 오래 걸리기는 하겠지만 좀 해보면 어느 정도 고객의 행동을 이해하는데 많은 도움이 될 것으로 생각되네.
이번 수강에서 얻은 가장 큰 소득이 아닐까 싶다.
분류 전체보기
- 머신런닝 : Python에서의 자연어 처리 마스터하기 2024.11.16
- 산다는 건 다 그런거 아니겠니? 2024.11.10 1
- networkx - sql과 함께 2024.10.24
- Python networkx 2024.10.10 1
- 퇴물이 된 느낌. 2024.10.10 1
- 좀 쉬고 싶은데 2024.10.05 1
머신런닝 : Python에서의 자연어 처리 마스터하기
산다는 건 다 그런거 아니겠니?
수원에서 집으로 올라오면서 들었던 이금희님의 라디오에서 90년대 유행하던 노래가 나와서 흥얼거리다가, 나온 노래가 이 노래였다.
정년까지 다닐 수 있으리라 믿었던 회사를 그만두면서 3달 정도 미친듯이 구직을 해서 들었갔던 곳이 지금 다니는 회사이다. 이런저런 제약도 많고 계약직이라서 언제까지 다닐 수 있을지도 모르는 회사이지만, 내 인생에서 아이들 교육비로 가장 돈을 많이 쓰던 3년을 이곳에서 일하면서 버텨낼 수 있었다. 덕분에 큰애는 재수해서 나름 괜찮은 대학을 갔고, 둘째는 자사고를 무사히 졸업하고 재수를 할 수 있었으며, 아내는 죽는 소리 하는 남편 걱정에 간호 조무사 학원 등록해서 자격증 따고 지금은 병원을 다니고 있다.
'내 이야기' 카테고리의 다른 글
드라마 - 트렁크 (1) | 2024.12.07 |
---|---|
투자를 어떻게 해야 하는가? (9) | 2024.12.06 |
퇴물이 된 느낌. (1) | 2024.10.10 |
좀 쉬고 싶은데 (1) | 2024.10.05 |
피곤한데 잠이 안오네 (0) | 2024.09.28 |
networkx - sql과 함께
큰 데이터셋의 경우, 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' 카테고리의 다른 글
NewsClassifier (0) | 2025.01.04 |
---|---|
Python Scheduler (0) | 2024.12.10 |
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 |
Python networkx
고객의 `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. **가장 많이 연결된 페이지 추출**: 페이지별 연결 강도를 기준으로 정렬해 가장 많이 연결된 페이지를 출력합니다.
### 결과:
- 이 코드는 각 세션에서 페이지 간의 이동을 시각적으로 보여주며, 페이지 이동 횟수에 따른 간선의 굵기가 조정됩니다.
- 또한, 가장 연결이 많이 된 페이지도 출력됩니다.
'Python, PySpark' 카테고리의 다른 글
Python Scheduler (0) | 2024.12.10 |
---|---|
networkx - sql과 함께 (0) | 2024.10.24 |
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 |
퇴물이 된 느낌.
도메인 지식보다는 챗지피티로 대변되는 생성형 AI로 인햐서 ML도 퇴물이 된다는 생각이 들었다. 대부분 딥러닝과 LLM이 대세가 되었는데 아직 이 분야는 내게 개념상의 이해이지 빠르게 코딩하고 이해해서 모델을 개발할만한 역량은 갖고 있지 않다. 전통적인 통계나 분류 모델을 주로 만들어온 사람들의 자리가 빠르게 사라지는 느낌이 들었다.
업무상 서울대 공대 회의 다녀오고 오후에는 채용면접 실무 담당자로 참석하느라 바빴고 이제 정말 새로운 시대가 왔구나 생각이 든다. 2017년부터 이러한 변화가 있었는데 나는 이걸 따라갈 플랫폼을 도입하고 조직을 꾸려나가는 일을 하느라 바빴는데 그러느라 중요한 알고리즘과 기술동향을 따라가지 못한 것이 이렇게 큰 충격을 줄줄은 몰랐다.
이전 회사가 그렇게 빨리 사업철수를 할줄은 몰랐다. 물론 남아 있는 선택을 하거나 비슷한 분석가 업무를 한 사람들도 있지만, 바깥 세상이 이렇게 AI로 미쳐 돌아갈 줄은 몰랐다는 것도 있겠지.
'내 이야기' 카테고리의 다른 글
투자를 어떻게 해야 하는가? (9) | 2024.12.06 |
---|---|
산다는 건 다 그런거 아니겠니? (1) | 2024.11.10 |
좀 쉬고 싶은데 (1) | 2024.10.05 |
피곤한데 잠이 안오네 (0) | 2024.09.28 |
난 어떻게 살아야 할까? (0) | 2024.09.26 |
좀 쉬고 싶은데
공부해야 할 것들은 많고 틈틈이 따라가기에도 바쁜 형편이다. 저녁에는 검도 도장 가서 운동하고, 밤에는 책보고 낮에는 회사에서 일하고 살고 있다. 전에 회사 다닐때에도 공부를 안한 것은 아니었는데, 지금처럼 방향을 잡고 줄기차게 한방향으로 공부한 적은 없구나.
'내 이야기' 카테고리의 다른 글
산다는 건 다 그런거 아니겠니? (1) | 2024.11.10 |
---|---|
퇴물이 된 느낌. (1) | 2024.10.10 |
피곤한데 잠이 안오네 (0) | 2024.09.28 |
난 어떻게 살아야 할까? (0) | 2024.09.26 |
둘째 재수학원 마지막 학원비 납부 완료 (3) | 2024.09.23 |