[R데이터분석] 카이제곱 검정

근이의 개발일기·2024년 12월 9일
post-thumbnail

카이제곱 검정(Chi-Square Test) 개요

카이제곱 검정은 범주형 자료의 교차표(분할표, Contingency Table)를 사용하여 관측된 빈도와 기대 빈도 간의 차이가 통계적으로 유의미한지를 평가하는 방법입니다.

목적

  • 두 범주형 변수 간의 독립성을 검정 (독립성 검정)
  • 한 범주형 변수의 분포가 기대 분포와 다른지를 검정 (적합성 검정)

종류

  1. 독립성 검정 (Independence Test)
    • 두 범주형 변수의 독립 여부를 평가합니다.
  2. 적합도 검정 (Goodness-of-Fit Test)
    • 관측된 데이터의 분포가 이론적 기대 분포와 일치하는지 평가합니다.

카이제곱 검정 수행 방법

1. 독립성 검정 (Independence Test)

데이터 구조: 두 개의 범주형 변수로 구성된 교차표(2x2, mxn) 형태의 데이터.

방법

  • chisq.test() 함수를 사용합니다.

코드 예시

# 데이터 준비 (2x3 교차표)
data <- matrix(c(50, 30, 20, 40, 20, 40), nrow = 2, byrow = TRUE)
colnames(data) <- c("A", "B", "C")
rownames(data) <- c("Group1", "Group2")

# 교차표 출력
print(data)

# 카이제곱 독립성 검정
chisq_test_result <- chisq.test(data)

# 결과 출력
print(chisq_test_result)

결과 해석

	Pearson's Chi-squared test

data:  data
X-squared = 10.24, df = 2, p-value = 0.006
  • X-squared: 카이제곱 통계량.
  • df (자유도): (행의 수 - 1) × (열의 수 - 1).
  • p-value: 유의 확률. p-value < 0.05이면 귀무가설(두 변수가 독립적이라는 가정)을 기각합니다.

결론

  • p-value = 0.006 < 0.05이므로, 두 변수는 독립이 아니며 서로 연관되어 있다고 해석합니다.

2. 적합도 검정 (Goodness-of-Fit Test)

데이터 구조: 관측된 빈도와 기대 빈도를 비교합니다.

방법

  • 관측된 데이터가 기대 분포와 일치하는지 평가합니다.
  • chisq.test() 함수를 사용합니다.

코드 예시

# 관측된 빈도
observed <- c(50, 30, 20)

# 기대되는 이론적 비율
expected <- c(40, 40, 20)  # 관측된 데이터의 합에 따라 이론 비율을 적용

# 카이제곱 적합도 검정
chisq_test_result <- chisq.test(x = observed, p = expected / sum(expected))

# 결과 출력
print(chisq_test_result)

결과 해석

	Pearson's Chi-squared test

data:  observed
X-squared = 5.555, df = 2, p-value = 0.062
  • X-squared: 카이제곱 통계량.
  • df (자유도): 카테고리의 개수 - 1.
  • p-value: 유의 확률. p-value < 0.05이면 귀무가설(관측값이 기대값과 일치한다)을 기각합니다.

결론

  • p-value = 0.062 > 0.05이므로, 관측된 데이터는 기대 분포와 유의미한 차이가 없다고 결론지을 수 있습니다.

chisq.test() 함수 특징

  • chisq.test() 함수는 독립성 검정과 적합도 검정에 모두 사용됩니다.
  • 독립성 검정에서는 교차표 형태의 데이터를 사용하여 두 변수 간의 독립성을 평가합니다.
  • 적합도 검정에서는 단일 빈도 벡터와 기대 분포를 비교하여 관측된 데이터가 기대값과 일치하는지를 평가합니다.
  • 두 검정의 차이는 데이터의 형태와 가설의 차이에 있습니다.
  • chisq.test() 함수의 출력 결과(X-squared, p-value 등)는 두 검정 모두 동일합니다.

Yates의 연속성 보정 적용하기

  • Yates의 연속성 보정2x2 교차표에서 카이제곱 검정을 수행할 때, 불연속성을 보정하기 위해 사용됩니다.
  • chisq.test()에서 correct = TRUE가 기본값이며, Yates의 보정을 적용합니다.

코드 예시

# 2x2 교차표
data <- matrix(c(50, 30, 40, 80), nrow = 2)

# 카이제곱 독립성 검정 (Yates 보정 적용)
chisq_test_result <- chisq.test(data, correct = TRUE)

# 결과 출력
print(chisq_test_result)

Fisher's Exact Test

  • 카이제곱 검정은 빈도가 작은 경우 신뢰할 수 없으므로, 빈도가 작을 때는 Fisher의 정확검정을 사용합니다.
  • Fisher의 검정은 2x2 교차표에 사용되며, fisher.test() 함수를 사용합니다.

코드 예시

# 2x2 교차표
data <- matrix(c(1, 9, 11, 3), nrow = 2)

# Fisher의 정확검정 수행
fisher_test_result <- fisher.test(data)

# 결과 출력
print(fisher_test_result)

결과 해석

  • p-value: 0.03 (예시)
  • p-value < 0.05이므로, 두 범주형 변수는 독립적이지 않다고 결론 내릴 수 있습니다.

카이제곱 검정의 해석 요약

종류귀무가설(H0)대립가설(H1)결정 기준
독립성 검정두 변수는 독립이다두 변수는 독립이 아니다p-value < 0.05 → 독립 아님
적합도 검정관측값 = 기대값관측값 ≠ 기대값p-value < 0.05 → 차이 있음
Fisher의 검정두 변수는 독립이다두 변수는 독립이 아니다p-value < 0.05 → 독립 아님

핵심 요약

  1. 카이제곱 독립성 검정: chisq.test()를 사용하여 두 범주형 변수의 독립성을 검정합니다.
  2. 카이제곱 적합도 검정: chisq.test()를 사용하여 관측 빈도와 기대 빈도가 일치하는지 확인합니다.
  3. Yates의 연속성 보정: 2x2 교차표의 경우 chisq.test()에서 correct = TRUE가 기본값으로 적용됩니다.
  4. Fisher의 정확검정: 교차표의 빈도가 작을 때 fisher.test()를 사용합니다.

주요 함수 요약

함수용도적용 상황
chisq.test()독립성/적합도 검정범주형 데이터의 교차표 또는 관측 빈도와 기대 빈도를 비교
fisher.test()2x2 교차표 독립성 검정소규모 빈도 (빈도가 작을 때)

카이제곱 검정과 Fisher 검정은 범주형 변수의 관계를 평가하는 주요 방법입니다. 두 검정 모두 교차표를 사용하여 검정하지만, 교차표의 빈도 수에 따라 chisq.test() 또는 fisher.test()를 선택해야 합니다.


chisq 검정을 하기 전에 검정해야 하는 사항과 시각적으로 데이터를 확인하는 방법


카이제곱 검정을 하기 전에 확인해야 할 사항

카이제곱 검정을 수행하기 전에 반드시 전제 조건가정을 확인해야 합니다. 전제 조건이 충족되지 않으면 검정 결과의 신뢰성이 떨어질 수 있습니다.


1. 독립성 검정의 전제 조건

  1. 범주형 변수:
    • 카이제곱 검정은 범주형 데이터에만 적용할 수 있습니다.
    • 독립성 검정에서는 2개 이상의 범주형 변수가 필요합니다.
  2. 빈도 데이터여야 함:
    • 데이터는 비율이 아니라 빈도(frequency) 형태여야 합니다.
    • 예를 들어, 남녀별 선호 제품에 대한 데이터는 빈도 값이어야지, 비율(%) 형태의 데이터로 하면 안 됩니다.
  3. 표본의 크기(빈도값) 제한:
    • 기대 빈도가 5 미만인 셀이 전체의 20%를 넘으면 안 됩니다.
    • 모든 셀의 기대빈도가 최소 1 이상이어야 합니다.
    • 기대빈도가 5 미만인 셀이 많다면 Fisher's exact test를 고려해야 합니다.
  4. 관측값의 독립성:
    • 각 관측치는 독립적이어야 합니다. 동일한 표본을 여러 번 반복 관찰하는 것은 안 됩니다.
  5. 셀 간 독립성:
    • 교차표의 각 셀의 값들은 서로 독립적이어야 합니다.
    • 즉, 동일한 사람이 여러 셀에 기여해서는 안 됩니다.

2. 적합도 검정의 전제 조건

  1. 범주형 자료:
    • 단일 범주형 변수에 대한 관측 빈도를 분석합니다.
  2. 기대값과 관측값 비교:
    • 기대 빈도와 관측된 빈도 간의 차이를 평가합니다.
  3. 표본의 크기(빈도값) 제한:
    • 모든 카테고리의 기대빈도가 5 이상이어야 합니다.
    • 기대 빈도가 5 미만인 경우, 결과의 신뢰성이 떨어질 수 있습니다.
  4. 셀의 독립성:
    • 각 셀에 들어가는 관측값은 서로 독립적이어야 합니다.

카이제곱 검정 전 확인해야 하는 데이터의 시각적 탐색

1. 데이터의 분포 확인

  • 교차표 형태로 데이터를 확인해야 합니다.
  • 데이터가 비율로 주어졌다면 빈도 값으로 변환해야 합니다.
  • table()을 사용하여 교차표를 생성하고, prop.table()로 비율을 확인할 수 있습니다.
  • R 코드 예시:
    # 데이터 생성
    data <- data.frame(
      Gender = c('Male', 'Male', 'Male', 'Female', 'Female', 'Female'),
      Product = c('A', 'B', 'C', 'A', 'B', 'C')
    )
    
    # 교차표 생성
    table_data <- table(data$Gender, data$Product)
    print(table_data)
    
    # 교차표의 비율 확인
    prop.table(table_data)
    
    결과 해석
    • table() 함수로 교차표를 확인하여 빈도 분포를 확인합니다.
    • *prop.table()**를 통해 각 셀이 차지하는 비율을 시각적으로 확인할 수 있습니다.

2. 기대값과 관측값의 비교

  • 기대값이 모두 5 이상인지 확인합니다.
  • 기대값을 확인하려면 chisq.test()$expected 속성을 확인할 수 있습니다.
  • R 코드 예시:
    chisq_test_result <- chisq.test(table_data)
    print(chisq_test_result$expected)  # 기대 빈도 출력
    
    결과 해석
    • 카이제곱 검정 후, $expected를 통해 기대빈도를 확인합니다.
    • 기대빈도가 5 미만인 셀이 많은 경우, Fisher's exact test로 대체하는 것이 좋습니다.

3. 데이터의 시각화

  • 데이터 시각화는 교차표를 히트맵(heatmap)으로 표현하거나, 막대그래프(barplot)로 나타낼 수 있습니다.
  • R 코드 예시:
    library(ggplot2)
    
    # 교차표를 데이터프레임 형태로 변환
    df <- as.data.frame(table(data$Gender, data$Product))
    
    # 막대그래프 시각화
    ggplot(df, aes(x = Var2, y = Freq, fill = Var1)) +
      geom_bar(stat = "identity", position = "dodge") +
      labs(title = "Gender vs Product Preference", x = "Product", y = "Frequency")
    
    결과 해석
    • 남성과 여성의 제품 선호에 대한 빈도 차이를 시각화합니다.
    • 막대 그래프를 통해 두 범주형 변수 간의 관계를 직관적으로 확인할 수 있습니다.

4. 교차표의 비율 분석

  • row-wisecolumn-wise 비율을 확인합니다.
  • prop.table(table_data, margin = 1) : 행 기준으로 비율을 확인합니다.
  • prop.table(table_data, margin = 2) : 열 기준으로 비율을 확인합니다.
  • R 코드 예시:
    # 행 기준 비율
    row_wise_ratio <- prop.table(table_data, margin = 1)
    print(row_wise_ratio)
    
    # 열 기준 비율
    column_wise_ratio <- prop.table(table_data, margin = 2)
    print(column_wise_ratio)
    
    결과 해석
    • 행 기준 비율(margin = 1)은 각 행의 값이 해당 행의 총합에서 차지하는 비율을 보여줍니다.
    • 열 기준 비율(margin = 2)은 각 열의 값이 해당 열의 총합에서 차지하는 비율을 보여줍니다.
    • 이를 통해 범주별로 데이터가 균형이 맞는지 시각적으로 파악할 수 있습니다.

카이제곱 검정 전 필수 검토 사항

  1. 범주형 데이터 확인: 데이터는 반드시 범주형이어야 하며, 교차표 형태로 준비합니다.
  2. 빈도 형태로 변환: 비율 데이터는 빈도로 변환해야 합니다.
  3. 셀 기대 빈도 확인: 기대빈도는 5 이상이어야 하며, 모든 기대빈도가 1 이상이어야 합니다.
  4. 관측값의 독립성: 데이터의 관측값들은 서로 독립적이어야 합니다.

데이터 시각화

  1. 교차표 시각화: table()과 prop.table()로 데이터를 시각적으로 확인합니다.
  2. 시각화 도구: heatmap(), barplot(), ggplot2의 geom_bar() 등을 활용해 교차표의 구조를 확인합니다.

최종 점검

  1. 교차표 형태의 빈도 데이터가 맞는지 확인.
  2. 기대값(5 이상)과 관측값의 독립성 확인.
  3. 카이제곱 검정을 수행하고 p-value로 귀무가설(H0)을 기각할 수 있는지 평가.

검정 전 고려 사항 정리

항목설명
데이터 유형범주형 데이터 (교차표, 빈도표)
관측값 독립성독립적이어야 함
빈도 조건기대빈도(5 이상), 최소 빈도(1 이상)
비율 데이터비율 데이터는 빈도 데이터로 변환해야 함

이 과정을 거쳐 카이제곱 검정을 수행하면, 결과의 신뢰성을 높일 수 있습니다.


library(descr)
CrossTable(cvs,cvs,cam)
Cell Contents
|-------------------------|
| N |
| Chi-square contribution |
| N / Row Total |
| N / Col Total |
| N / Table Total |
|-------------------------|

==============================
camcam cvs 0 1 Total

0 12 6 18
0.161 0.236
0.667 0.333 0.562
0.632 0.462
0.375 0.188

1 7 7 14
0.207 0.303
0.500 0.500 0.438
0.368 0.538
0.219 0.219

Total 19 13 32
0.594 0.406

descr::CrossTable()로 확인하는 것의 의미

descr::CrossTable() 함수는 교차표를 생성하고 카이제곱 검정에 필요한 정보를 제공하는 유용한 함수입니다. 이 함수는 단순히 교차표만 보여주는 것이 아니라, 카이제곱 검정에 필요한 핵심 정보를 모두 제공합니다.


CrossTable()이 제공하는 정보

  1. 교차표(Contingency Table)
    • 행과 열의 범주별 빈도를 보여줍니다.
    • 교차표 내에서 빈도(Frequency), 비율(Proportion), 누적 백분율(Cumulative Percentage) 등을 확인할 수 있습니다.
  2. 카이제곱 검정(Chi-square test)
    • 교차표의 각 셀에 대해 기대값(Expected Frequency)잔차(Residuals)를 계산합니다.
    • 카이제곱 검정의 핵심인 p-value, 카이제곱 통계량(Chi-sq), 자유도(degree of freedom, df) 등을 보여줍니다.
  3. 잔차(Residuals)
    • 잔차는 관측값 - 기대값으로, 특정 범주의 관측 빈도와 기대 빈도의 차이를 확인할 수 있습니다.
    • 잔차가 클수록 그 셀의 값이 기대와 얼마나 다른지를 나타내는 지표로, 어떤 범주가 카이제곱 검정에 기여하는지를 파악할 수 있습니다.
  4. 정확 검정(Fisher's exact test)
    • 교차표의 셀의 빈도 값이 너무 작아(기대빈도가 5 미만) 카이제곱 검정을 수행할 수 없는 경우 Fisher's exact test를 자동으로 수행할 수 있습니다.
  5. 열 기준 비율(Column Proportion) / 행 기준 비율(Row Proportion)
    • 교차표의 비율을 확인할 수 있습니다.
    • 각 셀의 값이 행 또는 열의 총합에 대한 비율로 표시됩니다.
  6. Phi, Cramer's V (Effect Size)
    • 효과 크기를 보여주는 지표로, 카이제곱 검정 결과가 유의미할 때 효과의 크기를 확인할 수 있습니다.

CrossTable()이 유용한 이유

  1. 교차표와 카이제곱 검정을 한 번에 확인 가능
    • 빈도, 비율, 기대빈도, 잔차, p-value를 한 번에 확인할 수 있습니다.
    • 카이제곱 검정(chisq.test())으로도 가능하지만, CrossTable이 훨씬 더 직관적이고 자세한 정보를 제공합니다.
  2. 셀별로 카이제곱 기여도를 확인할 수 있음
    • 교차표의 각 셀에 대한 잔차(Residuals)를 통해, 어떤 범주가 전체 카이제곱 검정에 크게 기여했는지를 파악할 수 있습니다.
  3. Fisher's exact test 자동 수행
    • 교차표의 기대빈도가 5 미만인 경우, 자동으로 Fisher's exact test를 수행합니다.
  4. 비주얼하게 확인 가능
    • 교차표 내에 빈도와 비율, 기대값, 잔차를 시각적으로 명확하게 표시합니다.

CrossTable()을 사용하는 방법

1. 기본 사용법

# 라이브러리 설치 및 불러오기
install.packages("descr")
library(descr)

# 예시 데이터 생성
data <- data.frame(
  Gender = c('Male', 'Male', 'Male', 'Female', 'Female', 'Female'),
  Product = c('A', 'B', 'C', 'A', 'B', 'C')
)

# 교차표 생성 및 카이제곱 검정 수행
CrossTable(data$Gender, data$Product, chisq = TRUE)

출력 해석

  • 교차표와 함께 빈도, 비율, 기대빈도, 잔차가 출력됩니다.
  • 카이제곱 검정 결과 (카이제곱 값, p-value, 자유도)도 같이 출력됩니다.
  • 교차표 내 각 셀의 기대빈도가 5 미만이면 Fisher's exact test가 자동으로 수행됩니다.

2. 추가 옵션 사용법

CrossTable(data$Gender, data$Product,
           chisq = TRUE,           # 카이제곱 검정 수행
           expected = TRUE,       # 기대빈도 출력
           prop.r = TRUE,         # 행 비율 출력
           prop.c = TRUE,         # 열 비율 출력
           prop.t = TRUE,         # 총합 비율 출력
           fisher = TRUE)         # Fisher's exact test 수행

주요 옵션 해설

  • chisq = TRUE: 카이제곱 검정 수행.
  • expected = TRUE: 기대빈도를 교차표에 함께 표시.
  • prop.r = TRUE: 각 셀의 행 기준 비율 표시.
  • prop.c = TRUE: 각 셀의 열 기준 비율 표시.
  • prop.t = TRUE: 각 셀의 전체 표에 대한 비율 표시.
  • fisher = TRUE: Fisher의 정확검정을 자동으로 수행합니다.

CrossTable()의 결과 해석

교차표의 해석

  1. 빈도(Frequency): 교차표에 나오는 실제 빈도 값입니다.
  2. 비율(Proportion): 행 기준, 열 기준, 전체 기준으로 셀의 비율을 볼 수 있습니다.
  3. 잔차(Residuals): 관측값 - 기대값으로, 카이제곱 검정에 얼마나 영향을 미치는지를 나타냅니다.
  4. 카이제곱 검정의 결과
    • Chi-sq: 카이제곱 통계량
    • df: 자유도
    • p-value: p-value가 0.05 미만이면 귀무가설을 기각하고, 변수 간에 독립이 아님을 의미합니다.

CrossTable() vs chisq.test()의 차이

구분CrossTable()chisq.test()
교차표 생성교차표 생성 및 시각화교차표 생성 불가
빈도 표시빈도, 비율, 잔차, 기대빈도 모두 표시교차표 직접 생성해야 함 (table())
카이제곱 검정카이제곱 검정 가능 (자동 수행)카이제곱 검정 수행 (명시적으로 실행)
잔차(Residuals)자동으로 표시표시되지 않음
Fisher test기대빈도가 5 미만이면 자동 실행직접 fisher.test() 실행 필요
직관적 해석직관적으로 확인 가능 (모든 정보 제공)카이제곱 통계량, p-value만 제공
결과의 디테일빈도, 비율, 기대값, 잔차까지 모두 제공카이제곱 통계량과 p-value만 제공

결론

  1. 의미가 있다. descr::CrossTable()은 단순한 교차표 생성을 넘어, 카이제곱 검정에 필요한 모든 정보를 한 번에 확인할 수 있는 강력한 도구입니다.
  2. 추천 사용: 카이제곱 검정과 더불어, 기대값과 관측값의 차이(잔차)까지 시각적으로 확인할 수 있다는 점에서 매우 유용합니다.
  3. 데이터 탐색과 검정 전 확인: 카이제곱 검정을 수행하기 전에 CrossTable()으로 먼저 빈도, 기대값, 잔차 등을 확인하면 데이터의 전반적인 특성을 쉽게 파악할 수 있습니다.

CrossTable()교차표 확인 + 카이제곱 검정 + 시각화 + 잔차 분석을 한 번에 할 수 있는 강력한 도구입니다.


chisq.test(cvs,cvs, cam)

Pearson's Chi-squared test with Yates' continuity correction

data: cvsandcvs and cam
X-squared = 0.34754, df = 1, p-value = 0.5555

  • H0: 새로운 항생제 복용군과 기본 항생제 복용군의 결과가 같다
    • p-value <0.05이므로 H0를 기각할 수 있다.
    • 행퍼센트로 볼지 열 퍼센트로 볼지 구분해야한다.

0개의 댓글