범주 vs 범주를 비교하고 분석하기 위해서 먼저 교차표 제작 / 범주와 범주의 값을 크로스해서 값을 데이터프레임 형태로
- nomalize = 'columns' 옵션을 주면 열 기준 합이 1(100%)이 되도록 크로스탭 작성
- nomalize = 'index' 옵션을 주면 행 기준 합이 1(100%)이 되도록 크로스탭 작성
- nomalize = 'all' 옵션을 주면 전체 기준 합이 1(100%)이 되도록 크로스탭 작성
#범주형1의 값에 따른 범주형2의 비율 계산
pd.crosstab(df['범주형1'], df['범주형2'], nomalize='columns')
시각화: 모자이크 플롯(mosaic)
범주별 양과 비율을 그래프로 알아서 나타내 줌!
# 객실등급별 생존여부를 mosaic plot으로 그려 봅시다.
mosaic(titanic, ['Pclass','Survived'])
plt.axhline(1- titanic['Survived'].mean(), color = 'r') # 전체평균 선 표시
plt.show()
- 빨간 선은 전체 평균을 의미!
** 두 범주형 변수가 아무런 상관이 없다면, 범주 별 비율의 차이가 전체평균과 차이가 전혀 없는 상태가 됨!
** 각 등급별로 전체 평균 비율과 차이가 많이 난다면 영향을 강하게 미치는 것!
참고) Stacked Bar
# 비율만 보이고 이 순서대로 코드를 작성해야 함 ********************
temp = pd.crosstab(titanic['Pclass'], titanic['Survived'], normalize = 'index')
print(temp)
temp.plot.bar(stacked=True)
plt.axhline(1-titanic['Survived'].mean(), color = 'r')
plt.show()
→ 해당 이미지는 각 객실등급 별 생존여부의 비율만 비교하고 있으므로 전체 인원의 양에 대한 비교는 할 수 없음!
수치화: 카이제곱 검정
- 카이제곱 검정: 범주형 변수들 사이에 어떤 관계가 있는지 수치화하는 방법
♣ 기대빈도: 범주형 변수들이 아무런 관련이 없을 때 나올 수 있는 빈도수!
♣ 실제 데이터: 관측된 값들!
기대빈도를 기준으로 기대빈도와 실제 데이터 사이의 차이에 따라서 범주 → 범주의 관계를 판단!
** 카이제곱 통계량은 클수록 기대빈도로부터 실제 값의 차이가 크다는 의미! ** 범주의 수가 늘어날수록 값은 커짐, 자유도의 약 2배보다 크면, 차이가 있다고 봄!
- 자유도: 범주의 수 -1
- 카이제곱검정에서의 자유도: x 변수의 자유도 * y 변수의 자유도 > 2보다 카이제곱 통계량이 크면, 차이가 있다고 볼 수 있음!
# 1) 먼저 교차표 집계- normalize 하면 안 됨, 그대로 count하도록 해야 함
table = pd.crosstab(df['x 변수'], df['y 변수'])
print(table)
print('-' * 50)
# 2) 카이제곱검정
spst.chi2_contingency(table)
# statistic = 카이제곱 통계량, expected_Freq(기대 빈도)