어제 구했던 DAU, WAU, MAU는 코드가 복잡하다.
groupby를 사용해 다시 구했다.
✅ DAU, WAU, MAU - groupby 이용해 구하기
dau = df3.groupby(df3['new_date'])['fullVisitorId'].nunique()
wau = df3.groupby(df3['new_date'].dt.to_period('W'))['fullVisitorId'].nunique()
mau = df3.groupby(df3['new_date'].dt.to_period('M'))['fullVisitorId'].nunique()
plt.figure(figsize=(10,5))
plt.plot(dau, label = 'DAU')
plt.plot(wau, label = 'WAU')
plt.plot(mau, label = 'MAU')
plt.xlabel('DATE')
plt.ylabel('Number of User')
plt.title('DAU / WAU / MAU')
plt.legend()

데이터 타입이 날짜형식이라면 dt.to_period메소드를 사용해 주별, 연도별 활동유저를 구할 수 있다!
: 데이터의 누적분포를 시각화 한 것이다.
이건 답이 아닌것 같지만 작업한 과정을 기록해보기로
#유저별 첫 번째 접속과 마지막 접속을 파악하여 DataFrame을 재구성
first_last_visit = df3.groupby([df3['fullVisitorId'], df3['new_visitStartTime'].dt.date])['new_visitStartTime'].agg(['first', 'last'])
# 각 사용자의 접속 기간을 계산하여 새로운 열로 추가
first_last_visit['session_duration'] = first_last_visit['last'] - first_last_visit['first']
#session_duration이 음수값도 있음 -> 제외 필요
# 마지막 접속 시간이 처음 접속 시간보다 큰 행만 선택하여 새로운 DataFrame을 생성
filtered_data = first_last_visit[first_last_visit['last'] > first_last_visit['first']]
#유저별 평균 접속시간 계산하기
#이미 사용자별 접속시간을 구했으므로(session_duration) 해당 컬럼으로 groupby
#level = 0 : 사용자별로 다 시그룹화하는데 사용되는 인덱스 레벨 -> fullVisitorId
mean_session_duration = filtered_data['session_duration'].groupby(level=0).mean()
#ecdf계산
def ecdf(data):
n = len(data)
x = np.sort(data)
y = np.arange(1, n + 1) / n
return x, y
x, y = ecdf(mean_session_duration)
# 시각화
plt.figure(figsize=(6, 5))
plt.plot(x, y, marker='.', linestyle='none')
plt.xlabel('Average Session Duration')
plt.ylabel('ECDF')
plt.title('ECDF of Average Session Duration by User')
plt.grid(True)
plt.show()

내가 해석한 내용은
#요일별, 시간대별 사용자수 구하기
week_hour_user = df3.groupby([df3['new_visitStartTime'].dt.hour, df3['new_visitStartTime'].dt.weekday])['fullVisitorId'].nunique()
# 히트맵을 그리기위한 피벗테이블
# unstack은 다중 인덱스를 가진 데이터프레임을 사용할 때 하나의 인덱스를 컬럼으로 변환할 수 있음
week_hour_user = week_hour_user.unstack()
여기서 unstack()이 킥이다.
.unstack()을 해주면 인덱스컬럼이 열로 변환되어 피봇으로 이쁘게 변환된다.
# heatmap그리기
plt.figure(figsize=(15, 8))
sns.heatmap(data = week_hour_user, cmap='YlGnBu', annot = True, fmt = 'd', linewidths=0.5)
plt.title('Weekday/Hour User Count')
plt.xlabel('Week of Day')
plt.ylabel('Hour')
plt.xticks(ticks=np.arange(7), labels=['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'])
plt.show()

비교적 히트맵은 이쁘게 그려진듯
평일 오후 6시정도가 가장 유저 활동이 많다!
- goupby : 사용법에 대해 이제 좀 감이 잡힌듯
- unstack() : 히트맵그릴때, 피봇테이블 만들때 유용
- ECDF : 분포를 확인하는 그래프같은데 아직 잘 모르겠음..!