통계 분석 워크플로우 정리
이 책에서 다룬 검정 방법을 흐름도와 치트시트로 정리합니다. 새 데이터를 만났을 때 "어떤 검정을 써야 하지"라는 질문이 생기면 이 챕터를 먼저 펼치세요.
검정 선택 흐름도
분석 목적과 변수 유형에 따라 적절한 검정을 선택하는 흐름입니다.
분석 목적이 무엇인가?
│
├─ 집단 간 평균 비교
│ │
│ ├─ 집단 수: 2개
│ │ ├─ 독립 집단
│ │ │ ├─ 정규성 O, 등분산 O → 독립 t-검정 (t.test, var.equal=TRUE)
│ │ │ ├─ 정규성 O, 등분산 X → Welch t-검정 (t.test, var.equal=FALSE)
│ │ │ └─ 정규성 X → Wilcoxon 순위합 검정 (wilcox.test)
│ │ └─ 대응 집단 (전후 비교)
│ │ ├─ 정규성 O → 대응 t-검정 (t.test, paired=TRUE)
│ │ └─ 정규성 X → Wilcoxon 부호순위 검정 (wilcox.test, paired=TRUE)
│ │
│ └─ 집단 수: 3개 이상
│ ├─ 정규성 O → 일원 분산분석 (aov)
│ │ └─ 유의미하면 → 사후 검정 (TukeyHSD)
│ └─ 정규성 X → Kruskal-Wallis 검정 (kruskal.test)
│ └─ 유의미하면 → 쌍별 Wilcoxon (pairwise.wilcox.test)
│
├─ 두 변수 간 관계 분석
│ │
│ ├─ 두 변수 모두 연속형
│ │ ├─ 정규성 O → Pearson 상관 (cor.test, method="pearson")
│ │ └─ 정규성 X → Spearman 상관 (cor.test, method="spearman")
│ │
│ ├─ 연속형 → 연속형 예측
│ │ ├─ 예측 변수 1개 → 단순 선형 회귀 (lm)
│ │ └─ 예측 변수 2개 이상 → 다중 선형 회귀 (lm)
│ │
│ └─ 범주형 → 범주형 관계
│ └─ 카이제곱 검정 (chisq.test)
│ └─ 기대빈도 < 5이면 → Fisher 정확 검정 (fisher.test)
│
└─ 이진 결과 예측
└─ 로지스틱 회귀 (glm, family=binomial)
정규성 검정 가이드
검정 선택 흐름도에서 "정규성 O/X"를 판단하는 방법입니다.
# 정규성 검정 도구 모음
# 1. Shapiro-Wilk 검정 (n < 5000 권장)
shapiro.test(x)
# p > 0.05: 정규분포를 따른다고 볼 수 있음
# 2. Q-Q 플롯으로 시각 확인
qqnorm(x)
qqline(x, col = "red")
# 점들이 직선에 가까울수록 정규분포에 가까움
# 3. 히스토그램 + 정규분포 곡선
hist(x, freq = FALSE, main = "분포 확인")
curve(dnorm(x, mean(x), sd(x)), add = TRUE, col = "red", lwd = 2)
표본이 클 때(n > 30)는 중심극한정리에 의해 평균의 분포가 정규분포에 가까워집니다. 이 경우 경미한 비정규성은 t-검정이나 ANOVA 결과에 큰 영향을 주지 않습니다.
핵심 함수 치트시트
기술통계
| 목적 | 함수 | 패키지 |
|---|---|---|
| 요약 통계 | summary(x) |
base |
| 평균 | mean(x, na.rm=TRUE) |
base |
| 중앙값 | median(x, na.rm=TRUE) |
base |
| 표준편차 | sd(x, na.rm=TRUE) |
base |
| 분산 | var(x, na.rm=TRUE) |
base |
| 사분위수 | quantile(x, probs=c(0.25,0.75)) |
base |
| 빈도표 | table(x) |
base |
| 그룹별 요약 | tapply(x, group, mean) |
base |
| 종합 기술통계 | describe(x) |
psych |
정규성 및 동질성 검정
| 목적 | 함수 | 패키지 |
|---|---|---|
| 정규성 (Shapiro-Wilk) | shapiro.test(x) |
base |
| 등분산 (Levene) | leveneTest(y ~ group) |
car |
| 등분산 (Bartlett) | bartlett.test(y ~ group) |
base |
평균 비교
| 목적 | 함수 | 패키지 |
|---|---|---|
| 독립 t-검정 | t.test(y ~ group, var.equal=TRUE) |
base |
| Welch t-검정 | t.test(y ~ group, var.equal=FALSE) |
base |
| 대응 t-검정 | t.test(before, after, paired=TRUE) |
base |
| Wilcoxon (독립) | wilcox.test(y ~ group) |
base |
| Wilcoxon (대응) | wilcox.test(before, after, paired=TRUE) |
base |
| 일원 ANOVA | aov(y ~ group) → summary() |
base |
| Tukey 사후 검정 | TukeyHSD(aov_result) |
base |
| Kruskal-Wallis | kruskal.test(y ~ group) |
base |
관계 분석
| 목적 | 함수 | 패키지 |
|---|---|---|
| Pearson 상관 | cor.test(x, y, method="pearson") |
base |
| Spearman 상관 | cor.test(x, y, method="spearman") |
base |
| 상관 행렬 | cor(df) |
base |
| 단순/다중 회귀 | lm(y ~ x1 + x2) |
base |
| 분산분석표 | anova(lm_result) |
base |
| 로지스틱 회귀 | glm(y ~ x, family=binomial) |
base |
범주형 분석
| 목적 | 함수 | 패키지 |
|---|---|---|
| 카이제곱 검정 | chisq.test(table) |
base |
| Fisher 정확 검정 | fisher.test(table) |
base |
| 비율 검정 | prop.test(x, n) |
base |
신뢰도 및 표본 계획
| 목적 | 함수 | 패키지 |
|---|---|---|
| Cronbach's α | alpha(df) |
psych |
| 표본 크기 (평균) | power.t.test(delta, sd, sig.level, power) |
base |
| 표본 크기 (비율) | power.prop.test(p1, p2, sig.level, power) |
base |
생존 분석
| 목적 | 함수 | 패키지 |
|---|---|---|
| 생존 객체 생성 | Surv(time, event) |
survival |
| KM 곡선 추정 | survfit(Surv ~ group) |
survival |
| 로그순위 검정 | survdiff(Surv ~ group) |
survival |
| KM 곡선 시각화 | ggsurvplot(km_fit) |
survminer |
공통 분석 파이프라인
분석 유형에 상관없이 공통으로 따르는 절차입니다.
# 1단계: 데이터 파악
str(data)
summary(data)
colSums(is.na(data))
# 2단계: 탐색적 시각화
# — 히스토그램, 박스플롯, 산점도로 분포 확인
# — 이상치, 편향, 클러스터 확인
# 3단계: 가정 검토
# — 정규성: shapiro.test() 또는 Q-Q 플롯
# — 등분산: leveneTest()
# — 독립성: 연구 설계에서 확인
# 4단계: 검정 수행
# — 위 흐름도에 따라 적절한 함수 선택
# — p값, 신뢰구간, 효과크기 함께 보고
# 5단계: 결과 해석
# — 통계적 유의성: p < 0.05 (또는 설정한 α)
# — 실질적 중요성: 효과크기 (Cohen's d, η², Cramer's V 등)
# — 신뢰구간: 0을 포함하는지 여부
# 6단계: 시각화
# — 검정 결과를 그림으로 표현
# — 오차막대, 신뢰구간, 유의성 표시 추가
# 7단계: 보고
# — R Markdown으로 재현 가능한 보고서 작성
오류 해석 주의사항
통계를 처음 배울 때 자주 빠지는 함정 세 가지를 기억해두세요.
첫째, p값이 작다고 효과가 크다는 뜻이 아닙니다. p값은 표본 크기에도 영향을 받습니다. 표본이 수만 명이면 아주 작은 차이도 p < 0.05가 됩니다. 효과크기(Cohen's d, η², Cramer's V 등)를 항상 함께 보고해야 합니다.
둘째, 귀무가설을 기각하지 못했다고 "차이가 없다"는 뜻이 아닙니다. "이 데이터로는 차이를 증명하지 못했다"는 뜻입니다. 표본이 충분히 크지 않았을 수 있습니다.
셋째, 상관관계는 인과관계가 아닙니다. 두 변수가 강하게 상관되어 있어도 하나가 다른 하나의 원인이라는 보장은 없습니다. 인과를 주장하려면 실험 설계나 도구 변수 같은 추가 방법이 필요합니다.