반응형

[SPSS] 피셔 정확 검정

 

 범주형 변수의 분포 사이에 유의미한 차이가 있는지 확인하는 분석으로는 보통 카이 제곱 검정을 시행한다. SPSS을 이용한 카이 제곱 검정 시행법은 다음 링크에서 확인할 수 있다.

2022.09.06 - [범주형 자료 분석/SPSS] - [SPSS] 카이 제곱 검정 (일반 및 연속성 수정)

 

그런데 기대 빈도가 5를 넘지 않는 셀이 전체의 25% 이상인 경우 카이 제곱 검정의 결과는 신뢰도가 떨어져 쓸 수 없게 되고 피셔 정확 검정 (Fisher's exact test)을 사용해야 한다. 이에 대한 이론적인 내용은 다음 링크에서 확인할 수 있다.

피셔 정확 검정: 2022.08.26 - [통계 이론] - [이론] 피셔 정확 검정 (Fisher's exact test)

피셔 정확 검정과 카이 제곱 검정의 관계:2022.08.29 - [통계 이론] - [이론] 카이 제곱 검정과 피셔 정확 검정의 관계

 

본 포스팅에서는 피셔 정확 검정을 어떻게 시행하는지 설명하고자 한다.

 

성별과 RH혈액형 간의 관계가 다음과 같다고 하자. RH혈액형의 분포를 보니 RH- 6명 중 5명이 무려 남성에 치우쳐져 있다. 이 결과를 보고 "남성일수록 RH-일 경향성이 있다."라고 할 수 있는지 따지는 검정이 피셔 정확 검정이다. 

  RH- RH+
여성 1 481
남성 5 513

 

일반적으로 이런 경우 카이 제곱 검정을 사용하지만 이 경우 사용할 수 없다. 기대 빈도가 5를 넘지 않는 셀이 전체의 25% 이상이기 때문인데, 한번 확인해보도록 하자.

 

*실습용 데이터는 아래 링크를 클릭하면 다운로드할 수 있습니다.

2022.08.04 - [공지사항 및 소개] - 분석용 데이터 (update 22.08.29)

 

분석용 데이터 (update 22.08.29)

2022년 08월 29일 버전입니다. 변수는 계속하여 추가될 예정입니다. 다음 카테고리에 있는 글에서 이용된 데이터입니다. - 기술 통계 - 통계 프로그램 사용 방법 1) 엑셀 파일 2) CSV 파일 3) 코드북

medistat.tistory.com

 

피셔 정확 검정 시행하기

 

2*2 분할표

1) 분석(A) > 기술통계량(E) > 교차분석(C) 

 

2) 행과 열에 원하는 변수를 넣어주기. 여기에서는 행에 SEX를, 열에 RH을 넣었다. 그리고 통계량(S)를 클릭한다.

3) 카이제곱(H)의 체크박스를 선택한다. "계속(C)"버튼을 누른다.

 

 4) 셀(E)을 클릭한다.

5) 기대빈도 (E) 체크박스를 선택하고 "계속(C)"를 누른다.

6) "확인" 버튼을 눌러 결과를 확인한다.

결과

1) 기대빈도

 기대 빈도가 5 미만인 셀이 2개 (50%)이므로 카이 제곱 검정이 아닌 피셔 정확 검정 (Fisher's exact test)을 시행해야 한다.

 또한,  "2 셀 (50.0%)은(는) 5보다 작은 기대 빈도를 가지는 셀입니다."이라고 말하며 카이 제곱 검정이 아닌 피셔 정확 검정을 시행해야 한다고 경고하고 있다. 

 

2) 피셔 정확 검정 결과

 피셔 정확 검정의 결과를 볼 때에는 정확 유의확률 (양측검정)의 결과를 보는 것이 일반적이다. 유의성 기준을 0.05로 잡았을 때, 성별과 RH 혈액형 여부는 독립이 아니라고 할 수 없다. 따라서 성별과 RH 혈액형 사이에는 어떠한 관계가 있다고 볼 수 없다. 양측 검정이 아닌 단측 검정을 보아야 할 때도 있다. 이는 대립 가설이 어떤 것이냐에 따라 달라지는데 이에 대한 자세한 내용은 다음 포스팅에서 확인할 수 있다.

2022.08.26 - [통계 이론] - [이론] 피셔 정확 검정 (Fisher's exact test)

 

 

2*2 이상의 분할표

분할표가 2*2 이상인 경우 정확 검정을 자동으로 시행해주지 않는다. 따라서 정확 검정을 하겠다는 설정을 따로 해주어야 한다.

 

 

1) 분석(A) > 기술통계량(E) > 교차분석(C) 

 

2) 행과 열에 원하는 변수를 넣어주기. 여기에서는 행에 SEX를, 열에 TWIN을 넣었다. 그리고 정확(X)을 클릭한다.

 

3) "정확검정(E)"  버튼을 클릭한다.

4) 통계량(S)를 클릭한다.

5) 카이제곱(H)의 체크박스를 선택한다. "계속(C)"버튼을 누른다.

 

 6) 셀(E)을 클릭한다.

5) 기대빈도 (E) 체크박스를 선택하고 "계속(C)"를 누른다.

6) "확인" 버튼을 눌러 결과를 확인한다.

결과

1) 기대빈도

 기대 빈도가 5 미만인 셀이 4개 (66.7%)이므로 카이 제곱 검정이 아닌 피셔 정확 검정 (Fisher's exact test)을 시행해야 한다.

 또한,  "4 셀 (66.7%)은(는) 5보다 작은 기대 빈도를 가지는 셀입니다."이라고 말하며 카이 제곱 검정이 아닌 피셔 정확 검정을 시행해야 한다고 경고하고 있다. 

 

2) 피셔 정확 검정 결과

 피셔 정확 검정의 결과를 볼 때에는 정확 유의확률 (양측검정)의 결과를 확인한다. 유의성 기준을 0.05로 잡았을 때, 성별과 쌍둥이 여부는 독립이 아니라고 할 수 없다. 따라서 성별과 쌍둥이 여부 사이에는 어떠한 관계가 있다고 볼 수 없다.

 

 

 

카이 제곱 검정과 피셔 정확 검정의 관계

2022.08.29 - [통계 이론] - [이론] 카이 제곱 검정과 피셔 정확 검정의 관계

 

[이론] 카이 제곱 검정과 피셔 정확 검정의 관계

[이론] 카이 제곱 검정과 피셔 정확 검정의 관계  범주형 자료 분석을 할 때 "기대 빈도가 5 미만인 셀이 25% 이상인 경우 카이 제곱 검정을 신뢰할 수 없으며 피셔 정확 검정의 결과를 확인

medistat.tistory.com

 

SPSS 피셔 정확 검정 정복 완료!

 

작성일: 2022.09.20.

최종 수정일: 2022.09.20.

이용 프로그램: IBM SPSS v26

운영체제: Windows 10

 

 

반응형
반응형

 

[SPSS] 카이 제곱 검정 (일반 및 연속성 수정)

 

 카이 제곱 검정은 범주형 변수 간에 분포의 유의미한 차이가 있는지 확인하는 방법이다. 이해할 수 있는 언어로 표현하면 다음과 같다. 분할표를 작성하였을 때 다음과 같다고 하자. (출처 및 분할표 작성법:2022.09.06 - [기술 통계/SPSS] - [R] 도수분포표 (Frequency table), 분할표 (Contingency table) 만들기)

 

  비음주자 음주자
여성 236 246
남성 174 344

 

이를 보면 비음주자 중에는 여성이 많고, 음주자 중에는 남성이 많다. 그렇다면 "성별과 음주 여부는 무관하다(=독립이다)."라는 말이 틀리다고 할 수 있을까? 즉, "특정 성별은 음주자일 확률이 더 높다."라고 할 수 있을까? 이에 대한 검정이 바로 카이 제곱 검정이다.

 

*실습용 데이터는 아래 링크를 클릭하면 다운로드할 수 있습니다.

2022.08.04 - [공지사항 및 소개] - 분석용 데이터 (update 22.08.29)

 

분석용 데이터 (update 22.08.29)

2022년 08월 29일 버전입니다. 변수는 계속하여 추가될 예정입니다. 다음 카테고리에 있는 글에서 이용된 데이터입니다. - 기술 통계 - 통계 프로그램 사용 방법 1) 엑셀 파일 2) CSV 파일 3) 코드북

medistat.tistory.com

 

카이 제곱 검정 시행하기

1) 분석(A) > 기술통계량(E) > 교차분석(C) 

 

2) 행과 열에 원하는 변수를 넣어주기. 여기에서는 행에 SEX를, 열에 ALCOHOL을 넣었다. 그리고 통계량(S)를 클릭한다.

 

 3) 카이제곱(H)의 체크박스를 선택한다. "계속(C)"버튼을 누른다.

 

 

 4) 셀(E)을 클릭한다.

 

4) 기대빈도 (E) 체크박스를 선택하고 "계속(C)"를 누른다.

5) "확인" 버튼을 눌러 결과를 확인한다.

결과

1) 기대빈도

 카이 제곱 검정을 시행하기 위한 전제조건은 기대 빈도가 5 미만이 셀이 전체 셀 중 25% 미만이어야 한다는 것이므로 기대 빈도를 산출해 보았고 모두 5 이상이므로 문제가 없었다.

 또한,  "0 셀 (0.0%)은(는) 5보다 작은 기대 빈도를 가지는 셀입니다."이라고 말하며 카이 제곱 검정을 시행해도 된다고 안심시켜주고 있다. 

 

2) 카이 제곱 검정 결과

 카이 제곱 검정의 결과를 볼 때에는 첫 번째 행 "Pearson 카이제곱"의 세 번째 열 "근사 유의확률 (양측검정)"을 확인해야 한다. "0.000"이라고 쓰여있는 것은 "<0.001"을 의미한다. 따라서 유의성 기준을 0.05로 잡았을 때, 성별과 음주 여부는 독립이 아니라고 할 수 있으며, 데이터를 보면 남성이 음주할 확률이 더 높다고 할 수 있다.

 

3) 연속성 수정 카이 제곱 검정 결과 (Chi-squared test with Yates's correction for continuity)

 연속성 수정을 하고 싶은 경우 두 번째 행 "연속성 수정"의 세 번째 열 "근사 유의확률 (양측검정)"을 확인해야 한다. p-value는 0.001보다 작으므로 유의성 기준을 0.05로 잡았을 때, 성별과 음주 여부는 독립이 아니라고 할 수 있으며, 데이터를 보면 남성이 음주할 확률이 더 높다고 할 수 있다.

 - 연속성 수정에 관한 이론적인 토대는 다음 글에서 살펴볼 수 있다.

2022.08.30 - [통계 이론] - [이론] 연속성을 수정한 카이 제곱 검정 (Chi-squared test with Yates's correction for continuity)

 

[이론] 연속성을 수정한 카이 제곱 검정 (Chi-squared test with Yates's correction for continuity)

[이론] 연속성을 수정한 카이 제곱 검정 (Chi-squared test with Yates's correction for continuity) 이 글을 읽기 전에 이전 포스팅을 읽고 오길 권한다. 2022.08.29 - [통계 이론] - [이론] 카이..

medistat.tistory.com

 

카이 제곱 검정의 이론 살펴보기

2022.08.16 - [통계 이론] - [이론] 카이 제곱 검정 (Chi-squared test)

 

[이론] 카이 제곱 검정 (Chi-squared test)

[이론] 카이 제곱 검정 (Chi-squared test)  범주형 자료의 분포에 유의미한 차이가 있는지 검정하기 위해 카이 제곱 검정 (Chi-squared test)를 시행하곤 한다. 깊은 이야기를 하기 전에 이번 글에서는

medistat.tistory.com

 

 

 

SPSS 카이 제곱 검정 정복 완료!

 

작성일: 2022.09.06.

최종 수정일: 2022.09.06.

이용 프로그램: IBM SPSS v26

운영체제: Windows 10

반응형

'범주형 자료 분석 > SPSS' 카테고리의 다른 글

[SPSS] 피셔 정확 검정  (0) 2022.09.20
반응형

[SPSS] 도수분포표 (Frequency table), 분할표 (Contingency table) 만들기

 

 수천 명의 정보를 포함한 데이터를 한눈에 요약하고 싶을 때가 많다. 나이, 혈압과 같은 연속형 변수는 평균으로 요약하곤 하는데, 성별이나 음주 여부는 평균을 구할 수 없으니 빈도를 제시하곤 한다. 이를 표로 제시하면 도수분포표 (Frequency table)가 된다. 이를 넘어서 남성 중 음주자가 몇 명인지, 여성중 비음주자가 몇 명인지 알고 싶을 때가 있는데, 이때 사용하는 것이 분할표 (Contingency table)이다. 즉 본 글의 목적은 다음 두 개의 표 내용을 채우는 것이다.

 

<도수분포표>

  빈도 백분율 누적백분율
여성      
남성      

 

<분할표>

  비음주자 음주자 합계
여성      
남성      
합계      

 

 

*실습용 데이터는 아래 링크를 클릭하면 다운로드할 수 있습니다.

2022.08.04 - [공지사항 및 소개] - 분석용 데이터 (update 22.08.29)

 

분석용 데이터 (update 22.08.29)

2022년 08월 29일 버전입니다. 변수는 계속하여 추가될 예정입니다. 다음 카테고리에 있는 글에서 이용된 데이터입니다. - 기술 통계 - 통계 프로그램 사용 방법 1) 엑셀 파일 2) CSV 파일 3) 코드북

medistat.tistory.com

 

먼저 데이터를 불러온다. 데이터를 불러오는 방법은 다음 글을 확인하길 바란다.

2022.08.04 - [통계 프로그램 사용 방법/SPSS] - [SPSS] 데이터 불러오기 및 저장하기

 

도수분포표 작성하기

1) 분석(A) > 기술통계량(E) > 빈도분석(F) 

 

2) 분석하고자 하는 변수(SEX)를 오른쪽으로 옮기고 "확인" 누르기

 

결과

빈도: 각 카테고리에 속하는 사람의 수

퍼센트: 전체 인구 (결측값 포함)에서 각 카테고리에 속하는 사람이 차지하는 분율

 - 따라서 결측값이 있는 경우 퍼센트의 총합은 100이 안 될 수 있다.

유효 퍼센트: 결측치를 제외한 인구에서 각 카테고리에 속하는 사람이 차지하는 분율 

 - 따라서 결측치 유무에 관계없이 유효 퍼센트의 총합은 100이 된다.

누적 퍼센트: 유효 퍼센트를 누적으로 더한 것

 

본 데이터에는 결측치가 없으므로 퍼센트와 유효 퍼센트는 같은 값으로 나온다. 보통의 경우 결측치를 제외했을 때의 퍼센트를 구하니 "유효 퍼센트"를 사용하면 된다. 도수분포표를 채우면 다음과 같다.

 

  빈도 백분율 누적백분율
여성 482 48.2 48.2
남성 518 51.8 100.0

 

분할표 작성하기

1) 분석(A) > 기술통계량(E) > 교차분석(C) 

 

2) 행과 열에 원하는 변수를 넣어주기. 여기에서는 행에 SEX를, 열에 ALCOHOL을 넣었다. 그리고 셀(E)을 클릭한다.

 

3) 퍼센트 박스의 세 개의 체크 박스를 모두 선택한다. 계속 (C)를 누른다.

4) "확인"버튼을 누른다.

결과

 

각 내용은 다음과 같다. 

 

각 셀 안의 내용물은 다음과 같다

(1) 빈도 - 각 셀에 해당하는 인구의 수

  비음주자 음주자 합계
여성 236
49.0%
57.6%
23.6%
246
51.0%
41.7%
24.6%
482
100.0%
48.2%
48.2%
남성 174
33.6%
42.4%
17.4%
344
66.4%
58.3%
34.4%
518
100.0%
51.8%
51.8%
합계 410
41.0%
100.0%
41.0%
590
59.0%
100.0%
59.0%
1000
100.0%
100.0%
100.0%

 

 

(2) 행 백분율 - 각 행에서 빈도가 차지하는 분율.

 - 여성에서 비음주자가 차지하는 분율은 49.0%, 음주자가 차지하는 분율은 51.0%다.

 - 남성에서 비음주자가 차지하는 분율은 33.6%, 음주자가 차지하는 분율은 66.4%다.

따라서 행별로 더하면 (=같은 색깔끼리 더하면) 100%가 나오게 된다.

  비음주자 음주자 합계
여성 236
49.0%
57.6%
23.6%
246
51.0%
41.7%
24.6%
482
100.0%
48.2%
48.2%
남성 174
33.6%
42.4%
17.4%
344
66.4%
58.3%
34.4%
518
100.0%
51.8%
51.8%
합계 410
41.0%
100.0%
41.0%
590
59.0%
100.0%
59.0%
1000
100.0%
100.0%
100.0%

(3) 열 백분율 - 각 열(칼럼)에서 빈도가 차지하는 분율.

 - 비음주자에서 여성이 차지하는 분율은 57.6%, 남성이 차지하는 분율은 42.4%다.

 - 음주자에서 여성이 차지하는 분율은 41.7%, 남성이 차지하는 분율은 58.3%다.

따라서 열(칼럼) 별로 더하면 (=같은 색깔끼리 더하면) 100%가 나오게 된다.

  비음주자 음주자 합계
여성 236
49.0%
57.6%
23.6%
246
51.0%
41.7%
24.6%
482
100.0%
48.2%
48.2%
남성 174
33.6%
42.4%
17.4%
344
66.4%
58.3%
34.4%
518
100.0%
51.8%
51.8%
합계 410
41.0%
100.0%
41.0%
590
59.0%
100.0%
59.0%
1000
100.0%
100.0%
100.0%

 

(4) 백분율 - 빈도를 전체 인구 (1,000)으로 나눠 %로 나타낸 값

세로 혹은 가로로 더하면 합계의 백분율과 일치하며 백분율의 총합은 100과 같다.

  비음주자 음주자 합계
여성 236
49.0%
57.6%
23.6%
246
51.0%
41.7%
24.6%
482
100.0%
48.2%
48.2%
남성 174
33.6%
42.4%
17.4%
344
66.4%
58.3%
34.4%
518
100.0%
51.8%
51.8%
합계 410
41.0%
100.0%
41.0%
590
59.0%
100.0%
59.0%
1000
100.0%
100.0%
100.0%

 

 

세 개 이상의 변수를 사용하는 분할표

세 개 이상의 변수를 사용하여 분할표를 작성하고 싶을 때가 있다. 조건에 따라 분할표를 작성하는 경우가 해당하는데 예를 들어 고혈압 여부에 따른 성별-음주의 분할표를 그려보도록 하겠다.

 

1) 분석(A) > 기술통계량(E) > 교차분석(C) 

 

2) 행과 열에 원하는 변수를 넣어주기. 여기에서는 행에 SEX를, 열에 ALCOHOL을 넣었다. 조건 (고혈압 여부)에 해당하는 변수인 HTN을 레이어에 넣는다. 그리고 셀(E)을 클릭한다.

 

3) 퍼센트 박스의 세 개의 체크 박스를 모두 선택한다. 계속 (C)를 누른다.

4) "확인"버튼을 누른다.

결과

고혈압이 없는 (HTN=0) 사람의 성별-음주 분할표가 위에 나오고, 고혈압이 있는 (HTN=1) 사람의 성별-음주 분할표가 따라 나오게 된다. 

 

SPSS 도수분포표, 분할표 정복 완료!

 

작성일: 2022.09.06.

최종 수정일: 2022.09.06.

이용 프로그램: IBM SPSS v26

운영체제: Windows 10

반응형
반응형

[이론] p-value에 관한 고찰

 

 P-value란 무엇인가?

 의학 및 보건학 논문을 읽다 보면 빠지지 않고 나오는 숫자가 p-value다. 연구를 하는 사람들도 그저 p-value는 0.05보다 작기만을 바라는 경향이 있다. 하지만, p-value에 관한 의미를 정확히 이해하지 못한다면 엉뚱한 결론을 짓는 잘못을 저지를 수도 있다. 따라서 본 포스팅에서는 p-value가 무엇인지 알아보고자 한다.

 

왜 다들 p-value를 이해하려 하지 않을까?

 논문을 쓰는 저자들도, 읽는 독자들도 p-value의 의미를 이해하지 않고 사용하는 경향이 있다. 이는 아마 p-value의 개념 자체가 꽤 복잡하기 때문일 것이다. 본 포스팅이 그 복잡한 내용으로 시작한다면 그들과 똑같은 짓을 하는 것일 테니, 학문적으로 복잡한 내용은 글 말미에 언급하도록 하겠다. 

 

실생활에 존재하는 p-value (One-tailed)

인식은 못하고 있겠지만, 여러분 모두 p-value가 무엇인지 아주 깊이 이해하고 있다. 다음 상황을 보자.

어느 동네에 야바위꾼이 여행객을 유혹한다.

야바위꾼: "동전을 던져 앞면이 나오면 제가, 뒷면이 나오면 당신이 이기는 것입니다. 진 사람은 이긴 사람에게 10,000원을 주면 됩니다."
여행객 A: "내가 하겠소. 10판을 합시다."

야바위꾼은 동전을 10번 던졌고, 앞면이 9회, 뒷면이 1회 나왔다. 

야바위꾼: "나에게 80,000원을 주시오."
여행객 A: (돈을 던지며) "이 나쁜 사기꾼아!!"

 누구든 저 여행객 A 입장이 되면 야바위꾼이 사기꾼이라고 생각할 것이다. 놀랍게도 이 짧은 이야기에 귀무가설, 대립 가설, p-value에 관한 내용이 모두 담겨있다. 다시 이야기로 돌아가 왜 여행객 A가 야바위꾼이 사기꾼이라고 생각하게 됐는지 그 사고 과정을 낱낱이 살펴보도록 하자. 여행객 A는 아마 다음과 같은 사고 과정을 거쳤을 것이다.

 

(야바위꾼의 호객행위를 들었을 때)

 - "저 동전은 공정한 동전이라 앞면이 나올 확률이 $1/2$, 뒷면이 나올 확률이 $1/2$일 거야."

 - "10번 던지면 5회쯤은 앞면이, 5회쯤은 뒷면이 나오겠지. 물론 5:5가 아니라 6:4 정도의 결과도 발생할 수는 있겠지. 운이 좋아 뒷면이 6회가 나온다면 내가 20,000원을 따겠구먼."

 

(동전을 던지고 난 뒤)

 - "어떻게 앞면이 9번이나 나올 수가 있어?! 이 정도의 일이 일어날 확률이 얼마나 된다고?!"

 - "분명 저 동전은 일반 동전이 아닐 거야. 앞 면이 더 잘 나오도록 어떤 조치를 취해뒀을 거야."

 

 

이 이야기의 귀무가설, 대립 가설, p-value은 다음과 같다.

귀무가설 : "저 동전은 공정한 동전이라 앞면이 나올 확률이 $1/2$, 뒷면이 나올 확률이 $1/2$일 거야."

대립 가설: "앞 면이 더 잘 나오도록 어떤 조치를 취해뒀을 거야" 

p-value: "이 정도의 일이 일어날 확률"

 

p-value

위 내용에서 "이 정도의 일이 일어날 확률"은 얼마나 될까?

또한,  "이 정도의 일"이란 무엇일까?

 

여행객 A는 앞면이 10회 나왔다면 더 화가 났을 것이다. 앞면이 8회 나온 상황에서도 화가 날 수 있지만, "이 정도의 일"까지는 아닌 것이다. 따라서 "이 정도의 일"이란 "앞면이 10회 나오는 일"과 "앞면이 9회 나오는 일"인 것이다. 이런 확률은 다음과 같이 계산된다.

 

$$\begin{align} P(X=9) &= _{10}C_1  \left( \frac {1} {2} \right)^{10} = \frac {10} {1024} \\ P(X=10) &= \left( \frac {1} {2} \right)^{10} = \frac {1} {1024} \\ \therefore P&= \frac {1+10} {1024} = \frac {11} {1024} \approx 0.0107 \\&& \end{align} $$

 

즉 여행객 A는 1.07%의 확률을 뚫고 일어난 일이 본인에게 발생했다는 것을 믿을 수 없어 "앞 면이 더 잘 나오도록 어떤 조치를 취해뒀을 거야"라는 생각을 하는 것이 합리적이라고 봤을 것이다.

 

 

실생활에 존재하는 p-value (Twe-tailed)

위의 상황은 "one-tailed"의 상황이었다. 이게 뭔지 몰라도 아래 "two-tailed"을 다루는 이야기를 보면 이해가 될 것이다.

어느 동네에 야바위꾼 두 명이 여행객들을 유혹한다.

야바위꾼A: (야바위꾼 B를 보며) "동전을 던져 앞면이 나오면 제(야바위꾼 A)가, 뒷면이 나오면 당신(야바위꾼 B)이 점수 1점을 획득합니다. 10번을 던졌을 때 저희 둘 중 한명이 9점 이상을 얻으면 저희의 승리, 둘 다 8점 이하라면 여행객 여러분들의 승리입니다. 패자는 승자에게 100,000원을 주면 됩니다."
여행객들: "내가 하겠소."

야바위꾼A는 동전을 10번 던졌고, 앞면이 9회, 뒷면이 1회 나왔다. 

야바위꾼: "제가 9점을 얻었습니다. 여행객 여러분은 제게 100,000원을 주시오."
여행객들: (돈을 던지며) "이 나쁜 사기꾼아!!"

이 상황에서도 여행객들은 화가 날 것이다. "이런 일"이 일어날 확률이 얼마 되지 않을 테니 사기를 쳤다고 확신할 것이다. 하지만 앞의 상황과는 "이런 일"의 정의가 조금 바뀌게 된다. 동전을 던지고 난 뒤 여행객들의 생각은 다음과 같을 것이다.

 

(동전을 던지고 난 뒤)

 - "어떻게 한쪽이 9번이나 나올 수가 있어?! 이 정도의 일이 일어날 확률이 얼마나 된다고?!"

 - "분명 저 동전은 일반 동전이 아닐 거야. 앞 면이든 뒷면이든 한쪽이 더 잘 나오도록 어떤 조치를 취해뒀을 거야."

 

앞의 상황(one-tailed)에서는 "앞면"이었던 것이 "한쪽"으로 바뀌었다. 누가 이기든 극단적인 양쪽(Two-tailed, two-sided)의 사건이 발생할 확률로 확인하는 것이 양측 검정이다. 

 

P-value의 학술적인 표현

P-value는 다음과 같이 기술할 수 있다. "귀무가설이 맞다고 할 때 이런 현상이 발생했을 확률"

이 정의는 좀 날 것 그대로니 학술적인 수정을 가하면 다음과 같다. "귀무가설이 맞는 데도 불구하고, 대립 가설을 선택했을 확률" 

보통 관련성이 없는 내용을 귀무가설로 설정하므로 "아무 관련성이 없는 게 학문적 진실인데, 관련성이 있다고 결론 내렸을 확률"이라고도 할 수 있다.

 

통계 검정으로의 적용

 P-value=0.01이라고 하자.

  (1) 귀무가설: 독립 변수(X)와 종속 변수(Y) 사이에 아무 관련성이 없다는 것이 사실이라고 했을 때 

  (2) p-value: 지금과 같은 현상이 일어날 확률은 0.01이므로 일어나기 어려운 일이다.

  (3) 대립 가설: 따라서 모종의 관련성이 있다고 하자.

 

아무 관련성이 없다는 말은 분석 방법에 따라 다르게 표현된다.

  (1) 로지스틱 회귀분석에서는 $\beta=0$ 혹은 $OR=1$으로 표현된다.

  (2) 선형 회귀분석에서는 $\beta=0$으로 표현된다.

  (3) Cox 회귀분석에서는 $\beta=0$ 혹은 $HR=1$으로 표현된다.

 

분석 방법에 따라 귀무가설이 표현되는 방법은 서로 다르다.

 

통계 검정으로의 적용 - 예외

다음 세 가지 분석은 다른 분석과는 다르게 귀무가설이 채택되기를 바라는 분석이다.

1) 정규성 검정 (Normality test): Shapiro-Wilk test, Kolmogorov-Smirnov test

2) Ordinal logistic regression의 proportional odds assumption 검정인 Score test

3) Cox regression의 proportional hazard assumption 검정인 Schoenfeld residual test

 

각 통계분석의 귀무가설은 다음과 같다.

 1) 데이터가 정규성을 따른다.

 2) Proportional odds assumption을 만족한다.

 3) Proportional hazards assumption을 만족한다.

 

즉 p-value가 0.05보다 작은 경우 귀무가설을 기각할 수 있으므로 정규성을 따르지 않는다거나, proportional odds/hazard를 만족하지 않는다고 할 수 있다. 하지만 p-value가 0.05보다 큰 경우 귀무가설을 기각할 수는 없다. 하지만 이 말이 귀무가설이 맞다는 말이 아니므로 정규성을 만족한다든가, proportional odds/hazard를 만족한다고 할 수는 없는 것이다. 이 점에 유의하며 p-value를 해석해야 한다. 따라서 우리가 통계 검정을 할 때에는 귀무가설이 무엇인지, 대립 가설이 무엇인지 항상 생각해야 한다.

 

 

[이론] P-value 정복 완료!

 

작성일: 2022.09.05.

최종 수정일: 2022.09.05.

반응형
반응형

[R] 피셔 정확 검정 - CrossTable()

 

 범주형 변수의 분포 사이에 유의미한 차이가 있는지 확인하는 분석으로는 보통 카이 제곱 검정을 시행한다. R을 이용한 카이 제곱 검정 시행법은 다음 두 링크에서 확인할 수 있다.

2022.08.31 - [범주형 자료 분석/R] - [R] 카이 제곱 검정 - chisq.test()

2022.09.01 - [범주형 자료 분석/R] - [R] 카이 제곱 검정 - CrossTable()

 

그런데 기대 빈도가 5를 넘지 않는 셀이 전체의 25% 이상인 경우 카이 제곱 검정의 결과는 신뢰도가 떨어져 쓸 수 없게 되고 피셔 정확 검정을 사용해야 한다. 이에 대한 이론적인 내용은 다음 링크에서 확인할 수 있다.

피셔 정확 검정: 2022.08.26 - [통계 이론] - [이론] 피셔 정확 검정 (Fisher's exact test)

피셔 정확 검정과 카이 제곱 검정의 관계:2022.08.29 - [통계 이론] - [이론] 카이 제곱 검정과 피셔 정확 검정의 관계

 

이전 포스팅에서는 fisher.test()를 이용하여 피셔 정확 검정을 하는 방법을 소개했고 이번에는 CrossTable() 함수를 이용한 방법을 소개하겠다.

 

성별과 RH혈액형 간의 관계가 다음과 같다고 하자. RH혈액형의 분포를 보니 RH- 6명 중 5명이 무려 남성에 치우쳐져 있다. 이 결과를 보고 "남성일수록 RH-일 경향성이 있다."라고 할 수 있는지 따지는 검정이 피셔 정확 검정이다. 

  RH- RH+
여성 1 481
남성 5 513

 

일반적으로 이런 경우 카이 제곱 검정을 사용하지만 이 경우 사용할 수 없다. 기대 빈도가 5를 넘지 않는 셀이 전체의 25% 이상이기 때문인데, 한번 확인해보도록 하자.

 

*실습용 데이터는 아래 링크를 클릭하면 다운로드할 수 있습니다.

2022.08.04 - [공지사항 및 소개] - 분석용 데이터 (update 22.08.29)

 

분석용 데이터 (update 22.08.29)

2022년 08월 29일 버전입니다. 변수는 계속하여 추가될 예정입니다. 다음 카테고리에 있는 글에서 이용된 데이터입니다. - 기술 통계 - 통계 프로그램 사용 방법 1) 엑셀 파일 2) CSV 파일 3) 코드북

medistat.tistory.com

 

코드를 보여드리기에 앞서 워킹 디렉토리부터 지정하겠다.

워킹 디렉토리에 관한 설명은 다음 링크된 포스트에서 볼 수 있다.

2022.08.05 - [통계 프로그램 사용 방법/R] - [R] 작업 디렉토리 (Working Directory) 지정 - getwd(), setwd()

setwd("C:/Users/user/Documents/Tistory_blog")

 

데이터를 불러와 df에 객체로 저장하겠다.

데이터 불러오는 방법은 다음 링크에서 볼 수 있다.

2022.08.05 - [통계 프로그램 사용 방법/R] - [R] 데이터 불러오기 : EXCEL - read_excel(), read.xlsx()

2022.08.10 - [통계 프로그램 사용 방법/R] - [R] 데이터 저장하기 : CSV 파일 - write.csv(), write_csv()

2022.08.10 - [통계 프로그램 사용 방법/R] - [R] 데이터 불러오기 : SAS file (.sas7bdat) - read.sas7bdat(), read_sas()

install.packages("readr")
library("readr")
df<-read_csv("Data.csv")

 

코드 - 피셔 정확 검정

CrossTable() 함수는 gmodels 패키지에 있으므로, 설치를 먼저 하기로 한다.

install.packages("gmodels")
library("gmodels")
CrossTable(df$SEX, df$RH, prop.chisq=FALSE, fisher=TRUE,expected=TRUE, prop.r=FALSE, prop.c=FALSE, prop.t=FALSE)

CrossTable(df$SEX, df$RH, prop.chisq=FALSE, fisher=TRUE,expected=TRUE, prop.r=FALSE, prop.c=FALSE, prop.t=FALSE) : df에 있는 SEX변수와 RH변수로 분할표를 만들라.  카이 제곱 기여분은 표시하지 말라 (prop.chisq=FALSE), 피셔 정확 검정은 시행하고 셀 별로 기댓값을 산출하라 (fisher=TRUE,expected=TRUE), 행백분율, 열백분율, 백분율은 산출하지 말라 (prop.r=FALSE, prop.c=FALSE, prop.t=FALSE)]

 

결과 

   'Cell Contents
|-------------------------|
|                       N |
|              Expected N |
|-------------------------|

 
Total Observations in Table:  1000 

 
             | df$RH 
      df$SEX |         0 |         1 | Row Total | 
-------------|-----------|-----------|-----------|
           0 |         1 |       481 |       482 | 
             |     2.892 |   479.108 |           | 
-------------|-----------|-----------|-----------|
           1 |         5 |       513 |       518 | 
             |     3.108 |   514.892 |           | 
-------------|-----------|-----------|-----------|
Column Total |         6 |       994 |      1000 | 
-------------|-----------|-----------|-----------|

 
Statistics for All Table Factors


Pearson's Chi-squared test 
------------------------------------------------------------
Chi^2 =  2.403963     d.f. =  1     p =  0.1210283 

Pearson's Chi-squared test with Yates' continuity correction 
------------------------------------------------------------
Chi^2 =  1.30126     d.f. =  1     p =  0.2539832 

 
Fisher's Exact Test for Count Data
------------------------------------------------------------
Sample estimate odds ratio:  0.2135842 

Alternative hypothesis: true odds ratio is not equal to 1
p =  0.2191681 
95% confidence interval:  0.004505326 1.918452 

Alternative hypothesis: true odds ratio is less than 1
p =  0.1264398 
95% confidence interval:  0 1.492381 

Alternative hypothesis: true odds ratio is greater than 1
p =  0.9809505 
95% confidence interval:  0.009115443 Inf


 
Warning messages:
1: In chisq.test(t, correct = TRUE, ...) :
  Chi-squared approximation may be incorrect
2: In chisq.test(t, correct = FALSE, ...) :
  Chi-squared approximation may be incorrect 

1) Pearson's Chi-squared test ,Pearson's Chi-squared test with Yates' continuity correction 

 카이 제곱 검정을 시행하는 말은 없었으나, 기댓값을 산출하라는 코드(expected=TRUE)가 있었으므로 카이 제곱 검정은 자동으로 시행한다. 하지만 맨 밑에 경고에서 볼 수 있듯이 카이 제곱 검정 결과는 사용하지 않는 게 좋다.

 

2) Alternative hypothesis: true odds ratio is not equal to 1
p =  0.2191681

양측 검정의 결과 p-value는 0.2192다.

 

3) Alternative hypothesis: true odds ratio is less than 1
p =  0.1264398

하단측 p-value는 0.1264다

 

4) Alternative hypothesis: true odds ratio is greater than 1
p =  0.9809505 

상단측 p-value는 0.9810이다. 

 

보통은 양측 검정 결과를 받아들이며, p-value>0.05이므로 성별과 RH혈액형 간에는 유의미한 분포의 차이가 있다고 볼 근거가 없다. (양측, 단측 검정의 이론적인 배경과 설명은 다음 링크를 확인하길 바란다.2022.08.26 - [통계 이론] - [이론] 피셔 정확 검정 (Fisher's exact test))

 

코드 정리

#작업 디렉토리 지정
setwd("C:/Users/user/Documents/Tistory_blog")

#데이터 불러오기
install.packages("readr")
library("readr")
df<-read_csv("Data.csv")

#피셔 정확 검정 시행하기
install.packages("gmodels")
library("gmodels")
CrossTable(df$SEX, df$RH, prop.chisq=FALSE, fisher=TRUE,expected=TRUE, prop.r=FALSE, prop.c=FALSE, prop.t=FALSE)

 

[R] 피셔 정확 검정 정복 완료!

 

작성일: 2022.09.02.

최종 수정일: 2022.09.02.

이용 프로그램: R 4.1.3

RStudio v1.4.1717

RStudio 2021.09.1+372 "Ghost Orchid" Release 

운영체제: Windows 10, Mac OS 10.15.7

반응형
반응형

[R] 피셔 정확 검정 - fisher.test()

 

 범주형 변수의 분포 사이에 유의미한 차이가 있는지 확인하는 분석으로는 보통 카이 제곱 검정을 시행한다. R을 이용한 카이 제곱 검정 시행법은 다음 두 링크에서 확인할 수 있다.

2022.08.31 - [범주형 자료 분석/R] - [R] 카이 제곱 검정 - chisq.test()

2022.09.01 - [범주형 자료 분석/R] - [R] 카이 제곱 검정 - CrossTable()

 

그런데 기대 빈도가 5를 넘지 않는 셀이 전체의 25% 이상인 경우 카이 제곱 검정의 결과는 신뢰도가 떨어져 쓸 수 없게 되고 피셔 정확 검정을 사용해야 한다. 이에 대한 이론적인 내용은 다음 링크에서 확인할 수 있다.

피셔 정확 검정: 2022.08.26 - [통계 이론] - [이론] 피셔 정확 검정 (Fisher's exact test)

피셔 정확 검정과 카이 제곱 검정의 관계:2022.08.29 - [통계 이론] - [이론] 카이 제곱 검정과 피셔 정확 검정의 관계

 

본 포스팅에서는 피셔 정확 검정을 어떻게 시행하는지 설명하고자 한다.

 

성별과 RH혈액형 간의 관계가 다음과 같다고 하자. RH혈액형의 분포를 보니 RH- 6명 중 5명이 무려 남성에 치우쳐져 있다. 이 결과를 보고 "남성일수록 RH-일 경향성이 있다."라고 할 수 있는지 따지는 검정이 피셔 정확 검정이다. 

  RH- RH+
여성 1 481
남성 5 513

 

일반적으로 이런 경우 카이 제곱 검정을 사용하지만 이 경우 사용할 수 없다. 기대 빈도가 5를 넘지 않는 셀이 전체의 25% 이상이기 때문인데, 한번 확인해보도록 하자.

 

*실습용 데이터는 아래 링크를 클릭하면 다운로드할 수 있습니다.

2022.08.04 - [공지사항 및 소개] - 분석용 데이터 (update 22.08.29)

 

분석용 데이터 (update 22.08.29)

2022년 08월 29일 버전입니다. 변수는 계속하여 추가될 예정입니다. 다음 카테고리에 있는 글에서 이용된 데이터입니다. - 기술 통계 - 통계 프로그램 사용 방법 1) 엑셀 파일 2) CSV 파일 3) 코드북

medistat.tistory.com

 

코드를 보여드리기에 앞서 워킹 디렉토리부터 지정하겠다.

워킹 디렉토리에 관한 설명은 다음 링크된 포스트에서 볼 수 있다.

2022.08.05 - [통계 프로그램 사용 방법/R] - [R] 작업 디렉토리 (Working Directory) 지정 - getwd(), setwd()

setwd("C:/Users/user/Documents/Tistory_blog")

 

데이터를 불러와 df에 객체로 저장하겠다.

데이터 불러오는 방법은 다음 링크에서 볼 수 있다.

2022.08.05 - [통계 프로그램 사용 방법/R] - [R] 데이터 불러오기 : EXCEL - read_excel(), read.xlsx()

2022.08.10 - [통계 프로그램 사용 방법/R] - [R] 데이터 저장하기 : CSV 파일 - write.csv(), write_csv()

2022.08.10 - [통계 프로그램 사용 방법/R] - [R] 데이터 불러오기 : SAS file (.sas7bdat) - read.sas7bdat(), read_sas()

install.packages("readr")
library("readr")
df<-read_csv("Data.csv")

 

일반적인 분석처럼 생각하고 카이 제곱 검정을 시행하면 다음과 같은 결과가 나온다. 카이 제곱 검정 방법은 다음 두 가지 방법을 이미 소개한 바가 있다.

2022.08.31 - [범주형 자료 분석/R] - [R] 카이 제곱 검정 - chisq.test()

2022.09.01 - [범주형 자료 분석/R] - [R] 카이 제곱 검정 - CrossTable()

 

코드 - 카이 제곱 검정

chi_sex_rh<-chisq.test(df$SEX, df$RH, correct=FALSE)
chi_sex_rh

결과

	Pearson's Chi-squared test

data:  df$SEX and df$RH
X-squared = 2.404, df = 1, p-value = 0.121

Warning message:
In chisq.test(df$SEX, df$RH, correct = FALSE) :
  Chi-squared approximation may be incorrect

결과 중 경고 메시지를 보면

"Warning message:
In chisq.test(df$SEX, df$RH, correct = FALSE) :
  Chi-squared approximation may be incorrect"

 카이 제곱 분포로의 근사는 정확하지 않을 수 있다고 설명해주고 있다. 이유는 기대 빈도가 5를 넘지 않는 셀이 전체의 25% 이상이기 때문이다. 

 

코드 - 기대 빈도

 그런데, 카이 제곱 분포를 쓰지 말고 피셔 정확 검정을 써야 하는 기준에 대해서는 사람마다 견해가 다르기도 하다. 따라서 기대 빈도를 직접 확인해보는 것이 좋은데 다음 두 가지 방법을 사용할 수 있다.

 (1) chisq.test() 검정 결과의 expected를 보기

 (2) 분할표를 산출할 때 기대 빈도도 산출하도록 "expected=TRUE"를 산입 하기. 그리고 행백분율 (prop.r), 열백분율(prop.c), 백분율 (prop.t) 는 FALSE로 처리하여 보이지 않게 하기.

#방법 1
chi_sex_rh$expected

#방법 2
install.packages("gmodels")
library("gmodels")
CrossTable(df$SEX, df$RH, prop.chisq=FALSE, expected=TRUE, prop.r=FALSE, prop.c=FALSE, prop.t=FALSE)

 

결과

방법 1)
      df$RH
df$SEX     0       1
     0 2.892 479.108
     1 3.108 514.892
     
방법 2)
   Cell Contents
|-------------------------|
|                       N |
|              Expected N |
|-------------------------|

 
Total Observations in Table:  1000 

 
             | df$RH 
      df$SEX |         0 |         1 | Row Total | 
-------------|-----------|-----------|-----------|
           0 |         1 |       481 |       482 | 
             |     2.892 |   479.108 |           | 
-------------|-----------|-----------|-----------|
           1 |         5 |       513 |       518 | 
             |     3.108 |   514.892 |           | 
-------------|-----------|-----------|-----------|
Column Total |         6 |       994 |      1000 | 
-------------|-----------|-----------|-----------|

 

기대 빈도가 5 미만인 셀이 [남성&RH-], [여성&RH-] 두 칸이나 존재한다. 이래서 카이 제곱 검정에서 오류를 띄웠던 것이다. 따라서 피셔 정확 검정을 해야 한다.

 

코드 - 피셔 정확 검정

fisher.test(df$SEX, df$RH)

fisher.test(df$SEX, df$RH) : df 데이터의 SEX변수와 RH변수로 피셔 정확 검정을 시행하라

 

결과

	Fisher's Exact Test for Count Data

data:  df$SEX and df$RH
p-value = 0.2192

alternative hypothesis: true odds ratio is not equal to 1
95 percent confidence interval:
 0.004505326 1.918452173
sample estimates:
odds ratio 
 0.2135842

우리가 봐야 할 곳은 세 번째 줄의 "p-value = 0.2192"이다. 피셔 정확 검정 결과 p-value는 0.2192로 0.05보다 크므로 "성별에 따라 RH혈액형의 분포가 다르다고 할 수 없다."라고 결론지어야 한다.

 

피셔 정확 검정을 구동하는 또 다른 방법이 있다. 먼저 분할표를 만든 뒤 시행하는 것이다. 

freq_sex_rh<-xtabs(~SEX+RH, data=df)
table_sex_rh<-table(df$SEX, df$RH)

fisher.test(freq_sex_rh)
fisher.test(table_sex_rh)

freq_sex_rh<-xtabs(~SEX+RH, data=df) : xtabs()함수를 이용하여 SEX와 RH의 분할표를 만들어라. 단 데이터는 df를 사용하라. 만든 것은 freq_sex_rh에 저장하라.
table_sex_rh<-table(df$SEX, df$RH) : df의 SEX와 df의 RH로 분할표를 만들어라. 만든 것은 table_sex_rh에 저장하라.

fisher.test(freq_sex_rh) : 분할표 freq_sex_rh로 피셔 정확 검정을 시행하라.
fisher.test(table_sex_rh) :  분할표 table_sex_rh로 피셔 정확 검정을 시행하라.

 

결과

-freq_sex_rh사용한 결과
	Fisher's Exact Test for Count Data

data:  freq_sex_rh
p-value = 0.2192

alternative hypothesis: true odds ratio is not equal to 1
95 percent confidence interval:
 0.004505326 1.918452173
sample estimates:
odds ratio 
 0.2135842 
 
 -table_sex_rh사용한 결과
 	Fisher's Exact Test for Count Data

data:  table_sex_rh
p-value = 0.2192

alternative hypothesis: true odds ratio is not equal to 1
95 percent confidence interval:
 0.004505326 1.918452173
sample estimates:
odds ratio 
 0.2135842

당연하게도 모두 같은 결과를 보여준다.

 

코드 - 단측 검정

지금까지의 내용은 양측 검정 (Two-sided, two-tailed) 의 내용이었다. 단측 검정을 원한다면 코드는 달라진다. (단측, 양측 피셔 정확 검정에 관한 내용은 다음 링크 확인 바란다:2022.08.26 - [통계 이론] - [이론] 피셔 정확 검정 (Fisher's exact test))

#상단 측 p-value
fisher.test(df$SEX, df$RH, alternative="greater")

#하단 측 p-value
fisher.test(df$SEX, df$RH, alternative="less")

결과

	Fisher's Exact Test for Count Data

data:  df$SEX and df$RH
p-value = 0.981

alternative hypothesis: true odds ratio is greater than 1
95 percent confidence interval:
 0.009115443         Inf
sample estimates:
odds ratio 
 0.2135842 
 
 	Fisher's Exact Test for Count Data

data:  df$SEX and df$RH
p-value = 0.1264

alternative hypothesis: true odds ratio is less than 1
95 percent confidence interval:
 0.000000 1.492381
sample estimates:
odds ratio 
 0.2135842

상단측 p-value와 하단측 p-value는 각각 0.9810, 0.1264다.

 

코드 정리

#작업 디렉토리 지정
setwd("C:/Users/user/Documents/Tistory_blog")

#데이터 불러오기
install.packages("readr")
library("readr")
df<-read_csv("Data.csv")

#카이제곱검정 시행해보기
chi_sex_rh<-chisq.test(df$SEX, df$RH, correct=FALSE)
chi_sex_rh

#기대 빈도 확인하기
#방법 1
chi_sex_rh$expected

#방법 2
install.packages("gmodels")
library("gmodels")
CrossTable(df$SEX, df$RH, prop.chisq=FALSE, expected=TRUE, prop.r=FALSE, prop.c=FALSE, prop.t=FALSE)

#피셔 정확 검정 시행하기
fisher.test(df$SEX, df$RH)

#분할표를 만든 뒤 피셔 정확 검정 시행하기
freq_sex_rh<-xtabs(~SEX+RH, data=df)
table_sex_rh<-table(df$SEX, df$RH)

fisher.test(freq_sex_rh)
fisher.test(table_sex_rh)

 

[R] 피셔 정확 검정 정복 완료!

 

작성일: 2022.09.02.

최종 수정일: 2022.09.02.

이용 프로그램: R 4.1.3

RStudio v1.4.1717

RStudio 2021.09.1+372 "Ghost Orchid" Release 

운영체제: Windows 10, Mac OS 10.15.7

반응형
반응형

 

[R] 카이 제곱 검정 (일반 및 연속성 수정) - CrossTable()

 

 이전 글에서 R의 chisq.test() 함수를 사용하여 카이 제곱 검정을 하는 방법을 소개하였다(2022.08.31 - [범주형 자료 분석/R] - [R] 카이 제곱 검정 - chisq.test()). 하지만 SAS나 SPSS는 분할표와 카이 제곱 검정 결과를 같이 보여주는 데에 반해 R의 chisq.test()는 카이 제곱 검정 결과만 보여주어 불편한 감이 있다. 따라서 분할표와 카이 제곱 검정 결과를 한꺼번에 보여주는 CrossTable() 함수를 이용하여 카이 제곱 검정을 하고자 한다.

 

 카이 제곱 검정은 범주형 변수 간에 분포의 유의미한 차이가 있는지 확인하는 방법이다. 이해할 수 있는 언어로 표현하면 다음과 같다. 분할표를 작성하였을 때 다음과 같다고 하자. (출처 및 분할표 작성법:

2022.08.31 - [기술 통계/R] - [R] 도수분포표 (Frequency table), 분할표 (Contingency table) 만들기 - table(), prop.table(), xtabs(), margin.table()

2022.08.31 - [기술 통계/R] - [R] 도수분포표 (Frequency table), 분할표 (Contingency table) 만들기 - CrossTable())

  비음주자 음주자
여성 236 246
남성 174 344

 

이를 보면 비음주자 중에는 여성이 많고, 음주자 중에는 남성이 많다. 그렇다면 "성별과 음주 여부는 무관하다(=독립이다)."라는 말이 틀리다고 할 수 있을까? 즉, "특정 성별은 음주자일 확률이 더 높다."라고 할 수 있을까? 이에 대한 검정이 바로 카이 제곱 검정이다.

 

*실습용 데이터는 아래 링크를 클릭하면 다운로드할 수 있습니다.

2022.08.04 - [공지사항 및 소개] - 분석용 데이터 (update 22.08.29)

 

분석용 데이터 (update 22.08.29)

2022년 08월 29일 버전입니다. 변수는 계속하여 추가될 예정입니다. 다음 카테고리에 있는 글에서 이용된 데이터입니다. - 기술 통계 - 통계 프로그램 사용 방법 1) 엑셀 파일 2) CSV 파일 3) 코드북

medistat.tistory.com

 

코드를 보여드리기에 앞서 워킹 디렉토리부터 지정하겠다.

워킹 디렉토리에 관한 설명은 다음 링크된 포스트에서 볼 수 있다.

2022.08.05 - [통계 프로그램 사용 방법/R] - [R] 작업 디렉토리 (Working Directory) 지정 - getwd(), setwd()

setwd("C:/Users/user/Documents/Tistory_blog")

 

데이터를 불러와 df에 객체로 저장하겠다.

데이터 불러오는 방법은 다음 링크에서 볼 수 있다.

2022.08.05 - [통계 프로그램 사용 방법/R] - [R] 데이터 불러오기 : EXCEL - read_excel(), read.xlsx()

2022.08.10 - [통계 프로그램 사용 방법/R] - [R] 데이터 저장하기 : CSV 파일 - write.csv(), write_csv()

2022.08.10 - [통계 프로그램 사용 방법/R] - [R] 데이터 불러오기 : SAS file (.sas7bdat) - read.sas7bdat(), read_sas()

 

install.packages("readr")
library("readr")
df<-read_csv("Data.csv")

 

CrossTable() 함수는 gmodels라는 패키지에 있으므로 패키지를 설치한다.

패키지 설치 방법은 다음 글에서 볼 수 있다.

2022.08.05 - [통계 프로그램 사용 방법/R] - [R] 패키지 설치하기 - install.packages(), library()

install.packages("gmodels")
library("gmodels")

 

코드

CrossTable(df$SEX, df$ALCOHOL, prop.chisq=FALSE, chisq=TRUE)

 

결과

   Cell Contents
|-------------------------|
|                       N |
|           N / Row Total |
|           N / Col Total |
|         N / Table Total |
|-------------------------|

 
Total Observations in Table:  1000 

 
             | df$ALCOHOL 
      df$SEX |         0 |         1 | Row Total | 
-------------|-----------|-----------|-----------|
           0 |       236 |       246 |       482 | 
             |     0.490 |     0.510 |     0.482 | 
             |     0.576 |     0.417 |           | 
             |     0.236 |     0.246 |           | 
-------------|-----------|-----------|-----------|
           1 |       174 |       344 |       518 | 
             |     0.336 |     0.664 |     0.518 | 
             |     0.424 |     0.583 |           | 
             |     0.174 |     0.344 |           | 
-------------|-----------|-----------|-----------|
Column Total |       410 |       590 |      1000 | 
             |     0.410 |     0.590 |           | 
-------------|-----------|-----------|-----------|

 
Statistics for All Table Factors


Pearson's Chi-squared test 
------------------------------------------------------------
Chi^2 =  24.38918     d.f. =  1     p =  7.870935e-07 

Pearson's Chi-squared test with Yates' continuity correction 
------------------------------------------------------------
Chi^2 =  23.75786     d.f. =  1     p =  1.092485e-06

지난 글 (2022.08.31 - [기술 통계/R] - [R] 도수분포표 (Frequency table), 분할표 (Contingency table) 만들기 - CrossTable())에서 다룬 분할표가 위에 나오고, 아래 카이 제곱 검정 결과가 나온다. 연속성을 수정하지 않은 결과와 연속성을 수정한 결과가 차례대로 나온다. (연속성에 관한 내용은 다음 글을 확인하길 바란다:2022.08.30 - [통계 이론] - [이론] 연속성을 수정한 카이 제곱 검정 (Chi-squared test with Yates's correction for continuity))

 

해석

 연속성을 수정하지 않았을 때 p-value는 $7.871×10^{−7}=0.0000007871$으로 p-value가 0.05보다 낮으므로 성별과 음주의 분포에는 유의미한 차이가 있다고 결론 내릴 수 있다. 

 (연속성을 수정한 결과는 참고하지 않는다.)

 

기대 빈도는 걱정하지 않아도 돼?

걱정하지 않아도 된다. 만약 카이 제곱 검정을 시행하기에 적절하지 않은 데이터인 경우 다음과 같은 경고 메시지를 띄워주게 된다. 예를 들어 셀의 빈도가 5 미만인 경우가 생기는 다음 코드를 돌려 보자.

CrossTable(df$SEX, df$RH, prop.chisq=FALSE, chisq=TRUE)

 

그러면 우선 결과는 분석해주긴 하지만 적절하지 않을 수 있다며 경고를 띄워준다.

Statistics for All Table Factors


Pearson's Chi-squared test 
------------------------------------------------------------
Chi^2 =  2.403963     d.f. =  1     p =  0.1210283 

Pearson's Chi-squared test with Yates' continuity correction 
------------------------------------------------------------
Chi^2 =  1.30126     d.f. =  1     p =  0.2539832 

 
Warning messages:
1: In chisq.test(t, correct = TRUE, ...) :
  Chi-squared approximation may be incorrect

 

혹시 걱정되면 "expected=TRUE" 구문을 넣어 기대 빈도를 확인해보면 된다. 이 경우 카이 제곱 검정이 자동으로 실행되므로 "chisq=TRUE"구문이 필요 없게 된다.

CrossTable(df$SEX, df$RH, prop.chisq=FALSE, expected=TRUE)

분할표의 두 번째 행에서 기대 빈도를 확인할 수 있다.

   Cell Contents
|-------------------------|
|                       N |
|              Expected N |
|           N / Row Total |
|           N / Col Total |
|         N / Table Total |
|-------------------------|

 
Total Observations in Table:  1000 

 
             | df$RH 
      df$SEX |         0 |         1 | Row Total | 
-------------|-----------|-----------|-----------|
           0 |         1 |       481 |       482 | 
             |     2.892 |   479.108 |           | 
             |     0.002 |     0.998 |     0.482 | 
             |     0.167 |     0.484 |           | 
             |     0.001 |     0.481 |           | 
-------------|-----------|-----------|-----------|
           1 |         5 |       513 |       518 | 
             |     3.108 |   514.892 |           | 
             |     0.010 |     0.990 |     0.518 | 
             |     0.833 |     0.516 |           | 
             |     0.005 |     0.513 |           | 
-------------|-----------|-----------|-----------|
Column Total |         6 |       994 |      1000 | 
             |     0.006 |     0.994 |           | 
-------------|-----------|-----------|-----------|

 
Statistics for All Table Factors


Pearson's Chi-squared test 
------------------------------------------------------------
Chi^2 =  2.403963     d.f. =  1     p =  0.1210283 

Pearson's Chi-squared test with Yates' continuity correction 
------------------------------------------------------------
Chi^2 =  1.30126     d.f. =  1     p =  0.2539832 

 
Warning messages:
1: In chisq.test(t, correct = TRUE, ...) :
  Chi-squared approximation may be incorrect
2: In chisq.test(t, correct = FALSE, ...) :
  Chi-squared approximation may be incorrect

 

또 다른 방법

df$SEX, df$ALCOHOL을 따로 따로 넣지 않고 xtab()이나 table()으로 만든 분할표를 넣을 수도 있다.

freq_sex_alc<-xtabs(~SEX+ALCOHOL, data=df)
table_sex_alc<-table(df$SEX, df$ALCOHOL)

CrossTable(freq_sex_alc, prop.chisq=FALSE, chisq=TRUE)
CrossTable(table_sex_alc, prop.chisq=FALSE, chisq=TRUE)

같은 결과를 내준다.

코드 정리

#작업 디렉토리 지정
setwd("C:/Users/user/Documents/Tistory_blog")

#데이터 불러오기
install.packages("readr")
library("readr")
df<-read_csv("Data.csv")

#패키지 설치
install.packages("gmodels")
library("gmodels")

#카이 제곱 시행하기
CrossTable(df$SEX, df$ALCOHOL, prop.chisq=FALSE, chisq=TRUE)

 

[R] 카이 제곱 검정 정복 완료!

 

작성일: 2022.09.01.

최종 수정일: 2022.09.01.

이용 프로그램: R 4.1.3

RStudio v1.4.1717

RStudio 2021.09.1+372 "Ghost Orchid" Release 

운영체제: Windows 10, Mac OS 10.15.7

반응형
반응형

[R] 카이 제곱 검정 (일반 및 연속성 수정) - chisq.test()

 

 카이 제곱 검정은 범주형 변수 간에 분포의 유의미한 차이가 있는지 확인하는 방법이다. 이해할 수 있는 언어로 표현하면 다음과 같다. 분할표를 작성하였을 때 다음과 같다고 하자. (출처 및 분할표 작성법:

2022.08.31 - [기술 통계/R] - [R] 도수분포표 (Frequency table), 분할표 (Contingency table) 만들기 - table(), prop.table(), xtabs(), margin.table()

2022.08.31 - [기술 통계/R] - [R] 도수분포표 (Frequency table), 분할표 (Contingency table) 만들기 - CrossTable())

  비음주자 음주자
여성 236 246
남성 174 344

 

이를 보면 비음주자 중에는 여성이 많고, 음주자 중에는 남성이 많다. 그렇다면 "성별과 음주 여부는 무관하다(=독립이다)."라는 말이 틀리다고 할 수 있을까? 즉, "특정 성별은 음주자일 확률이 더 높다."라고 할 수 있을까? 이에 대한 검정이 바로 카이 제곱 검정이다.

 

*실습용 데이터는 아래 링크를 클릭하면 다운로드할 수 있습니다.

2022.08.04 - [공지사항 및 소개] - 분석용 데이터 (update 22.08.29)

 

분석용 데이터 (update 22.08.29)

2022년 08월 29일 버전입니다. 변수는 계속하여 추가될 예정입니다. 다음 카테고리에 있는 글에서 이용된 데이터입니다. - 기술 통계 - 통계 프로그램 사용 방법 1) 엑셀 파일 2) CSV 파일 3) 코드북

medistat.tistory.com

 

코드를 보여드리기에 앞서 워킹 디렉토리부터 지정하겠다.

워킹 디렉토리에 관한 설명은 다음 링크된 포스트에서 볼 수 있다.

2022.08.05 - [통계 프로그램 사용 방법/R] - [R] 작업 디렉토리 (Working Directory) 지정 - getwd(), setwd()

setwd("C:/Users/user/Documents/Tistory_blog")

 

데이터를 불러와 df에 객체로 저장하겠다.

데이터 불러오는 방법은 다음 링크에서 볼 수 있다.

2022.08.05 - [통계 프로그램 사용 방법/R] - [R] 데이터 불러오기 : EXCEL - read_excel(), read.xlsx()

2022.08.10 - [통계 프로그램 사용 방법/R] - [R] 데이터 저장하기 : CSV 파일 - write.csv(), write_csv()

2022.08.10 - [통계 프로그램 사용 방법/R] - [R] 데이터 불러오기 : SAS file (.sas7bdat) - read.sas7bdat(), read_sas()

install.packages("readr")
library("readr")
df<-read_csv("Data.csv")

 

코드

chisq.test(df$SEX, df$ALCOHOL, correct=FALSE)

chisq.test(df$SEX, df$ALCOHOL, correct=FALSE) : df 데이터의 SEX 변수와 ALCOHOL 변수 사이의 카이 제곱 검정을 시행하라. 이때 연속성 수정은 하지 않는다. 

 

결과

	Pearson's Chi-squared test

data:  df$SEX and df$ALCOHOL
X-squared = 24.389, df = 1, p-value = 7.871e-07

결과에서 중점적으로 봐야할 곳은 "p-value=7.871e-07"로 이는 "p-value가 $7.871\times10^{-7}= 0.0000007871$이다"라는 뜻이다. p-value가 0.05보다 낮으므로 성별과 음주의 분포에는 유의미한 차이가 있다고 결론내릴 수 있다.

 

 

왜 "correct=FALSE"?

R의 chisq.test() 함수는 연속성 수정을 하는 것을 디폴트 값으로 갖는다. 따라서 "correct=FALSE"라고 쓰지 않으면 "correct=TRUE"로 받아들이게 된다. 실제로 코드를 돌려보면 다음과 같다.

 

코드

chisq.test(df$SEX, df$ALCOHOL)

 

결과

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

data:  df$SEX and df$ALCOHOL
X-squared = 23.758, df = 1, p-value = 1.092e-06

 

보는 바와 같이 "with Yates' continuity correction"이라고 적혀있다. 즉 연속성 수정을 기본적으로 시행하게 된다.  해석 방법은 위의 일반적인 카이 제곱 검정과 같다.

연속성 수정에 관한 자세한 내용은 다음 글을 참고하길 바란다.

2022.08.30 - [통계 이론] - [이론] 연속성을 수정한 카이 제곱 검정 (Chi-squared test with Yates's correction for continuity)

 

기대 빈도는 걱정하지 않아도 돼?

걱정하지 않아도 된다. 만약 카이 제곱 검정을 시행하기에 적절하지 않은 데이터인 경우 다음과 같은 경고 메시지를 띄워주게 된다. 예를 들어 셀의 빈도가 5 미만인 경우가 생기는 다음 코드를 돌려 보자.

chisq.test(df$SEX, df$RH, correct=FALSE)

그러면 우선 결과는 분석해주긴 하지만 적절하지 않을 수 있다며 경고를 띄워준다.

	Pearson's Chi-squared test

data:  df$SEX and df$RH
X-squared = 2.404, df = 1, p-value = 0.121

경고메시지(들): 
chisq.test(df$SEX, df$RH, correct = FALSE)에서:
  Chi-squared approximation may be incorrect

 

또 다른 방법

df$SEX, df$ALCOHOL을 따로 따로 넣지 않고 xtab()이나 table()으로 만든 분할표를 넣을 수도 있다.

freq_sex_alc<-xtabs(~SEX+ALCOHOL, data=df)
table_sex_alc<-table(df$SEX, df$ALCOHOL)

chisq.test(freq_sex_alc, correct=FALSE)
chisq.test(table_sex_alc, correct=FALSE)
	Pearson's Chi-squared test

data:  freq_sex_alc
X-squared = 24.389, df = 1, p-value = 7.871e-07


	Pearson's Chi-squared test

data:  freq_sex_alc
X-squared = 24.389, df = 1, p-value = 7.871e-07

코드 정리

#작업 디렉토리 지정
setwd("C:/Users/user/Documents/Tistory_blog")

#데이터 불러오기
install.packages("readr")
library("readr")
df<-read_csv("Data.csv")

#카이 제곱 시행하기
chisq.test(df$SEX, df$ALCOHOL, correct=FALSE)

 

 

[R] 카이 제곱 검정 정복 완료!

 

작성일: 2022.08.31.

최종 수정일: 2022.09.06.

이용 프로그램: R 4.1.3

RStudio v1.4.1717

RStudio 2021.09.1+372 "Ghost Orchid" Release 

운영체제: Windows 10, Mac OS 10.15.7

반응형

+ Recent posts