흔히 통계에서는 오차, 잔차, 편차에 대해 얘기하곤 합니다.
그렇다면 이 3가지의 차이는 어떻게 정의되는 것인지 살펴보도록 하겠습니다.
먼저 들어가기 앞서 데이터를 불러옵니다. (삼성전자 주가, 코스피 지수)
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import yfinance as yf
# 한글폰트 출력 가능 코드
from matplotlib import rc
rc('font', family='AppleGothic') # Mac Os
#rc('font', family='NanumGothic') # Windows Os
plt.rcParams['axes.unicode_minus'] = False
# 삼성전자, KOSPI 데이터 불러오기
stock_price = yf.download({'005930.KS','^KS11'}, '2021-12-01', '2022-01-21')
# 수정종가 불러오기
stock_price['Adj Close']
>>>
005930.KS ^KS11
Date
2021-12-01 74065.523438 2899.719971
2021-12-02 75459.234375 2945.270020
2021-12-03 75260.132812 2968.330078
2021-12-06 75956.984375 2973.250000
2021-12-07 77052.039062 2991.719971
2021-12-08 77052.039062 3001.800049
2021-12-09 77848.445312 3029.570068
2021-12-10 76554.289062 3010.229980
2021-12-13 76454.734375 3001.659912
2021-12-14 76653.835938 2987.949951
2021-12-15 77251.140625 2989.389893
2021-12-16 77450.242188 3006.409912
2021-12-17 77649.343750 3017.729980
2021-12-20 76753.390625 2963.000000
2021-12-21 77748.890625 2975.030029
2021-12-22 79043.046875 2984.479980
2021-12-23 79540.796875 2998.169922
2021-12-24 80138.101562 3012.429932
2021-12-27 79839.453125 2999.550049
2021-12-28 79939.000000 3020.239990
2021-12-29 78800.000000 2993.290039
2021-12-30 78300.000000 2977.649902
2022-01-04 78700.000000 2989.239990
2022-01-05 77400.000000 2953.969971
2022-01-06 76900.000000 2920.530029
2022-01-07 78300.000000 2954.889893
2022-01-10 78000.000000 2926.719971
2022-01-11 78900.000000 2927.379883
2022-01-12 78900.000000 2972.479980
2022-01-13 77900.000000 2962.090088
2022-01-14 77300.000000 2921.919922
2022-01-17 77500.000000 2890.100098
2022-01-18 77000.000000 2864.239990
2022-01-19 76300.000000 2842.280029
2022-01-20 76500.000000 2862.679932
그리고 바로 삼성전자를 feature로 하고 KOSPI를 target으로 하는 단순회귀식을 구해봅니다.
# 필요한 라이브러리
import statsmodels.api as sm
# target은 종속변수, feature는 독립변수와 같다.
target = stock_price['Adj Close']['^KS11']
feature = stock_price['Adj Close']['005930.KS']
# 상수항을 더해줘서 회귀식을 더 잘 적합할 수 있도록 만들어 준다.
feature_add = sm.add_constant(feature, has_constant='add')
# 상수항 더한 것 확인
# feature_add
# sm OLS 적합
model = sm.OLS(target, feature_add)
fitted_model = model.fit()
# 통계치 출력
print(f'R-squared : {fitted_model.rsquared : .5f}')
print(f'constant coef p 값 : {fitted_model.pvalues[0] : .5f}')
print(f'feature coef p 값 : {fitted_model.pvalues[1] : .5f}')
print(f'MSE : {fitted_model.mse_resid : .5f}')
# 회귀선 도출
target_pred1 = fitted_model.predict()
# 통계치 출력
print(f'결정계수 R-squared : {fitted_model.rsquared : .5f}')
print(f'constant coef(계수)에 대한 p 값 : {fitted_model.pvalues[0] : .5f}')
print(f'feature coef(계수)에 대한 p 값 : {fitted_model.pvalues[1] : .5f}')
print(f'잔차의 제곱합 MSE : {fitted_model.mse_resid : .5f}')
# 회귀선 도출
target_pred1 = fitted_model.predict()
plt.scatter(feature, target, marker='+', label='$Y_i$ 실제 관측치')
plt.plot(feature, target_pred1, color = 'g', label='$\hat{Y}_i$ 회귀선')
plt.hlines(target.mean(), feature.min(), feature.max(), color = 'r', label='$Y_i$ 평균선')
plt.legend()
plt.xlabel('Samsung Price')
plt.ylabel('KOSPI')
plt.show()
>>>
R-squared : 0.17145
constant coef p 값 : 0.00014
feature coef p 값 : 0.01341
MSE : 1954.64720
오차 (Error)
오차는 모집단의 회귀식과 관측치 (개별값)의 차이를 의미합니다.
그림에서 이해해보면, 녹색 회귀식과 파란색 십자가(관측치, 개별값)의 차이를 의미하는 것이죠.
여기서 표준오차 (Standard Error)의 개념이 나옵니다.
각 표본의 평균이 전체의 평균과 얼마나 차이가 있는지 알려주는 지표로서 표본평균과 모평균의 차이를 의미합니다.
실제 모집단과 각 표본평균이 얼마만큼의 편차를 가지고 있는지 알려주기에 평균의 정확도를 추정할 때 사용하며 표준오차가 적을수록 표본의 대표성이 높다고 판단하게 됩니다.
물론 일반적으로 표본 추출은 1회 실시합니다. 따라서 표준오차에 대해 계산할 수 없습니다. 그러나 이론적으로는 계산이 가능합니다.
표본분산을 표본수의 제곱근으로 나눈 값으로 각 표본의 평균이 전체 평균에 대해 얼마나 떨어져 있는지 이론적으로 확인이 가능합니다.
참고로 표본오차 (Sampling Error)는 모평균의 추정구간 중심으로 부터 허용할 최대 허용오차로
로 표시할 수 있고 모평균 추정치의 표본오차를 의미합니다.
잔차 (Residual)
잔차는 표본의 회귀식과 관측치 (개별값)의 차이를 의미합니다.
그림에서 이해해보면, 녹색 회귀식과 파란색 십자가(관측치, 개별값)의 차이를 의미하는 것이죠...
사실 오차와 잔차는 간단하게만 보면 큰 차이가 없습니다.
하지만, 데이터를 추출한 집단이 모집단을 의미하는지 혹은 표본을 의미하는지에 따라 다르게 부르게 됩니다.
이를 식으로 표현하면 다음과 같습니다.
물론, 대부분의 통계분석은 모집단이 아닌 표본 데이터를 활용하기 때문에 잔차를 활용하여 최적의 coef를 추정하게 됩니다. (잔차제곱합을 최소로 만들어주는 최소제곱법 사용)
따라서, OLS의 모형 검정에 대해서는 오차분석이 아닌 잔차분석이라는 용어를 사용하는 것이 일반적이죠.
편차 (Deviation)
편차는 평균값과 관측치 (개별값)의 차이를 의미합니다.
여기서 보면, 빨간 평균선과 파란색 십자가(관측치, 개별값)의 차이를 의미하는 것입니다.
따라서 정규분포에서 편차의 합은 0이 되는 것입니다.
'공부 > 기초통계' 카테고리의 다른 글
통계적 추론과 바람직한 추정량 python (0) | 2022.03.25 |
---|---|
표본과 모집단의 이해 (0) | 2022.03.21 |
confusion matrix (혼동행렬) python (0) | 2022.03.17 |
Distribution (분포도) python (0) | 2022.02.10 |
기초통계 (상관계수) python (0) | 2022.02.09 |
댓글