Post

평균 분석과 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 testWilcoxon, 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.