01. 가설 검정 (Hypothesis Testing)
1. 개요 및 시나리오
상황: “남성 고객이 여성 고객보다 돈을 더 많이 쓴다”는 소문이 팀 내에 돌고 있습니다. 데이터 팀장님이 묻습니다.
“그거 진짜야? 아니면 그냥 우연히 몇몇 큰손 남성 고객 때문 아니야? 통계적으로 유의미한가?”
우리는 단순히 평균을 비교하는 것을 넘어, 그 차이가 우연이 아님을 증명해야 합니다. 이를 위해 T-test와 ANOVA를 사용합니다.
2. 데이터 준비
src_users와 src_orders, src_order_items 테이블을 사용하여 고객별 총 구매 금액을 구합니다.
BigQuery (SQL)
from google.cloud import bigquery
from scipy import stats
import pandas as pd
client = bigquery.Client()3. T-Test: 두 집단 간 비교 (남성 vs 여성)
가장 흔한 질문입니다. “A와 B의 평균이 다른가?”
❓ 문제 1: 성별 평균 구매 금액 비교
Q. Independent Two-sample T-test를 수행하여 남성과 여성 고객의 평균 총 구매 금액 차이가 유의미한지 검정하세요.
(단, 구매 이력이 있는 고객만 대상으로 합니다.)
BigQuery + Python
전략: BigQuery로 데이터를 집계하여 Python으로 가져온 후, scipy.stats를 사용합니다.
Hint: SQL에서 GROUP BY user_id, gender로 총 구매액을 구한 뒤 가져옵니다.
정답 코드 보기
# 1. 데이터 추출
query = """
SELECT
u.gender,
SUM(oi.sale_price) as total_purchase
FROM `your-project-id.retail_analytics_us.src_users` u
JOIN `your-project-id.retail_analytics_us.src_orders` o ON u.user_id = o.user_id
JOIN `your-project-id.retail_analytics_us.src_order_items` oi ON o.order_id = oi.order_id
WHERE o.status NOT IN ('Cancelled', 'Returned')
GROUP BY u.user_id, u.gender
"""
df = client.query(query).to_dataframe()
# 2. 그룹 분리
group_m = df[df['gender'] == 'M']['total_purchase']
group_f = df[df['gender'] == 'F']['total_purchase']
# 3. T-test 수행 (등분산 가정 X -> Welch's t-test)
t_stat, p_val = stats.ttest_ind(group_m, group_f, equal_var=False)
print(f"남성 평균: ${group_m.mean():.2f}")
print(f"여성 평균: ${group_f.mean():.2f}")
print(f"T-statistic: {t_stat:.4f}")
print(f"P-value: {p_val:.4f}")
if p_val < 0.05:
print("✅ 차이가 통계적으로 유의미합니다.")
else:
print("❌ 차이가 유의미하지 않습니다.")남성 평균: $130.20 여성 평균: $114.75 T-statistic: 15.4704 P-value: 0.0000 ✅ 차이가 통계적으로 유의미합니다.
💡 해석 가이드
- P-value < 0.05: “두 집단의 평균이 다르다”는 가설을 채택 (유의미한 차이).
- P-value >= 0.05: 차이가 있다고 말할 충분한 증거가 없음 (우연일 수 있음).
- 남성의 평균 구매액이 더 높고 P-value가 0.0000이라면, “남성이 통계적으로 더 많이 쓴다”고 결론 내릴 수 있습니다.
4. ANOVA: 세 개 이상 집단 비교
만약 비교 대상이 셋 이상이라면? (예: 가입 채널별, 국가별) 이때는 T-test를 여러 번 하는 대신 **ANOVA(분산분석)**를 사용합니다.
❓ 문제 2: 가입 채널(Traffic Source)별 구매 금액 차이
Q. traffic_source (Search, Displays, Facebook 등)에 따라 고객들의 평균 총 구매 금액에 차이가 있는지 검정하세요.
BigQuery + Python
Hint: src_users 테이블에 traffic_source 컬럼이 없으므로, 유입 채널 데이터가 필요합니다.
여기서는 src_users에 traffic source 정보가 있다고 가정하거나, 연습을 위해 country를 사용해봅시다.
(가이드 수정: 데이터셋 한계로 Country 비교로 대체합니다.)
대체 문제: 국가(Country)별 평균 구매 금액 차이 검정
정답 코드 보기
# 1. 데이터 추출
query = """
SELECT
u.country,
SUM(oi.sale_price) as total_purchase
FROM `your-project-id.retail_analytics_us.src_users` u
JOIN `your-project-id.retail_analytics_us.src_orders` o ON u.user_id = o.user_id
JOIN `your-project-id.retail_analytics_us.src_order_items` oi ON o.order_id = oi.order_id
WHERE o.status NOT IN ('Cancelled', 'Returned')
AND u.country IN ('United States', 'China', 'Japan') -- 3개국 비교
GROUP BY u.user_id, u.country
"""
df_anova = client.query(query).to_dataframe()
# 2. 그룹별 데이터 준비
groups = [df_anova[df_anova['country'] == c]['total_purchase'] for c in df_anova['country'].unique()]
# 3. ANOVA 수행
f_stat, p_val = stats.f_oneway(*groups)
print(f"F-statistic: {f_stat:.4f}")
print(f"P-value: {p_val:.4f}")F-statistic: 2.6464 P-value: 0.0709
5. 사후 검정 (Post-hoc Analysis)
ANOVA에서 “차이가 있다(P < 0.05)“고 나왔다면, **“구체적으로 어디랑 어디가 다른데?”**를 알아야 합니다. 이를 위해 Tukey HSD 테스트를 합니다.
❓ 문제 3: 국가별 사후 검정
Q. statsmodels의 pairwise_tukeyhsd를 사용하여 어느 국가 간에 차이가 뚜렷한지 확인하세요.
Python (Common)
정답 코드 보기
from statsmodels.stats.multicomp import pairwise_tukeyhsd
# df_anova는 위에서 만든 데이터프레임
tukey = pairwise_tukeyhsd(endog=df_anova['total_purchase'],
groups=df_anova['country'],
alpha=0.05)
print(tukey)Multiple Comparison of Means - Tukey HSD, FWER=0.05 =========================================================== group1 group2 meandiff p-adj lower upper reject ----------------------------------------------------------- China Japan 6.4094 0.1268 -1.3222 14.141 False China United States -1.217 0.6424 -4.398 1.9641 False Japan United States -7.6263 0.0596 -15.4896 0.2369 False -----------------------------------------------------------
결과 해석:
reject컬럼이True인 행: 두 그룹 간 차이가 유의미함.- 예: US vs China가 True라면, 두 국가 간 소비 성향이 다름.
💡 요약
- T-test: 두 집단 비교 (A vs B)
- ANOVA: 셋 이상 집단 비교 (A vs B vs C)
- Post-hoc: 누가 다른지 범인 찾기
다음 챕터에서는 A/B 테스트를 통해 마케팅 성과를 검증해봅니다.