평균 분석과 ANOVA
평균 분석과 ANOVA
주요 통계 분포
F-분포 (F-distribution) : 집단간 분산 / 집단내 분산
- 용도: 집단 간 분산과 집단 내 분산의 비율 분석
- 적용 사례:
- 분산 분석(ANOVA)
- 등분산성 검정
카이제곱 분포 (Chi-squared distribution)
- 공식: ∑[(관측값 - 기대값)² / 기대빈도]
- 용도:
- 적합도 검정
- 독립성 검정
t-분포 (t-distribution)
- 특징:
- 표본 크기가 작을 때 정규 분포 대신 사용
- 꼬리가 두꺼워 신뢰구간이 넓음(보수적 판단)
- 용도:
- 두 집단의 평균 차이 검정(평균차/표준오차)
- 신뢰구간 추정
분산 분석 계열
ANOVA (분산 분석)
- 여러 집단 간의 평균 차이를 검정하기 위해 사용
- 유형:
- 일원분산분석(One-way): 1개 독립변수, 3개 이상 집단 비교
- 이원분산분석(Two-way): 2개 이상 독립변수 고려
- 가정:
- 정규성
- 등분산성
- 독립성
ANCOVA (공분산 분석)
- 특징:
- ANOVA + 회귀 분석 결합
- 공변량(초기값) 통제 후 분석
- 장점: 초기값이나 외부 요인의 영향을 통제하여 보다 정확한 결과를 도출하는 데 유용
MANOVA (다변량 분산 분석)
- 차이점: 종속변수 2개 이상 사용
- 장점: 여러 종속변수 간의 상호 관계를 고려하여 집단 간의 평균 차이를 검정
MANCOVA (다변량 공분산 분석)
- 특징: MANOVA와 ANCOVA의 결합. 공변량 통제 -> 여러 종속변수의 상호 관계를 동시에 분석
구조 방정식 모델링 (SEM)
- 목적: 변수 간 인과관계 분석. 관찰된 변수와 잠재 변수(관찰되지 않은 변수)를 모두 고려하여 변수들 간의 관계를 구조적으로 분석
- 구성 요소:
- 관측 변수
- 잠재 변수
- 경로 분석
- 활용: 복잡한 변수 관계 모델링
정규성 및 가설 검정
가설 검정 유형
| 검정 유형 | 모수적 검정 | 비모수적 검정 |
|---|---|---|
| 정규성 | 만족 시 사용 | 불만족 시 사용 |
| 예시 | t-test, ANOVA , Revenue’s test | Wilcoxon, Levene’s Test, Bartlett’s test |
| 표본 크기 | 대규모 표본 유리 | 소규모 표본 가능 |
주요 검정 방법
1. Shapiro-Wilk Test
- 용도: 데이터 정규성 검정
- 특징: 소표본(3 ≤ n ≤ 50)에 최적화
2. Wilcoxon Rank-Sum Test
- 용도: 두 독립 집단 중앙값 차이 검정
- 가정:
- 연속형 데이터
- 데이터 순위 사용
3. Variance test or F-Test (등분산성 검정)
- 용도: 두 집단 간의 분산 차이를 검정하는 데 사용, 두 집단이 동일한 분산을 가지는지 여부를 평가
- 결과 활용: t-test 시 var.equal 옵션 결정
- var.equal = TRUE: 두 집단의 분산이 동일하다고 가정합니다. 이러한 경우, 동질 분산 t-검정(Pooled t-test)이 수행됩니다.
- var.equal = FALSE (기본값): 두 집단의 분산이 다를 수 있다고 가정합니다. 이러한 경우, 웰치 t-검정(Welch’s t-test)이 수행됩니다.
R 함수 요약
정규성 검정 shapiro.test(data)
등분산성 검정 var.test(group1, group2)
Wilcoxon 검정 (비모수) wilcox.test(x, y, paired=FALSE)
t-test (모수) t.test(x, y, var.equal=TRUE/FALSE)
예제
x <- c(65, 78, 88, 55, 48, 95, 66, 57, 79, 81) t.test(x, mu = 75) # 결과 해석 # t = -0.764, p-value = 0.464 # 귀무가설 채택: 표본 평균(70.8)은 모평균 75와 유의미한 차이 없음 lung <- runif(20, min=19, max=20) t.test(lung, mu=20, conf.level=.99) # t = -9.59, p = 1.03e-08 # 귀무가설 기각: 폐암 발생률이 20과 유의미하게 다름 비율 검정
이항 검정
binom.test(c(125, 9), p=0.7) # p-value = 4.2e-11 # 성공률 125/134 = 93.3% → 70% 가설 기각 두 집단 비율 비교
prop.test(x = c(165, 246), n = c(500, 600)) # X² = 7.12, p = 0.0076 # 두 회사 흡연율 차이 통계적 유의성 확인 맥나마 검정 (McNemar’s Test)
사전-사후 설문 분석
Performance <- matrix(c(794, 86, 150, 570), nrow=2, dimnames=list("1st"=c("Approve","Disapprove"), "2nd"=c("Approve","Disapprove"))) mcnemar.test(Performance) # X² = 21.35, p = 3.8e-06 # 유의미한 의견 변화 발생 분포 시각화
t-분포 vs 정규분포
ggplot(data.frame(x=c(-3.3,3.3))) + stat_function(fun=dnorm, aes(color="N(0,1)")) + stat_function(fun=dt, args=list(df=3), aes(color="t(3)")) + stat_function(fun=dt, args=list(df=1), aes(color="t(1)")) 등분산 검정
var.test(extra ~ group, data = sleep) # F = 0.798, p-value = 0.7427 # 결론: 분산 동일 (α=0.05) t.test(extra ~ group, data = sleep, var.equal = TRUE) # t = -1.8608, df = 18, p-value = 0.07919 # 결론: 두 집단 평균 차이 없음 (p > 0.05) 정규성 검정
set.seed(450) x <- runif(300, 2, 4) shapiro.test(x) # p = 0.08995 → 정규성 위반 단측/양측 검정 비교
양측 검정 (Two-sided)
x <- rnorm(1000, 5.0, 0.5) t.test(x, mu = 5.2) # p < 2.2e-16 → 평균 차이 존재 단측 검정 (One-sided)
# 오른쪽 검정 (Greater) t.test(x, mu = 5.2, alternative = "greater") # p = 1 # 왼쪽 검정 (Less) t.test(x, mu = 5.2, alternative = "less") # p < 2.2e-16 Cars93 데이터 분석
미국 시장 내 수입차와 국산차 가격 차이 여부 확인 유의수준 α = 0.05
library(MASS) with(Cars93, tapply(Price, Original, summary)) boxplot(Price ~ Origin, data=Cars93, main = "원산지별 가격", xlab="원산지", ylab="가격") with(Cars93, tapply(Price, Origin, shapiro.test)) var.test(Price ~ Origin, data = Cars93) # p-value = 0.01387 wilcox.test(Price ~ Origin, data = Cars93, alternative=c("two.sided"), var.equal = T, exact=F, conf.level=0.95) # p-value = 0.6724 결과 해석
- 검정통계량: W = 1024.5
- 유의확률: p = 0.672
- 결론: 미국산과 수입차 가격 평균 차이 통계적으로 유의하지 않음 (p > 0.05)
효과 크기 분석 (Cohen’s d)
install.packages("effsize") library(effsize) group_A <- c(50,55,60,65,70,75,80,85,90,95) group_B <- c(45,50,55,60,65,70,75,80,85,90) cohen_d <- cohen.d(group_A, group_B) cohen_d # d estimate: 0.5 (중간 효과) # 수동계산 mean_diff <- mean(group_A) - mean(group_B) pooled_sd <- sqrt(((9*sd(group_A)^2) + (9*sd(group_B)^2))/18) cohen_d_manual <- mean_diff/pooled_sd # 0.5 값 범위 효과 크기 0.2 ≤ d < 0.5 : 작은 효과 0.5 ≤ d < 0.8 : 중간 효과 d ≥ 0.8 : 큰 효과
비모수 검정 (Wilcoxon)
dataset <- data[c('method', 'score')] method1_score <- subset(dataset, method==1)$score method2_score <- subset(dataset, method==2)$score wilcox.test(method1_score, method2_score) # W = 10279, p-value = 0.0016 # 방향성 검정 wilcox.test(method1_score, method2_score, alternative="greater") # p=0.0008 wilcox.test(method1_score, method2_score, alternative="less") # p=0.999 대응표본 검정
paired_data <- read.csv("paired_sample.csv") before <- paired_data$before after <- na.omit(paired_data$after) wilcox.test(before, after, paired=TRUE) # V = 856, p-value = 0.009 cohen.d(before, after) # d = -1.495 (큰 효과) 분산분석 (ANOVA)
data("InsectSprays") aov_model <- aov(count ~ spray, data=InsectSprays) summary(aov_model) # F=34.7, p=2.2e-16 # 사후 검정 TukeyHSD(aov_model) # sprayB-sprayA: p=0.005 # sprayC-sprayA: p=0.000 등분산이 아닌 경우(kruskal.test) var.equal=F
oneway.test(score ~ factor(method), data=data, var.equal = F) install.packages("PMCMRplus") library(PMCMRplus) gamesHowellTest(score ~ factor(method), data = data) # 정규성 검정을 통과하지 못하는 경우 (위의 결과) # 비모수 검정 : 등분산을 고려하지 않는다. kruskal.test(score~factor(method),data=data) This post is licensed under CC BY 4.0 by the author.