통계

MSE, MSR 의미 알아보고 F비 파이썬으로 구해보기

이석사 중 2022. 12. 31. 02:41
728x90

종강하고 푹 쉬고 오느라고 한동안 포스팅을 못했네여..

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)))

앞에 다른 포스팅들하고 똑같이 공식만 구현하면 되는 부분이라 '

 

다른 설명은 크게 필요 없다고 생각합니다

 

잘 읽어보시고 궁금하신 부분은 댓글로 언제든지 질문해주세요!

 

진짜 진짜 긴 글 읽어주셔서 감사합니다!

728x90