ch0nny_log

[빅데이터분석] R _ 50. 이원 교차표 분석하기 본문

빅데이터 분석(with 아이티윌)/R

[빅데이터분석] R _ 50. 이원 교차표 분석하기

chonny 2024. 7. 9. 15:57

■ 이원 교차표 분석하기   p128 페이지

 두 명목변수 간의 관계를 관찰하고자 할 때 이원 교차표를 사용합니다.
 교차표는 하나의 변수값이 다른 변숫값에 의해 어떻게 변하는지 관찰할 수 있다는 장점이 있습니다.

(산포도 그래프와 유사) 

※ 이원 교차표의 해석
1. 행 합계
2. 열 합계
3. 표 합계에 대한 셀의 상대적 비율
4. 카이제곱 통계
예제.
install.packages("gmodels")
library(gmodels)

emp <- read.csv("c:\\data\\emp.csv")
CrossTable(x=emp$deptno, y=emp$job)​

 


설명: 부서번호별 직업별 인원수가 출력되면서 오른쪽에는 row 토탈이 출력 맨 아래쪽에는 칼럼 토털이 출력됩니다.  

※ CrossTable 해석 요약:
 
빈도수 (N): 해당 셀의 실제 관측값
카이제곱 기여도 (Chi-square contribution): 해당 셀이 카이제곱 통계량에 기여하는 정도
행 기준 비율 (N / Row Total): 해당 행에서 해당 셀의 비율
열 기준 비율 (N / Col Total): 해당 열에서 해당 셀의 비율
전체 기준 비율 (N / Table Total): 전체 테이블에서 해당 셀의 비율

예제2. 월급을 2500을 기준으로 직업별로 각각 월급이 2500 이상인 사원들과 월급이 2500 보다 작은 사원들의 분포를 이원 교차표로 확인하시오 
emp$sal_2500 <- ifelse( emp$sal >= 2500, 1, 0 )
emp

library(gmodels)
CrossTable( emp$sal_2500, emp$job )​
예제 3. 책에서 나온 중고차 데이터에 대해서 던진 질문?
  Q . 중고차의 모델(차종) 별로 보수적인 색깔이 더 많은지 확인할 수 있을까? 더 많다면 우연일까?

#풀이 1. 중고차 모델과 색깔을 각각 중복 제거해서 출력하시오
 unique(car$model)  # "SEL" "SE"  "SES"
 unique(car$color) # "Yellow" "Gray"   "Silver" "White"  "Blue"   "Black"  "Green"  "Red"    "Gold"

보수적인 색깔 ?  black, white, grey, slilver


#풀이 2. 중고차의 색깔이 보수적인 TRUE 아니면 FALSE 인 파생변수를 추가하시오!

car$conservative <- car$color  %in%  c("Black", "Gray", "Silver", "White")
car

table(car$conservative)​
설명: true가 보수적인 색깔 차량수

#풀이3. 차 모델 별로도 보수적인 색깔이 더 많은지 확인하시오. 
library(gmodels)
CrossTable( car$model, car$conservative )​

설명: 모델별로 비교 해봐도 보수적인 색(true) 의 수가 더 많음
-> 이게 우연인지 확인해봐야됨.

# 풀이 4.카이제곱 검정으로 위의 결과가 우연인지 아니지 확인하시오.
CrossTable( car$model, car$conservative, chisq=TRUE )​
카이제곱값: Chi^2 = 0.1539564  /  자유도: d.f. = 2  / p-value: p = 0.92591
설명: P-Value 확률이 0.05 보다 작다면 두 변수가 연관이 있다는 강한 증거를 제공하는데 0.9 이면 모델과 색깔의 연관성은 우연 때문이고 실제로 연관이 있지않을 가능성이 높습니다. 


 

 

카이제곱 검정이란?

카이제곱 분포는 1900년 경에 칼 피어슨에 의해서 개발되어

모집단에 대한 가설검정이나 교차분석에 유용하게 되는 검정방법

 

 

예제 1. 아래의 2x2 크로스 집계 표를 보고 두 변수가 연관성이 있는지 살펴보시오!

관측빈도 당뇨 정상 전체
비만 10 10 20
정상체중 15 65 80
전체 25 75 100
귀무가설: 당뇨와 비만은 연관성이 없다. (챔피언)
대립가설: 당뇨와 비만은 연관성이 있다. (도전자)

두 집단의 비만 비율이 통계적으로 차이가 없다면 당뇨환자 25명 중에서 20% (5명)가 비만이고 정상인 75명 중에서 20%(15명)가 비만일 것으로 기대할 수 있을 것이다. 이렇듯 두 변수 사이에 연관성이 없다는 가정하에 예상되는 빈도를 "기대빈도"라고 합니다.


출처. https://m.blog.naver.com/kimyhkimyh/220987924942

 

기대빈도 당뇨 정상 전체
비만 5 15 20
정상체중 20 60 80
전체 25 75 100

수학식

카이제곱값 = (10-5)^2 / 5 + (10-15)^2 /15 + (15-20)^2 / 20 + (65-60)^2 / 60 = 8.333333
자유도? R x C의 자유도는 (R-1) x(C-1)? (2-1)*(2-1) = 1

카이제곱값: 8.33333, 자유도: 1 일 때 p-value 확률은?
1 - pchisq( q=8.33, df = 1, lower.tail=TRUE) 0.003899566 0.004의 확률이므로 유의수준으 5%(0.05)로 두면 귀무가설이 기각이 되고 대립가설이 채택이 될 수 있는 것입니다. 비만과 당뇨는 연관성이 있다고 보는 것입니다.

카이제곱값이 높을수록 ---> 확률이 낮아진다 ---> 두 변수의 연관성이 많다 카이제곱값이 낮을수록 ---> 확률이 높아진다 ---> 두 변수의 연관성이 적다

위에 풀이과정은 카이제곱검정을 이해하기 위한 설명이었고 그냥 실세계에서 두 명목 변수 간의 연관성이 우연인지 아닌지를 확인하는 방법은 다음과 같이 CrossTable 이원 교차표를 이용하면 됩니다.

CrossTable( car$model, car$conservative,  chisq=TRUE )​

 

문제 1. 사원 테이블의 직업과 커미션을 받는 유무가 서로 연관성이 있는지 카이제곱 검정값으로 확인하시오 

귀무가설: 커미션을 받는 유무는 직업과 연관성이 없다.
대립가설: 커미션을 받는 유뷰는 직업과 연관성이 있다.

유의 수준 5% (0.05) 미만의 확률이 나오면 귀무가설을 기각하고 대립가설을 채택하면 됩니다.
힌트: 커미션을 받으면 1, 아니면 0 인 파생 칼럼을 하나 만들어주고 하세요

emp$comm_accept <- ifelse( is.na(emp$comm), 0, 1 ) 
CrossTable( emp$job, emp$comm_accept , chisq=TRUE )​

 결과해석: p-value 가 0.007 이므로 0.05 보다 작으므로 귀무가설을 기각하고 대립가설을 채택할 충분한 근거가 있습니다. 그러므로 직업과 커미션의 수급 유무는 연관이 있다고 볼 수 있습니다. 경고 메시지가 나온 이유는 이는 표본의 크기가 작거나 기대빈도가 너무 낮을 때 발생할 수 있습니다.라는 경고 메시지입니다.
문제 2. 카이제곱 검정에 대한 현업 연구 사례의 데이터로 카이제곱 검정을 수행하시오

한 연구에서는 사람들이 영화를 보러 갈 때 간식을 구매하는지 여부가 영화 장르와 관련이 있는지를 조사했습니다. 영화 장르(액션, 코미디, 드라마 등)와 간식 구매 여부(구매함, 구매하지 않음)라는 두 범주형 변수를 사용하여 카이제곱 독립성 검정을 수행했습니다. 이를 통해 특정 영화 장르가 간식 구매에 미치는 영향을 확인할 수 있습니다​.
# 영화 장르와 간식 구매 여부에 대한 데이터 생성
data <- data.frame(
  Genre = c(rep("Action", 50), rep("Comedy", 50), rep("Drama", 50)),
  Snack = c(
    sample(c("Yes", "No"), 50, replace = TRUE, prob = c(0.7, 0.3)),
    sample(c("Yes", "No"), 50, replace = TRUE, prob = c(0.5, 0.5)),
    sample(c("Yes", "No"), 50, replace = TRUE, prob = c(0.4, 0.6))
  )
)

# 데이터 확인
print(head(data))​


답:

CrossTable( data$Genre, data$Snack, chisq=TRUE )


설명: p-value가 0.05 보다 높으므로 영화 장르와 간식 구매여부 간에는 통계적으로 유의미하지 않으므로 영향을 미치지가 않는다.

자리마다 다른 게 나온 이유는 sample 함수가 랜덤 하게 데이터를 생성해서입니다. 
 다음과 같이 seed 값을 설정하고 sample 함수를 쓰면 자리마다 동일하게 출력됩니다. 

set.seed(123)

# 영화 장르와 간식 구매 여부에 대한 데이터 생성
data <- data.frame(
  Genre = c(rep("Action", 50), rep("Comedy", 50), rep("Drama", 50)),
  Snack = c(
    sample(c("Yes", "No"), 50, replace = TRUE, prob = c(0.7, 0.3)),
    sample(c("Yes", "No"), 50, replace = TRUE, prob = c(0.5, 0.5)),
    sample(c("Yes", "No"), 50, replace = TRUE, prob = c(0.4, 0.6))
  )
)

CrossTable( data$Genre , data$Snack ,  chisq=TRUE )


1. 빈도수 (N): 해당 셀의 실제 관측값

예: 첫 번째 셀의 첫 번째 행은  빈도수 15

2. 카이제곱 기여도 (Chi-square contribution): 해당 셀이 카이제곱 통계량에 기여하는 정도

예: 첫 번째 셀의 두 번째는 카이제곱 기여도 3.375

3. 행 기준 비율 (N / Row Total): 해당 행에서 해당 셀의 비율

예:  첫 번째 셀의 세 번째 값 0.300 은 
      Action 장르의 사람들 중 30% 가 간식을 구매하지 않았다. 

4. 열 기준 비율 (N / Col Total): 해당 열에서 해당 셀의 비율

예: 첫 번째 셀의 네 번째 값인 0.208은 간식을 구매하지 않은 사람들 중 20%가
     Action 장르를 선택했다. 

5. 전체 기준 비율 (N / Table Total): 전체 테이블에서 해당 셀의 비율

예: 첫 번째 셀의 다섯 번째 값인 0.100 은 전체 사람들 중 10%가 action 장르를 선택했고
     간식을 구매하지 않았다.