MATLAB

MATLAB으로 KS test(Kolmogorov-Smirnov test) 하기(kstest 함수 사용)

qlsenddl 2021. 1. 12. 19:10
728x90

 어떤 변수에 대한 sample이 어떠한 분포-즉, 확률 밀도 함수(PDF: probability density function)-를 따르는지 알아내기 위한 방법 중에서 KS test(Kolmogorov-Smirnov test)가 있다. KS test는 Goodness-of-fit test 방법 중 하나로 특정 타입의 분포에서만 적용가능하다는 식의 제한 조건이 필요 없다는 것이 장점이다.


1. 이론

 KS test는 empirical CDF와 hypothesized(or theoretical) CDF를 비교한다.(여기에서 empirical CDF는 sample이 실제로 sampling된 분포이고 우리가 알고자 하는 분포이다. hypothesized CDF는 해당 sample들이 어떤 분포를 따르는지 모르지만 다음과 같은 분포를 따른다고 가정한 분포를 말한다. CDF는 cumulative distribution function의 줄임말로 누적 분포 함수라고 한다.) 즉, 아래의 식과 같다.



 여기에서 Dn은 수학적으로 확률 변수(random variable)이므로 Dn의 CDF는 다음과 같은 유의 수준(significance level)으로 표현 된다.



 이 때 empirical CDF와 hypothesized CDF의 최대 차이값이 계산되고 그 maximum Dn이 critical value보다 작으면 hypothesized CDF가 기각되지않고(accept), 해당 sample들이 hypothesized CDF를 따른다고 본다. 반대로 critical value보다 크면 hypothesized CDF가 기각되고(reject), 해당 sample들이 hypothesized CDF를 따르지 않는다고 본다.


2. MATLAB 코드 구현

 이론은 이해가 안가도 MATLAB의 kstest 함수를 통해서 구현할 수 있다. 우선 문제는 아래와 같다.

 - ν=10인 chi-square distribution을 따르는 sample 30개가 sample mean, sample standard deviation에 대한 정규 분포(normal distribution)을 따르는지에 대해서 유의 수준 0.05에 대한 KS test를 해보자.


step1: ν=10인 chi-square distribution을 따르는 sample 30개 생성한다. - 실제로는 해당 분포가 어느 분포에서 나오는지 모르고 sample만 30개 있음

nu = 10;

X = chi2rnd(nu, [30, 1]);


step2: 해당 sample들의 mean과 standard deviation에 대한 normal distribution을 따르는 CDF 값들을 얻는다.

Fx = normcdf(X, mean(X), std(X));


step3: sample X와 hypothesized CDF Fx에 대해서 KS test를 진행한다.

[H, P, Dn_max, Dn_alpha] = kstest(X, [X, Fx], 0.05)


<전체 코드>

nu = 10;

X = chi2rnd(nu, [30, 1]);


Fx = normcdf(X, mean(X), std(X));

[H, P, Dn_max, Dn_alpha] = kstest(X, [X, Fx], 0.05)


<코드 실행 결과> - random sampling 과정이 있기 때문에 코드 실행 시 조금 다를 수 있음

H =

  logical

   0


P =

    0.8505


Dn_max =

    0.1065


Dn_alpha =

    0.2417


-> H = 0이므로 해당 분포에 대해서 KS test는 accept한 것을 확인할 수 있다.


3. kstest 함수 설명

해당 내용은 아래 MATLAB 설명 링크를 참고했다.

https://kr.mathworks.com/help/stats/kstest.html


[H, P, Dn_max, Dn_alpha] = kstest(X, [X, Fx], alpha)


1) input

X: test하고자하는 sample

Fx: sample X에 대한 hypothesized CDF 값

alpha: 유의 수준(significance level) α

2) output

H: 가설 검정 결과로 0이면 accept(기각되지 않음), 1이면 reject(기각)을 의미

P: 해당 가설 검정에 대한 p-value 값

Dn_max: maximum Dn

Dn_alpha: critical value


* kstest(x)로 하는 경우 표준 정규분포에 대해서 유의 수준 5%(0.05)으로 KS test 진행

728x90