데이터 구조 이해
📦 데이터셋 다운로드 (BigQuery 세팅 가이드)
이 Cookbook에서 사용하는 데이터셋의 구조와 관계를 이해합니다.
데이터셋 개요
이 Cookbook은 가상의 이커머스 회사 데이터를 기반으로 합니다. Google BigQuery의 thelook_ecommerce 공개 데이터셋을 확장하여 CS 티켓, 마케팅 캠페인, 외부 시장 데이터 등을 추가했습니다.
데이터 모델 (ERD)
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ src_users │ │ src_orders │ │ src_order_items │
├─────────────────┤ ├─────────────────┤ ├─────────────────┤
│ user_id (PK) │──────▶│ order_id (PK) │◀──────│ order_id (FK) │
│ first_name │ │ user_id (FK) │ │ product_id (FK) │
│ last_name │ │ created_at │ │ sale_price │
│ email │ │ status │ │ returned_at │
│ gender │ │ num_of_item │ │ shipped_at │
│ age │ └─────────────────┘ │ delivered_at │
│ country │ └────────┬────────┘
│ state │ │
│ created_at │ │
└─────────────────┘ ▼
┌─────────────────┐
┌─────────────────┐ │ src_products │
│ src_events │ ├─────────────────┤
├─────────────────┤ │ product_id (PK) │
│ id (PK) │ │ category │
│ user_id (FK) │ │ brand │
│ session_id │ │ department │
│ sequence_number │ │ name │
│ created_at │ │ retail_price │
│ ip_address │ │ cost │
└─────────────────┘ └─────────────────┘테이블 상세 설명
1. 핵심 테이블 (이커머스)
src_users - 고객 정보
| 컬럼 | 타입 | 설명 |
|---|---|---|
| user_id | INT64 | 고객 고유 식별자 (PK) |
| first_name | STRING | 이름 |
| last_name | STRING | 성 |
| STRING | 이메일 주소 | |
| gender | STRING | 성별 (M/F) |
| age | INT64 | 나이 |
| country | STRING | 국가 |
| state | STRING | 주/지역 |
| created_at | TIMESTAMP | 가입일시 |
ℹ️
데이터 규모
약 100,000명의 고객 데이터가 포함되어 있습니다.
src_orders - 주문 정보
| 컬럼 | 타입 | 설명 |
|---|---|---|
| order_id | INT64 | 주문 고유 식별자 (PK) |
| user_id | INT64 | 고객 ID (FK) |
| created_at | TIMESTAMP | 주문일시 |
| status | STRING | 주문 상태 (Shipped, Complete, Cancelled 등) |
| num_of_item | INT64 | 주문 상품 수 |
주문 상태 값:
Shipped: 배송 중Complete: 배송 완료Cancelled: 취소됨Returned: 반품됨Processing: 처리 중
src_order_items - 주문 상품 상세
| 컬럼 | 타입 | 설명 |
|---|---|---|
| order_id | INT64 | 주문 ID (FK) |
| product_id | INT64 | 상품 ID (FK) |
| sale_price | FLOAT64 | 판매가격 |
| returned_at | TIMESTAMP | 반품일시 (NULL 가능) |
| shipped_at | TIMESTAMP | 배송시작일시 |
| delivered_at | TIMESTAMP | 배송완료일시 |
💡
복합키
order_id와 product_id의 조합이 이 테이블의 복합 기본키입니다.
src_products - 상품 정보
| 컬럼 | 타입 | 설명 |
|---|---|---|
| product_id | INT64 | 상품 고유 식별자 (PK) |
| category | STRING | 카테고리 |
| brand | STRING | 브랜드 |
| department | STRING | 부서 (Men/Women) |
| name | STRING | 상품명 |
| retail_price | FLOAT64 | 정가 |
| cost | FLOAT64 | 원가 |
| sku | STRING | SKU 코드 |
| distribution_center_id | INT64 | 물류센터 ID |
주요 카테고리:
- Accessories, Active, Blazers & Jackets, Clothing Sets
- Dresses, Fashion Hoodies & Sweatshirts, Jeans
- Leggings, Maternity, Outerwear & Coats, Pants
- Pants & Capris, Plus, Shorts, Skirts, Sleep & Lounge
- Socks, Socks & Hosiery, Suits, Suits & Sport Coats
- Sweaters, Swim, Tops & Tees, Underwear
src_events - 웹 이벤트 로그
| 컬럼 | 타입 | 설명 |
|---|---|---|
| id | INT64 | 이벤트 ID (PK) |
| user_id | INT64 | 고객 ID (FK, NULL 가능) |
| session_id | STRING | 세션 ID |
| sequence_number | INT64 | 세션 내 이벤트 순서 |
| created_at | TIMESTAMP | 이벤트 발생 시간 |
| ip_address | STRING | IP 주소 |
2. 증강 데이터 (세션 분석용)
events_augmented - 세션 단위 집계
| 컬럼 | 타입 | 설명 |
|---|---|---|
| session_id | STRING | 세션 ID (PK) |
| user_id | INT64 | 고객 ID |
| session_start_at | TIMESTAMP | 세션 시작 시간 |
| session_date | DATE | 세션 날짜 |
| events_in_session | INT64 | 세션 내 이벤트 수 |
| channel_key | STRING | 유입 채널 |
| device_key | STRING | 디바이스 유형 |
| landing_page | STRING | 랜딩 페이지 URL |
| pageviews_est | INT64 | 추정 페이지뷰 수 |
| add_to_cart_est | INT64 | 추정 장바구니 추가 수 |
채널 유형:
organic: 자연 검색paid_search: 유료 검색 광고paid_social: 유료 소셜 광고display: 디스플레이 광고email: 이메일 마케팅referral: 추천/제휴direct: 직접 방문
3. 고객 서비스 데이터
cs_tickets_dummy - CS 티켓
| 컬럼 | 타입 | 설명 |
|---|---|---|
| ticket_id | STRING | 티켓 ID (PK) |
| user_id | INT64 | 고객 ID (FK) |
| opened_at | TIMESTAMP | 티켓 생성 시간 |
| first_response_at | TIMESTAMP | 첫 응답 시간 |
| resolved_at | TIMESTAMP | 해결 시간 |
| status | STRING | 상태 (open, pending, solved, escalated) |
| priority | STRING | 우선순위 (low, normal, high, urgent) |
| channel | STRING | 접수 채널 (email, chat, phone) |
| issue_type | STRING | 이슈 유형 |
| agent_id | STRING | 담당 상담원 ID |
| country_name | STRING | 고객 국가 |
| category | STRING | 관련 상품 카테고리 |
| satisfaction_score | INT64 | 만족도 점수 (1-5) |
| comment | STRING | 고객 코멘트 |
이슈 유형:
size: 사이즈 문의quality: 품질 문제shipping: 배송 관련payment: 결제 문제refund: 환불 요청
survey_cs_dummy - 고객 만족도 설문
| 컬럼 | 타입 | 설명 |
|---|---|---|
| survey_id | STRING | 설문 ID (PK) |
| user_id | INT64 | 고객 ID |
| sent_at | TIMESTAMP | 설문 발송 시간 |
| completed_at | TIMESTAMP | 설문 완료 시간 |
| nps_score | INT64 | NPS 점수 (0-10) |
| csat_score | INT64 | CSAT 점수 (1-5) |
| free_text | STRING | 자유 응답 |
| related_ticket_id | STRING | 관련 티켓 ID |
4. 마케팅 데이터
mkt_campaigns_dummy - 캠페인 메타데이터
| 컬럼 | 타입 | 설명 |
|---|---|---|
| campaign_id | STRING | 캠페인 ID (PK) |
| campaign_name | STRING | 캠페인명 |
| channel_key | STRING | 채널 |
| start_date | DATE | 시작일 |
| end_date | DATE | 종료일 |
| target_category | STRING | 타겟 카테고리 |
| target_country | STRING | 타겟 국가 |
| objective | STRING | 목표 (awareness, traffic, conversion 등) |
| kpi | STRING | KPI (CTR, CVR, ROAS, LTV) |
| budget | FLOAT64 | 예산 |
mkt_channel_spend_dummy - 채널별 광고 집행
| 컬럼 | 타입 | 설명 |
|---|---|---|
| date | DATE | 날짜 |
| channel_key | STRING | 채널 |
| campaign_id | STRING | 캠페인 ID |
| impressions | INT64 | 노출 수 |
| clicks | INT64 | 클릭 수 |
| spend | FLOAT64 | 지출 금액 |
| landing_page | STRING | 랜딩 페이지 |
| country_name | STRING | 국가 |
| device_key | STRING | 디바이스 |
5. 외부 데이터
ext_demand_trends - 시장 수요 트렌드
| 컬럼 | 타입 | 설명 |
|---|---|---|
| week | DATE | 주 시작일 |
| keyword | STRING | 키워드 |
| region_code | STRING | 지역 코드 |
| score | INT64 | 트렌드 점수 (0-100) |
ext_competitive_signal - 경쟁 신호
| 컬럼 | 타입 | 설명 |
|---|---|---|
| period | DATE | 기간 (월) |
| topic | STRING | 주제 |
| region_code | STRING | 지역 코드 |
| signal | FLOAT64 | 신호 강도 |
| source | STRING | 소스 (patent, news, social) |
데이터 관계 활용
기본 조인 패턴
-- 주문과 고객 정보 조인
SELECT
o.order_id,
o.created_at,
u.country,
u.age
FROM src_orders o
JOIN src_users u ON o.user_id = u.user_id
-- 주문 상세와 상품 정보 조인
SELECT
oi.order_id,
oi.sale_price,
p.category,
p.brand
FROM src_order_items oi
JOIN src_products p ON oi.product_id = p.product_id
-- 전체 조인 (주문 → 상품 → 고객)
SELECT
o.order_id,
o.created_at,
u.country,
p.category,
oi.sale_price
FROM src_orders o
JOIN src_users u ON o.user_id = u.user_id
JOIN src_order_items oi ON o.order_id = oi.order_id
JOIN src_products p ON oi.product_id = p.product_idPandas 동등 코드
# 데이터 로드
orders = pd.read_csv('src_orders.csv')
users = pd.read_csv('src_users.csv')
order_items = pd.read_csv('src_order_items.csv')
products = pd.read_csv('src_products.csv')
# 주문과 고객 정보 조인
orders_with_users = orders.merge(users, on='user_id')
# 주문 상세와 상품 정보 조인
items_with_products = order_items.merge(products, on='product_id')
# 전체 조인
full_data = (orders
.merge(users, on='user_id')
.merge(order_items, on='order_id')
.merge(products, on='product_id'))다음 단계
데이터 구조를 이해했으니, 이제 본격적인 분석을 시작할 준비가 되었습니다:
- SQL 트랙 시작하기 - BigQuery SQL로 데이터 분석
- Pandas 트랙 시작하기 - Python Pandas로 데이터 분석
Last updated on