[Project] GA4 데이터 분석 전처리(json 데이터 변경 / POSIX to datetime)

김수경·2024년 2월 6일

팀프로젝트

목록 보기
2/5

다시 시작된 팀프로젝트🫠
의견 조율부터 결과내기까지 여간 쉽지 않은데, 두번 경험했으니 더 잘해보자..!
이번 프로젝트는 무려 심화프로젝트
기초를 넘어서 SQL, Python을 사용해 전처리, 예측모델, 시각화까지 완성해보는 시간이 될 거다. 아자아자!

선정주제 : GA4 데이터로 프로덕트 분석

  • 개요
    • 유저 분석에 널리 사용되는 GA4 데이터를 직접 다뤄봅니다
    • 서비스 사용성 분석에 일반적으로 사용되는 지표를 직접 구해봅니다
      팀 프로젝트 시작과 함께 고르게 된 GA4 데이터
  • 배경
    • 로그 데이터 Log data는 서비스를 이용하는 유저의 족적을 파악할 수 있는 데이터입니다.
    • 굉장히 양이 많고, 전처리가 조금 어렵지만 서비스 분석을 하기 위해서는 필수적인 여정이기에 이를 체험보고자 합니다.
  • 주제
    • 사용자 로그행동 데이터 활용 웹 서비스 분석
  • 분석 해볼만한 것
    • DAU/WAU/MAU를 line chart로 시각화
    • 유저별 평균접속시간의 분포를 ECDF로 시각화
    • 방문 주차에 따른 코호트를 생성하고, 코호트 별로 weekly 리텐션을 구하고 이를 heatmap으로 시각화
    • 요일/시간대별 사용자 수를 구하고 이를 heatmap으로 시각화
    • (Challenging) Carrying Capacity
      - 참고 영상(토스)
    • (Challenging) 국가별 DAU 평균을 Folium으로 시각화하기
    • (Challenging) 캠페인 효과 분석: 캠페인으로 들어온 사람은 다른 사람과 다른 특징을 가지고 있는지 분석해보기
  • 데이터셋 : https://www.kaggle.com/competitions/ga-customer-revenue-prediction/overview

챌린징 과제는 두고보고, 기본분석부터 차근차근 시작해보기!

1. 전처리

train 데이터를 사용하기에 데이터 분리과정은 생략

EDA(탐색적 데이터 분석)

import pandas as pd
import numpy as np 
import seaborn as sns 
import matplotlib.pyplot as plt 
import json  #json형태의 컬럼값 펼치기
from pandas import json_normalize
df = pd.read_csv("/Users/sookyeong/Desktop/train 2.csv")


device외 여러 컬럼이 json 형식의 데이터를 갖는다.
json형식을 dataframe형식으로 변경이 필요


전체 데이이터로 보면 결측치 없이 깔-끔
공부하기엔 좋지 않은 캐글데이터. 현업에서는 데이터가 생각보다 엉망이라 한다.
date 컬럼은 datetime 형식으로 변경 필요

그리고 컬럼설명 중,
visitStartTime - The timestamp (expressed as POSIX time).

POSIX 시간
POSIX 시간이란 1970년 1월 1일 00:00:00 UTC부터 현재까지의 초를 나타내는 방식입니다. 따라서 주어진 숫자 1472830385는 POSIX 시간에서 1472830385초 후의 시간을 의미합니다.

라고 한다. gpt한테 물어봄
✅ visitStartTime을 datetime 형식으로 변경 필요


  1. json형식을 dataframe형식으로 변경이 필요
device_df = json_normalize(df['device'].apply(json.loads))
geonetwork_df = json_normalize(df['geoNetwork'].apply(json.loads))
totals_df = json_normalize(df['totals'].apply(json.loads))
trafficsource_df = json_normalize(df['trafficSource'].apply(json.loads))


device컬럼을 datafrme으로 다시 보면, 결측치는 없지만 값이 없는것과 마찬가지인 컬럼들이 많다. 분석 효율을 위해 이런 데이터는 제외한다.

이런식으로.
geonetwork, trafficsource도 마찬가지(totals는 유저행동과 관련있어 보여서 다 사용하기로)

  1. date 컬럼은 datetime 형식으로 변경 필요
# date컬럼 날짜 형식으로 변경
df['new_date'] = pd.to_datetime(df['date'], format='%Y%m%d')
df.head(3)

  1. visitStartTime을 datetime 형식으로 변경 필요
# POSIX 시간을 datetime으로 변환하여 새로운 컬럼에 저장
df['new_visitStartTime'] = pd.to_datetime(df['visitStartTime'], unit='s')  # unit='s'는 초 단위를 의미합니다.
df.head(3) 

  1. 필요한 컬럼만 남기고 dataframe 합치기
#필요한 컬럼만 남기기
# df
df2 = pd.DataFrame(df[['channelGrouping', 'new_date', 'fullVisitorId', 'sessionId', 'visitId', 'visitNumber', 'new_visitStartTime']])

#device 사용컬럼만 남기기
device_df2 = pd.DataFrame(device_df[['browser', 'deviceCategory']])

#geonetwork 사용컬럼만 남기기
geonetwork_df2 = pd.DataFrame(geonetwork_df[['continent', 'country']])

#traficsource 사용컬럼만 남기기, 나머지 컬럼은 
trafficsource_df2 = pd.DataFrame(trafficsource_df[['campaign', 'source', 'medium', 'keyword']])

#데이터 하나로 합치기
df3 = pd.concat([df2, device_df2, geonetwork_df2, totals_df, trafficsource_df2], axis = 1)
df3

EDA가 다 끝난건 아니다.
시각화를 해보고 무엇을 분석해볼지 더 면밀하게 돌려볼 필요가 있다.
다음 스텝에서 이어가보자.

profile
잘 하고 있는겨?

0개의 댓글