교차표(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)이 작으면 → “우연이 아니라 관련이 있다!”

⚙️ 작동 원리

  1. 기대빈도 계산
  2. → “두 변수에 아무 관계가 없다고 가정하면 이런 비율이 나올 거야.”
  3. 실제값(관찰된 비율) 과 비교
  4. → “실제 데이터가 예상과 얼마나 다른가?” 계산
  5. 그 차이를 χ²(카이제곱) 값으로 표현
  6. → 값이 클수록 “예상과 너무 다르다 = 관련 있다”는 뜻!

기대빈도

  • 두 변수 사이에 아무 관련이 없다고 가정했을 때, 각 칸(조합)에 기대되는 값(빈도)

즉, “만약 흡연과 폐질환이 진짜 아무 상관이 없다면, 각 칸에 몇 명쯤 들어가야 자연스러울까?”

(“만약 흡연과 폐질환이 상관없다면 이렇게 나올 거야~”라는 예상 값)

그걸 계산한 게 바로 기대빈도

기대빈도 = ‘관련이 없다면 나올 법한 예상 숫자’

실제 값이 이 예상과 많이 다르면 → “관련이 있다!”

 

 

+ Recent posts