다양한 통계적 검정 방법
데이터 사이언스의 세계에서는 다양한 통계적 방법들이 중요한 역할을 한다. 이러한 방법들은 데이터를 분석하고, 숨겨진 패턴을 발견하며, 의미 있는 결론을 도출하는 데 필수적이다.
또한 귀무 가설(Null Hypothesis)과 대립 가설(Alternative Hypothesis)의 검정을 위해서도 통계적인 방법을 활용하여 유의미한 차이가 있는지 없는지 검토해야 한다.
t-검정부터 카이제곱 검정, ANOVA, 그리고 회귀 분석에 이르기까지 여러 통계적 검정 방법들의 기본 개념을 알아 보고, Python을 사용한 실제 샘플 코드와 그 결과를 분석하는 것까지 살펴보도록 하자.
t-검정(t-test)
- 목적: 두 집단 간 평균의 차이가 통계적으로 유의미한지를 평가한다.
- 종류:
- 독립 표본 t-검정: 두 독립적인 집단 간의 평균을 비교한다.
- 대응 표본 t-검정: 같은 집단의 전후 차이를 비교한다.
- 사용: t-검정은 표본 크기가 작고 데이터가 정규 분포를 따를 때 유용하다. t-통계량을 계산하여 이를 t-분포와 비교함으로써 귀무 가설을 기각할지 결정한다.
샘플 코드
from scipy import stats
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
# 샘플 데이터 생성
group1 = np.random.normal(100, 10, 30)
group2 = np.random.normal(90, 10, 30)
# t-검정 수행
t_statistic, p_value = stats.ttest_ind(group1, group2)
# t-검정 결과 시각화
plt.figure(figsize=(8, 5))
sns.histplot(group1, color="blue", kde=True)
sns.histplot(group2, color="orange", kde=True)
plt.title("t-Test: Distribution of Two Groups")
plt.tight_layout()
plt.show()
실행 결과
t-검정의 결과는 t-통계량(t-statistic)과 p-값(p-value)으로 제공된다.
- t-statistic: 3.89
t-통계량은 두 집단 간의 평균 차이를 표준 오차로 나눈 값이다. - p-value: 0.000262
t-statistic 값이 양수이므로 두번째 그룹의 평균이 첫번째 보다 크며, 두 그룹간의 평균차이가 존재한다 볼 수 있다.
p-value는 0.05보다 작기 때문에 두 집단간의 유의미한 차이가 있다고 해석할 수 있다.
카이제곱 검정(Chi-square Test)
- 목적: 범주형 변수 간의 독립성을 검정한다.
- 사용: 관측된 빈도와 기대 빈도 간의 차이를 카이제곱 통계량으로 계산하고, 이를 카이제곱 분포와 비교한다. 통계량이 높을수록 귀무 가설(변수 간 독립)을 기각할 가능성이 높다.
샘플 코드
from scipy.stats import chi2_contingency
import matplotlib.pyplot as plt
import seaborn as sns
# 샘플 데이터 생성
table = [[10, 20, 30], [20, 15, 35]]
# 카이제곱 검정 수행
chi2, p, dof, expected = chi2_contingency(table)
# 카이제곱 검정 결과 시각화
plt.figure(figsize=(8, 5))
sns.barplot(x=["Category 1", "Category 2", "Category 3"], y=np.sum(table, axis=0))
plt.title("Chi-Square Test: Category Frequencies")
plt.tight_layout()
plt.show()
실행 결과
카이 제곱 검정의 결과는 카이제곱 통계량(chi2)과 p-값(p-value), 자유도(dof), 기대빈도(Expected) 값 으로 제공된다.
- chi2: 3.684
카이제곱 통계량은 관측된 빈도와 기대 빈도 간의 차이를 수치화 하며, 값이 클수록, 관측된 데이터가 기대 빈도와 더 많이 달라진다. 이는 두 변수 간의 독립성이 떨어질 가능성을 시사한다. - p-value: 0.158
chi2 값 3.684는 변수간 일정 수준의 차이가 있음을 나타내지만,
p-value는 0.05보다 크기 때문에 두 집단간의 유의미한 차이가 없다고 해석할 수 있다.
ANOVA(Analysis of Variance)
- 목적: 세 개 이상의 집단 간 평균의 차이가 통계적으로 유의미한지 평가한다.
- 사용: 집단 간 및 집단 내 분산을 비교하여 f-통계량을 계산한다. f-통계량이 높으면 집단 간 평균에 유의미한 차이가 있다고 볼 수 있어 귀무 가설을 기각할 수 있다.
샘플 코드
from scipy.stats import f_oneway
import matplotlib.pyplot as plt
import seaborn as sns
# 샘플 데이터 생성
group1 = np.random.normal(100, 10, 30)
group2 = np.random.normal(110, 10, 30)
group3 = np.random.normal(90, 10, 30)
# ANOVA 검정 수행
f_statistic, p_value = f_oneway(group1, group2, group3)
# ANOVA 결과 시각화
plt.figure(figsize=(8, 5))
sns.boxplot(data=[group1, group2, group3])
plt.title("ANOVA: Group Comparisons")
plt.tight_layout()
plt.show()
실행 결과
ANOVA 검정의 결과는 f-통계량(f-statistic)과 p-값(p-value)으로 제공된다.
- f-statistic: 25.775
f-통계량은 집단 간 분산과 집단 내 분산의 비율을 나타낸다. - p-value: 1.62e-9
f-통계량 값이 25.775라는 것은, 집단 간의 평균 차이가 통계적으로 상당히 크다는 것을 의미하며, 집단 간에 실질적인 평균 차이가 존재할 가능성을 나타낸다.
p-value는 0.05보다 매우 작기 때문에 집단간의 유의미한 차이가 있다고 해석할 수 있다.
회귀 분석(Regression Analysis)
- 목적: 변수 간의 관계를 평가하고 예측 모델을 구축한다.
- 사용: 회귀 계수의 유의성을 t-검정 또는 f-검정을 통해 평가한다. 유의미한 회귀 계수는 귀무 가설(계수가 0이라는 가설)을 기각하는 근거가 된다.
샘플 코드
import statsmodels.api as sm
import matplotlib.pyplot as plt
import seaborn as sns
# 샘플 데이터 생성
data = pd.DataFrame({
'X1': np.random.rand(100),
'X2': np.random.rand(100),
'Y': np.random.rand(100)
})
# 회귀 분석 수행
X = data[['X1', 'X2']]
Y = data['Y']
X = sm.add_constant(X)
model = sm.OLS(Y, X).fit()
# 회귀 결과 시각화
sns.pairplot(data, x_vars=['X1', 'X2'], y_vars='Y', height=4, aspect=1, kind='reg')
plt.suptitle("Regression Analysis: Relationship Between X1, X2 and Y")
plt.tight_layout()
plt.show()
# 회귀 분석 결과 출력
model.summary()
실행 결과
회귀분석 결과는 다양한 값으로 제공된다.
- R-squared(결정 계수): 0.017
이는 모델이 종속 변수 Y의 변동성을 약 1.7%만 설명한다는 것을 의미한다. - Adj. R-squared(조정된 R-제곱): -0.003
이 값은 독립 변수의 수를 고려하여 조정된 R-제곱 값이며, 이 값이 낮다는 것은 모델이 데이터를 잘 설명하지 못한다는 것을 나타낸다. - f-statistic(f-통계량): 0.8586
모델의 전반적인 유의성을 평가하는 값으로, 일반적으로 F-통계량이 크면 모델이 유의미하다고 간주한다. - Prob(f-statistic)(f-통계량의 p-값): 0.427
이 값이 0.05보다 크기 때문에 이 모델이 전체적으로 유의미하지 않다는 것을 나타낸다. - const(상수항): 60.4978
p 값이 0.05보다 작으므로 통계적으로 유의미함을 나타낸다. - X1: -4.6993
p 값이 0.05보다 크므로(p = 0.657) 통계적으로 유의미하지 않음을 나타낸다. - X2: -13.8479
p 값이 0.05보다 크므로(p = 0.211) 통계적으로 유의미하지 않음을 나타낸다. - Omnibus/Prob(Omnibus): 45.151 / 0.000
잔차의 정규성 검정 결과, 이 모델의 잔차가 정규 분포를 따르지 않을 가능성이 높음을 나타낸다.
일반적으로 낮은 Omnibus 값과 높은 Prob(Omnibus) 값은 잔차가 정규 분포를 따른다는 것을 나타낸다. - Durbin-Watson: 1.915
이 값은 잔차의 독립성을 나타내며, 일반적으로 1.5~2.5 사이면 독립으로 간주한다. - Jarque-Bera (JB)/Prob(JB): 6.445 / 0.0399
잔차의 정규성에 대한 추가적인 검정 결과, 이 모델의 잔차가 정규 분포를 따르지 않을 수 있음을 나타낸다.
Jarque-Bera 값이 크고 Prob(JB) 값이 낮으면(예: 0.05 미만), 잔차가 정규 분포를 따르지 않을 가능성이 높다는 것을 의미한다. - Condition Number: 5.62
다중공선성(multicollinearity)의 존재를 나타내는 지표로 일반적으로 10~30 미만이면 다중공선성 문제가 없다고 간주한다.