교차표(Crosstab)
- 범주vs범주 데이터 비교하기 위해서는 Pandas의 crosstab() 함수를 사용해 교차표를 만들어야함

크로스탭 만들기
pd.crosstab(diabetes['BMIStatus'], diabetes['Outcome'])
- 'index': 각 행의 합으로 각 요소를 나눠서 각 행의 상대적인 비율을 보여준다(각 행의 합이 1이 됨).
- 'columns': 각 열의 합으로 각 요소를 나눠서 각 열의 상대적인 비율을 보여준다(각 열이 합이 1이 됨).
- 'all': 전체 합으로 각 요소를 나눠서 전체 데이터셋에서 각 셀의 상대적인 비율을 보여준다(전체 합이 1이 됨).

pd.crosstab(diabetes['BPStatus'], diabetes['Outcome'], normalize='columns')
pd.crosstab(diabetes['BPStatus'], diabetes['Outcome'], normalize='index') 보통 이걸 씀
pd.crosstab(diabetes['BPStatus'], diabetes['Outcome'], normalize='all')
시각화
(크로스탭 만들고, 노말라이즈 인덱스 준 다음, 시각화)
- 100% Stacked Bar Plot
- Mosaic Plot
100% Stacked Bar
- normalize='index' 를 설정한 교차표 작성
- normalize='index'를 지정했으므로 각 행의 합은 1
table = pd.crosstab(diabetes['BPStatus'], diabetes['Outcome'], normalize='index')
display(table)
table.plot(kind='bar', stacked=True)
plt.axhline(1-diabetes['Outcome'].mean(), color='r')
plt.xticks(rotation=0)
plt.show()
mosaic plot
- 100% Stacked Bar는 비율만 비교하므로 양에 대한 비교는 할 수 없음
- Mosaic Plot으로 양에 대한 비교
- statsmodels.graphics.mosaicplot의 mosaic() 함수로 Mosaic Plot을 그린다
mosaic(diabetes, ['BMIStatus', 'Outcome'])
plt.axhline(1-diabetes['Outcome'].mean(), color='r')
plt.show()
시각화 결과를 분석하는 방법
- 귀무가설이 참일 때 나올 그래프의 모양(아래 그림)
- 평균선 여기서 벗어나면, '차이가 있다'., '관련이 있다'는 말

수치화
카이제곱검정
- 범주형 변수들 사이에 관련이 있는지(연관이 있는지) 수치화 하는 방법
즉 , “두 변수 사이에 관계가 있나, 그냥 우연인가?” 를 보는 검사
- scipy.stats 라이브러리의 chi2_contingency() 함수로 카이제곱검정을 수행
table = pd.crosstab(diabetes['BPStatus'], diabetes['Outcome'])
result = spst.chi2_contingency(table)
print('* 카이제곱통계량:', result[0])
print('* p-value:', result[1])
print('* 기대빈도:\\n',result[3])

🍎 예시
“흡연 여부(Yes/No)”와 “폐질환 발생 여부(Yes/No)”가 관련이 있을까?
흡연 여부 폐질환 있음 폐질환 없음 합계
| 흡연자 | 40 | 60 | 100 |
| 비흡연자 | 10 | 90 | 100 |
이럴 때 카이제곱검정을 하면,
- “흡연과 폐질환이 무관하다면 이런 비율이 나올 확률”을 계산
- 그 확률(p-value)이 작으면 → “우연이 아니라 관련이 있다!”
⚙️ 작동 원리
- 기대빈도 계산
- → “두 변수에 아무 관계가 없다고 가정하면 이런 비율이 나올 거야.”
- 실제값(관찰된 비율) 과 비교
- → “실제 데이터가 예상과 얼마나 다른가?” 계산
- 그 차이를 χ²(카이제곱) 값으로 표현
- → 값이 클수록 “예상과 너무 다르다 = 관련 있다”는 뜻!
기대빈도
- 두 변수 사이에 아무 관련이 없다고 가정했을 때, 각 칸(조합)에 기대되는 값(빈도)
즉, “만약 흡연과 폐질환이 진짜 아무 상관이 없다면, 각 칸에 몇 명쯤 들어가야 자연스러울까?”
(“만약 흡연과 폐질환이 상관없다면 이렇게 나올 거야~”라는 예상 값)
그걸 계산한 게 바로 기대빈도
기대빈도 = ‘관련이 없다면 나올 법한 예상 숫자’
실제 값이 이 예상과 많이 다르면 → “관련이 있다!”
'KT 에이블스쿨 8기 > 데이터분석' 카테고리의 다른 글
| 이변량 분석 ④ - 수치형 → 범주형 (0) | 2025.11.25 |
|---|---|
| 이변량 분석 ② - 범주형 → 수치형 (1) | 2025.11.25 |
| 단변량 분석 ② - 범주형 (0) | 2025.11.25 |
| 단변량 분석 ① - 수치형 (0) | 2025.11.25 |
| 시각화라이브러리 ② - Seaborn (0) | 2025.11.25 |