데이터과학 기초/통계

파이썬으로 Chi-Square(카이 제곱)검정 돌리기

eigenvector 2022. 8. 6. 10:46
반응형

이제 t-test 시리즈(?)를 마무리하고, 그 다음으로 카이 제곱 검정에 대해 알아보겠습니다.

 

(정확히 말하면, 모수 기반의 t-test만 마무리했지만 오늘은 넘어가겠습니다)

 

Chi-Square검정은 환경에 따라 t-test 보다 더 많이 쓰는 검정 방식입니다.

 

개념상 헷갈릴 부분을 제외하면 과정이 크게 복잡하지 않기 때문에 포스팅 내용을 차근차근 따라하시면 쉽게 이해할 수 있습니다.

 

그러면 시작해보겠습니다.

 


카이 제곱 검정?

 

Chi-Square검정은 말 그대로 카이(χ) 제곱 분포를 사용하는 검정입니다.

 

그렇다면, 왜 카이 제곱 분포를 사용할까요?

 

잠깐 이전의 포스팅을 확인해 보도록 합시다.

 

2022.08.04 - [데이터과학 기초/통계] - 파이썬으로 대응표본 t-test 돌리기

2022.08.02 - [데이터과학 기초/통계] - 파이썬으로 단일표본 t-test 돌리기

2022.07.29 - [데이터과학 기초/통계] - 파이썬으로 독립표본 t-test 돌리기

 

t-test 시리즈(?)는 방식은 조금씩 다르지만 큰 공통점을 갖고 있습니다.

 

t-test는 기본적으로 특정 그룹을 기준으로 평균값을 비교합니다(!) -> e.g. 어떤 그룹이 다른 그룹보다 크다/작다

 

그렇다면, 평균값을 비교할 필요가 없다면 어떤 분포를 써야할까요?

 

간단한 예를 들어볼까요?

 

"A국과 B국 국민 1000명을 대상으로 출근길 주요 교통수단을 조사했습니다. 같은 분포를 가질까요?"

"코딩 가능한 디자인, 사회학과 학생 1000명을 대상으로 선호하는 프로그래밍 언어를 조사했습니다. 같은 분포를 가질까요?"

"고혈압 측정 후, 고위험군과 저위험군 대상으로 흡연 여부를 조사했습니다. 같은 비율을 가질까요?"

 

뭔가 느낌상 차이가 날 것 같은데, t-test로는 검정할 방법이 애매합니다.

 

왜냐하면, 종속변인이 카테고리(= 종류, 명목형)기 때문입니다.

 

카이제곱 검정은 이렇게 "카테고리" X "카테고리"의 문제를 해결하기 위한 방안입니다.

 

그렇기 때문에, 가설 검정 또한 t-test와 다르게 구성됩니다.

 

예를 들어 A와 B국에서 출시한 제품의 신제품 색상 판매 데이터가 있다고 할 때 다음과 같이 가설이 세워집니다.

 

귀무가설 : A국과 B국의 신제품 색상 선호 분포는 동일하다.

대립가설 : A국과 B국의 신제품 색상 선호 분포는 동일하지 않다.

 

귀무/대립의 구성은 같지만 "선호"가 1 아니면 0 (사거나, 안사거나)라는 점을 고려할 필요가 있습니다.

 

(구매 = 선호 관계가 아닐 수 있지만, 오늘은 사소한 내용은 넘어가겠습니다)

 

이제 분석에 들어가 보도록 하죠.


환경 설정

Pandas와 Seaborn은 이전과 동일하게 사용되지만 통계 패키지의 경우 추천 패키지가 따로 없습니다.

 

본 포스팅에서는 이전 과정과 연속성을 위해 Pingouin 사용하지만, Statsmodels이나 Scipy도 딱히 나쁜 선택은 아닙니다.

 

일단 본 포스팅에서는 다음과 같이 설치한 후, 주피터 노트북으로 진행하도록 하겠습니다.

 

설치 과정을 잘 모르겠다면 이전포스팅을 참조해 주세요.

 

2022.07.31 - [데이터과학 기초/Python배우기] - conda로 손쉽게 파이썬 환경 관리하자 (Intel부터 M1까지) - 기초

 

conda install -c conda-forge pandas, seaborn, pingouin

 


데이터셋

오늘의 샘플 데이터셋은 A, B 국가를 대상으로 한 신제품의 색상 선호 설문입니다.

 

다음의 파일을 다운받아 파이썬 폴더에 넣어주세요.

 

selling.csv
0.00MB

 

데이터가 제대로 로드 됐는지 확인해 보겠습니다.

 

import pandas as pd

selling = pd.read_csv("./selling.csv")
selling.head()

 

 

데이터 로드가 오류 없이 마무리 됐으니 Chi-Square 검정을 위한 준비로 기술 분석을 수행해 보겠습니다.

 

Contingency table 구성하는 두 가지 방법 - groupby, pivot

 

오늘 다룰 데이터는 두 개의 카테고리가 존재하기 때문에 기술 분석을 다르게 할 필요가 있습니다.

 

구체적으로 말 하자면, 각 카테고리별로 대답의 빈도를 정리해야 합니다.

 

(좀 더 학술적으로 표현하면, Contingency table를 구성합니다)

 

여기에는 groupby와 pivot 두 가지 방법이 있습니다.

 

피봇(Pivot)

피봇(Pivot)은 엑셀을 사용하는 유저라는 꽤 익숙한 기능일텐데요, 특정 컬럼 조합을 기준으로 셀 내용을 정리해주는 기능입니다.

 

파이썬 Pandas에서도 사용 방법은 유사합니다.

 

pd.pivot(대상데이터프레임, index=가로축기준, columns = 세로축기준, aggfunc = 조합방식)

 

즉, 가로(Nation), 세로(Color), 방식(빈도세기)로 볼 때, 다음과 같이 구성하면 됩니다.

 

# index(가로)를 Nation, columns(세로)를 Color로 놓고 Count

pd.pivot_table(selling, index="Nation",columns='Color', aggfunc='count')

 

 

그룹화(Groupby)

피봇이 전체 데이터프레임을 다른 함수에 넣어야 한다면, Groupby는 좀 더 간략한 버전이라고 볼 수 있습니다.

 

특히, 복잡하게 구성된 여러 컬럼의 데이터를 한번에 조합할 때 빠르고 직관적으로 처리할 수 있다는 장점을 가집니다.

 

대상데이터셋.groupby([그룹에 넣을, 컬럼들]).그룹연산방법

 

이렇게 말하면 잘 모르겠지만, 다음과 같은 예시를 보면 한번에 이해 가능합니다.

 

# 국가와 색으로 묶어낸 다음, 빈도(size)를 확인

selling.groupby(['Nation','Color']).size()

 


시각화

빈도 시각화의 경우 카테고리가 두 종류기 때문에 어떻게 조합할 것인지 여러 고민이 필요합니다.

 

오늘은, 가장 간단한 방식으로 분할된 그래프 내 바 차트를 활용해 보겠습니다.

 

말이 좀 어렵게 표현됐지만, 바 차트를 국가별로 1개씩 그려주는 것과 동일합니다.

 

import seaborn as sns

# kind에 count를 넣어주는 것에 주목합시다.
sns.catplot(data=selling, x="Color",col="Nation",kind="count",col_wrap=2)

 

간단히 살펴 보기로는 B국가와 A 국가의 분포 차이가 어느 정도 존재하는 것 처럼 보입니다.

 

그렇다면, 이것이 "통계적으로 유의미" 한지 최종 확인해 보도록 하겠습니다.

 


Chi-Square 검정의 조건과 실행

앞서 수행된 t-test 검정은 Normality와 같은 조건을 만족할 필요가 있었습니다.

 

그렇다면 Chi-Square 검정은 어떤 조건을 요구할까요?

 

Chi-Square검정은 한 셀의 값(Pivot에서 한 칸에 담긴 숫자)이 5이하인 칸이 전체의 20%를 넘으면 안됩니다.

 

그렇기에, 많은 카테고리로 인해 한 셀의 값이 너무 작아진다면 적당한 선에서 재분류를 할 필요가 있습니다.

 

(통계에서 발생하는 많은 문제는 적당한 샘플 수를 확보하지 못하는 데 있습니다)

 

우리가 가진 샘플 데이터의 경우 이 조건과 상관없기 때문에 그대로 Chi-Square 검정을 실행해도 충분합니다.

 

Chi-Square는 우리가 가진 데이터와 예상치를 비교하는 식으로 이뤄지기에, 결과도 세 가지로 나옵니다.

 

이 세가지는 (예상분포, 실제분포, 통계검정결과) 이며, 다음과 같이 변수를 구성해서 할당받을 수 있습니다.

 

expected, observed, stats = pg.chi2_independence(selling, x='Nation', y='Color')

 

이제, 하나씩 결과를 확인해 볼까요?

 

expected

 

observed

 

이제, 관찰과 실제 사이의 차이를 확인해 보겠습니다.

 

observed - expected

확실히 차이가 보이는군요, 통계적으로 어떤 차이가 존재할까요?

 

stats

 

좀 더 보기 편하게 정리해 봅시다.

 

stats.round(3)

여러 평가 지표가 있지만, 우리는 맨 위 줄의 pearson을 확인하면 됩니다.

 

p-value가 0.05 보다 작기 때문에, 우리는 귀무가설을 기각하고 "두 국가 사이 색상 선호 분포의 차이가 존재한다"고 결론내릴 수 있습니다.

 


Chi-Square 검정의 해석 / 보고

Chi-Square 검정은 가설에서 설정한 것과 같이 "두 집단의 분포가 다르다"라는 사실만 확인해 줍니다.

 

집단의 특징은 연구자가 따로 확인해야 할 필요가 있다는 것입니다.

 

하지만, 우리는 이미 기술검정과 (예측-실제) 값의 차이에서 각 국가에 따른 선호 차이가 어떤 식으로 분포되어 있는지 확인했습니다.

 

이에 따라 다음과 보고를 구성하면 됩니다.

 

1. 사용한 통계 방법론

카이 제곱 검정

 

2. 통계 결과

(χ2(2) = 35, p-value<0.001 은 국가와 색상 선호 사이에 유의미한 관계(차이)가 존재한다는 것을 보여준다)

 

3. 해석

A국은 ~색상을, B국은 ~ 색상을 더 선호하는 경향이 확인된다.

 

이 세 가지 정보를 조합해서 보고하시면 결과가 마무리 됩니다.

반응형