Certificate/ADP

[ADP 데이터분석 전문가- 통계편] 카이제곱 분포, 교차분석, 카이제곱 검정, 적합성검정, 독립성검정, 동일성검정, chi-squared

Olivia-BlackCherry 2023. 10. 20. 15:18

목차

    1. 카이제곱 분포 chi-square distribution

    카이제곱 분포는 추정과 검정에서 사용하는 어떠한 형태를 하고 있는 특수한 확률분포이다. 

    t-test에 사용한 t분포, 분산분석에서 사용한 f분포 역시 어떠한 형태를 하고 있는 특수한 확률분포의 일종이다.

    오늘은 카이제곱 분포가 어떤 형태를 하고 있는지, 정규분포와 어떤 관련성을 맺고 있는지에 대해 설명하고 교차분석과 카이제곱 검정을 진행해보겠다.

     

    1) 정의

    Z1~Zn이 서로 독립이고 N(0,1)을 따를 때, 그 제곱합의 확률분포가 자유도가 n인 카이제곱분포라고 한다.

    2) 표기

    χ²(n)

     

     

    3) 범위

    제곱이라는 말에서도 알 수 있듯이, 카이제곱분포가 취할 수 있는 값은 0이상인 실수.

     

    4) 파이썬 구현

    <문제>

    표준정규분포에서 표본 크기 10으로 무작위추출하여 그 제곱의 합을 취하는 작업

     n =100만회 시행

    총 100만의 표본 데이터를 얻음

    import scipy.stats as stats
    import numpy as np
    n=10
    rv=stats.norm()
    sample_size= int(1e6)
    sample= rv.rvs((n, sample_size))
    chi2_sample= np.sum(sample**2, axis=0)

    - stats.norm() : Scipy의 stats.norm() 함수를 사용하여 평균이 0이고, 표준 편차가 1인 정규 분포를 나타내는 확률 변수 rv를 생성함.

    - rv.rvs((n, sample_size)) : rv 확률변수를 가지고, n개의 데이터 포인트를 가지는 sample size 만큼의 표본을 생성함

    - 카이제곱분포를 만들기 위해 각 샘플을 제곱한 후 더함. sample의 shape이 (10, 100만)이기 때문에 axis=0으로 열을 따라 합계를 계산하도록 지정한다. 

     

    <시각화>

    - 카이제곱분포 시각화 함수 

    ax.plot(a, b)

    a: x값

    b: stats.chi2(n)---를 pdf()함수로 확률밀도값으로 계산함. 

     

     

     

     

    import matplotlib.pyplot as plt
    fig = plt.figure(figsize=(10,6))
    ax= fig.add_subplot(111)
    
    xs=np.linspace(0, 30, 100) #0~30까지 범위에서 100개로 나눔
    rv_true= stats.chi2(n)
    
    # density: 정규화되어 각 막대의 높이가 총 합이 1이 되도록 조정
    # alpha: 히스토그램의 색상 투명도
    ax.hist(chi2_sample, bins=50, density=True, alpha=0.5, label='chi2_sample)')
    
    # 확률밀도 함수 그래프 그리기 
    # pdf()는 rv_true(확률변수)의 확률밀도함수 값을 계산
    ax.plot(xs, rv_true.pdf(xs), label=f'chi2{n})', color='gray')
    
    ax.legend()
    ax.set_xlim(0,30)
    plt.show()

     

    <자유도>

    자유도 n에 따라  달라지는 분포 형태

    --> 자유도가 커지면 좌우대칭에 가까워진다.

    fig=plt.figure(figsize=(10,6))
    ax=fig.add_subplot(111)
    xs= np.linspace(0,20, 500)
    
    # -실선, -- 이중대시, : 점선
    linestyles=['-', '--', ':'] 
    
    for n,ls in zip([3,5,10], linestyles):
        rv= stats.chi2(n)
        ax.plot(xs, rv.pdf(xs), label=f'chi2({n})', ls=ls, color='gray')
        
    ax.legend()
    plt.show()

     

    5) 신뢰구간 구할 때

    카이제곱분포 상위 100a% 점 구하는 방법 χ²0.05(5)

    rv= stats.chi2(5)
    rv.isf(0.05)
    11.070497693516355

     

    6) 카이제곱분포 특징 요약

    - 좌우비대칭으로 왼쪽으로 치우처지고 오른쪽으로 넓어짐

    - 자유도 커지면 좌우대칭에 가까워짐

    - 자유도 값 가까이에 분포의 정점이 있음

     

     

     

     

    2. 교차분석

    - 카이제곱분포를 씀

    - 종속변수가 범주형 변수인 경우 사용
    - 데이터를 표로 나타내고, 그 표를 사용하여 그룹들 간의 차이, 관계 파악하는데 도움을 줌
    ex) 여자와 남자의 학점이 다른가?
    ex) 서로 다른 연령대에서 즐겨 먹는 음식이 다른가?

     

    <기대빈도와 관찰빈도>

    다항분포에 대한 검정의 기본원리는 빈도를 토대로 한다.

    빈도는 두 가지가 있다. 기대빈도, 관찰빈도이다.

    기대빈도(이론) 범주형 자료의 특성을 표현하는 가설이나 가정이 있다. 그 가설이 참이라면 각각의 범주에 대해 그에 해당하는 기대빈도가 있다. 
    ex) 남자 여자 비율 0.5일 것이라는 가설-> 참이라면> 1000명 중 남자:500, 여자:500 (기대빈도)
    관찰빈도 표본으로부터 실제 측정한 것이다.
    ex)남자:591, 여자409(관찰빈도)

    --> 이 두가지 값을 비교하여 별다른 차이가 없다면 가설을 받아들이고, 차이가 크다면 기각한다.

     

     

     

    3. 카이제곱 검정

    1) 적합성 검정

    - 각 범주에 따른 데이터의 빈도분포가 이론적으로 기대하는 분포에 따르는지 검정

    - ex) 주사위 굴렸을 때 각 주사위의 값이 1/6 확률이 맞는지 검정

    H0: 각 주사위의 눈의 값은 1/6확률과 일치한다.
    H1: 일치하지 않는다.
      1 2 3 4 5 6
    기대빈도 2 2 2 2 2 2
    관찰빈도 1 4 1 1 2 3

    titanic.csv
    0.04MB

    <EDA>

     

    <가설 설정>

    HO: 타이타닉호의 생존자 중 남자의 비율이 50%, 여자의 비율이 50%이다.
    H1: 타이타닉호의 생존자 중 남자의 비율이 50%, 여자의 비율이 50%라고 할 수 없다.

     

    < 카이제곱 검정 코드를 쓸 수 있도록 테이블 만들기 >

     

    < 카이제곱 검정하기>

    scipy.stats.chisquare(f_obs=?, f_exp=?)

    obs는 관찰빈도

    exp 기대빈도

     

    <해석>

    카이제곱 통계량은 45이고 p value는 유의수준 0.05보다 작으므로, 생존자의 성별 비율이 50:50이라고 이야기할 수 없다.

     

     

     

     

     

    2) 독립성 검정

    - 모집단이 두 개의 변수 A, B에 의해 범주화되었을 때, 두 변수들 사이의 관계가 독립인지 아닌지 검정

    - 교차표 활용

    - 두 변수가 상관이 있는지 없는지에 초점이 맞춰져 있음

    - ex) 채식여부와 건강등급이 주어졌을 때, 채식에 따른 건강등급 비율에 차이가 존재하는지 검정

    H0: 채식여부와 건강등급은 독립이다.
    H1: 채식여부와 건강등급은 독립이 아니다.
      건강등급1 건강등급2 건강등급3
    채식 0 4 2 2 8
    채식 X 1 1 3 5
    5 3 5  

      건강등급1 건강등급2 건강등급3
    채식 0 4 2 2 8
    기대값 5/13 *8/13 *13 = 40/13 3/13* 8 /13 *13 = 24/13 5/13*8/13*13= 40/13  
    채식 X 1 1 3 5
    기대값 5/13 * 5/13 *13 =25/13 3/13*5/13*13= 15/13 5 /13*5 /13*13= 25/13  
    5 3 5 13

    P(A ∩ B) = P(A)*P(B) 의 원리를 이용

    <교차표 생성>

    pd.crosstab(a, b) 사용

     

    <독립성 검정>

    from scipy.stats import chi2_contingency
    chi, p, df, expect = chi2_contingency(table)
    print('Statistic:', chi)
    print('p_value:', p)
    print('df', df)
    print('expect\n', expect)
    Statistic: 102.88898875696056
    p_value: 4.549251711298793e-23
    df 2
    expect
     [[133.09090909  82.90909091]
     [113.37373737  70.62626263]
     [302.53535354 188.46464646]]

     

    <해석>

    독립성 검정 결과 p value가 유의수준 0.05보다 작으므로 귀무가설을 기각한다. 즉 좌석등급과 생존은 유의수준 0.05하에서 독립이라 할 수 없다.

     

     

     

     

    3) 동질성 검정 = 동일성 검정

    - 독립성 검정과 계산법, 검정방법이 같다. --> 

    - 이 검정도 독립성 검정과 같이 두 개의 범주를 대상으로 한다.

    - 각각의 범주를 r, c라고 하자. r, c 각각 여러 개의 유형으로 나눈다. 

    - 검정의 주제는 범주 r에 대해 범주 c의 유형들이 같은 빈도로 나타나는지(= 유형간 빈도의 차이가 있는지)

    ex)  성별(남/여)에 따른 혈압군(저/정상/고)의 빈도 비율이 같은지

    H0: 성별에 따른 혈압군의 차이가 없다. 같은 빈도로 나온다. 동일하다.

    H1: 성별에 따른 혈압군의 차이가 있다. 동일하지 않다.

     

    계산 절차는 앞의 독립성 검정과 같다.

     

     

    <가설설정과 해석>

    - 가설설정

    • H0: class 분포는 survived에 관계없이 동일하다.
    • H1: class 분포는 survived에 관계없이 동일하지 않다.

    - 해석

    class 분포에 따라 survived의 비율은 동일하지 않다.