교차분석 (카이제곱 검정)
두 개 이상의 범주형 변수를 교차표(contingency table)로 정리하여 변수 간 관계를 분석하는 방법
이때 주로 사용되는 통계적 검정이 카이제곱(χ²) 검정
카이제곱 검정
- 설명 변수가 범주형 변수인 경우에 적용
- 데이터에서 각 범주에 따른 결과 변수의 분포를 비교하거나
두 개 이상의 범주형 변수 간에 통계적으로 유의미한 관련성(독립성 여부)이 존재하는지를 검정
카이제곱 검정의 유형 ( 특히 명목형일 때 )
- 적합성 검정 => 오차 ㄱㅊ?
- 하나의 범주형 변수에 대해 관측된 빈도 분포가 이론적·기대 분포와 일치하는지를 검정함
- 데이터가 가정한 분포에서 크게 벗어나지 않는지(오차가 허용 가능한 수준인지)를 확인함
- 독립성 검정 => 독립 ㅇㅇ?
- 하나의 모집단이 두 개의 범주형 변수에 의해 분류되었을 때 두 변수가 서로 독립적인지, 또는 관련성이 존재하는지를 검정함
- 교차분석에서 가장 일반적으로 사용되는 형태임
- 동질성 검정 (집단 간 분포 동일성 비교)
- 서로 다른 여러 모집단에서 하나의 범주형 변수에 대한 분포가 동일한지를 검정함
- 각 집단 간 비율이나 분포의 차이가 존재하는지를 확인함

분산분석(ANOVA)에서 F 통계량의 의미
- F 통계량은 두 개 이상의 서로 독립적인 집단을 비교할 때 사용하는 통계량임
- 분산분석에서는 개별 데이터 값 자체를 직접 비교하지 않고, 분산의 비율을 활용함
- 즉, F는 분산 비율을 이용한 통계량이며, 직접적인 분산값 비교가 아님
F 통계량의 구성과 해석
- F 통계량은 집단 간 분산 / 집단 내 분산의 형태로 정의됨
- 분자에는 집단 간 분산, 분모에는 집단 내 분산이 위치함
- 이는 평균 비교 문제를 분산의 관점으로 확장한 방법임
표본분산과 모수 추정 관점
- 사용되는 분산은 **표본분산(표본값² 기반)**임
- 표본분산은 모분산을 추정하는 통계량임
- 분산분석에서 최종적으로 남는 것은 모분산 자체가 아니라 모분산의 비율임
- 따라서 F 통계량은 모분산 비율에 대한 추정값의 성격을 가짐
집단 간 분산 VS 집단 내 분산
- 집단 내 분산은 각 집단 내부의 변동성을 의미함
- 집단 간 분산은 집단 평균들 사이의 변동성을 의미함
- F 값은 집단 내 분산에 비해 집단 간 분산이 얼마나 큰지를 나타냄
분산분석은 분자에 평균차이, 분모에 개인차이를 두어 개인차 대비 평균차이의 비율을 검정함

- F 통계량은 집단 간 분산을 집단 내 분산으로 나눈 비율임
- 집단 내 분산은 개인들이 가지고 있는 자연스러운 변동성을 의미함
- 집단 간 분산은 집단 평균들 사이의 차이로부터 발생하는 변동성을 의미함
- F = 1인 경우
- F = 1이라는 것은 집단 간 분산과 집단 내 분산이 거의 동일함을 의미함
- 집단 평균 간의 차이가
- 개인 수준에서 발생하는 변동성과 구분될 만큼 크지 않음을 의미함
- 의미
- 개인을 구성하는 차이에 대비하여 집단 간의 차이가 크지 않음을 의미함
- 집단이 가진 차이가 개인이 가진 변동성 수준을 넘어서지 못함을 의미함
- 집단을 나누었지만 실질적으로 거의 같은 집단처럼 보이는 상황임
- 집단 구분이 데이터 변동을 설명하는 데 의미 있는 역할을 하지 못함
- F >1인 경우
- 집단 간 분산이 집단 내 분산보다 큼
- 개인 수준의 변동성보다 집단 차이에서 발생하는 변동성이 더 큼
- 집단이라는 요인이 데이터 차이를 설명하는 데 일정한 영향력을 가짐
- “개인 차이보다 집단의 힘이 더 강해지고 있다”라고 해석 가능함
평균차이와 분포(첨도)의 관계
- 평균 차이가 존재한다고 해서 반드시 서로 다른 집단이라고 판단할 수는 없음
- 평균은 분포의 위치만 설명하며, 데이터의 흩어짐과 형태는 반영하지 못함
- 따라서 평균 차이가 개인 변동성 대비 충분히 의미 있는지를 확인하기 위해 F 검정이 필요함
- F 검정은 평균 차이를 분산의 비율 관점에서 평가함
- 평균 차이가 집단 내 개인차(집단 내 분산)를 뚫고 나올 만큼 충분한지를 검정함
- 단순히 평균이 다르다는 사실이 아니라→ 분포 전체가 다르다고 볼 수 있는지를 판단함
- 첨도가 높은 경우(뾰족한 분포)
- 데이터가 평균 주변에 밀집되어 있음
- 집단 내 분산이 작아 개인차가 크지 않음
- 이 경우 평균 차이가 존재하면 → 분포 간 차이가 명확하게 드러남
- 결과적으로 F 값이 커지고 집단 효과가 뚜렷해짐
- → 평균 차이가 강한 영향력을 가짐
- 개인차(집단 내 분산)가 작음
- 평균 차이가 존재하면 개인차를 뚫고 쉽게 드러남
- F 값이 커지기 쉬움
- 첨도가 낮은 경우( 완만한 분포)
- 데이터가 넓게 퍼져 있음
- 집단 내 분산이 커 개인차가 큼
- 평균 차이가 존재하더라도
→ 분포가 겹쳐 평균 차이가 거의 티 나지 않음 - 결과적으로 F 값이 1 근처에 머물 가능성이 큼
- → 평균 차이가 개인차에 묻혀 의미가 약해짐
- 개인차(집단 내 분산)가 큼
- 평균 차이가 있어도 분포에 묻혀 티가 잘 안 남
- F 값이 1 근처에 머물 가능성이 큼
다집단 비교
- 비교할 집단이 **3개 이상(A, B, C)**인 경우
→ t-검정은 두 집단씩만 비교 가능함 - 만약 t-검정을 사용한다면
→ A–B, B–C, A–C처럼 여러 번 반복 수행해야 함
→ 이 과정에서 p-value가 누적됨
→ 제1종 오류(거짓 양성) 확률이 증가함
→ 결과적으로 신뢰도가 매우 낮아짐 - 따라서 다집단 비교에서는 t-검정을 사용하지 않음
- 대신 한 번의 검정으로 전체 집단 차이를 평가할 수 있는 F 검정을 사용함
평균 차이 검정과 F-검정(ANOVA)의 의미
- 평균 차이에 대한 검정은 F-검정을 사용하여 진행함
- 이는 평균값 자체를 직접 비교하는 것이 아니라
→ 분산의 크기를 통해 평균 차이가 의미 있는지를 판단함
분포 관점에서의 해석
- 분산이 크다는 것은
→ 집단 간 평균 차이로 인해 발생한 변동성이
→ **개인들이 가지고 있는 자연스러운 변동성(개인차)**에 비해
→ 상대적으로 큰지를 의미함 - 즉, F-검정은
→ 집단 간 차이가 개인차 대비 충분히 큰지를 평가함
F-검정으로 알 수 있는 것과 알 수 없는 것
- F-검정 결과를 통해
→ 집단 간 평균 차이가 존재하는지 여부만 판단 가능함 - 그러나
→ 어떤 집단 사이에서 차이가 발생했는지는 알 수 없음 - 즉,
→ 차이의 위치나 방향은 제공하지 않음
ANOVA와 F-검정
- 평균을 비교하는 검정이 분산분석(ANOVA)임
- 분산분석은 F-통계량을 사용하여 평균 차이를 검정함
- 따라서 → ANOVA는 F-검정을 기반으로 한 평균 차이 검정 방법임
- 개념적으로→ “F-검정 안에 ANOVA가 포함되어 있다”라고 이해해도 무방함
문제 )

정답 )
getwd()
setwd("C:\\Users\\user\\Desktop\\Rwork")
df<-read.csv("three_sample.csv",header=TRUE) #원본데이터
str(df)
summary(df)
data <- subset(df, !is.na(score), c(method, score))
#subset :행을 뽑아라
#두번째 인수 : 조건
#세번째 인수 : 특정 칼럼 조합으로 출력
plot(data$score) # 산점도 이용 outlier 확인(50이상 발견) #연속형데이터
boxplot(data$score) # 막대 차트 이용 outlier 확인
mean(data$score) # 평균 통계량 : 8.45
length(data$score) # outlier 제거 전 관측치 91개
data2 <- subset(data, score <= 14) # 14이상 제거
length(data2$score) #88 (3개 제거)
x <- data2$score
boxplot(x) # 박스 차트에서 정제 데이터 확인 (이상치제거 후) -> 이제 f-검정 가능
#단계 1 : 세 집단 subset 작성
# 코딩 변경 - 변수 리코딩(method: 1:방법1, 2:방법2, 3:방법3)
data2$method2[data2$method==1] <- "방법1" # 조건 만족하는 TF로 반환
data2$method2[data2$method==2] <- "방법2"
data2$method2[data2$method==3] <- "방법3"
str(data2)
table(data2$method2) # 교육방법 별 빈도수
#비율이 맞는지 모르겠으면 카이제곱검정 필요 (통상적 편차 범위 안에 있는지 확인)
#단계 3 : 교육방법을 x변수에 저장
x <- table(data2$method2)
#단계 4 : 교육방법에 따른 시험성적 평균 구하기
y <- tapply(data2$score, data2$method2, mean)
df2 <- data.frame(교육방법=x, 성적=y)
df2
#동질성 검사 H0: 두 집단은 동질하다
bartlett.test(score ~ method, data=data2)
#세 집단이상의 평균 검정(통계적 유의미성 확인 필요)
help(aov) # 형식) aov(종속변수(결과/ 연속형) ~ 독립변수(원인/ 명목형이어도 ㄱㅊ), data=data set)
result <- aov(score ~ method2, data=data2)
names(result)
summary(result)
TukeyHSD(result) # 분산분석의 결과로 사후검정
#방법2와 방법1의 집단 간 평균의 차(diff) 가 가장 크게 난다.
plot(TukeyHSD(result)) # diff : 폭 크기
하나씩 뜯어보자아
1. 데이터 불러와서 파악하기
getwd()
setwd("C:\\Users\\user\\Desktop\\Rwork")
df<-read.csv("three_sample.csv",header=TRUE) #원본데이터
str(df)
summary(df)

2. subset함수로 필요한 칼럼만 뽑고, 결측치를 제거한다.
data <- subset(df, !is.na(score), c(method, score))
- subset :행을 뽑아라
- 두번째 인수 : 조건
- 세번째 인수 : 특정 칼럼 조합으로 출력
- subset(df, 조건, 선택할컬럼) 구조.
- !is.na(score) : score가 NA가 아닌 행만 남김.
- c(method, score) : method와 score만 남김.
3. 이상치 확인하기
plot(data$score) # 산점도 이용 outlier 확인(50이상 발견) #연속형데이터
boxplot(data$score) # 막대 차트 이용 outlier 확인
mean(data$score) # 평균 통계량 : 8.45


- plot(data$score) : 인덱스-값 산점도처럼 보여서 큰 값이 튀는지 확인.
- boxplot(data$score) : IQR 기반 이상치 표시(점으로 튀어나옴).
- mean(data$score) : 전체 평균 확인(8.45).
4. 이상치 제거 및 정제 결과 확
length(data$score) # outlier 제거 전 관측치 91개
data2 <- subset(data, score <= 14) # 14이상 제거
length(data2$score) #88 (3개 제거)

- 분산분석(ANOVA)은 평균 비교이므로 극단값이 평균/분산을 크게 흔들 수 있음
- 이상치 제거 후 정규성/등분산성이 더 잘 맞을 가능성이 큼
5. 박스 차트로 정제된 데이터 결과 확인
x <- data2$score
boxplot(x) # 박스 차트에서 정제 데이터 확인

(이상치제거 후) -> 이제 f-검정 가능
6. 세 집단 subset 작성하기 -> method를 명목형(라벨)로 리코딩
# 코딩 변경 - 변수 리코딩(method: 1:방법1, 2:방법2, 3:방법3)
data2$method2[data2$method==1] <- "방법1" # 조건 만족하는 TF로 반환
data2$method2[data2$method==2] <- "방법2"
data2$method2[data2$method==3] <- "방법3"
str(data2)

- method가 1/2/3 숫자라면, 해석 가능한 라벨을 붙인 method2 생성.
- table(data2$method2) : 교육방법별 표본 수 확인
7. 교육방법 별 빈도수
table(data2$method2) # 교육방법 별 빈도수

비율이 맞는지 모르겠으면 카이제곱검정 필요 (통상적 편차 범위 안에 있는지 확인)
8. 교육 방법을 x 변수에 저장
x <- table(data2$method2)
- table() : 방법별 관측치 수(표본 크기).
9. 교육방법에 따른 시험성적 평균 구하기
y <- tapply(data2$score, data2$method2, mean)
df2 <- data.frame(교육방법=x, 성적=y)
df2

- tapply(score, group, mean) :
- group별 mean 계산. 반복적으로
- 결과가 table형태로
- group단위로 평균을 구해서 표의 형태로 반환
- df2로 합쳐서 “표본수 + 평균”을 한 번에 보여줌.
- ANOVA는 집단 간 평균 차이를 검정하므로, 사전 탐색으로 각 집단 평균이 얼마나 다른지 확인하는 단계.
10. 동질성 검사
bartlett.test(score ~ method, data=data2)

평균검정하려면 동질성 검사 필수 !
-> 집단별로 분포가 균등하게 되어있는지 확인 (특히anova검정)
- 귀무가설(H0): 집단들의 분산이 같다(등분산)
- 대립가설(H1): 적어도 하나의 집단 분산이 다르다
- p-value가 충분히 크면(예: 0.05보다 큼) → 등분산 가정에 “크게 문제 없음”
- p-value가 작으면 → 등분산 깨짐 → 일반 ANOVA 대신 Welch ANOVA 고려
11. 세 집단이상의 평균 검정
help(aov) # 형식) aov(종속변수(결과/ 연속형) ~ 독립변수(원인/ 명목형이어도 ㄱㅊ), data=data set)
result <- aov(score ~ method2, data=data2)
names(result)
summary(result)


통계적 유의미성 확인 필요하기 때문에 실행
형식 : aov(종속변수(결과/ 연속형) ~ 독립변수(원인/ 명목형이어도 ㄱㅊ), data=data set)
- aov(score ~ method2) :
- 종속변수: score (연속형)
- 독립변수: method2 (3집단 범주형)
- summary(result) : ANOVA 테이블 출력
| 표시 | p-value 범위 | 의미 |
| *** | p < 0.001 | 매우 매우 강한 유의성 |
| ** | 0.001 ≤ p < 0.01 | 매우 강한 유의성 |
| * | 0.01 ≤ p < 0.05 | 통계적으로 유의 |
| . | 0.05 ≤ p < 0.1 | 경향성 있음 (보통 유의 X) |
| 없음 | p ≥ 0.1 | 유의하지 않음 |
12. 분산분석의 결과로 사후검정
TukeyHSD(result)
plot(TukeyHSD(result)) # diff : 폭 크기
- TukeyHSD는 모든 쌍(pairwise) 비교를 하되, 다중비교로 인한 1종 오류 증가를 제어
- 방법2와 방법1의 집단 간 평균의 차(diff) 가 가장 크게 남

세 집단 모두 평균에서의 차이가 있다

그래프 해석
- 중앙의 수직 점선(0): 두 집단의 평균 차이가 '0'임을 의미합니다= 차이가 없음
- 수평선(신뢰구간): 두 집단의 평균 차이가 존재할 수 있는 범위
- 0을 포함하는 경우: 두 집단 사이에 통계적으로 유의미한 차이가 없음
- 0을 포함하지 않는 경우: 두 집단 사이에 통계적으로 유의미한 차이가 있음
- 방법2 - 방법1 (맨 위) 신뢰구간이 약 2.0에서 3.3 사이에 형성되어 있으므로,
==> 0을 전혀 포함하지 않고 양수 쪽에 치우쳐 있음
==> 따라서 방법2가 방법1보다 평균적으로 유의미하게 높다고 결론 내림 가능
'LG DX DATA SCHOOL' 카테고리의 다른 글
| 01/13 파이썬 머신러닝 시작 (0) | 2026.01.13 |
|---|---|
| 01/12 회귀 분석 마무리 (0) | 2026.01.12 |
| 01/07 확률 분포 (t- 검정 vs 카이제곱 검정 ) (0) | 2026.01.07 |
| 01/06 가설 검정 (정규 분포, t-분포) (0) | 2026.01.06 |
| 01/05 통계 분석의 이해 (1) | 2026.01.05 |