[Project] GA4 데이터 분석 (DAU/WAU/MAU, ECDF, HEATMAP)

김수경·2024년 2월 8일

팀프로젝트

목록 보기
4/5

어제 구했던 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메소드를 사용해 주별, 연도별 활동유저를 구할 수 있다!


유저별 평균접속시간의 분포를 ECDF로 시각화

: 데이터의 누적분포를 시각화 한 것이다.
이건 답이 아닌것 같지만 작업한 과정을 기록해보기로

  • 방법 : daily로 첫 접속과 마지막 접속 사이의 길이를 평균 접속 시간으로 간주
#유저별 첫 번째 접속과 마지막 접속을 파악하여 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()


내가 해석한 내용은

  • y축 0.5기준으로 평균접속시간이 늘어난다.
  • 데이터 분포가 right-skew됨을 알 수 있다.

요일/시간대별 사용자 수를 구하고 이를 heatmap으로 시각화

#요일별, 시간대별 사용자수 구하기
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 : 분포를 확인하는 그래프같은데 아직 잘 모르겠음..!
profile
잘 하고 있는겨?

0개의 댓글