오답노트

[데이터 분석] 이변량 분석 - 범주 데이터와 범주 데이터 본문

Python/데이터 분석

[데이터 분석] 이변량 분석 - 범주 데이터와 범주 데이터

권멋져 2022. 8. 12. 20:08

범주 데이터와 범주 데이터

범주 데이터와 범주 데이터를 비교하는 방법은 교차표를 만들어 각 범주마다 비율을 비교해보면 된다.

만약 비율의 차가 거의 없으면 상관관계가 적고, 차가 클수록 상관관계가 크다고 할 수 있다.

 

교차표 만들기

pandas의 crosstab함수를 사용해서 쉽게 만들 수 있다.

하지만 이때 normalize 옵션을 'index'로 지정해야한다.

normalize 옵션이 'index'이면 행의 합이 1이다.

 

pd.crosstab(titanic['Survived'], titanic['Embarked'], normalize = 'index')

2.1. crosstab index normalize

 

 

 

시각화

boxplot 과 mosaic으로 표현할 수 있다.

여기서는 mosaic으로 표현하는 법을 알아보겠다.

 

mosaic은 두 범주 데이터의 비율 뿐만 아니라 양도 같이 비교할 수 있다.

 

from statsmodels.graphics.mosaicplot import mosaic
mosaic(데이터프레임, [변수,타겟], gap = 0.01)

데이터프레임 변수와 변수, 타겟 순서로 이루어진 리스트를 인자로 받는다.

gap 옵션은 도형간의 간격을 지정할 수 있다.

 

mosaic(titanic, [ 'Pclass','Survived'])
plt.show()

3.1 mosic

비율의 차가 크므로 두 범주 데이터 간에 상관관계는 강하다고 볼 수 있다.

 

수치화

카이 제곱 검정을 통해서 수치화할 수 있다.

 

4.1 카이 제곱 검정 공식

카이 제곱 통계량은 클 수록 상관관계가 강하다는 의미다.

범주의 개수가 많아질 수록 카이 제곱 통계량은 커지게 되어있다.

 

범주형 변수의 자유도는 범주의 개수 - 1이다.

그 이유는 True, False를 시리즈로 나타낼때 1개의 시리즈로 나타낼 수 있는것과 원리가 같다.

 

카이 제곱 통계량은 (x 변수의 자유도) * (y 변수의 자유도) 보다 2~3배 크면, 상관관계가 크다고 볼 수 있다.

 

import scipy.stats as spst
spst.chi2_contingency(table)

 

chi2_contingency 는 crosstab 함수에서 반환된 데이터프레임을 인자로 받는다.

 

반환되는 값은

카이 제곱 통계량, p 값, 자유도, 기대빈도 순의 튜플로 반환된다.

 

table = pd.crosstab(titanic['Survived'], titanic['Pclass'])

result = spst.chi2_contingency(table)
print('카이제곱통계량', result[0])
print('p-value', result[1])
print('자유도',result[2])
print('기대빈도\n',result[3])

'''

카이제곱통계량 102.88898875696056
p-value 4.549251711298793e-23
자유도 2
기대빈도
 [[133.09090909 113.37373737 302.53535354]
 [ 82.90909091  70.62626263 188.46464646]]
 
'''

 

카이 제곱 통계량은 102로 자유도의 3배인 6보다 크므로 두 범주 데이터 간 상관관계는 강하다 볼 수 있다.