Skip to Content

01. 가설 검정 (Hypothesis Testing)

고급2시간

1. 개요 및 시나리오

상황: “남성 고객이 여성 고객보다 돈을 더 많이 쓴다”는 소문이 팀 내에 돌고 있습니다. 데이터 팀장님이 묻습니다.

“그거 진짜야? 아니면 그냥 우연히 몇몇 큰손 남성 고객 때문 아니야? 통계적으로 유의미한가?

우리는 단순히 평균을 비교하는 것을 넘어, 그 차이가 우연이 아님을 증명해야 합니다. 이를 위해 T-testANOVA를 사용합니다.


2. 데이터 준비

src_userssrc_orders, src_order_items 테이블을 사용하여 고객별 총 구매 금액을 구합니다.

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으로 가져온 후, 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 등)에 따라 고객들의 평균 총 구매 금액에 차이가 있는지 검정하세요.

💡

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. statsmodelspairwise_tukeyhsd를 사용하여 어느 국가 간에 차이가 뚜렷한지 확인하세요.

정답 코드 보기

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 테스트를 통해 마케팅 성과를 검증해봅니다.

Last updated on

🤖AI 모의면접실전처럼 연습하기