Skip to Content

01. ๊ฐ€์„ค ๊ฒ€์ • (Hypothesis Testing)

๊ณ ๊ธ‰2์‹œ๊ฐ„

1. ๊ฐœ์š” ๋ฐ ์‹œ๋‚˜๋ฆฌ์˜ค

์ƒํ™ฉ: โ€œ๋‚จ์„ฑ ๊ณ ๊ฐ์ด ์—ฌ์„ฑ ๊ณ ๊ฐ๋ณด๋‹ค ๋ˆ์„ ๋” ๋งŽ์ด ์“ด๋‹คโ€๋Š” ์†Œ๋ฌธ์ด ํŒ€ ๋‚ด์— ๋Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ํŒ€์žฅ๋‹˜์ด ๋ฌป์Šต๋‹ˆ๋‹ค.

โ€œ๊ทธ๊ฑฐ ์ง„์งœ์•ผ? ์•„๋‹ˆ๋ฉด ๊ทธ๋ƒฅ ์šฐ์—ฐํžˆ ๋ช‡๋ช‡ ํฐ์† ๋‚จ์„ฑ ๊ณ ๊ฐ ๋•Œ๋ฌธ ์•„๋‹ˆ์•ผ? ํ†ต๊ณ„์ ์œผ๋กœ ์œ ์˜๋ฏธํ•œ๊ฐ€?โ€

์šฐ๋ฆฌ๋Š” ๋‹จ์ˆœํžˆ ํ‰๊ท ์„ ๋น„๊ตํ•˜๋Š” ๊ฒƒ์„ ๋„˜์–ด, ๊ทธ ์ฐจ์ด๊ฐ€ ์šฐ์—ฐ์ด ์•„๋‹˜์„ ์ฆ๋ช…ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด T-test์™€ ANOVA๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.


2. ๋ฐ์ดํ„ฐ ์ค€๋น„

src_users์™€ src_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. statsmodels์˜ pairwise_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 Mock InterviewPractice with real questions