두 집단의 차이가 유의미할까? | 데이터 분석과 t검정
t검정: 두 집단 간 평균 차이의 통계적 유의성을 검증하는 방법. 표본 크기가 작거나 모집단의 표준편차를 모를 때 사용되는 핵심적인 통계 기법으로, 데이터 분석과 연구에서 널리 활용됩니다.
Mar 03, 2025

안녕하세요! 오늘은 제가 데이터 분석 수업에서 배운 t-test에 대해 간단히 정리해보려고 합니다. 처음 배워서 아직 많이 헷갈리지만, 제가 이해한 내용을 최대한 설명해볼게요.
t-test가 뭔가요?
t-test는 두 그룹 간의 평균 차이가 통계적으로 유의미한지 확인하는 방법이라고 배웠어요. 예를 들어, 새로운 약이 효과가 있는지 확인하고 싶을 때 사용할 수 있대요.
t-test의 종류
- 일표본 t-test (One-sample t-test): 하나의 그룹과 특정 값을 비교
- 독립표본 t-test (Independent t-test): 서로 다른 두 그룹을 비교
- 대응표본 t-test (Paired t-test): 같은 그룹의 전/후 비교
저는 아직 독립표본 t-test만 과제로 실습을 진행하면서 제대로 이해한 것 같아요. 다른 것들은 좀 더 공부와 실습이 필요해요.
t-test 계산 방법
t-test는 평균 차이를 표준 오차로 나누는 방식으로 계산한다고 했어요. 공식이 있긴 한데 아직 완전히 외우지는 못했어요.
# Python으로 t-test 하는 예시 코드
import scipy.stats as stats
# 두 그룹의 데이터
group1 = [23, 25, 21, 22, 27]
group2 = [19, 20, 18, 21, 20]
# t-test 수행
t_stat, p_value = stats.ttest_ind(group1, group2)
print(f"t-statistic: {t_stat}")
print(f"p-value: {p_value}\n")
# p < 0.05이면 통계적으로 유의미한 차이가 있다고 해석
if p_value < 0.05:
print(f"두 그룹은 통계적으로 유의미한 차이가 있습니다.\n평균1: {sum(group1) / len(group1)}\n평균2: {sum(group2) / len(group2)}")
else:
print("두 그룹은 통계적으로 유의미한 차이가 없습니다.")
#출력 결과
"""
t-statistic: 3.3567254331867566
p-value: 0.009980160624714575
두 그룹은 통계적으로 유의미한 차이가 있습니다.
평균1: 23.6
평균2: 19.6
"""
stats.ttest_ind 함수 소개
stats.ttest_ind
는 SciPy 라이브러리에서 제공하는 독립표본 t-test를 수행하는 함수입니다. 이 함수는 두 독립된 그룹의 평균을 비교할 때 사용합니다.함수 사용법과 파라미터
stats.ttest_ind(a, b, equal_var=True, nan_policy='propagate', alternative='two-sided')
주요 파라미터 설명:
- a, b: 비교할 두 샘플 데이터 (배열 또는 리스트)
- equal_var: 두 그룹의 분산이 같은지 여부 (True면 Student's t-test, False면 Welch's t-test)
- Student's t-test (equal_var=True): 두 그룹의 분산이 동일하다고 가정할 때 사용합니다. 이 방법은 두 그룹의 표본 크기가 크거나 분산이 비슷할 때 적합합니다. 계산이 비교적 간단하고 분석 결과가 직관적입니다. 분산 차이를 확인하려면 t검정 이전에 F검정을 실시합니다.
- Welch's t-test (equal_var=False): 두 그룹의 분산이 다를 수 있다고 가정할 때 사용합니다. 이 방법은 두 그룹의 표본 크기가 다르거나 분산이 크게 다를 때 더 정확한 결과를 제공합니다. 실제로 대부분의 데이터 분석에서는 분산이 동일하다고 확신할 수 없기 때문에 Welch's t-test를 사용하는 것이 더 안전합니다. 분산이 만약에 같더라도 검정 결과에 영향을 주지 않는다고 합니다.
- alternative: 검정 방향 ('two-sided', 'less', 'greater' 중 선택)
- two-sided: 양측 검정은 두 그룹 간 차이가 있는지만 확인하며, 어느 쪽이 더 큰지는 상관없습니다. 가장 일반적으로 사용됩니다.
- less: 단측 검정으로, 첫 번째 그룹의 평균이 두 번째 그룹보다 작은지 검정합니다. 대립가설은 "그룹 a의 평균 < 그룹 b의 평균"입니다.
- greater: 단측 검정으로, 첫 번째 그룹의 평균이 두 번째 그룹보다 큰지 검정합니다. 대립가설은 "그룹 a의 평균 > 그룹 b의 평균"입니다.
반환값
이 함수는 두 값을 반환합니다:
- t-statistic: t-통계량 값
- p-value: p-값
p-value가 일반적으로 사용하는 유의수준보다 작으면 귀무가설을 기각하고, 두 그룹 간에 통계적으로 유의미한 차이가 있다고 결론 내립니다.
일반적으로 t 통계량의 절대값이 t 임계값(critical value)보다 클 때 귀무가설을 기각합니다. t 임계값은 유의수준(α)과 자유도(df)에 따라 결정됩니다. 예를 들어, 유의수준 0.05에서 자유도가 18인 경우, t 임계값은 약 ±2.101입니다. 계산된 t 통계량의 절대값이 이 임계값보다 크면 귀무가설을 기각하고, 두 그룹 간에 유의미한 차이가 있다고 판단합니다.
다행히도 Python의
stats.ttest_ind
함수를 사용할 경우 이러한 비교는 자동으로 수행되며, p-value를 통해 결과를 확인할 수 있습니다. p-value가 유의수준보다 작다는 것은 곧 t 통계량이 t 임계값을 초과했다는 의미입니다.사용 시 고려사항
- 두 그룹의 데이터가 정규분포를 따르는지 확인해야 합니다.
- 정규분포 확인을 위해 다음과 같은 방법들을 사용할 수 있습니다:
- 시각적 방법: 히스토그램, QQ-plot으로 데이터 분포를 시각화합니다.
import matplotlib.pyplot as plt
import scipy.stats as stats
# 히스토그램 그리기
plt.hist(data, bins=30)
plt.title('Histogram')
plt.show()
# QQ-plot 그리기
stats.probplot(data, dist="norm", plot=plt)
plt.title('Q-Q Plot')
plt.show()
# Shapiro-Wilk 검정 (일반적으로 가장 강력한 검정)
stat, p_value = stats.shapiro(data)
print(f'Shapiro-Wilk: statistic={stat}, p-value={p_value}')
# Kolmogorov-Smirnov 검정
stat, p_value = stats.kstest(data, 'norm')
print(f'Kolmogorov-Smirnov: statistic={stat}, p-value={p_value}')
# 해석: p-value > 0.05이면 정규분포를 따른다고 가정할 수 있음
# "정규분포를 따른다."가 귀무가설이므로.
from scipy.stats import skew, kurtosis
# 왜도 계산 (정규분포는 0에 가까움)
sk = skew(data)
print(f'Skewness: {sk}')
# 첨도 계산 (정규분포는 0에 가까움, scipy에서는 3을 뺀 값을 반환)
kt = kurtosis(data)
print(f'Kurtosis: {kt}')
# 일반적으로 |왜도| < 1이고 |첨도| < 1 이면 근사적으로 정규분포로 간주
- 두 그룹의 분산이 같다고 가정할 수 없을 때는
equal_var=False
로 설정하세요.
- 방향성 가설(일방향 검정)을 검증할 때는
alternative
매개변수를 적절히 설정해야 합니다.
실제 분석 예시
이번주에 실습으로 건강검진 데이터에서 두 그룹의 공복혈당을 비교하는 t-test를 해봤어요. 결과적으로 p-value가 0에 가깝게 나와서 두 그룹의 평균은 통계적으로 유의미한 차이가 있다고 결론을 내렸어요.
우리가 업무나 실생활에서 두 값의 차이가 의미 있는지 확인이 필요할 때가 있어요. t-test를 적용하면 수치적으로 명확하게 의사결정할 수 있어서 도움이 많이 될 것 같아요.
Share article