ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 빅데이터 분석기사 5) F 분포와 F 검정(F-test) 그리고 등분산성 검정
    데이터 사이언스(DS)와 통계 2024. 7. 28. 01:15

    F 분포는 '두 카이제곱분포에 대한 비율'로써 정의된다.

    두 분산을 비교하기 위해, 인위적으로 만든 분포라고 볼 수 있다.

     

    F 통계량은 아래와 같이 정의된다.

    F 통계량 정의 및 여러 표현식 (출처 : 나무위키)

     

     

     

     

    예제)
    수출용 PCB는 탄탄한 내구성을 위해, PCB 기판을 더 두껍게 만들고 있다.
    
    PCB 기계의 세팅 값에 변화를 주어, 수출용과 내수용으로 나누어 제작하고 있다고 할때,
    샘플링하여 측정된 PCB 두께는 아래와 같다.
    
    내수용 두께 = [12, 15, 14, 13, 14, 13, 16, 14, 15, 14, 14, 13, 15, 14, 13, 15, 14, 13, 14, 15]
    수출용 두께 = [27, 29, 25, 30, 27, 28, 32, 26, 27, 30, 27, 30, 29, 28, 27, 26, 31, 28, 29, 27]
    
    수출용 PCB와 내수용 PCB 두께의 분산이 동일한지 검정하여라.

     

    # 수출용 PCB와 내수용 PCB 두께의 분산이 동일한지 검정하여라.
    # - 귀무가설: 두 분산은 차이가 없다.
    
    a_data = [12, 15, 14, 13, 14, 13, 16, 14, 15, 14, 14, 13, 15, 14, 13, 15, 14, 13, 14, 15]
    b_data = [27, 29, 25, 30, 27, 28, 32, 26, 27, 30, 27, 30, 29, 28, 27, 26, 31, 28, 29, 27]
    
    norm1 = stats.shapiro(a_data) # 정규성 확인
    norm2 = stats.shapiro(b_data) # 정규성 확인
    
    freedom_a = len(a_data)-1
    freedom_b = len(b_data)-1
    
    F_stats = np.var(a_data, ddof= 1) / np.var(b_data, ddof = 1)
    
    pvalue = min(stats.f.cdf(F_stats, freedom_a, freedom_b), stats.f.sf(F_stats, freedom_a, freedom_b)) * 2
    
    # stats.f.cdf(F_stats, freedom_a, freedom_b)의 p_value는 0.51이었음
    # 즉, 절반을 넘어가게 되므로, 1 - stats.f.cdf(F_stats, freedom_a, freedom_b)에 대해 곱하기 2를 수행해야함.
    
    F_stats, pvalue
    
    # 결론 : p_value가 0.05보다 작으므로 귀무가설을 기각한다. 등분산이라고 볼수 없다.

     

    결과는 다음과 같다.

    >> F_stats : 0.2877

    >> p_value: 0.0093

     

    유의 수준 5%로 결론을 내보자

    >> p-value 값은 0.0093로 0.05보다 작다.

    >> 즉, 귀무가설(=두 분산은 동일하다)을 기각할만큼, p-value 값이 작다.

    >> 따라서 귀무가설을 기각할 수 있다.

    >> 귀무가설을 기각 할 수 있으므로, 대립가설(=두 분산은 다르다)을 채택한다.

    >>  ∴ 위 data를 통해 추정시, 수출용과 내수용의 PCB 두께는 분산이 다르다고 볼 수 있다.

     

    ※ F 검정은 샘플이 정규할 때 적용 가능하므로,

        정규성 검정을 수행한뒤 F 검정을 수행하는 것이 바람직하다.

     

    ※ F 분포는 t분포, 정규분포와는 달리 좌우 대칭이 아니다.

    그럼에도 불구하고,

    양측 가설시 stats.f.cdf(F_stats, freedom_a, freedom_b)과 1 - stats.f.cdf(F_stats, freedom_a, freedom_b)) 중에서

    더 작은 면적 값의 2배로써 p-value를 구한다.

    참고로, stats.f.sf(F_stats, freedom_a, freedom_b)는 1 - stats.f.cdf(F_stats, freedom_a, freedom_b)와 같다

     

     

     

    그런데, 사실 등분산 검정은 정규분포가 아니더라도 가능하다.(검정 방법이 많다)

    그 중에서도 유명하고 간단한 'Levene 등분산성 검정'을 수행해보자.

    a_data = [12, 15, 14, 13, 14, 13, 16, 14, 15, 14, 14, 13, 15, 14, 13, 15, 14, 13, 14, 15]
    b_data = [27, 29, 25, 30, 27, 28, 32, 26, 27, 30, 27, 30, 29, 28, 27, 26, 31, 28, 29, 27]
    
    # Levene 등분산성 검정 수행
    stats.levene(a_data, b_data)
    
    >> LeveneResult(statistic=7.332761578044598, pvalue=0.010092324480818794)

     

    수행 결과, F 검정 결과와 동일하게

    pvalue = 0.01009로 등분산하지 않다는 결과가 나왔다.

    (물론, F 검정에서 나온 pvalue의 값까지 완전히 같지는 없다. 식과 알고리즘?이 다르다.)

     

    데이터가 정규하지 않아도 등분산성을 수행할 수 있는 Levene을 기억해두자!

     

    728x90
Designed by Tistory.