๊ฐ์ค ๊ฒ์ ์ ๊ธฐ์ด
๊ฐ์ค ๊ฒ์ ์ ํ๋ณธ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ์ง๋จ์ ๋ํ ํต๊ณ์ ๊ฐ์ค์ด ํ๋นํ์ง๋ฅผ ํ๋จํ๋ ๊ณผ์ ์ ๋๋ค.
์ด๋ฅผ ํตํด ์ฐ๊ตฌ ๊ฐ์ค์ ์ง์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๊ธฐ ์ํด ํต๊ณ์ ์ฆ๊ฑฐ๋ฅผ ํ๊ฐํฉ๋๋ค.
๊ฐ์ค ๊ฒ์ ํ๋ก์ธ์ค
- ๊ท๋ฌด ๊ฐ์ค (Null Hypothesis, H0): ๊ธฐ๋ณธ ๊ฐ์ค๋ก, ๋ณํ๊ฐ ์์์ ์ฃผ์ฅํฉ๋๋ค.
- ๋๋ฆฝ ๊ฐ์ค (Alternative Hypothesis, H1): ์ฐ๊ตฌ ๊ฐ์ค๋ก, ๋ณํ๋ฅผ ์ฃผ์ฅํฉ๋๋ค.
- ๊ฒฐ์ ๊ท์น: ํต๊ณ์ ์ ์์ฑ์ ํ๊ฐํ์ฌ ๊ฐ์ค์ ๊ธฐ๊ฐํ๊ฑฐ๋ ์ฑํํฉ๋๋ค. ์ฃผ๋ก p-value๋ฅผ ์ฌ์ฉํ์ฌ ๊ท๋ฌด ๊ฐ์ค์ ๊ธฐ๊ฐ ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํฉ๋๋ค.
T๊ฒ์ (T-test)
T๊ฒ์ ์ ๋ ๊ทธ๋ฃน ๊ฐ์ ํ๊ท ์ฐจ์ด๊ฐ ํต๊ณ์ ์ผ๋ก ์ ์๋ฏธํ์ง ๊ฒ์ ํ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
๋ฐ์ดํฐ๊ฐ ์ ๊ท ๋ถํฌ๋ฅผ ๋ฐ๋ฅด๊ณ ๋ ์ง๋จ์ ์ํ ํฌ๊ธฐ๊ฐ ๋น๊ต์ ์์ ๋ ์ฌ์ฉ๋ฉ๋๋ค.
์ ํ
๋ ๋ฆฝ ํ๋ณธ T๊ฒ์ (Independent Sample T-test): ๋ ๋ ๋ฆฝ๋ ๊ทธ๋ฃน ๊ฐ์ ํ๊ท ์ฐจ์ด๋ฅผ ๋น๊ตํฉ๋๋ค.
from scipy.stats import ttest_ind
group1 = [1, 2, 3, 4, 5]
group2 = [2, 3, 4, 5, 6]
t_stat, p_value = ttest_ind(group1, group2)
print(f'T-statistic: {t_stat}, P-value: {p_value}')
๋์ ํ๋ณธ T๊ฒ์ (Paired Sample T-test): ๋์ผํ ๊ทธ๋ฃน์ ์ฌ์ -์ฌํ ํ๊ท ์ฐจ์ด๋ฅผ ๋น๊ตํฉ๋๋ค.
from scipy.stats import ttest_rel
before = [1, 2, 3, 4, 5]
after = [2, 3, 4, 5, 6]
t_stat, p_value = ttest_rel(before, after)
print(f'T-statistic: {t_stat}, P-value: {p_value}')
๋จ์ผ ํ๋ณธ T๊ฒ์ (One Sample T-test): ํ๋ณธ ํ๊ท ์ด ํน์ ๊ฐ๊ณผ ๋ค๋ฅธ์ง ๊ฒ์ ํฉ๋๋ค.
from scipy.stats import ttest_1samp
sample = [1, 2, 3, 4, 5]
t_stat, p_value = ttest_1samp(sample, 3)
print(f'T-statistic: {t_stat}, P-value: {p_value}')
ANOVA (Analysis of Variance, ๋ถ์ฐ ๋ถ์)
ANOVA๋ ์ธ ๊ฐ ์ด์์ ๊ทธ๋ฃน ๊ฐ ํ๊ท ์ ์ฐจ์ด๊ฐ ํต๊ณ์ ์ผ๋ก ์ ์๋ฏธํ์ง ๊ฒ์ ํ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
์ฌ๋ฌ ์ง๋จ์ ๋ฐ์ดํฐ๋ฅผ ๋น๊ตํ ๋ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
- ์๋ฅผ ๋ค์ด, ๋ค์ํ ๋ง์ผํ ์ ๋ต์ ํจ๊ณผ๋ฅผ ๋น๊ตํ ๋ ์ฌ์ฉ๋ฉ๋๋ค.
from scipy.stats import f_oneway
group1 = [1, 2, 3, 4, 5]
group2 = [2, 3, 4, 5, 6]
group3 = [3, 4, 5, 6, 7]
f_stat, p_value = f_oneway(group1, group2, group3)
print(f'F-statistic: {f_stat}, P-value: {p_value}')
๋น๋ชจ์์ ๋ฐฉ๋ฒ
๋น๋ชจ์์ ๋ฐฉ๋ฒ์ ๋ฐ์ดํฐ๊ฐ ์ ๊ท ๋ถํฌ๋ฅผ ๋ฐ๋ฅด์ง ์์ ๋ ์ฌ์ฉํ๋ ํต๊ณ์ ๊ฒ์ ๋ฐฉ๋ฒ์ ๋๋ค.
์ฃผ์ ๋น๋ชจ์์ ๊ฒ์
1. ํฌ๋ฃจ์ค์นผ-์๋ฆฌ์ค ๊ฒ์ (Kruskal-Wallis Test): ์ฌ๋ฌ ๋ ๋ฆฝ๋ ํ๋ณธ ๊ทธ๋ฃน์ ๋น๊ตํฉ๋๋ค. ANOVA์ ๋น๋ชจ์์ ๋์์ ๋๋ค.
from scipy.stats import kruskal
group1 = [1, 2, 3, 4, 5]
group2 = [2, 3, 4, 5, 6]
group3 = [3, 4, 5, 6, 7]
stat, p_value = kruskal(group1, group2, group3)
print(f'Statistic: {stat}, P-value: {p_value}')
2. ๋งจ-ํํธ๋ U ๊ฒ์ (Mann-Whitney U Test): ๋ ๋ ๋ฆฝ ํ๋ณธ ๊ฐ์ ์ฐจ์ด๋ฅผ ๊ฒ์ ํฉ๋๋ค.
from scipy.stats import mannwhitneyu
group1 = [1, 2, 3, 4, 5]
group2 = [2, 3, 4, 5, 6]
stat, p_value = mannwhitneyu(group1, group2)
print(f'Statistic: {stat}, P-value: {p_value}')
3. ์์ฝ์จ ๋ถํธ ์์ ๊ฒ์ (Wilcoxon Signed-Rank Test): ๋ ๊ด๋ จ ํ๋ณธ ๊ฐ์ ์ฐจ์ด๋ฅผ ๊ฒ์ ํฉ๋๋ค.
from scipy.stats import mannwhitneyu
group1 = [1, 2, 3, 4, 5]
group2 = [2, 3, 4, 5, 6]
stat, p_value = mannwhitneyu(group1, group2)
print(f'Statistic: {stat}, P-value: {p_value}')
A/B ํ ์คํธ
A/B ํ ์คํธ๋ ๋ ๊ฐ์ง ์ด์์ ๋ฒ์ (์: ์น ํ์ด์ง, ์ ํ, ์๋น์ค)์ ๋์์ ์คํํ์ฌ ์ด๋ ๊ฒ์ด ๋ ํจ๊ณผ์ ์ธ์ง๋ฅผ ๊ฒฐ์ ํ๋ ์คํ์ ์ ๊ทผ ๋ฐฉ์์ ๋๋ค.
- ์ด๋ฅผ ํตํด ์ฌ์ฉ์ ๊ฒฝํ, ์ ํ ์ฑ๋ฅ, ๋ง์ผํ ์ ๋ต ๋ฑ์ ์ต์ ํํ ์ ์์ต๋๋ค.
A/B ํ ์คํธ์ ์ค์์ฑ
- ๋น์ฆ๋์ค ์์ฌ๊ฒฐ์ ๊ฐ์ : ์ค์ ๋ฐ์ดํฐ์ ๊ธฐ๋ฐํด์ ์์ฌ๊ฒฐ์ ์ ๋ด๋ฆฌ๋ฏ๋ก, ๊ฐ์ ์ด๋ ์ถ์ธก๋ณด๋ค ์ ๋ขฐํ ์ ์์ต๋๋ค.
- ํ์ ์ ์ธ ์์ด๋์ด ๊ฒ์ฆ: ์๋ก์ด ์์ด๋์ด๋ ๊ธฐ๋ฅ์ ์์ ํ๊ฒ ํ ์คํธํ๊ณ , ์ค์ ํจ๊ณผ๋ฅผ ํ๊ฐํ ์ ์์ต๋๋ค.
- ์ฌ์ฉ์ ๋ง์กฑ๋ ํฅ์: ์ฌ์ฉ์ ๊ฒฝํ์ ๊ฐ์ ํ๊ณ , ์ฌ์ฉ์์ ์๊ตฌ์ ๋ ์ ๋ง๋ ์๋น์ค๋ฅผ ์ ๊ณตํ ์ ์์ต๋๋ค.
Example.
1. ์น์ฌ์ดํธ ๋์์ธ ํ ์คํธ: A/B ํ ์คํธ๋ฅผ ํตํด ๋ ๊ฐ์ง ์น์ฌ์ดํธ ๋์์ธ ์ค ์ด๋ ๊ฒ์ด ๋ ๋์ ์ ํ์จ์ ๋ณด์ด๋์ง ํ์ธํ ์ ์์ต๋๋ค.
import numpy as np
from scipy.stats import ttest_ind
# ์์ ๋ฐ์ดํฐ
conversion_a = np.random.binomial(1, 0.2, 1000) # A ๋ฒ์ ์ ์ ํ์จ
conversion_b = np.random.binomial(1, 0.25, 1000) # B ๋ฒ์ ์ ์ ํ์จ
t_stat, p_value = ttest_ind(conversion_a, conversion_b)
print(f'T-statistic: {t_stat}, P-value: {p_value}')
2. ๋ง์ผํ ์ ๋ต ํ ์คํธ: ๋ ๊ฐ์ง ๋ง์ผํ ์บ ํ์ธ ์ค ์ด๋ ๊ฒ์ด ๋ ๋์ ๋งค์ถ์ ์ฌ๋ฆฌ๋์ง ํ๊ฐํ ์ ์์ต๋๋ค.
# ์์ ๋ฐ์ดํฐ
sales_a = [200, 220, 250, 230, 210]
sales_b = [240, 260, 270, 250, 230]
t_stat, p_value = ttest_ind(sales_a, sales_b)
print(f'T-statistic: {t_stat}, P-value: {p_value}')
์๋๋ฆฌ์ค
๋ฐ์ดํฐ ๋ถ์์์ ์๋๋ฆฌ์ค๋ ํน์ ์กฐ๊ฑด์ด๋ ์ํฉ์ ๊ฐ์ ํ์ฌ ๋ถ์์ ์ํํ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
- ์๋๋ฆฌ์ค๋ ์ฌ๋ฌ ๊ฐ์ง ๊ฐ์ ์ด๋ ๋ณ์ ์กฐํฉ์ ๊ธฐ๋ฐ์ผ๋ก ๋ค์ํ ๊ฒฐ๊ณผ๋ฅผ ์์ธกํ๊ณ , ์ด๋ฌํ ๊ฒฐ๊ณผ๋ฅผ ๋น๊ตํ์ฌ ์ต์ ์ ์์ฌ๊ฒฐ์ ์ ๋ด๋ฆฌ๋ ๋ฐ ๋์์ ์ค๋๋ค.
- ์๋๋ฆฌ์ค ๋ถ์์ ํนํ ๋ถํ์ค์ฑ์ด ๋์ ์ํฉ์์ ๋ค์ํ ๊ฐ๋ฅ์ฑ์ ํ๊ตฌํ๊ณ ๋๋น์ฑ ์ ๋ง๋ จํ๋ ๋ฐ ์ ์ฉํฉ๋๋ค.
์๋๋ฆฌ์ค ๋ถ์์ ๋ชฉ์
์๋๋ฆฌ์ค ๋ถ์์ ๋ชฉ์ ์ ํฌ๊ฒ 4๊ฐ์ง๊ฐ ์์ต๋๋ค.
- ๋ฏธ๋ ์์ธก: ๋ค์ํ ์กฐ๊ฑดํ์์์ ๊ฐ๋ฅํ ๊ฒฐ๊ณผ๋ฅผ ์์ธกํ์ฌ ๋ถํ์คํ ๋ฏธ๋๋ฅผ ๋๋นํ ์ ์์ต๋๋ค.
- ์์ฌ๊ฒฐ์ ์ง์: ๊ฐ ์๋๋ฆฌ์ค์ ๋ฐ๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ๋น๊ตํ์ฌ ์ต์ ์ ๊ฒฐ์ ์ ๋ด๋ฆด ์ ์๋๋ก ๋์์ค๋๋ค.
- ์ํ ๊ด๋ฆฌ: ์ฌ๋ฌ ์๋๋ฆฌ์ค๋ฅผ ๊ณ ๋ คํจ์ผ๋ก์จ ์ ์ฌ์ ์ธ ์ํ์ ์๋ณํ๊ณ , ์ด๋ฅผ ์ํํ ์ ์๋ ์ ๋ต์ ์๋ฆฝํ ์ ์์ต๋๋ค.
- ์ ๋ต ๊ฐ๋ฐ: ์๋๋ฆฌ์ค ๋ถ์์ ํตํด ๋ค์ํ ์ ๋ต์ ํ ์คํธํ๊ณ , ๊ฐ์ฅ ํจ๊ณผ์ ์ธ ์ ๋ต์ ์ ํํ ์ ์์ต๋๋ค.
์๋๋ฆฌ์ค ์์ (Example)
์ฌ๋ฌ๋ถ์ ์จ๋ผ์ธ ์ผํ๋ชฐ์ ์ด์ํ๋ ‘A’์ ๋ฐ์ดํฐ ๋ถ์๊ฐ ์ ๋๋ค.
A ๋ ์ต๊ทผ ์น์ฌ์ดํธ์ ์ฌ์ฉ์ ์ธํฐํ์ด์ค(UI)๋ฅผ ์๋กญ๊ฒ ๋ณ๊ฒฝํ์ต๋๋ค.
์ด ๋ณ๊ฒฝ์ด ์ค์ ๋ก ์ฌ์ฉ์๋ค์ ๊ตฌ๋งค ์ ํ์จ์ ์ด๋ค ์ํฅ์ ๋ฏธ์ณค๋์ง ๋ถ์ํ๊ณ ์ ํฉ๋๋ค.
์์งํ ๋ฐ์ดํฐ: UI ๋ณ๊ฒฝ ์ ๊ณผ ๋ณ๊ฒฝ ํ์ ์ฌ์ฉ์ ์ํธ์์ฉ ๋ก๊ทธ, ๊ตฌ๋งค ์ด๋ ฅ, ๊ทธ๋ฆฌ๊ณ ์ฌ์ฉ์ ํผ๋๋ฐฑ ๋ฐ์ดํฐ
- ๊ฐ์์ ๋ฐ์ดํฐ ์์ฑ
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from scipy.stats import pearsonr, ttest_ind
import statsmodels.api as sm
# ๊ฐ์์ ๋ฐ์ดํฐ ์์ฑ
np.random.seed(42)
data = pd.DataFrame({
'user_id': range(1, 201),
'ui_type': ['A']*100 + ['B']*100,
'session_duration': np.random.normal(5, 1.5, 200).tolist(),
'page_views': np.random.randint(1, 10, 200),
'conversion': np.random.binomial(1, 0.1, 100).tolist() + np.random.binomial(1, 0.15, 100).tolist(),
'feedback': ['Good', 'Bad', 'Neutral', 'Excellent', 'Poor']*40
})
๋ฐ์ดํฐ ์ข ๋ฅ์ ์์ฑ ํ์
์์ง๋ ๋ฐ์ดํฐ์ ์ข ๋ฅ์ ์์ฑ์ ํ์ ํ๋ ๊ฒ์ ๋ฐ์ดํฐ ๋ถ์์ ์ฒซ ๋จ๊ณ์ ๋๋ค.
์ด๋ ๋ฐ์ดํฐ์ ์ ์ฑ์ , ์ ๋์ ํน์ฑ์ ์ดํดํ๊ณ , ๋ถ์์ ๋ฐฉํฅ์ ์ค์ ํ๋ ๋ฐ ์ค์ํฉ๋๋ค. ๋ฐ์ดํฐ์ ํ์ ์ 4๊ฐ์ง๊ฐ ์์ต๋๋ค.
- ์ ์ฑ์ ๋ฐ์ดํฐ (Qualitative Data)
- ์ค๋ช : ํ ์คํธ, ์ด๋ฏธ์ง, ๋น๋์ค ๋ฑ ์์นํํ ์ ์๋ ๋ฐ์ดํฐ. ์: ์ฌ์ฉ์ ํผ๋๋ฐฑ.
- ๋ถ์ ๋ฐฉ๋ฒ: ํ ์คํธ ๋ง์ด๋, ๊ฐ์ ๋ถ์, ์ฃผ์ ๋ชจ๋ธ๋ง.
- ์์: ์ฌ์ฉ์ ํผ๋๋ฐฑ์ ํ ์คํธ๋ก ๋ถ์ํ์ฌ ๊ธ์ ์ , ๋ถ์ ์ , ์ค๋ฆฝ์ ํผ๋๋ฐฑ์ผ๋ก ๋ถ๋ฅ.
- ์ ๋์ ๋ฐ์ดํฐ (Quantitative Data)
- ์ค๋ช : ์์น๋ก ํํ๋๋ ๋ฐ์ดํฐ. ์: ์ฒด๋ฅ ์๊ฐ, ๊ตฌ๋งค ๊ธ์ก.
- ๋ถ์ ๋ฐฉ๋ฒ: ํต๊ณ ๋ถ์, ์๊ฐํ, ํ๊ท ๋ถ์.
- ์์: ์ฒด๋ฅ ์๊ฐ๊ณผ ๊ตฌ๋งค ๊ธ์ก์ ๋ถ์ํ์ฌ ํ๊ท , ์ค์๊ฐ, ํ์คํธ์ฐจ ๋ฑ์ ๊ณ์ฐ.
- ์ฐ์ํ ๋ฐ์ดํฐ (Continuous Data)
- ์ค๋ช : ์ฐ์์ ์ธ ๊ฐ์ ๊ฐ์ง๋ ๋ฐ์ดํฐ. ์: ์ฒด๋ฅ ์๊ฐ, ๊ตฌ๋งค ๊ธ์ก.
- ๋ถ์ ๋ฐฉ๋ฒ: ํ์คํ ๊ทธ๋จ, ๋ฐ์ค ํ๋กฏ, ์ฐ์ ๋.
- ์์: ์ฒด๋ฅ ์๊ฐ์ ํ์คํ ๊ทธ๋จ์ ๊ทธ๋ ค ๋ฐ์ดํฐ ๋ถํฌ๋ฅผ ํ์ .
- ๋ฒ์ฃผํ ๋ฐ์ดํฐ (Categorical Data)
- ์ค๋ช : ํน์ ๋ฒ์ฃผ๋ก ๊ตฌ๋ถ๋๋ ๋ฐ์ดํฐ. ์: ์ฌ์ฉ์ ์ฑ๋ณ, ์ฌ์ฉ UI ํ์ .
- ๋ถ์ ๋ฐฉ๋ฒ: ๋ง๋ ๊ทธ๋ํ, ํผ๋ฒ ํ ์ด๋ธ.
- ์์: ์ฌ์ฉ์ ์ฑ๋ณ์ ๋ฐ๋ฅธ ๊ตฌ๋งค ์ ํ์จ ๋น๊ต.
๋ฐ์ดํฐ ๋ถ๋ถ ์์ ์ฝ๋
# ์ฌ์ฉ์ ํผ๋๋ฐฑ ๋ฐ์ดํฐ ์ ์ฑ์ , ์ ๋์ ๋ฐ์ดํฐ๋ก ๊ตฌ๋ถ
feedback_counts = data['feedback'].value_counts()
# ์ฐ์ํ ๋ฐ์ดํฐ์ ๋ฒ์ฃผํ ๋ฐ์ดํฐ ์๋ณ
continuous_data = data[['session_duration', 'page_views']]
categorical_data = data[['user_id', 'ui_type', 'conversion', 'feedback']]
๊ธฐ์ด ํต๊ณ ๋ฐ EDA (Exploratory Data Analysis)
๊ธฐ์ด ํต๊ณ ๋ฐ ํ์์ ๋ฐ์ดํฐ ๋ถ์(EDA)์ ํตํด ๋ฐ์ดํฐ์ ์ ๋ฐ์ ์ธ ํน์ฑ๊ณผ ํจํด์ ํ์ ํ๊ณ , ์ด๊ธฐ ์ธ์ฌ์ดํธ๋ฅผ ๋์ถํฉ๋๋ค.
ํ๋ฒ 4๊ฐ์ง์ ์์ ๋ฅผ ํ๋ฒ ๋ณด๊ฒ ์ต๋๋ค.
๋ฐ์ดํฐ์ ๋ถํฌ ํ์
- ํ์คํ ๊ทธ๋จ: ์ฒด๋ฅ ์๊ฐ๊ณผ ํ์ด์ง ๋ทฐ์ ํ์คํ ๊ทธ๋จ์ ๊ทธ๋ ค ๋ฐ์ดํฐ์ ๋ถํฌ๋ฅผ ํ์ ํฉ๋๋ค.
# ๊ธฐ์ด ํต๊ณ ๋ฐ EDA
# ํ์คํ ๊ทธ๋จ: ์ฒด๋ฅ ์๊ฐ๊ณผ ํ์ด์ง ๋ทฐ
plt.figure(figsize=(12, 5))
plt.subplot(1, 2, 1)
sns.histplot(data['session_duration'], bins=30, kde=True)
plt.title('Session Duration Distribution')
plt.subplot(1, 2, 2)
sns.histplot(data['page_views'], bins=30, kde=True)
plt.title('Page Views Distribution')
plt.show()
์ค์ฌ ๊ฒฝํฅ๊ณผ ๋ถ์ฐ ํ์
- ๊ธฐ์ด ํต๊ณ: ๋ฐ์ดํฐ์ ๋ถํฌ, ์ค์ฌ ๊ฒฝํฅ, ๋ถ์ฐ ๋ฑ์ ํ์ ํ๊ณ , ์ด๊ธฐ ์ธ์ฌ์ดํธ๋ฅผ ์ป์ต๋๋ค.
mean_duration = data['session_duration'].mean()
median_duration = data['session_duration'].median()
std_duration = data['session_duration'].std()
print(f'Mean: {mean_duration}, Median: {median_duration}, Std Dev: {std_duration}')
์๊ด๊ด๊ณ ํ์
- ์ฐ์ ๋: ๊ตฌ๋งค ์ ํ์จ๊ณผ ์ฒด๋ฅ ์๊ฐ์ ๊ด๊ณ๋ฅผ ์ฐ์ ๋๋ก ๋ํ๋ด ์๊ด๊ด๊ณ๋ฅผ ํ์ํฉ๋๋ค.
# ์ฐ์ ๋: ๊ตฌ๋งค ์ ํ์จ๊ณผ ์ฒด๋ฅ ์๊ฐ
plt.figure(figsize=(8, 6))
sns.scatterplot(x='session_duration', y='conversion', data=data)
plt.title('Session Duration vs Conversion Rate')
plt.xlabel('Session Duration')
plt.ylabel('Conversion Rate')
plt.show()
์ด์์น ์๋ณ
- ๋ฐ์ค ํ๋กฏ: ๋ฐ์ค ํ๋กฏ์ ์ฌ์ฉํ์ฌ ์ฒด๋ฅ ์๊ฐ์ ์ด์์น๋ฅผ ์๋ณํ๊ณ ์ฒ๋ฆฌ ๋ฐฉ์์ ๊ณ ๋ คํฉ๋๋ค.
data = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
plt.boxplot(data)
plt.title('Box Plot')
plt.ylabel('Value')
plt.show()
์๊ด๊ด๊ณ ๋ถ์
๊ฐ ๋ณ์๋ค์ด ๊ตฌ๋งค ์ ํ์จ๊ณผ ๊ฐ๋ ์๊ด๊ด๊ณ์ ์ธ๊ณผ๊ด๊ณ๋ฅผ ๋ถ์ํฉ๋๋ค.
- ํผ์ด์จ ์๊ด ๊ณ์๋ฅผ ๊ณ์ฐํ์ฌ ์ฒด๋ฅ ์๊ฐ๊ณผ ๊ตฌ๋งค ์ ํ์จ ๊ฐ์ ์ ํ ๊ด๊ณ๋ฅผ ํ์ ํฉ๋๋ค.
# ์๊ด๊ด๊ณ ๋ถ์
# ํผ์ด์จ ์๊ด ๊ณ์ ๊ณ์ฐ
corr, _ = pearsonr(data['session_duration'], data['conversion'])
print(f'Pearson correlation between session duration and conversion: {corr}')
# Pearson correlation between session duration and conversion: -0.05994324020560468
- ์ธ๊ณผ๊ด๊ณ๋ฅผ ์ ์ถํ๊ธฐ ์ํด ์ถ๊ฐ์ ์ธ ๋ณ์๋ค(์: ํ์ด์ง ๋ทฐ, ์ธ์ ์ค ๋ฐ์ํ ์ด๋ฒคํธ ์)์ ๊ณ ๋ คํ์ฌ ๋ค์ค ํ๊ท๋ถ์์ ์ํํฉ๋๋ค.
# ๋ค์ค ํ๊ท๋ถ์ ์ํ
X = data[['session_duration', 'page_views']]
X = sm.add_constant(X) # ์์ ํญ ์ถ๊ฐ
y = data['conversion']
model = sm.OLS(y, X).fit()
print(model.summary())
OLS Regression Results
==============================================================================
Dep. Variable: conversion R-squared: 0.004
Model: OLS Adj. R-squared: -0.007
Method: Least Squares F-statistic: 0.3555
Date: Sat, 20 Jul 2024 Prob (F-statistic): 0.701
Time: 14:13:00 Log-Likelihood: -80.153
No. Observations: 200 AIC: 166.3
Df Residuals: 197 BIC: 176.2
Df Model: 2
Covariance Type: nonrobust
====================================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------------
const 0.2309 0.103 2.246 0.026 0.028 0.434
session_duration -0.0156 0.019 -0.841 0.401 -0.052 0.021
page_views 0.0002 0.010 0.024 0.981 -0.020 0.020
==============================================================================
Omnibus: 72.128 Durbin-Watson: 2.055
Prob(Omnibus): 0.000 Jarque-Bera (JB): 141.950
Skew: 1.897 Prob(JB): 1.50e-31
Kurtosis: 4.625 Cond. No. 29.6
==============================================================================
Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
๊ฐ์ค ๊ฒ์ ๋ฐ A/B ํ ์คํธ
- ๋ณ๊ฒฝ๋ UI๊ฐ ๊ตฌ๋งค ์ ํ์จ์ ๊ธ์ ์ ์ธ ์ํฅ์ ๋ฏธ์ณค๋์ง๋ฅผ ํต๊ณ์ ์ผ๋ก ๊ฒ์ฆํฉ๋๋ค.
- ์ฌ์ฉ์๋ฅผ ๋ ๊ทธ๋ฃน(๊ธฐ์กด UI์ ์ UI ์ฌ์ฉ์)์ผ๋ก ๋๋๊ณ , ์ด๋ค ๊ฐ์ ๊ตฌ๋งค ์ ํ์จ์ ๋น๊ตํฉ๋๋ค.
- ์ฌ์ฉ์๋ฅผ ๋ฌด์์๋ก ๋ ๊ทธ๋ฃน(A: ๊ธฐ์กด UI, B: ์ UI)์ผ๋ก ํ ๋นํฉ๋๋ค.
# ๊ฐ์ค ๊ฒ์ ๋ฐ A/B ํ
์คํธ
# A/B ํ
์คํธ๋ฅผ ์ํ ๋
๋ฆฝ ํ๋ณธ T๊ฒ์ ์ํ
group_A = data[data['ui_type'] == 'A']['conversion']
group_B = data[data['ui_type'] == 'B']['conversion']
t_stat, p_value = ttest_ind(group_A, group_B)
print(f'T-statistic: {t_stat}, P-value: {p_value}')
# T-statistic: 1.3672469278991675, P-value: 0.1730980605898706
- ๊ฐ ๊ทธ๋ฃน์ ๊ตฌ๋งค ์ ํ์จ์ ๊ณ์ฐํ๊ณ , ๋ ๊ทธ๋ฃน ๊ฐ์ ์ฐจ์ด๋ฅผ ํ๊ฐํ๊ธฐ ์ํด ๋ ๋ฆฝ ํ๋ณธ T๊ฒ์ ์ ์ํํฉ๋๋ค.
- p-๊ฐ๊ณผ ์ ์ ์์ค(0.05)์ ๋น๊ตํ์ฌ ๊ท๋ฌด ๊ฐ์ค(๋ UI ๊ฐ์ ์ฐจ์ด๊ฐ ์๋ค)์ ๊ธฐ๊ฐ ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํฉ๋๋ค.
# ์ ์ ์์ค 0.05์์ ๊ท๋ฌด ๊ฐ์ค ๊ธฐ๊ฐ ์ฌ๋ถ ๊ฒฐ์
alpha = 0.05
if p_value < alpha:
print("๊ท๋ฌด ๊ฐ์ค ๊ธฐ๊ฐ: ๋ UI ๊ฐ์ ์ ์๋ฏธํ ์ฐจ์ด๊ฐ ์์")
else:
print("๊ท๋ฌด ๊ฐ์ค ์ฑํ: ๋ UI ๊ฐ์ ์ ์๋ฏธํ ์ฐจ์ด๊ฐ ์์")
# ๊ท๋ฌด ๊ฐ์ค ์ฑํ: ๋ UI ๊ฐ์ ์ ์๋ฏธํ ์ฐจ์ด๊ฐ ์์
- ํต๊ณ์ ๊ฒ์ ์ ํตํด ์ป์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ์ผ๋ก UI ๋ณ๊ฒฝ์ ํจ๊ณผ๋ฅผ ํ๊ฐํฉ๋๋ค.
# ํต๊ณ์ ๊ฒ์ ์ ํตํด ์ป์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ์ผ๋ก UI ๋ณ๊ฒฝ์ ํจ๊ณผ ํ๊ฐ
if p_value < alpha:
print("์๋ก์ด UI๊ฐ ๊ตฌ๋งค ์ ํ์จ์ ๊ธ์ ์ ์ธ ์ํฅ์ ๋ฏธ์ณค์ต๋๋ค.")
else:
print("์๋ก์ด UI๊ฐ ๊ตฌ๋งค ์ ํ์จ์ ์ ์๋ฏธํ ์ํฅ์ ๋ฏธ์น์ง ์์์ต๋๋ค.")
# ์๋ก์ด UI๊ฐ ๊ตฌ๋งค ์ ํ์จ์ ์ ์๋ฏธํ ์ํฅ์ ๋ฏธ์น์ง ์์์ต๋๋ค.
Conclusion (๊ฒฐ๋ก )
- ํผ์ด์จ ์๊ด ๊ณ์: ์ฒด๋ฅ ์๊ฐ๊ณผ ๊ตฌ๋งค ์ ํ์จ ๊ฐ์ ์ ํ ์๊ด๊ด๊ณ๋ฅผ ์์น์ ์ผ๋ก ํ๊ฐํ ์ ์์ต๋๋ค. ์ด ๊ฐ์ด 1์ ๊ฐ๊น์ธ์๋ก ๊ฐํ ์์ ์๊ด๊ด๊ณ๋ฅผ, -1์ ๊ฐ๊น์ธ์๋ก ๊ฐํ ์์ ์๊ด๊ด๊ณ๋ฅผ ์๋ฏธํฉ๋๋ค. 0์ ๊ฐ๊น์ธ์๋ก ์๊ด๊ด๊ณ๊ฐ ๊ฑฐ์ ์์์ ๋ํ๋ ๋๋ค.
- ๋ค์ค ํ๊ท๋ถ์: ์ฒด๋ฅ ์๊ฐ, ํ์ด์ง ๋ทฐ ๋ฑ ์ฌ๋ฌ ๋ณ์๋ฅผ ๊ณ ๋ คํ์ฌ ๊ตฌ๋งค ์ ํ์จ์ ๋ํ ์ํฅ์ ๋ถ์ํ ์ ์์ต๋๋ค. ํ๊ท ๋ชจ๋ธ์ ๊ฒฐ๊ณผ๋ฅผ ํตํด ๊ฐ ๋ณ์์ ๊ธฐ์ฌ๋๋ฅผ ํ์ ํ ์ ์์ต๋๋ค.
Pearson correlation between session duration and conversion: -0.05994324020560468
- ํ์ด์ง์์์ ์ฒด๋ฅ์๊ฐ๊ณผ ๊ตฌ๋งค ์ ํ์จ์ ์๊ด ๊ด๊ณ๋ 0์ ๊ฑฐ์ด ๊ฐ๊น์์ผ๋ก ๊ฑฐ์ด ์๊ด๊ด๊ณ๊ฐ ์์์ ๋ํ๋ ๋๋ค.
- T๊ฒ์ ๊ฒฐ๊ณผ: ๋ UI ๊ทธ๋ฃน ๊ฐ์ ๊ตฌ๋งค ์ ํ์จ ์ฐจ์ด๋ฅผ ํ๊ฐํ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์์ต๋๋ค. T๊ฒ์ ์ t-ํต๊ณ๋๊ณผ p-๊ฐ์ ํตํด ๋ ๊ทธ๋ฃน ๊ฐ์ ์ฐจ์ด๊ฐ ํต๊ณ์ ์ผ๋ก ์ ์๋ฏธํ์ง ์ฌ๋ถ๋ฅผ ํ๋จํ ์ ์์ต๋๋ค.
- ๊ท๋ฌด ๊ฐ์ค์ ๊ธฐ๊ฐ ์ฌ๋ถ: p-๊ฐ์ด ์ ์ ์์ค(alpha)๋ณด๋ค ์์ผ๋ฉด ๊ท๋ฌด ๊ฐ์ค์ ๊ธฐ๊ฐํฉ๋๋ค. ์ด๋ ๋ UI ๊ฐ์ ์ ์๋ฏธํ ์ฐจ์ด๊ฐ ์์์ ์๋ฏธํฉ๋๋ค. ๋ฐ๋๋ก p-๊ฐ์ด ์ ์ ์์ค๋ณด๋ค ํฌ๋ฉด ๊ท๋ฌด ๊ฐ์ค์ ์ฑํํฉ๋๋ค. ์ด๋ ๋ UI ๊ฐ์ ์ ์๋ฏธํ ์ฐจ์ด๊ฐ ์์์ ์๋ฏธํฉ๋๋ค.
P-value์ ํด์-
P-value: 0.1730980605898706
์ ์ ์์ค (alpha): 0.05
P-value๊ฐ 0.05๋ณด๋ค ํฌ๋ฏ๋ก, ๊ท๋ฌด ๊ฐ์ค์ ๊ธฐ๊ฐํ ์ ์์ต๋๋ค.
P-value๊ฐ ์ ์ ์์ค 0.05๋ณด๋ค ํฌ๋ฏ๋ก, ๋ UI ๊ฐ์ ๊ตฌ๋งค ์ ํ์จ์ ์ ์๋ฏธํ ์ฐจ์ด๊ฐ ์๋ค๊ณ ๊ฒฐ๋ก ์ง์ ์ ์์ต๋๋ค.
์ฆ, ๋ฐ์ดํฐ ๋ถ์ ๊ฒฐ๊ณผ ์๋ก์ด UI๊ฐ ๊ธฐ์กด UI์ ๋นํด ๊ตฌ๋งค ์ ํ์จ์ ์ ์๋ฏธํ ์ํฅ์ ๋ฏธ์น์ง ์์์ต๋๋ค.
๊ฒฐ๋ก ์ ๊ท๋ฌด ๊ฐ์ค ์ฑํ์ด ๋์๋ค๊ณ ๋ณผ ์ ์์ต๋๋ค.
'๐ Data Analysis' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Data Analysis] Data Visualization (๋ฐ์ดํฐ ์๊ฐํ) & ์๊ฐ์ ์ธ์ง (0) | 2024.07.25 |
---|---|
[Data Analysis] ์๊ณ์ด ๋ฐ์ดํฐ & ๋ค๋ณ๋ ๋ถ์ (0) | 2024.07.21 |
[Data Analysis] ๊ธฐ์ด ํต๊ณ, ์๊ด & ์ธ๊ณผ๊ด๊ณ (0) | 2024.07.18 |
[Data Analysis] ๋ฐ์ดํฐ์ ์ข ๋ฅ์ ์์ฑ & ๋ฐ์ดํฐ ํ์ (EDA) (0) | 2024.07.18 |
[Data Analysis] Data Analysis - ๋ฐ์ดํฐ ๋ถ์ (0) | 2024.07.17 |