종강하고 푹 쉬고 오느라고 한동안 포스팅을 못했네여..
MSR, MSE, F비로 다시 이어가보겠습니다
먼저 MSE랑 MSR, F비에 대해 설명이 조금 필요합니다
쉬운 이해를 위해 그림을 그려왔습니다
파란색 점들은 관측값, 빨간색 선 위에 점들은 예측값, 초록색 수평선은 관측값의 평균입니다
맨 앞부분을 가져와서 옆으로 눕혀서 보겠습니다
(눕혀서 보는게 편해요!)
정의를 써놨지만 그림만 보면 모를수도 있으니 아래에 써보도록 할께요
여기서 예측값은 파이썬에서 Linear Regression 모듈에 predict로 구해진 값을 말합니다
- 평균과 회귀값의 차이 : 평균값 - 예측값
- 편차 : 관측값 - 평균값
- 잔차 : 관측값 - 예측값
이렇게 정의 할 수 있습니다
위에 3가지 정의를 가지고 SSR, SSE, SST라는 값들을 구할 수 있습니다
3가지 값들은 위의 공식을 가지고 구할 수 있습니다
- SST : 편차들의 제곱의 합
- SSR : 평균과 회귀값의 차이들의 제곱의 합
- SSE : 잔차의 제곱의 합
뒤에 나올 MSR과 MSE에서 사용되기 때문에 중요합니다!!
MSR은 Mean Squares Regression의 약자이고, MSE는 Mean Squares Error의 약자입니다
또 다르게 말하면 MSR은 회귀직선으로 설명되는 변동, MSE는 회귀 직선으로 설명되지 않는 변동을 의미합니다
MSR을 구하는 식은 다음과 같습니다 SSR/1이기 때문에 SSR이 곧 MSR과 같은 값이지만
독립 변수 x의 편차와 회귀 직선을 기울기를 이용해서도 구할 수 있습니다
(이 부분은 제가 잘못 이해했을수도 있기 때문에 통계 관해서 잘 아시는 분은 꼭 피드백 부탁 드립니다 ㅠㅠ)
먼저 회귀 직선의 기울기가 같은 상황을 먼저 보겠습니다
독립 변수 x의 편차가 크다는 말은 x값의 범위가 넓다는 말하고 같습니다
기울기가 같은데 x값의 범위가 더 넓다면? 전체적으로 설명할 수 있는 부분의 영역이 커지겠죠??
정리하면 x편차가 크면 변동을 더 많이 설명한다 라고 생각할 수 있습니다
다음은 x 편차가 같은 상황입니다
회귀 계수b, 즉 회귀 직선의 기울기에 따라 정해집니다
그림이 조금 보기 힘들수도 있지만 잘 따라오시면 됩니다!
두 회귀 직선이 있습니다
x범위가 1~5로 같기 때문에 편차는 같습니다
검은색 수평선은 초록 회귀선 관측값의 평균, 빨간색 수평선은 파랑 회귀선 관측값의 평균입니다
초록, 파란선들이 예측값들을 연결한 직선이기 때문에 수평선과 직선의 거리를 구해서 제곱한 후
합한 값이 SSR입니다
이제 다시 보면 기울기가 클수록 수평선과 직선 사이 거리들이 더 크기 때문에
SSR이 더 크다고 생각할 수 있겠져??
그럼 정리하면 기울기가 클수록 변동을 더 많이 설명한다고 생각할 수 있습니다
두 상황을 합쳐서 보면 기울기가 크고 x편차가 크면? MSR이 크다 라고 생각할 수 있습니다
MSE는 SSE/(n-2)로 구할 수 있습니다
다른 공식 없이 이 과정만 거치면 구해집니다
그럼 이 두 변동들을 왜 구하냐?
F비를 구하기 위해서 입니다
F비는 MSR/MSE로 F비가 클수록 에러가 없이 더 많은 변동들을 설명한다고 할 수 있습니다
원래 F비는 분산 분석이라고 ANOVA에서 사용하지만 ANOVA까지 설명하게 되면
수준을 넘어가는 것 같아서 이런 거다라고 언급만 하고 넘어가겠습니다
위에 2가지 값만 구하면 F비도 자연스럽게 구할 수 있겠져??
설명 참 길었습니다
이제 파이썬으로 코드를 짜보겠습니다
#Mean Squares Regression
class msr:
def __init__(self, x, y):
self.x1 = np.array(x)
self.x_me = np.mean(x)
self.reg1 = LinearRegression()
self.reg1.fit(self.x1.reshape(-1, 1), y)
self.x1_grad = self.reg1.coef_
self.x_dev = self.x1 - self.x_me
self.x_msr = self.x1_grad**2 * np.sum(self.x_dev ** 2)
self.x_msr1 = self.x_msr.tolist()
print('MSR(Regression Mean Squares) : {}'.format(round(self.x_msr1[0], 4)))
#Mean Squared Error(MSE)
class mse:
def __init__(self, x, y):
self.x2 = np.array(x)
self.y2 = np.array(y)
self.reg2 = LinearRegression()
self.reg2.fit(self.x2.reshape(-1, 1), self.y2)
self.res = self.y2 - self.reg2.predict(self.x2.reshape(-1, 1))
self.x2_mse = np.var(self.res)
print('MSE(Mean Squared Error) : {}'.format(round(self.x2_mse, 4)))
#F - ratio
class Fratio:
def __init__(self, x, y):
self.x3 = np.array(x)
self.y3 = np.array(y)
self.x3_me = np.mean(x)
self.reg3 = LinearRegression()
self.reg3.fit(self.x3.reshape(-1, 1), y)
self.x3_grad = self.reg3.coef_
self.x3_dev = self.x3 - self.x3_me
self.x3_msr = self.x3_grad**2 * np.sum(self.x3_dev ** 2)
self.res1 = self.y3 - self.reg3.predict(self.x3.reshape(-1, 1))
self.x3_mse = np.var(self.res1)
self.F = self.x3_msr/self.x3_mse
self.F1 = self.F.tolist()
print('F - ratio : {}'.format(round(self.F1[0], 4)))
앞에 다른 포스팅들하고 똑같이 공식만 구현하면 되는 부분이라 '
다른 설명은 크게 필요 없다고 생각합니다
잘 읽어보시고 궁금하신 부분은 댓글로 언제든지 질문해주세요!
진짜 진짜 긴 글 읽어주셔서 감사합니다!
'통계' 카테고리의 다른 글
상관계수와 회귀식, 예측값 파이썬으로 구해보기 (2) | 2022.12.21 |
---|---|
상관 계수 5%, 1% 수준 유의성 검사 파이썬으로 해보기 (0) | 2022.12.20 |
t-value와 p-value의 관계 파이썬으로 알아보기 (0) | 2022.12.20 |
결정계수와 p-value 파이썬으로 구해보기 (0) | 2022.12.09 |