ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [5강] 왜도와 첨도를 활용한 자크베라 검정(정규성 검정)
    기초지식/Quantopian(강의노트) 2024. 12. 7. 17:46
    반응형

    정규성 검정(Jarque-Bera Test: 자크베라 검정)

    데이터가 정규분포라면 평균을 중심으로 대칭적이고, 꼬리가 점차 얇아지는 종모양을 가졌을 것이다. 따라서 왜도는 0이 되고, 첨도는 3이 된다. 이것이 성립한다면, 많은 데이터의 통계적인 추론들이 가능해진다. 하지만 실제 금융데이터가 정규성을 만족한다는 보장이 없으므로 정규성 검증을 실시한 후 그것을 감안하여 추가적인 분석을 실행한다. 

    [5강] 통계적 지표(왜도와 첨도)에서 살펴본 왜도와 첨도를 통해서 데이터의 정규성을 판단하는 한 방법이 자크베라 검정이다. 먼저, 귀무가설과 대립가설을 세운다.

    H0(귀무가설): 데이터는 정규분포를 따른다.
    H1(대립가설): 데이터는 정규분포를 따르지 않는다.

    귀무가설은 옳다고 하는 주장이고, 대립가설은 귀무가설에 대립하는 주장으로 귀무가설이 의미 없음을 주장하는 것이다. 대립가설이 옳다고 하는 증거가 충분하면 대립가설이 채택되어서 귀무가설은 기각되고, 충분하지 않다면 귀무가설이 채택된다. 

    정규분포를 따르는 왜도 값은 0이고, 첨도의 값은 3이므로 아래와 식 1의 ①과 같은 기준을 잡을 수 있다. 추가적으로 각 항목에 정규화 상수 6과 24를 나누어 정규분포의 기준에 맞게 조정을 해주면 식 1의 ②와 같은 식이 나온다. 식1의 ② 의 각 항목은 왜도와 첨도가 가지는 고유한 분산을 보정하였기 때문에 각각 표준 정규분포를 따른다.

    식1: 자크베라 검정통계량 구성요소

    분포가 정규분포에 가깝다면 위 두 값은 0에 가까울 것이고, 벗어난다면 위 두 값은 커질 것이다. 위 두 값에 샘플크기(n)를 반영하여 아래 식 2와 같은 기준을 만들 수 있다. 

    식2: 자크베라 검정통계량

    JB 검정통계량은 표준화된 두 항목(왜도값, 첨도값)의 제곱합이며, 이 두 항목은 각각 독립적이다. 이렇게 표준 정규분포를 따르는 독립적인 확률 변수들의 제곱합을 카이제곱 분포라고 한다. 그리고 JB검정통계량은 왜도값과 첨도값 두 가지로 구성되니까 자유도가 2인 카이제곱 분포를 따르게 된다. 데이터가 정규분포와 비슷할수록 JB검정통계량은 0에 가까워지고, 정규분포와 괴리가 커서 왜도와 첨도가 클수록 JB검정통계량을 커진다. 즉, 데이터가 정규분포와 비슷할수록 JB검정통계량까지의 누적확률값이(CDF; Cumulative Distribution Function) 작아지고, 정규분포에서 멀어질수록 누적확률값이 커진다. 

    그림1: JB검정통계량과 p-value

    따라서 1-CDF(JB)로 정의되는 p-value 값은 데이터가 정규분포와 비슷할수록 커진다. p-value 가 유의수준보다(여기선 5%) 크면 귀무가설(데이터는 정규분포를 따른다.)이 부정되지 않아서 데이터는 정규분포를 따르는 것이 되고, 유의수준보다 작으면 귀무가설이 부정되고 데이터는 정규분포를 따르지 않는다.

    정규성검정 구현하기

    자크베라 검정은 데이터의 왜도와 첨도를 구하고, 위 식 2의 JB검정통계량을 구하는 것만 구현하면 된다. 그리고 scipy 라이브러리의 chi2 모듈의 cdf 함수를 통해 구한 JB까지의 누적확률값을 1에서 빼서 p-value를 구하면 결과해석이 가능하다. 이렇게 구한 p-value 값이 내가 정한 유의 수준(여기서는 5%) 보다 크면 데이터가 정규분포 형태인 것이고 아니면, 데이터가 정규분포가 아니다.

    import numpy as np
    import scipy.stats as stats
    
    # 1. 데이터 정의
    data = [2,3,4,5,6,7,8,9,10,10]
    n = len(data)
    
    # 2. 왜도(S)와 첨도(K) 계산
    S = stats.skew(data)
    # Fisher=False로 원래 첨도를 계산
    K = stats.kurtosis(data, fisher=False)  
    
    # 3. Jarque-Bera 통계량 계산
    JB = n * ((S**2) / 6 + ((K - 3)**2) / 24)
    print("JB Statistic:", JB)
    
    # 4. p-value 계산
    p_value = 1 - stats.chi2.cdf(JB, df=2)
    print("p-value:", p_value)
    
    # 5. 결과 해석
    if p_value > 0.05:
        print("데이터가 정규분포 형태입니다..(귀무가설)")
    else:
        print("데이터가 정규분포 형태가 아닙니다.(대립가설)")

    scipy 라이브러리의 stats 모듈의 jarque_bera 함수를 사용하면, 모든 과정을 생략하고 p-value 를 구할 수 있다. 아래와 같이 p-value를 구해서 데이터의 정규분포 여부를 판단할 수 있는 것이다. 

    import numpy as np
    import scipy.stats as stats
    
    data = [2,3,4,5,6,7,8,9,10,10]
    # 1. Jarque-Bera 통계량 계산
    stat, p = stats.jarque_bera(data)
    # 2. 결과 해석
    print("p-value:", p)
    if p_value > 0.05:
        print("데이터가 정규분포 형태입니다..(귀무가설)")
    else:
        print("데이터가 정규분포 형태가 아닙니다.(대립가설)")

     

    반응형
Designed by Tistory.