기본 콘텐츠로 건너뛰기

pandas_ta를 적용한 통계적 인덱스 지표

회귀계수에 대한 F 검정

단변수에 대한 회귀검정
회귀 모형에서 독립변수 각각의 효과를 검정합니다.
2 단계로 이루어 집니다.
1) 독립변수와 관찰치 사이의 상관을 계산
$$\frac{(x-\ba x)(y-\bar y)}{\sigma_x \sigma_y}$$
2) F score 즉, F 값과 대응되는 p value를 계산한다.

F 검정은 정규분포를 따르는 모집단에서 분류된 집단의 분산이 동일하고 각 집단의 평균이 같다고 가정한다. 
H0: 각 그룹의 분산은 같다.
회귀계수의 검정에서 각 변수는 그 회귀계수가 0일 경우 즉, 반응변수의 평균과의 잔차에 대한 분포와 독립변수가 사용될 때 추정치와의 잔차의 분포를 비교합니다. 

다음의 독립변수(ind)와 반응변수(de)에 대해 F 검정의 결과는 regression_f() 메소드를 적용합니다. 이 메소드는 sklearn.feature_selection클래스 메소드입니다.

>>> from sklearn import feature_selection
>>> ind
array([[ 17550.,  17580.,  17345.],
       [ 17550.,  17750.,  17400.],
       [ 17610.,  17955.,  17530.],
       [ 17890.,  17905.,  17370.],
       [ 17445.,  17470.,  17135.],
       [ 17365.,  17445.,  17230.],
       [ 17395.,  17425.,  17225.],
       [ 17400.,  17405.,  17205.],
       [ 17300.,  17555.,  17215.],
       [ 17575.,  18010.,  17550.],
       [ 17710.,  17785.,  17455.],
       [ 17580.,  17630.,  17485.],
       [ 17685.,  17885.,  17500.],
       [ 17500.,  17670.,  17490.],
       [ 17430.,  17485.,  16840.]])

>>> de
array([17750, 17875, 17370, 17265, 17335, 17380, 17250, 17500, 17610,
       17520, 17585, 17585, 17520, 16840, 16985], dtype=int64)

>>> feature_selection.f_regression(ind, de)
(array([ 0.12716965,  0.36784891,  1.48167167]),
 array([ 0.72710626,  0.55462331,  0.24514876]))
위 결과에서 위의 값들은 F value이고 아래 값들은 각 변수의 p value이다. 이 결과에 의하면 각 변수들이 반응변수과의 상관에서 생성되는 분포의 분산의 차이는 없다고 할 수 있습니다.
그러나 이 분포는 모집단이 정규분포를 따른다는 가정위에서 성립됩니다. 또한 위 데이터의 샘플수가 작기 때문에 모집단에서 일부를 추출하여 표분평균을 계산하는 과정으로 반복하여 샘플수를 증가시켜 보면 다음과 같습니다.

>>> da=np.c_[ind, de]
       smp=np.random.choice(len(da), size=5)
       nda=np.mean(da[smp,:], axis=0).reshape(1, 4)
       for i in range(3001):
         smp=np.random.choice(len(da), 5)
         nda1=np.mean(da[smp, :], axis=0).reshape(1, 4)
         nda=np.r_[nda, nda1]

nda
Out[140]:
array([[ 17603.,  17748.,  17362.,  17409.],
       [ 17544.,  17640.,  17410.,  17558.],
       [ 17514.,  17762.,  17400.,  17504.],
       ...,
       [ 17477.,  17570.,  17308.,  17494.],
       [ 17592.,  17790.,  17398.,  17473.],
       [ 17580.,  17661.,  17317.,  17349.]])

>>> len(nda)
3003

>>> feature_selection.f_regression(nda[:,:3], nda[:,3])
(array([  50.61216817,  109.83841674,  365.41579061]),
 array([  1.40143913e-12,   2.88718268e-25,   5.84373864e-77]))

위 결과는 각 변수는 다른 분산을 가지므로 변수 모두가 효과가 있음을 나타냅니다.

댓글