ํต๊ณ๋ถ์
๋ฐ์ดํฐ ๊ธฐ๋ฐ ์์ฌ๊ฒฐ์ ์ ์ํ ํต๊ณ๋ถ์ ๋ ์ํผ ๋ชจ์์ ๋๋ค. ๊ธฐ์ ํต๊ณ๋ถํฐ A/B ํ ์คํธ๊น์ง ์ค๋ฌด์์ ์์ฃผ ์ฌ์ฉ๋๋ ํต๊ณ ๊ธฐ๋ฒ์ ํ์ตํฉ๋๋ค.
์ ํต๊ณ๊ฐ ํ์ํ๊ฐ?
- ๋ฐ์ดํฐ ๋ถ์: โ์ง๋ ๋ฌ ๋งค์ถ์ด 10% ์ฆ๊ฐํ๋คโ
- ํต๊ณ๋ถ์: โ์ด ์ฆ๊ฐ๊ฐ ์ฐ์ฐ์ธ์ง, ์ค์ ์๋ฏธ์๋ ๋ณํ์ธ์ง ๊ฒ์ฆโ
ํต๊ณ๋ ๋ฐ์ดํฐ์ ๋ถํ์ค์ฑ์ ์ ๋ํํ๊ณ , ์ ๋ขฐํ ์ ์๋ ๊ฒฐ๋ก ์ ๋์ถํ๋ ๋๊ตฌ์ ๋๋ค.
0. ์ฌ์ ์ค๋น (Setup)
import pandas as pd
import numpy as np
import scipy.stats as stats
import statsmodels.api as sm
from statsmodels.formula.api import ols
# Dummy Data for Examples
group_a = np.random.normal(100, 10, 100)
group_b = np.random.normal(105, 12, 100)
df = pd.DataFrame({'x1': np.random.rand(100), 'x2': np.random.rand(100), 'y': np.random.rand(100)})์ปค๋ฆฌํ๋ผ
1. ๊ธฐ์ ํต๊ณ
์ด๊ธ๋ฐ์ดํฐ์ ํน์ฑ์ ์์ฝํ๋ ๊ธฐ๋ณธ์ ์ธ ํต๊ณ๋์ ํ์ตํฉ๋๋ค.
- ์ค์ฌ ๊ฒฝํฅ: ํ๊ท , ์ค์๊ฐ, ์ต๋น๊ฐ
- ์ฐํฌ๋: ํ์คํธ์ฐจ, ๋ถ์ฐ, ๋ฒ์, IQR
- ๋ถํฌ ํํ: ์๋(Skewness), ์ฒจ๋(Kurtosis)
- ๋ฐฑ๋ถ์์์ ์ฌ๋ถ์์
2. ์๊ด๊ด๊ณ ๋ถ์
์ด๊ธ์ค๊ธ๋ ๋ณ์ ๊ฐ์ ๊ด๊ณ๋ฅผ ๋ถ์ํ๋ ๋ฐฉ๋ฒ์ ํ์ตํฉ๋๋ค.
- ํผ์ด์จ ์๊ด๊ณ์ (์ฐ์ํ ๋ณ์)
- ์คํผ์ด๋ง ์๊ด๊ณ์ (์์ํ/๋น์ ํ)
- ์๊ด๊ด๊ณ vs ์ธ๊ณผ๊ด๊ณ
- ์๊ด๊ด๊ณ ํ๋ ฌ๊ณผ ํํธ๋งต
์๊ด๊ด๊ณ ๋ถ์ ์์ํ๊ธฐ โ
3. ๊ฐ์ค๊ฒ์
์ค๊ธ๋ฐ์ดํฐ์ ๊ธฐ๋ฐํ ๊ฐ์ค ๊ฒ์ฆ ๋ฐฉ๋ฒ์ ํ์ตํฉ๋๋ค.
- ๊ท๋ฌด๊ฐ์ค๊ณผ ๋๋ฆฝ๊ฐ์ค
- p-value์ ์๋ฏธ์ ํด์
- t-๊ฒ์ (๋จ์ผํ๋ณธ, ๋ ๋ฆฝํ๋ณธ, ๋์ํ๋ณธ)
- ์นด์ด์ ๊ณฑ ๊ฒ์ (๋ฒ์ฃผํ ๋ณ์)
- ์ 1์ข /์ 2์ข ์ค๋ฅ
4. ํ๊ท๋ถ์
์ค๊ธ๊ณ ๊ธ๋ณ์ ๊ฐ์ ๊ด๊ณ๋ฅผ ๋ชจ๋ธ๋งํ๊ณ ์์ธกํ๋ ๋ฐฉ๋ฒ์ ํ์ตํฉ๋๋ค.
- ๋จ์ ์ ํ ํ๊ท
- ๋ค์ค ์ ํ ํ๊ท
- ํ๊ท ๊ณ์ ํด์
- ๊ฒฐ์ ๊ณ์(Rยฒ)์ ๋ชจ๋ธ ํ๊ฐ
- ๋ค์ค๊ณต์ ์ฑ ์ง๋จ
5. A/B ํ ์คํธ
์ค๊ธ๊ณ ๊ธ์คํ์ ํตํ ์ธ๊ณผ๊ด๊ณ ๊ฒ์ฆ ๋ฐฉ๋ฒ์ ํ์ตํฉ๋๋ค.
- A/B ํ ์คํธ ์ค๊ณ
- ํ๋ณธ ํฌ๊ธฐ ์ฐ์ (๊ฒ์ ๋ ฅ ๋ถ์)
- ์ ํ์จ ๋น๊ต (๋น์จ ๊ฒ์ )
- ์ฐ์ํ ์งํ ๋น๊ต (t-๊ฒ์ )
- ์กฐ๊ธฐ ์ข ๋ฃ์ ๋ค์ค ๋น๊ต ๋ฌธ์
A/B ํ ์คํธ ์์ํ๊ธฐ โ
6. ์๊ณ์ด ๋ถ์
๊ณ ๊ธ์๊ฐ์ ๋ฐ๋ฅธ ๋ฐ์ดํฐ ํจํด์ ๋ถ์ํ๊ณ ์์ธกํ๋ ๋ฐฉ๋ฒ์ ํ์ตํฉ๋๋ค.
- ์๊ณ์ด ๋ถํด (์ถ์ธ, ๊ณ์ ์ฑ, ์์ฐจ)
- ์ด๋ํ๊ท ๊ณผ ์ง์ํํ
- ์๊ธฐ์๊ด(ACF)๊ณผ ํธ์๊ธฐ์๊ด(PACF)
- ARIMA ๋ชจ๋ธ ๊ธฐ์ด
- Prophet ํ์ฉ
์ฃผ์ ๊ฐ๋ ์ ๋ฆฌ
ํ๋ฅ ๊ณผ ๋ถํฌ
| ๋ถํฌ | ์ฌ์ฉ ์์ | ์์ |
|---|---|---|
| ์ ๊ท๋ถํฌ | ์ฐ์ํ ๋ฐ์ดํฐ, ํ๋ณธ ํ๊ท | ํค, ๋ชธ๋ฌด๊ฒ, ํ ์คํธ ์ ์ |
| ์ดํญ๋ถํฌ | ์ฑ๊ณต/์คํจ ํ์ | ์ ํ ์, ํด๋ฆญ ์ |
| ํฌ์์ก๋ถํฌ | ๋จ์ ์๊ฐ๋น ๋ฐ์ ํ์ | ์ผ๋ณ ์ฃผ๋ฌธ ๊ฑด์ |
| t-๋ถํฌ | ์ํ๋ณธ ํ๊ท ๋น๊ต | ๊ทธ๋ฃน ๊ฐ ํ๊ท ์ฐจ์ด ๊ฒ์ |
๊ฐ์ค๊ฒ์ ์์ฌ๊ฒฐ์ ํ๋ฆ
๋ฐ์ดํฐ ์์ง
โ
๊ฐ์ค ์ค์ (Hโ, Hโ)
โ
์ ์์์ค ๊ฒฐ์ (๋ณดํต ฮฑ = 0.05)
โ
๊ฒ์ ํต๊ณ๋ ๊ณ์ฐ
โ
p-value ์ฐ์ถ
โ
p < ฮฑ โ Hโ ๊ธฐ๊ฐ (์ ์๋ฏธํ ์ฐจ์ด)
p โฅ ฮฑ โ Hโ ๊ธฐ๊ฐ ์คํจ (์ ์๋ฏธํ ์ฐจ์ด ์์)Python ํต๊ณ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
# ๊ธฐ๋ณธ ํต๊ณ
import scipy.stats as stats
import statsmodels.api as sm
from statsmodels.formula.api import ols
# ์์: t-๊ฒ์
t_stat, p_value = stats.ttest_ind(group_a, group_b)
# ์์: ํ๊ท๋ถ์
model = ols('y ~ x1 + x2', data=df).fit()
print(model.summary())OLS Regression Results
==============================================================================
Dep. Variable: y R-squared: 0.005
Model: OLS Adj. R-squared: -0.015
Method: Least Squares F-statistic: 0.2639
Date: Sat, 20 Dec 2025 Prob (F-statistic): 0.769
Time: 00:25:05 Log-Likelihood: -13.739
No. Observations: 100 AIC: 33.48
Df Residuals: 97 BIC: 41.29
Df Model: 2
Covariance Type: nonrobust
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
Intercept 0.5603 0.078 7.139 0.000 0.404 0.716
x1 -0.0050 0.097 -0.052 0.959 -0.197 0.187
x2 -0.0750 0.103 -0.726 0.469 -0.280 0.130
==============================================================================
Omnibus: 19.776 Durbin-Watson: 2.230
Prob(Omnibus): 0.000 Jarque-Bera (JB): 5.138
Skew: -0.135 Prob(JB): 0.0766
Kurtosis: 1.923 Cond. No. 5.63
==============================================================================
Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.์ค๋ฌด ํ
- p < 0.05๋ผ๊ณ ํด์ ๋ฌด์กฐ๊ฑด ์๋ฏธ์๋ ๊ฒ์ ์๋๋๋ค
- **ํจ๊ณผ ํฌ๊ธฐ(Effect Size)**๋ฅผ ํจ๊ป ๊ณ ๋ คํ์ธ์
- ์: ์ ํ์จ์ด 0.01% ์ฆ๊ฐํ๊ณ p = 0.001์ด๋ผ๋ฉด?
- ํต๊ณ์ ์ผ๋ก ์ ์ํ์ง๋ง, ์ค๋ฌด์ ๊ฐ์น๋ ์์ ์ ์์
- ๋น์ฆ๋์ค ์ํฉํธ(๋งค์ถ ์ํฅ ๋ฑ)๋ฅผ ํญ์ ํจ๊ป ๊ณ์ฐํ์ธ์