안녕하세요! 하트카운트의 Analytics Engineer, Jaden입니다.
이제 7월부터, GA의 이전버전인 UA 는 정말로 역사속으로 사라집니다.
Google Analytics 가 UA 에서 GA4로 바뀌며 큰 변화가 있었어요.
고객의 성별이나 나이 등 인구통계를 중심으로 하는 Session 기반 분석에서,
서비스 플랫폼 내에서 만드는 행동 기반 분석으로 패러다임이 바뀐 것입니다.
바야흐로 "Product Analytics" 의 출현이죠. 그리고 이러한 행동 기반 분석을 수행하기 위해서, Product Analytics 제품들은 Event 기반 측정을 합니다.
따라서, Product Analytics 로 자사 제품을 발전시키기 위해서는, 이 Event 를 잘 설계할 줄 알아야 합니다. 오늘은 이 Event 를 설계하는 법, Event Taxonomy 에 대해서 알아보겠습니다.
Event와 Event Taxonomy가 뭐야?
여러분은 데이터 분석을 시작하기 전에 가장 먼저 무엇을 하시나요? 바로 데이터의 구조와 내용을 파악하는 일일 것입니다.
어떤 데이터가 수집되고 있는지, 각 데이터의 의미는 무엇인지 이해하는 것, 이것이 데이터 분석의 첫걸음이라 할 수 있습니다.
기업에서 수집하는 데이터의 대부분을 차지하는 것이 바로 'Event Data'인데요. 웹사이트 클릭부터 모바일 앱 실행, 온라인 구매에 이르기까지, 사용자의 모든 행동이 이벤트 데이터로 기록됩니다.
문제는 이 이벤트 데이터가 매우 비정형적이고 방대하다는 것입니다.
때로는 하나의 이벤트에 수십 개의 속성이 포함되기도 하죠. 이런 데이터를 어떻게 이해하고 활용할 수 있을까요?
여기서 등장하는 개념이 바로 'Event Taxonomy'입니다.
Event Taxonomy란 무엇인가?
Event Taxonomy는 비즈니스 프로세스 상에서 발생하는 다양한 사용자 행동 데이터를 일관되고 구조화된 방식으로 정의하고 분류하는 체계를 말합니다.
쉽게 말해, 고객의 모든 액션을 의미 있는 '이벤트'로 번역하고, 이를 카테고리화하는 것이죠.
예를 들어 이커머스 플랫폼인 아마존의 경우를 생각해 봅시다. 사용자가 웹사이트를 방문하는 순간부터 구매 완료에 이르기까지, 다음과 같은 일련의 이벤트가 발생할 수 있습니다.
- 웹사이트 방문 (Page Viewed)
- 카테고리 페이지 조회 (Category Page Viewed)
- 상품 검색 (Product Searched)
- 상품 상세 페이지 조회 (Product Page Viewed)
- 장바구니에 상품 추가 (Product Added to Cart)
- 체크아웃 프로세스 시작 (Checkout Started)
- 결제 완료 (Order Completed)
예컨대 아마존의 'Product Added to Cart' 이벤트의 경우 상품 ID, 상품명, 상품 카테고리, 상품 가격, 수량 등의 속성을 포함할 수 있겠죠.
이처럼 체계적으로 정의된 이벤트 데이터는 다양한 분석의 기반이 됩니다. 상품별, 카테고리별 매출 분석부터 사용자 세그먼트별 구매 패턴 분석, Funnel 분석, Cohort 분석에 이르기까지 말이죠.
왜 Event Taxonomy가 중요한가?
1. 데이터 기반 의사결정 역량 강화
Event Taxonomy는 비즈니스 맥락을 반영한 데이터 수집을 가능케 함으로써 데이터의 품질을 높입니다. 일관되고 정확한 데이터를 확보할 수 있게 되며, 이는 곧 데이터 활용도 제고로 이어집니다.
체계적인 Event Taxonomy를 통해 사용자 행동에 대한 심층적 이해가 가능해집니다. 이를 바탕으로 데이터 기반의 통찰력을 발굴하고, 신속하고 정확한 의사결정을 내릴 수 있게 됩니다.
나아가 Event Taxonomy는 조직 전반의 데이터 리터러시를 향상시킵니다. 마케팅, 제품, 엔지니어링 등 여러 부서가 데이터에 대해 같은 언어로 소통할 수 있게 되며, 이는 부서 간 협업과 소통을 원활하게 합니다. 데이터 사일로를 해소하고, 조직이 하나의 방향을 바라볼 수 있는 기반이 마련되는 것입니다.
2. 고객 중심 서비스 혁신 가속화
Event Taxonomy 설계의 출발점은 바로 '고객 경험'입니다.
고객에게 가치를 전달하는 순간(Aha-Moment)과 고객의 필요(Pain Point)를 깊이 이해함으로써, 진정 고객 중심적인 통찰을 얻을 수 있습니다.
이는 고객 니즈에 기반한 서비스 혁신으로 이어집니다. 단순히 수치를 추적하는 것이 아니라, 고객의 문제를 발견하고 해결하는 방향으로 나아갈 수 있게 되는 것입니다. 개인화와 타겟팅 역량 또한 강화될 수 있습니다.
에어비앤비의 사례가 이를 잘 보여줍니다. 그들은 '예약'이라는 결과 뿐 아니라, 숙소 검색, 호스트와의 소통, 실제 숙박 경험 등 고객 여정 전반을 Event Taxonomy에 반영하였습니다. 이를 통해 고객 가치를 극대화하는 방향으로 서비스를 지속 발전시켜 나가고 있습니다.
3. 비즈니스 민첩성과 혁신성 확보
오늘날의 비즈니스 환경은 그 어느 때보다 빠르게 변화하고 있습니다. 이런 상황에서 기업이 생존하고 성장하기 위해서는 변화에 신속히 적응하고, 혁신을 거듭해야만 합니다.
잘 설계된 Event Taxonomy는 이러한 비즈니스 민첩성의 토대가 됩니다. 서비스의 변화를 Taxonomy에 신속히 반영함으로써, 항상 최신의 데이터를 확보할 수 있기 때문입니다.
새로운 기능 출시 후 그 효과를 즉시 측정하고, 마케팅 캠페인의 성과를 실시간으로 추적하며, 고객 불만 요인을 신속히 파악하고 해결하는 등 데이터와 밀착된 의사결정이 가능해집니다. 이를 통해 기업은 변화의 흐름을 신속히 감지하고, 선제적으로 대응할 수 있는 민첩성을 확보하게 되는 것입니다.
글로벌 기업들의 사례
넷플릭스 (Netflix)
Netflix는 사용자의 시청 데이터를 바탕으로 개인화 콘텐츠 추천을 제공하는 것으로 유명합니다. 그들은 '시청 시작', '시청 완료', '평가 제출' 등 다양한 이벤트 데이터를 수집하고 있습니다.
Netflix는 머신러닝 알고리즘을 통해 이런 이벤트 데이터를 분석하여, 사용자별 콘텐츠 추천은 물론 신규 콘텐츠 제작 의사결정에도 활용하고 있습니다.
우버 (Uber)
Uber는 방대한 양의 승차 데이터를 실시간으로 처리하고 분석하여 서비스를 최적화합니다. 그들은 '승차 요청', '운전자 할당', '승차 시작', '승차 완료' 등 각 단계별 이벤트 데이터를 수집합니다.
특히 '승차 요청'과 '승차 시작' 간의 시간 차이는 고객 만족도와 직결되는 중요한 지표입니다. Uber는 이 지표를 최소화하기 위해 실시간 데이터 처리 파이프라인을 구축하고, 머신러닝 기반의 수요 예측과 최적 배차 알고리즘을 적용하고 있습니다.
에어비앤비 (Airbnb)
Airbnb는 방대한 숙박 예약 데이터와 사용자 행동 데이터를 활용하여 개인화 추천, 수요 예측, 가격 최적화 등을 수행합니다. 그들은 '숙소 조회', '예약 요청', '예약 완료', '후기 작성' 등 다양한 이벤트 데이터를 추적합니다.
특히 '예약 요청'과 '예약 완료' 간의 전환율은 호스트의 응답성과 직결되는 중요한 지표입니다. Airbnb는 이 지표를 호스트 평가에 반영하여 플랫폼의 신뢰도를 관리하고 있습니다. 또한 '후기 작성' 이벤트 데이터는 자연어 처리와 감성 분석을 통해 처리되어, 개인화 추천과 검색 랭킹에 활용됩니다.
Event Taxonomy 설계하기
내용의 방향성에 Technical 한 깊이를 조금 더해보겠습니다.
Event의 구조: Objects와 Attributes
Event Taxonomy를 설계하기 위해서는 먼저 이벤트의 구조를 이해해야 합니다. 이벤트는 크게 '객체(Object)'와 '속성(Attribute)'로 구성됩니다.
객체는 이벤트의 주체가 되는 핵심 비즈니스 엔터티를 의미합니다. 이커머스에서 '상품 조회' 이벤트의 경우 '사용자'와 '상품'이 객체가 되겠죠.
{
"event_name": "Product Viewed",
"user": {
"id": "u123",
"name": "Alice Kim",
"email": "alice@email.com"
},
"product": {
"id": "p456",
"name": "Nike Air Max",
"category": "Shoes"
},
"timestamp": "2023-06-15T10:30:00Z"
}
한편 속성은 이벤트와 객체의 상세 정보를 표현하는 메타데이터입니다. 위 예시에서 user
의 email
, product
의 category
등이 속성에 해당합니다.
객체와 속성을 정의할 때는 데이터 타입, 포맷, 제약 조건 등을 명확히 해야 합니다.
예를 들어 user
객체와 product
객체의 속성을 다음과 같이 정의할 수 있습니다.
객체 | 속성 | 데이터 타입 | 설명 |
---|---|---|---|
user | id | STRING | 사용자 고유 식별자 (필수) |
name | STRING | 사용자 이름 | |
STRING | 사용자 이메일 주소, 이메일 형식이어야 함 | ||
product | id | STRING | 상품 고유 식별자 (필수) |
name | STRING | 상품명 | |
category | STRING | 상품 카테고리 | |
price | FLOAT | 상품 가격 |
구글 애널리틱스 4의 이벤트 기반 데이터 모델
구글은 차세대 애널리틱스인 구글 애널리틱스 4(GA4)에서 이벤트 중심의 데이터 모델을 채택했습니다. GA4에서는 페이지뷰, 클릭, 스크롤 등 모든 사용자 상호작용을 이벤트로 취급하며, 각 이벤트는 '파라미터'라는 속성을 가집니다.
예를 들어 GA4의 'purchase' 이벤트는 다음과 같은 구조를 가집니다.
{
"name": "purchase",
"params": {
"transaction_id": "T12345",
"value": 25.42,
"currency": "USD",
"tax": 4.90,
"shipping": 5.99,
"items": [
{
"item_id": "SKU_12345",
"item_name": "Stan and Friends Tee",
"affiliation": "Google Merchandise Store",
"item_brand": "Google",
"item_category": "Apparel",
"item_category2": "Adult",
"item_category3": "Shirts",
"item_category4": "Crew",
"item_category5": "Short sleeve",
"item_variant": "green",
"price": 9.99,
"quantity": 1
}
]
}
}
이처럼 이벤트 파라미터를 통해 거래 ID, 가격, 통화, 세금, 배송비 등 거래 관련 속성과 함께, 구매된 상품의 상세 속성까지 풍부하게 담아낼 수 있습니다.
이러한 이벤트 중심 데이터 모델은 사용자 행동을 보다 세밀하고 유연하게 추적할 수 있게 해줍니다. 또한 사용자 속성과 이벤트 속성을 결합한 분석을 가능케 하죠. 이는 사용자 여정 분석, 코호트 분석, 퍼널 분석 등 다양한 분석 시나리오에서 강력한 힘을 발휘합니다.
Event 기반의 대표주자, GA4
GA4 데이터의 구조와 특징
GA4는 사용자 행동 데이터를 JSON 형태로 수집하고 저장합니다.
JSON은 계층적이고 유연한 데이터 표현이 가능하다는 장점이 있지만, 동시에 데이터 분석 과정에서 복잡성을 증가시키기도 합니다.
중첩된 구조를 평면화하고 필요한 정보를 추출하는 등의 전처리 작업이 필요하기 때문입니다.
예를 들어, 다음은 GA4에서 수집한 전자상거래 구매 이벤트의 JSON 데이터입니다.
{
"event_name": "purchase",
"event_params": {
"transaction_id": "T12345",
"value": 25.42,
"currency": "USD",
"items": [
{
"item_id": "SKU_12345",
"item_name": "T-Shirt",
"item_brand": "Google",
"item_category": "Apparel",
"item_variant": "Black",
"price": 12.99,
"quantity": 1
},
{
"item_id": "SKU_67890",
"item_name": "Socks",
"item_brand": "Google",
"item_category": "Apparel",
"item_variant": "White",
"price": 4.99,
"quantity": 2
}
]
},
"user_properties": {
"customer_id": "C12345"
}
}
위 데이터에는 구매 거래에 대한 정보(transaction_id
, value
, currency
)와 함께, 구매된 상품의 상세 정보가 items
배열에 담겨 있습니다. 또한 user_properties
필드에는 고객 ID가 별도로 저장되어 있습니다.
이처럼 중첩된 구조와 반복되는 데이터 요소를 갖는 JSON 데이터를 효과적으로 분석하기 위해서는, 이에 최적화된 데이터 웨어하우스와 쿼리 방식이 필요합니다.
BigQuery의 Nested Field (중첩 필드)
Google BigQuery는 중첩 및 반복 필드(Nested Fields)를 통해 JSON과 같은 반정형 데이터를 효과적으로 처리할 수 있습니다.
표준 SQL에 약간의 확장 문법을 더해, Nested Fields를 유연하게 다룰 수 있습니다.
중첩 필드는 하나의 레코드 내에 다른 레코드가 내장된 구조를 말합니다. BigQuery에서는 이를 STRUCT
데이터 타입으로 표현합니다.
위의 GA4 데이터 예시에서 event_params
와 user_properties
가 Nested Fields에 해당합니다.
먼저 Nested Fields에 접근하기 위해서는 점(.
) 표기법을 사용합니다.
예를 들어, 위 데이터에서 transaction_id
와 customer_id
를 추출하려면 다음과 같이 쿼리를 작성할 수 있습니다.
SELECT
event_params.transaction_id,
user_properties.customer_id
FROM purchase_events
Event-based JSON 데이터, RDB에서 활용하기
JSON과 같은 유연한 데이터 모델은 웹, 앱에서 발생하는 다양한 사용자 이벤트를 보다 세밀하게 포착하고 분석할 수 있게 해주지만, 동시에 기존 RDB 기반의 데이터 인프라와의 통합에는 어려움을 야기하기도 합니다.
특히 데이터 시각화와 리포팅 측면에서 RDB의 중요성은 여전히 크기 때문에, GA4의 JSON 데이터를 어떻게 RDB로 변환하고 활용할 것인지는 많은 조직에서 직면한 도전 과제입니다.
그렇다면 JSON 형태 데이터를 RDB에서 활용할 수 있을까요?
크게 두 가지 접근 방식을 생각해 볼 수 있습니다.
1. ETL을 통한 데이터 평면화
첫 번째 방법은 ETL(Extract, Transform, Load) 프로세스를 통해 JSON 데이터를 평면화하고 RDB 테이블에 로드하는 것입니다.
JSON 데이터를 RDB 테이블로 변환하기 위해서는 먼저 Nested Field를 평면화해야 합니다. Nested Field는 별도의 컬럼으로 추출하고, Repeated Field는 별도의 테이블로 분리하는 것이 일반적인 접근법입니다. 이 과정에서 데이터의 계층 구조는 사라지게 됩니다.
예를 들어, 다음과 같은 JSON 데이터가 있다고 가정해 보겠습니다.
{
"name": "John Doe",
"age": 30,
"address": {
"street": "123 Main St",
"city": "Anytown",
"state": "CA",
"zip": "12345"
},
"phoneNumbers": [
{
"type": "home",
"number": "555-1234"
},
{
"type": "work",
"number": "555-5678"
}
]
}
이제 Python을 사용하여 위의 JSON 데이터를 평면화하고 RDB 테이블에 로드하는 과정을 살펴보겠습니다.
import json
import psycopg2
# JSON 데이터 로드
with open('data.json') as f:
data = json.load(f)
# RDB 연결 (여기서는 PostgreSQL 사용)
conn = psycopg2.connect(database="mydb", user="myuser", password="mypass", host="localhost", port="5432")
cur = conn.cursor()
# users 테이블에 데이터 삽입
cur.execute("INSERT INTO users (name, age, address_street, address_city, address_state, address_zip) VALUES (%s, %s, %s, %s, %s, %s)",
(data['name'], data['age'], data['address']['street'], data['address']['city'], data['address']['state'], data['address']['zip']))
# phone_numbers 테이블에 데이터 삽입
for phone in data['phoneNumbers']:
cur.execute("INSERT INTO phone_numbers (user_id, type, number) VALUES ((SELECT id FROM users WHERE name = %s), %s, %s)",
(data['name'], phone['type'], phone['number']))
conn.commit()
cur.close()
conn.close()
위의 Python 코드는 data.json
파일에서 JSON 데이터를 로드하고, PostgreSQL 데이터베이스에 연결합니다. 그리고 users
테이블과 phone_numbers
테이블에 데이터를 삽입합니다.
이때 phone_numbers
테이블의 user_id
는 users
테이블의 id
를 참조하게 됩니다.
이러한 ETL 과정을 통해 JSON 데이터를 정규화된 RDB 스키마로 변환할 수 있습니다. 데이터를 일관된 형태로 저장함으로써 데이터 무결성을 보장하고, SQL을 통한 효율적인 질의가 가능해집니다.
2. RDB의 JSON 기능 활용
두 번째 방법은 최신 RDB에서 제공하는 JSON 지원 기능을 활용하는 것입니다. PostgreSQL, MySQL, Oracle 등 많은 RDB들이 JSON 데이터 타입을 지원하므로, JSON 데이터를 별도의 변환 없이 그대로 저장할 수 있습니다.
위의 JSON 데이터를 JSON 컬럼에 저장한다면 다음과 같은 테이블 구조가 될 수 있습니다.
- users 테이블
id | info |
---|---|
1 | { "name": "John Doe", "age": 30, "address": { ... }, "phoneNumbers": [ ... ] } |
이제 JSON 쿼리 함수를 사용하여 원하는 데이터를 추출할 수 있습니다. 예를 들어 PostgreSQL에서는 다음과 같이 쿼리할 수 있습니다.
SELECT info->>'name' AS name, info->>'age' AS age
FROM users
WHERE info->'address'->>'state' = 'CA';
이 방법의 장점은 JSON 데이터의 계층 구조를 유지하면서도 SQL을 통해 질의할 수 있다는 것입니다. 또한 스키마 변경에 유연하게 대응할 수 있습니다.
하지만 이 방법에는 단점이 있습니다.
쿼리 성능JSON 컬럼에 대한 쿼리는 일반적인 RDB 쿼리에 비해 성능이 떨어질 수 있습니다. JSON 데이터는 텍스트로 저장되므로, 쿼리 시 JSON 파싱 오버헤드가 발생합니다. 또한 JSON 컬럼에는 인덱스를 직접 생성할 수 없어 복잡한 쿼리의 성능이 저하될 수 있습니다.
데이터 일관성JSON 컬럼에는 스키마가 강제되지 않습니다. 즉, 같은 컬럼 내에서도 각 레코드마다 JSON 구조가 다를 수 있습니다. 이는 데이터 일관성을 해치고, 데이터 품질 관리를 어렵게 만듭니다. 또한 JSON 데이터에 대한 참조 무결성을 보장하기 어렵습니다.
따라서 JSON 컬럼을 사용할 때는 이런 단점들을 고려해야 합니다. 데이터의 성격과 사용 패턴에 따라, JSON 컬럼의 사용이 적절하지 않을 수 있습니다.
데이터 시각화와 RDB의 중요성
지금까지 우리는 GA4의 JSON 데이터를 RDB에서 활용하는 다양한 방법에 대해 알아보았습니다.
그런데 왜 굳이 RDB에서 이 데이터를 다뤄야 할까요?
1. 데이터 정규화와 일관성
RDB의 가장 큰 강점 중 하나는 데이터를 정규화된 형태로 저장한다는 것입니다. 정규화란 데이터의 중복을 최소화하고, 각 데이터를 독립적인 테이블에 분리하여 저장하는 과정을 말합니다.
예를 들어 '고객' 데이터와 '주문' 데이터를 별도의 테이블로 관리하고, 두 테이블을 '고객 ID'로 연결하는 식이죠. 이렇게 함으로써 데이터의 일관성과 무결성을 유지할 수 있습니다.
이는 데이터 시각화에 있어 매우 중요한 전제 조건이 됩니다. 일관되고 정제된 데이터야말로 정확하고 신뢰할 만한 시각화를 만들어낼 수 있기 때문입니다.
만약 데이터가 중복되어 있거나, 형식이 일관되지 않다면 시각화 결과도 왜곡될 수밖에 없겠죠. 그래프의 축이 맞지 않거나, 잘못된 합계가 표시될 수 있습니다.
2. SQL의 강력한 쿼리 기능
데이터 시각화에 있어 또 하나의 중요한 요소는 데이터에 대한 유연한 쿼리 기능입니다. 사용자는 다양한 조건과 기준에 따라 데이터를 필터링하고, 집계하고, 비교할 수 있어야 합니다.
이 때 SQL(Structured Query Language)은 매우 강력하고 표현력 있는 도구가 됩니다. SELECT, WHERE, GROUP BY, JOIN 등의 키워드를 사용하여 복잡한 분석 쿼리를 작성할 수 있죠.
대부분의 데이터 시각화 도구는 이러한 SQL 쿼리를 기반으로 동작합니다.
Tableau의 경우 라이브 연결(Live Connection) 기능을 통해 직접 SQL 쿼리를 실행하고, 그 결과를 시각화합니다. Power BI도 DirectQuery 모드에서는 기본적으로 SQL을 사용하고, 복잡한 쿼리의 경우 SQL 뷰나 저장 프로시저를 활용하기도 합니다.
즉, RDB와 SQL은 데이터 시각화에 있어 데이터 쿼리의 핵심 기반이 되는 셈입니다.
결론 & 요약
결론적으로, Event Taxonomy는 사용자 행동 데이터를 체계적으로 정의하고 분류하여 데이터의 품질을 높이고 분석의 기반을 마련하는 중요한 도구입니다.
이를 통해 조직은 데이터 기반 의사결정 역량을 강화하고, 고객 중심의 서비스 혁신을 가속화할 수 있습니다. 비즈니스 민첩성과 혁신성을 확보하는 데에도 Event Taxonomy는 핵심적인 역할을 합니다.
GA4와 같은 모던 애널리틱스 플랫폼의 도입으로 이벤트 중심의 데이터 모델이 더욱 중요해지고 있습니다. 이를 효과적으로 활용하기 위해서는 적절한 데이터 웨어하우스와 쿼리 방법을 선택하는 것이 중요합니다.
특히 BigQuery와 같은 플랫폼을 통해 JSON 형태의 이벤트 데이터를 효율적으로 분석하고, RDB와의 통합을 통해 다양한 BI 도구와의 호환성을 유지하는 것이 필요합니다.
따라서, Event Taxonomy를 잘 설계하고 운영하는 것은 데이터 분석의 성공적인 출발점이 될 것입니다. 기업은 이를 통해 데이터의 가치를 극대화하고, 변화하는 비즈니스 환경에서 경쟁 우위를 확보할 수 있습니다.