Data Analysis/Statistics

Python_Statistics_Chi-square

mansoorrr 2023. 12. 15. 11:32

카이제곱 검정

  • t-test와 Anova는 종속변수가 연속형 변수
  • 카이제곱 검정은 종속변수가 범주형 변수
  • 적합성 검정, 독립성 검정, 동질성 검정 목적으로 사용됨
검정 방법 내용
적합성 검정 각 범주에 따른 데이터의 빈도분포가 이론적으로 기대하는 분포를 따르는지 검정
독립성 검정 모집단이 두 개의 변수 A, B에 의해 범주화 되었을 때, 이 두 변수들 사이의 관계가 독립인지 검정
동질성 검정 서로 다른 표본 집단의 변수의 동질성 확인
  • 교차분석의 관측빈도와 기대빈도의 차이를 비교하는것이 기본적인 아이디어

 

교차분석

  • 교차표를 통해 각 셀의 관찰빈도와 기대빈도 간의 차이를 검정하는 방법
  • 관찰빈도: 자료로 부터 얻은 빈도분포
  • 기대빈도: 두 변수가 독립일때 이론적으로 기대할 수 있는 빈도분포

적합성검정

  • 각 범주에 따른 데이터의 빈도분포가 이론적으로 기대하는 분포를 따르는지 검정하는 법
    • 예) 주사위를 굴렸을때 각 주사위의 값이 1/6의 확률이 맞는지를 검정
  • scipy.stats.chisquare(관찰빈도, 기대빈도, 자유도)

예시 1) titanic 데이터에서 가설에 대한 적합도 검정을 수행

  • 가설
    • H0: 타이타닉호 생존자중 남자와 여자의 비율은 차이가 없다(50%: 50%)
    • H1: 타이타닉 호 생존자중 남자와 여자의 비율은 차이가 있다.
  • 카이제곱검정 결과 통계량은 44.95, p-value < .05 이므로 귀무가설을 기각한다.
  • 따라서 남자와 여자의 비율은 차이가 있다.
#---------- 데이터 로드
import pandas as pd
import seaborn as sns

#seaborn에 있는 데이터로 진행
titanic = sns.load_dataset("titanic")
print(titanic.shape)
titanic.info()

#----------- 생존자중 남녀 분포
table = titanic.loc[titanic["survived"] == 1, "sex"]
table.value_counts()

#---------- 카이제곱 검정
import scipy.stats as stats
stats.chisquare(table.value_counts(), f_exp=[171, 171]) #기대도수(f_exp)는 남녀 전체 342명 / 2(남,여)
#Power_divergenceResult(statistic=44.95906432748538, pvalue=2.0119672574477235e-11)

 

 

독립성 검정

  • 모집단이 두개의 변수 A, B에 의해 범주화 되었을때, 두 변수들 사이의 관계가 독립인지 아닌지를 검정
  • scipy.stats.chi2_contingency("pd.crosstab의 결괏값", correction=True, lambda_=None)
  • return 값 설명
    • ch2: 카이제곱 통계량
    • p: p-value
    • dof: 자유도
    • expected: 테이블의 합계를 기반으로한 기대빈도

예시 1) titanic 데이터에서 좌석등급에 따른생존여부가 서로 독립인지 확인

  • 가설
    • H0: 좌석등급에 따른 생존여부는 독립이다.
    • H1: 좌석등급과 생존여부는 독립이 아니다.
  • pd.crosstab을 활용해 도수분포표 생성
  • 도수분포표를 통한 카이제곱 검정결과
  • 통계량 102.89, p-value <.05 이므로 귀무가설 기각
  • 좌석등급과 생존여부는 독립이 아님
#---------- titanic 데이터로 진행
#도수분포표 생성
cross_table = pd.crosstab(titanic["class"], titanic["survived"])

#total 포함한 도수분포표
pd.crosstab(titanic["class"], titanic["survived"], margins=True, margins_name="total")

#비율확인을 위한 도수분포표
pd.crosstab(titanic["class"], titanic["survived"], margins=True, margins_name="total", normalize=True)*100

#---------- 카이제곱(독립성확인)검정
stats.chi2_contingency(cross_table)

# Chi2ContingencyResult(
#	statistic=102.88898875696056,
#    pvalue=4.549251711298793e-23,
#    dof=2,
#    expected_freq=array(
#    [[133.09090909,  82.90909091],
#     [113.37373737,  70.62626263],
#      [302.53535354, 188.46464646]]
#     )
# )

crosstab 활용 table

 

 

동질성검정

  • 모집단이 임의의 변수에 따라 R개의 속성으로 범주화 되었을때
  • R개의 부분 모집단에서 추출한 표본이 C개의 범주화된 집단의 분포가 서로 동일한지 검정
  • 가설
    • H0: class의 분포는 survived에 관계없이 동일하다
    • H1: class의 분포는 survived에 관계가 있다.