예전에는 몰랐는데 40이 넘고 이제 중반을 지나 후반으로 달려가는 요즘, 입춘이나 여름 그리고 단풍철과 같은 행사를 볼때마다 짠하다. 예전에는 아무 생각없이 볼 수 있었다지만, 이제는 앞으로 이걸 몇 번이나 더 볼 수 있을까 생각이 든다고 해야 할까? 40이 넘으면서 처음으로 꽃이 피는 시절이 아름답다는 생각을 하게 되었으니까 말이다.
오늘은 2024년 김장이다. 집안에 재수생이 있어서 힘든 1년이었는데, 이번에 성적이 그리 좋지 않다. 덩치가 큰 녀석이 자기 앞으로 어떻게 사냐고 우는 모습을 보니 참 뭐라고 해줄말이 없었다. 이 녀석이 고집도 세고 거친데 마음은 참 여리구나 생각이 들었다. 나는 기다리고 노력하고 기회가 올때까지 칼을 갈며 웃으면서 사는 녀석인데 우리 아들은 뭐랄까 많이 다르다는 생각이 들었다.
덕분에 4형제중 아무도 따라오지 않은 상태에서 김장을 해야만 했다.
전체 글
- 2024 김장 2024.11.17 1
- 머신런닝 : Python에서의 자연어 처리 마스터하기 2024.11.16
- 산다는 건 다 그런거 아니겠니? 2024.11.10 1
- networkx - sql과 함께 2024.10.24
- Python networkx 2024.10.10 1
- 퇴물이 된 느낌. 2024.10.10 1
2024 김장
머신런닝 : Python에서의 자연어 처리 마스터하기
udemy 머신 러닝 자연어 처리를 보면서, 이걸 고객의 페이지 이동 분석하는데 사용이 가능할 것으로 생각이 드는구나. 물론 전처리하는게 엄청 오래 걸리기는 하겠지만 좀 해보면 어느 정도 고객의 행동을 이해하는데 많은 도움이 될 것으로 생각되네.
이번 수강에서 얻은 가장 큰 소득이 아닐까 싶다.
산다는 건 다 그런거 아니겠니?
수원에서 집으로 올라오면서 들었던 이금희님의 라디오에서 90년대 유행하던 노래가 나와서 흥얼거리다가, 나온 노래가 이 노래였다.
정년까지 다닐 수 있으리라 믿었던 회사를 그만두면서 3달 정도 미친듯이 구직을 해서 들었갔던 곳이 지금 다니는 회사이다. 이런저런 제약도 많고 계약직이라서 언제까지 다닐 수 있을지도 모르는 회사이지만, 내 인생에서 아이들 교육비로 가장 돈을 많이 쓰던 3년을 이곳에서 일하면서 버텨낼 수 있었다. 덕분에 큰애는 재수해서 나름 괜찮은 대학을 갔고, 둘째는 자사고를 무사히 졸업하고 재수를 할 수 있었으며, 아내는 죽는 소리 하는 남편 걱정에 간호 조무사 학원 등록해서 자격증 따고 지금은 병원을 다니고 있다.
'내 이야기' 카테고리의 다른 글
퇴물이 된 느낌. (1) | 2024.10.10 |
---|---|
좀 쉬고 싶은데 (1) | 2024.10.05 |
피곤한데 잠이 안오네 (0) | 2024.09.28 |
난 어떻게 살아야 할까? (0) | 2024.09.26 |
둘째 재수학원 마지막 학원비 납부 완료 (3) | 2024.09.23 |
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' 카테고리의 다른 글
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 |
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' 카테고리의 다른 글
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 |
Jupyterlab에서 텍스트 파일 미리보기(encoding='euc-kr') (0) | 2024.07.15 |
퇴물이 된 느낌.
도메인 지식보다는 챗지피티로 대변되는 생성형 AI로 인햐서 ML도 퇴물이 된다는 생각이 들었다. 대부분 딥러닝과 LLM이 대세가 되었는데 아직 이 분야는 내게 개념상의 이해이지 빠르게 코딩하고 이해해서 모델을 개발할만한 역량은 갖고 있지 않다. 전통적인 통계나 분류 모델을 주로 만들어온 사람들의 자리가 빠르게 사라지는 느낌이 들었다.
업무상 서울대 공대 회의 다녀오고 오후에는 채용면접 실무 담당자로 참석하느라 바빴고 이제 정말 새로운 시대가 왔구나 생각이 든다. 2017년부터 이러한 변화가 있었는데 나는 이걸 따라갈 플랫폼을 도입하고 조직을 꾸려나가는 일을 하느라 바빴는데 그러느라 중요한 알고리즘과 기술동향을 따라가지 못한 것이 이렇게 큰 충격을 줄줄은 몰랐다.
이전 회사가 그렇게 빨리 사업철수를 할줄은 몰랐다. 물론 남아 있는 선택을 하거나 비슷한 분석가 업무를 한 사람들도 있지만, 바깥 세상이 이렇게 AI로 미쳐 돌아갈 줄은 몰랐다는 것도 있겠지.
'내 이야기' 카테고리의 다른 글
산다는 건 다 그런거 아니겠니? (1) | 2024.11.10 |
---|---|
좀 쉬고 싶은데 (1) | 2024.10.05 |
피곤한데 잠이 안오네 (0) | 2024.09.28 |
난 어떻게 살아야 할까? (0) | 2024.09.26 |
둘째 재수학원 마지막 학원비 납부 완료 (3) | 2024.09.23 |