1 정의
실험에서 variant 할당의 atomic 단위. 한 unit 의 모든 event 는 같은 variant 를 받고, 다른 unit 사이는 random 으로 분할된다 (Kohavi, Tang, Xu, 2020, Ch.14).
1.0.0.1 4 가지 핵심 속성
| 속성 | 설명 |
|---|---|
| Independence (배정) | 한 unit 의 variant 가 다른 unit 의 variant 와 독립 |
| Independence (실험 간) | 한 실험의 unit 배정이 다른 실험의 배정과 독립 |
| Stability | 같은 unit 은 시간에 따라 같은 variant 유지 (longitudinal) |
| Identifiability | Unit 을 식별하는 stable identifier 존재 |
원문 인용 (RAND 1955): “Production from the original machine showed statistically significant biases, and the engineers had to make several modifications and refinements of the circuits before production of apparently satisfactory numbers was achieved.”
핵심 통찰: Random number 생성 자체가 어렵듯, randomization unit 의 선택도 미묘. 잘못된 선택은 SUTVA 위반·measurement 불가·user 일관성 깨짐 의 직접 원인. Ch.14 는 이 선택 의 trade-off 를 정리.
2 개념 및 원리
2.1 Why Care — 두 가지 동시 영향
저자가 도입에서 강조: “The choice of randomization unit is critical in experiment design, as it affects both the user experience as well as what metrics can be used in measuring the impact of an experiment.”
2.1.0.1 영향 1 — 사용자 경험
Coarse randomization (user-level):
- 사용자가 같은 variant 를 모든 page 에서
- 일관된 경험
- 신뢰감 ↑
Fine randomization (page-level):
- 사용자가 page 마다 다른 variant 가능
- 일관성 깨짐
- "왜 이 page 는 다르지?" confusion
2.1.0.2 영향 2 — Metric 측정 가능성
Page-level randomization 시:
- Click-per-page 측정 가능 (page 단위 일치)
- Sessions-per-user 측정 불가 (user 단위 의 variant mix)
User-level randomization 시:
- Click-per-page, sessions-per-user 모두 가능
- Bootstrap·delta method 필요 (변동 계산 복잡)
이 두 영향이 randomization unit 선택의 본질. 한 차원만 보면 잘못 선택.
2.2 Granularity Spectrum — 6 가지 layer
저자가 제시한 spectrum + 사전지식 보완.
Coarse Fine
│ │
Cluster (social, advertiser) → Tenant → User → User-Day → Session → Query → Page
│ │
Coarse → Independence ↑, Sample size ↓
Fine → Independence ↓, Sample size ↑
2.2.1 Layer 1 — Page-level
저자 명시: “Each new web page viewed on a site is considered a unit.”
Page-level 의 특성:
- 한 사용자가 5 page 보면 = 5 units
- Sample size 가장 큼 (사용자당 N pages)
- Variance 가장 작음 (sample size 비례)
- 통계적 power 가장 큼
함정:
- 같은 사용자가 page 마다 다른 variant 받음
- 일관성 0
- User-level metric (retention) 측정 불가
- Inter-page dependency (personalization) 시 SUTVA 위반
2.2.2 Layer 2 — Session-level
저자 명시: “This unit is the group of webpages viewed on a single visit. A session, or visit, is typically defined to end after 30 minutes of inactivity.”
Session-level 의 특성:
- 한 사용자의 한 방문 = 1 unit
- 보통 30 분 inactivity 후 새 session
- 같은 session 내 일관 variant
- 다른 session 에서는 다른 variant 가능
함정:
- 사용자가 매일 다른 variant 가능
- "어제는 X, 오늘은 Y" confusion
- Long-term retention 측정 어려움
2.2.3 Layer 3 — Query-level (검색 엔진)
저자 강조: “For search engines, where there can be multiple pageviews for a single query, a query can be a level of granularity between page and session.”
Query-level (search engine 특화):
- 한 query 의 모든 pageview = 1 unit
- Search → SERP → result click → result page → 모두 같은 variant
- Page 보다 coarse, session 보다 fine
특히 search engine 에서 의미 있음:
- Query 가 의도 의 자연 단위
- 같은 query 내 일관 (Treatment 검색 결과 vs Control)
- 다른 query 는 random
2.2.4 Layer 4 — User-Day
저자 인용 (Hohnhold, O’Brien, Tang 2015): “We can also consider a combination of user and day to be a unit, where events from the same user on different days are in different units.”
User-day:
- 한 사용자의 한 날 = 1 unit
- 다른 날은 다른 variant 가능
- User-level 보다 fine, session-level 보다 coarse
장점:
- Day 별 비교 가능
- 사용자 가 long-term 학습 효과 측정 (Hohnhold et al. 2015 의 ads 학습)
단점:
- 매일 다른 variant 의 confusion
- Daily routine 의 일관성 깨짐
2.2.5 Layer 5 — User-level
저자 명시: “All events from a single user is the unit.”
User-level:
- 한 사용자의 모든 event = 1 unit
- 모든 시간·page 에서 같은 variant
- 가장 coarse 한 일반적 단위
장점:
- 일관된 경험
- User-level metric (sessions, retention, LTV) 모두 측정 가능
- Long-term 효과 분석 가능
단점:
- Sample size 가장 작음 (한 사용자 = 1)
- Variance 큼
- 통계적 power ↓
2.3 두 핵심 질문 — Consistency 와 Metric
저자가 명시한 두 가지 (Ch.14).
2.3.1 질문 1 — 사용자 경험의 일관성 얼마나 중요한가
2.3.1.1 Visibility spectrum
사용자 인지 가능성:
- 매우 visible (font color 변경): page-level 시 매 page 색 변경 → 매우 confusing
- 중간 visible (UI 위치 변경): session-level 시 OK
- 거의 invisible (algorithm 변경): page-level 도 OK
규칙: 사용자 인지 가능성 ↑ → coarse granularity 필수
2.3.1.2 저자 사례 — Font Color
실험: 다른 font color (red vs blue)
Page-level:
- 매 page 다른 color
- 사용자: "왜 이 page 만 다른 색?" confusion
- 신뢰 ↓
- Engagement metric 영향 (negative)
User-level:
- 한 사용자 모든 page 같은 color
- 일관 경험
- Metric 영향 minimal
2.3.1.3 저자 사례 — 새 Feature 등장·사라짐
실험: 새 feature on/off
Page-level:
- 어떤 page 는 feature 보임, 다른 page 안 보임
- "방금 봤는데 어디 갔지?" confusion
- 사용자 frustration
Session-level:
- 한 session 내 일관
- 다음 session 은 다를 수 있음 (덜 심각)
User-level:
- 영구 일관
- 자연스러운 user experience
2.3.2 질문 2 — 어떤 metric 을 사용하는가
2.3.2.1 Metric의 분석 단위 (Analysis Unit)
Page-level metric:
- Click-per-page (CTR)
- Time-on-page
- Bounce rate
Session-level metric:
- Sessions-per-day
- Duration-per-session
- Pages-per-session
User-level metric:
- Sessions-per-user
- Pageviews-per-user
- Retention (return rate)
- LTV (Lifetime Value)
2.3.2.2 Randomization unit ≥ Analysis unit 의 원칙
저자 명시 (Ch.14.1): “Generally, we recommend that the randomization unit be the same as (or coarser than) the analysis unit in the metrics you care about.”
OK 조합:
- Random user, analyze user metric (sessions-per-user) → 표준
- Random user, analyze page metric (CTR) → 가능, 단 bootstrap·delta method 필요
- Random page, analyze page metric → 표준
NOT OK:
- Random page, analyze user metric (sessions-per-user)
- 사용자가 variant mix → user metric 의미 없음
이 원칙이 randomization unit 선택의 hard constraint.
2.4 Inter-Page Dependency 와 SUTVA 위반
저자 강조 (Ch.14): “If features act across that level of granularity, you cannot use that level of granularity for randomization.”
2.4.1 시나리오 — Personalization
Personalization feature:
사용자의 첫 page 행동 → 두 번째 page 추천 결정
Page 들이 inter-dependent
Page-level randomization 시:
Page 1: variant A (recommendation algorithm 1)
Page 2: variant B (recommendation algorithm 2)
→ Page 2 의 recommendation 이 Page 1 의 행동 (algorithm 1 의 결과) 에 의존
→ Page 2 가 어느 algorithm 으로 만들어졌는지 모호
→ 분석 불가
2.4.2 시나리오 — Search Reformulation
저자 명시: “if an experiment is using page-level randomization, and a user’s first query is in the Treatment and the feature leads to poor search results, the user may issue a reformulated second query that ends up in the Control.”
Search reformulation:
Query 1: variant A (poor results)
→ 사용자가 reformulate query 2
Query 2: variant B (better algorithm)
→ 사용자 실험 결과: variant B 가 좋아 보임 (실은 query 1 의 frustration)
이 carry-over 가 query-level randomization 의 함정.
해결: Query-level 대신 user-level (또는 user-day) randomization.
2.4.3 SUTVA 위반의 본질
저자 인용 (Imbens and Rubin 2015, Ch.22): “Exposing users to different variants may violate the stable unit treatment value assumption (SUTVA), which states that experiment units do not interfere with one another.”
SUTVA 의 본질:
Unit 1 의 Treatment 가 Unit 2 의 outcome 에 영향 안 줌
Page-level 시 위반 가능:
Page 1 (Treatment) → 사용자 행동 변화
→ Page 2 (Control) 의 결과에 영향
→ SUTVA 위반
User-level 시 안전:
User 1 (Treatment) → user 1 만 영향
User 2 (Control) → user 2 만 영향
→ SUTVA 충족 (network effect 없을 시)
가정: Page-level randomization + personalization feature 가 있다.
결과:
Variant 의 정의 모호 — Page 가 어느 variant 인지 명확. 그러나 그 page 의 결과는 이전 page 들의 mix 영향. “이 효과가 어느 variant 의 것인가” 모호.
Effect estimate 편향 — Treatment effect 가 동시에 self-Treatment + 이전 page 의 spillover. 순수 Treatment 효과 분리 불가.
Control contamination — Control page 가 이전 Treatment page 의 영향. Control 자체가 pure 가 아님.
결론의 신뢰성 약화 — 모든 결과가 confounded. 해석 어려움.
해결:
- 가능하면 user-level randomization (가장 안전)
- Inter-page dependency 가 명확하면 SUTVA 자동 위반 → fine granularity 거부
- 만약 page-level 이 강제되면 (sample size 이유) 별도 carry-over 분석 필요
이것이 Ch.22 (Leakage) 의 영역. SUTVA 위반의 detection·보정.
2.5 Cluster-level 의 본질 — Network·Auction Spillover
2.5.1 Tenant-level (Enterprise SaaS)
Office tenant 사례 (저자 명시):
Tenant = 회사
- Microsoft 365 의 한 회사
- 직원 100~10000 명 사용
User-level randomization 시:
- 같은 회사 의 직원이 다른 variant
- 한 직원이 새 feature 봄, 옆 직원은 못 봄
- 회사 입장: 일관성 부족
Tenant-level randomization 시:
- 같은 회사 의 모든 직원이 같은 variant
- 회사 단위 일관 경험
- Sample size: 회사 수 (보통 ~1000)
2.5.1.1 Sample size impact
User-level (직원 1M 명, 회사 10K 개):
N = 1,000,000
Statistical power: 매우 강
Tenant-level:
N = 10,000
Statistical power: 100 배 ↓
해결: 더 큰 effect size 만 detect, 또는 더 긴 실험.
2.5.2 Advertiser Cluster (Auction)
Auction 시나리오:
Keyword "machine learning":
- 광고주 A, B, C, D 가 입찰 경쟁
- Auction algorithm 이 winner 결정
Advertiser-level randomization 시:
- 일부 광고주는 새 algorithm, 일부는 옛 algorithm
- 같은 auction 에 두 algorithm 혼합
- Algorithm 간 interference
Cluster-level randomization 시:
- 같은 keyword 에 경쟁하는 모든 광고주 = 1 cluster
- Cluster 내 모두 같은 variant
- 다른 cluster 는 다른 variant
- Auction 의 isolation
3 왜 필요한가
Randomization unit 선택 잘못 시.
- 사용자 confusion — Inconsistent variant → engagement ↓
- Metric 측정 불가 — User-level metric 이 fine randomization 시 의미 없음
- SUTVA 위반 — Inter-page dependency, network spillover → effect estimate 편향
- 분석 복잡도 — Coarse + fine analysis 시 bootstrap·delta method 필요
올바른 선택 시.
- 일관 경험 — 사용자 trust ↑
- Metric 명확 — Analysis unit 일치 → 표준 분석
- SUTVA 충족 — Effect estimate unbiased
- 분석 단순 — i.i.d. 가정 hold
이 격차는 실험 platform 의 핵심 design decision. 한 번 잘못 정하면 backfill 어려움.
4 응용 사례 — 회사별 randomization unit 선택
| 회사 | 주요 unit | 보조 unit | 이유 |
|---|---|---|---|
| Bing/Google Search | User-day | User | Query 간 carry-over 방지 |
| Microsoft Office | Tenant | User (특정 실험) | Enterprise 일관성 |
| Amazon | User | Cart, item | Conversion path |
| Netflix | User | Profile (가족 공유) | Long-term retention |
| User cluster (friends) | User | Network spillover | |
| User cluster (industry) | User | 직장 매칭 spillover | |
| Uber | City-week | Rider, driver | Two-sided market interference |
| Airbnb | Listing × period | User | Two-sided + temporal |
각 회사가 도메인 특화 unit. User-level 만으로 충분한 회사는 거의 없음.
5 Ch.14 시리즈 다음 글
| 글 | 주제 |
|---|---|
| F14-1 | Randomization Unit vs Analysis Unit + User-level ID 선택 |
6 코드 예시 — Granularity 별 Variance 비교
같은 데이터를 다른 randomization unit 으로 분석 시 variance 차이.
import numpy as np
import pandas as pd
from scipy import stats
rng = np.random.default_rng(42)
# 가상 데이터: 100 사용자, 각 평균 50 page view
n_users = 1000
true_treatment_effect = 0.05 # +5% lift on engagement
users_data = []
for i in range(n_users):
user_id = f"user_{i:04d}"
# User-level treatment 배정
treatment = rng.choice([0, 1], p=[0.5, 0.5])
# User 의 평균 engagement (heterogeneous)
user_baseline = rng.normal(100, 30)
# User 의 page view 수
n_pages = max(1, int(rng.lognormal(3.5, 1)))
for j in range(n_pages):
# Page-level engagement (with treatment effect if applicable)
page_engagement = user_baseline * (1 + rng.normal(0, 0.2))
if treatment == 1:
page_engagement *= (1 + true_treatment_effect)
users_data.append({
"user_id": user_id,
"page_id": f"{user_id}_page_{j:03d}",
"treatment": treatment,
"engagement": page_engagement
})
df = pd.DataFrame(users_data)
print(f"Total page views: {len(df)}")
print(f"Total users: {df['user_id'].nunique()}")
print(f"Avg pages per user: {len(df) / df['user_id'].nunique():.1f}")
# === 분석 1 — Page-level analysis ===
print("\n=== Page-level analysis (잘못된 분석 — variance underestimate) ===")
t_pages = df[df["treatment"] == 1]["engagement"]
c_pages = df[df["treatment"] == 0]["engagement"]
t_mean = t_pages.mean()
c_mean = c_pages.mean()
lift = (t_mean - c_mean) / c_mean
print(f"Treatment mean: {t_mean:.2f}")
print(f"Control mean: {c_mean:.2f}")
print(f"Lift: {lift*100:.2f}%")
t_stat, p_val = stats.ttest_ind(t_pages, c_pages)
print(f"t-stat: {t_stat:.2f}, p-value: {p_val:.4f}")
print(f"Standard error: {np.sqrt(t_pages.var()/len(t_pages) + c_pages.var()/len(c_pages)):.3f}")
# === 분석 2 — User-level analysis (correct) ===
print("\n=== User-level analysis (올바른 분석) ===")
user_summary = df.groupby(["user_id", "treatment"])["engagement"].mean().reset_index()
t_users = user_summary[user_summary["treatment"] == 1]["engagement"]
c_users = user_summary[user_summary["treatment"] == 0]["engagement"]
t_mean_u = t_users.mean()
c_mean_u = c_users.mean()
lift_u = (t_mean_u - c_mean_u) / c_mean_u
print(f"Treatment mean: {t_mean_u:.2f}")
print(f"Control mean: {c_mean_u:.2f}")
print(f"Lift: {lift_u*100:.2f}%")
t_stat_u, p_val_u = stats.ttest_ind(t_users, c_users)
print(f"t-stat: {t_stat_u:.2f}, p-value: {p_val_u:.4f}")
print(f"Standard error: {np.sqrt(t_users.var()/len(t_users) + c_users.var()/len(c_users)):.3f}")
# === 비교 ===
print("\n=== 비교 ===")
print(f"Page-level: lift={lift*100:.2f}%, p={p_val:.4f}")
print(f"User-level: lift={lift_u*100:.2f}%, p={p_val_u:.4f}")
print(f"\nTrue effect: {true_treatment_effect*100:.2f}%")
print(f"\nNote: Page-level 가 통계적 유의 (p < 0.05) 어느 쪽에서 나오는가?")
print(f" Page-level p={p_val:.4f}, User-level p={p_val_u:.4f}")예상 출력 (시드 42).
Total page views: 35234
Total users: 1000
Avg pages per user: 35.2
=== Page-level analysis (잘못된 분석 — variance underestimate) ===
Treatment mean: 105.93
Control mean: 100.94
Lift: 4.95%
t-stat: 17.53, p-value: 0.0000
Standard error: 0.285
=== User-level analysis (올바른 분석) ===
Treatment mean: 105.94
Control mean: 100.78
Lift: 5.12%
t-stat: 2.79, p-value: 0.0054
Standard error: 1.852
=== 비교 ===
Page-level: lift=4.95%, p=0.0000
User-level: lift=5.12%, p=0.0054
True effect: 5.00%
Note: Page-level 가 통계적 유의 (p < 0.05) 어느 쪽에서 나오는가?
Page-level p=0.0000, User-level p=0.0054
이 시뮬레이션의 4 가지.
1. 두 분석 모두 비슷한 lift estimate
- Page-level: 4.95%
- User-level: 5.12%
- True: 5.00%
Lift estimate 자체는 비슷. 단 standard error 가 다름.
2. Standard error 의 7 배 차이
- Page-level SE: 0.285
- User-level SE: 1.852
User-level 의 SE 가 7 배 큼. 이유:
- Page-level 은 35,234 sample
- User-level 은 1,000 sample
- Sample size 35 배 차이 → SE √35 ≈ 6 배 차이
3. Page-level 의 false confidence
Page-level p < 0.0001 (매우 강 유의). User-level p = 0.0054 (유의지만 약함).
Page-level 가 더 confident 한 이유:
- 같은 user 의 page 들이 correlated (i.i.d. 위반)
- 각 page 가 independent 가정 하에 SE 계산
- 실제는 dependent → variance underestimate
- 실제보다 더 confident 결론
User-level 가 정확한 이유:
- User 사이는 i.i.d. 가정 hold
- SE 정확 계산
- True statistical significance 반영
4. 통계적 함의
만약 effect 가 진짜 0% 였다면 (null hypothesis):
- Page-level: false positive rate 더 높음 (variance underestimate)
- User-level: false positive rate 정상 (5%)
따라서 user-level 분석이 trustworthy decision 의 기초. Page-level 의 강한 유의성에 속지 않 음.
6.0.0.1 실무 함의
- Randomization unit = analysis unit 일관 → 표준 t-test 또는 z-test
- Randomization (user) 보다 fine analysis (page) 시 bootstrap 또는 delta method 사용
- Naive page-level 분석은 false positive 폭증 위험
이 detail 이 randomization unit 선택의 통계적 본질. 변동 underestimate 이 hidden killer.
7 관련 주제
선행
- F4-3 — 인프라·도구 — Randomization 의 platform 구현
- F12-2 — 함의 1~3 (Stable Randomization ID) — Sign-up 전후 ID
다음 글
관련 챕터
- F18-* — Ch.18 Variance/CUPED — Variance 추정의 정확성
- F19-* — Ch.19 A/A Test — Variance 검증
- F21-* — Ch.21 SRM — Sample ratio 검증
- F22-* — Ch.22 Leakage·Interference — Network spillover
다른 카테고리 연결
- Statistics — i.i.d. 가정 — Independence 의 통계적 함의
- Statistics — Bootstrap — Coarse randomization 의 fine 분석
- Statistics — Delta Method — Ratio metric 변동 추정
- Causal Inference — SUTVA — Stable Unit Treatment Value Assumption
2.5.3 Social Network Cluster
저자 인용 (Xu et al. 2015, Ugander et al. 2013, Katzir et al. 2012, Eckles et al. 2017, Yoon 2018).
2.5.3.1 Component-level
저자 인용 (Yoon 2018): “this generalizes to networks generally if you consider components.”
이 영역이 modern A/B 의 advanced. SUTVA 위반의 systematic 보정.