통계적 검정 방법의 종류와 활용법에 대해 학습하였습니다.
데이터 유형에 따른 적절한 검정 기법 분류와 함께,
t-test, ANOVA, 카이제곱, 로지스틱 회귀의 원리 및 코드 예제를 실습하였습니다.
⚠️본 글은 부트캠프 수업 내용을 기반으로 한 개인 학습 기록입니다.
✅ 통계 검정 분류 기준
| 입력(x) | 출력(y) | 사용 기법 | 예시 |
| 수치형 | 수치형 | 회귀분석 | 공부 시간(x)으로 점수(y) 예측 |
| 수치형 | 범주형 | 로지스틱 회귀 | 체온(x)으로 질병 유무(y) 예측 |
| 범주형 | 수치형 | t-test, ANOVA | 성별(x)에 따른 키(y) 차이 |
| 범주형 | 범주형 | 카이제곱 검정 | 성별(x)과 구매여부(y) 독립성 |
✅ 정규성 검정
📌 샤피로 검정 (shapiro)
- 정규분포를 따르는지 검정하여 t-test, ANOVA 가능 여부를 확인한다
- 정규성 만족 시 → t-test/ANOVA 가능
- 정규성 불만족 시 → 비모수 검정 사용 고려
- 비모수 검정 : Mann-Whitney U test(2집단), Kruskal-Wallis(3집단 이상)
#성별로 나눈 팁 데이터를 각각 정규성 검정에 사용
shapiro_male = stats.shapiro(male_tips)
shapiro_female = stats.shapiro(female_tips)
#검정 결과 출력 (통계량, p-value 확인)
print(shapiro_male)
print(shapiro_female)
#출력결과
ShapiroResult(statistic=np.float64(0.8758690617789388), pvalue=np.float64(3.7084828294513925e-10))
ShapiroResult(statistic=np.float64(0.9567775372726819), pvalue=np.float64(0.005448280473692281))
# 통계량(0~1) : 1에 가까울수록 정규분포에 가까움
# p-value > 0.05 → 정규성 있음 / p-value ≤ 0.05 → 정규성 없음
✅ t-검정 (t-test)
| 유형 | 설명 | 예시 |
| 단일표본 t-test | 한 집단의 평균이 특정 값과 다른지 검정 | 우리 학교 학생 평균 키가 170cm와 다른가 |
| 독립표본 t-test | 두 독립 집단 간 평균 차이 | 남녀의 수학 점수 차이 |
| 대응표본 t-test | 동일 집단의 두 시점 비교 | 다이어트 전후 체중 변화 |
📌 전제 조건 (t-test, ANOVA 동일)
- 정규성 (Shapiro-Wilk) : 데이터가 정규분포를 따른다
- 등분산성 (Levene Test) : 두 집단의 분산이 동일하다
- 독립성 : 서로 다른 집단의 데이터는 독립적이다
📌 equal_var 설정에 따른 차이
- equal_var = True
- 두 집단의 분산이 같다고 가정
- Student's t-test
- equal_var = False
- 두 집단의 분산이 다를 수 있다고 가정
- Welch's t-test (더 일반적)
from scipy import stats
# 예시: 성별에 따른 팁 차이
male = df[df['sex'] == 'Male']['tip']
female = df[df['sex'] == 'Female']['tip']
stats.ttest_ind(male, female, equal_var=False)
✅ 분산분석 (ANOVA)
- 세 그룹 이상에서 평균 차이가 통계적으로 유의한지 검증
- 그룹 간 분산(변동)과 그룹 내 분산(오차)를 비교하여 F-통계량 도출
📌 t-test, ANOVA 전제 조건 동일함
#ANOVA 분석 예제
#f_oneway() : 일원분산분석(One-Way ANOVA) 수행 함수, 간단한 ANOVA 분석
import statsmodels.api as sm
from statsmodels.formula.api import ols #ols() : 선형회귀모델 생성
model = ols('Q("sepal length (cm)") ~C(species)', data=df).fit()
#Q("sepal length (cm)") ~C(species)의 구조
#종속변수 ~ 독립변수
#Q("sepal length (cm)") → 종속변수 (결과값, y)
#C(species) → 독립변수 (설명자, x)
#범주형 독립변수 (x) → 수치형 종속변수 (y)에 영향을 주는지 분석
#항상 결과값 ~ 설명자 (y ~ x)의 순서로 작성
anova_table = sm.stats.anova_lm(model, typ=2)
#anova_lm : anova 분석 수행
#typ = 2 : 분산분석 방식 중 type 2 ANOVA
anova_table
📌 Tukey's HSD Test : 분산 분석 결과에서 통계적으로 유의미한 차이가 있는 경우, 어떤 그룹 간에 차이가 나는지 알아보는 쌍별 비교(post-hoc test) 방법
#사후 검정 (Tukey’s HSD)
from statsmodels.stats.multicomp import pairwise_tukeyhsd
tukey = pairwise_tukeyhsd(endog=df['sepal length (cm)'], groups = df['species'], alpha=0.05)
print(tukey)
#endog = : 종속변수
#groups = : 독립변수 그룹
#alpha=0.05 : 유의수준 5% -> p-value < 0.05면 유의미한 차이로 판단
✅ 카이제곱검정 (Chi-Square Test)
| 종류 | 설명 | 예시 |
| 적합성 검정 | 관측된 데이터가 특정 분포나 비율을 따르는지 검정 | 성별 비율이 1:1인가? |
| 독립성 검정 | 두 범주형 변수가 서로 독립적인지 검정 | 성별과 구매 여부의 관련성 |
🔹 카이제곱 적합성 검정 예제
#카이제곱 적합성 검정
#expected_ratio : 기대비율을 넘파이 배열로 저장
expected_ratio = np.array([3, 2, 5]) # 4기통:6기통:8기통 = 3:2:5
#전체 비율의 합은 3+2+5=10, 각각의 비율을 확률처럼 정규화
#[3/10, 2/10, 5/10] → [0.3, 0.2, 0.5]
expected_prop = expected_ratio / expected_ratio.sum()
expected_specific = n_total * expected_prop #각 비율에 총합을 곱해 기대값 계산
chi2_stat2, p_value2 = chisquare(f_obs=observed_cyl.values,f_exp=expected_specific)
#observed_cyl.values : 실제 관측값 [11, 7, 14]
#expected_specific : 기대값 [9.6, 6.4, 16.0]
#chisquare() 함수로 적합성 검정 수행
print(chi2_stat2) #chi2_stat2 : 카이제곱 통계량
print(p_value2) #p_value2 : 유의확률 (p-value)
📍 비율이 바뀌어도 expected_ratio만 바꾸면 되므로 재사용성, 가독성 좋음
🔹 카이제곱 독립 검정 예제
from scipy.stats import chi2_contingency
observed = contingency_table.iloc[:-1, :-1].values
#교차표에서 마지막 행과 마지막 열(합계)부분 제거 후, 모델에 넣기 위한 사전 작업
#.values : 넘파이 배열로 변환
chi2_stats, p_val, dof, excepted = chi2_contingency(observed)
print(chi2_stats) #카이제곱 통계량
print(p_val) #p-value
print(dof) #자유도
print(excepted) #기대빈도표 (변수들이 독립적이라고 가정했을 때 예상되는 값들)
✅ 로지스틱회귀 (Logistic Regression)
📌로지스틱 회귀란?
- 종속변수가 이진형(Binary)인 경우 사용하는 회귀분석
- 결과는 확률로 해석되며, 0~1 사이 값을 예측
- 일반 선형회쉬와 달리, 시그모이드 함수(logistic function)를 씀
df['sex_binary'] = (df['sex'] == 'Male').astype(int)
#.astype(int) : True면 1, False면 0, 결과적으로 남성은 1, 여성은 0
#로지스틱 회귀
#logit('종속변수 ~ 독립변수',data...) : 종속변수는 무조건 이진형(0과 1)이어야 함
model = logit('sex_binary ~ tip', data=df).fit() #fit() : 모델을 실제 데이터로 학습
print(model.summary()) #coef 값, p-value 등을 통해 결과 해석 가능
🔍 참고
로지스틱 회귀의 출력값(y)은 0과 1처럼 수치형으로 보일 수 있지만, 실제로는 이진 범주형 데이터로 해석된다
즉, 숫자처럼 보여도 범주형(yes/no, 있음/없음)을 분류하는 데 사용된다
✅ 검정 해석
| 요소 | 해석 방식 |
| 귀무가설(H₀) | 차이/효과 없음 |
| 대립가설(H₁) | 차이/효과 있음 |
| p-value < 0.05 | 대립가설 채택 |
| p-value ≥ 0.05 | 귀무가설 채택 |
✅ 오류 유형
- 1종 오류
- 귀무가설이 실제로 참인데도 불구하고 그것을 기각하는 실수
- 아무일도 없는데 큰일 났다고 착각하는 것
- 오류를 저지를 확률을 알파 또는 유의수준 이라고 함
- 예 : 건강한 사람에게 암에 걸렸다고 오진하는 경우
- 2종 오류
- 귀무가설이 실제로는 거짓인데도 그것을 기각하지 못하는 실수
- 분명 문제가 있는데 놓치거나 괜찮다고 판단하는 것
- 오류를 저지를 확률을 베타라고 함
- 예 : 암 환자를 건강하다고 진단하는 경우
- 재판에서는 1종 오류가 치명적, 질병을 진단하는 경우에서는 2종 오류가 더 치명적이다
✅ 통계 검정별 함수
#t-검정 (t-test)
from scipy import stats # t검정 함수
from statsmodels.formula.api import ols # t검정 결과 시각화용 모델 (옵션)
#분산 분석 (ANOVA)
from statsmodels.formula.api import ols # 선형 모델 생성
import statsmodels.api as sm # ANOVA 실행
from statsmodels.stats.multicomp import pairwise_tukeyhsd # 사후 검정
#로지스틱 회귀
import statsmodels.api as sm
from statsmodels.formula.api import logit # 로지스틱 회귀 함수
#카이제곱 검정
from scipy.stats import chi2_contingency # 독립성 검정
from scipy.stats import chisquare # 적합성 검정
✔️ 핵심 함수 요약표
| 검정 종류 | 주요 함수 |
| 정규성 검정 | stats.shapiro() |
| 등분산성 검정 | stats.levene() |
| t-검정 | stats.ttest_ind() , stats.ttest_rel() |
| ANOVA | ols() , sm.stats.anova_lm() |
| 사후 검정 | pairwise_tukeyhsd() |
| 카이제곱 검정 | chisquare() , chi2_contingency() |
| 로지스틱 회귀 | logit() |
'부트캠프 정리' 카테고리의 다른 글
| [멋쟁이사자처럼 데이터분석 부트캠프 7주차]-시각화 (5) | 2025.08.27 |
|---|---|
| [멋쟁이사자처럼 데이터분석 부트캠프 5주차]-데이터전처리기초 (6) | 2025.07.31 |
| [멋쟁이사자처럼부트캠프 데이터분석 2주차]-파이썬 모듈/데이터분석 기초 (8) | 2025.07.25 |
| [멋쟁이사자처럼 데이터분석 부트캠프 1주차]-파이썬 기초 (16) | 2025.07.24 |
| [멋쟁이사자처럼 데이터분석 부트캠프 4주차]-SQL (2) | 2025.07.22 |