티스토리 뷰

반응형

1. 단순회귀분석이란?

하나의 변수를 이용하여 다른 변수를 예측하는 것이다.

마치 일차방정식처럼 \( y = \beta_1 x + \beta_0 \) 의 식을 구한 후 \( x \) 에 하나의 변수를 넣으면 \( y \) 값을 예측하는 방식이다.

두 변수의 관계만 나타내는 것이 아니라 하나의 변수에서 다른 변수를 예측하는 것이다.

예를 들면, 몸무게를 통해 키를 예측한다고 하면 몸무게가 60일 때 키는 170이라고 하자.

그렇다면 식은 \( 170 = 60\beta_1 + \beta_0 \) 이 될 것이다.

이를 일반화하면, \( y = 3x - 10 \) 으로 쓸 수도 있고, \( y = 2x + 50 \) 으로 쓸 수도 있다.

데이터에는 여러 개의 직선이 나올 수 있기 때문에, 무엇이 최적의 절편과 기울기인지를 찾아야 한다.

 

2. 회귀계수 \( \beta_1 , \beta_0 \)의 추정

위의 식에서 본다면, 몸무게에 몇 배를 해야 키를 잘 예측할까? 이는 기울기 \( \beta_1 \) 를 의미한다.

그 이후에 얼마를 더하거나 빼야 키를 잘 예측할까? 이는 절편 \( \beta_0 \) 에 해당한다.

이를 추정하는 방법을 최소제곱법(least square method) 라고 하는데,
잔차(residual)가 최소화되는 직선을 찾는 것이다.

 

 

위의 그래프를 보면 빨간색 회귀직선과 각 파란색 점과의 차이를 잔차(residual)이라고 부른다.

이를 최소화 하는 방법을 최소제곱법이라고 한다.

 

여기서 제곱을 하는 이유는 데이터가 회귀직선의 위에에도 있을 수 있고 아래에도 있을 수 있기 때문에 제곱을 하는 것이다.

예를 들면, 회귀식을 통해 몸무게로 키를 예측한다고 해보자.

몸무게가 60일 때, 회귀직선은 키를 170을 예측했다. 그러나 실제 데이터에서 한몸무게가 60인 한 사람의 키는 172였고, 다른 한 명은 168이었다.

이 경우 (172-170 =2) + (168-170=-2)이다. 둘을 더하면 값은 0이 나온다.

이를 방지하기 위해 2와 -2의 제곱을 한 4+4를 더해 잔차를 구한다.

이를 식으로 나타내면

\((y_i - \hat{y})^2\)이 된다. y는 실제값이며, \(\hat{y}\)는 회귀직선이 예측한 값이 된다.

위의 예시라면 y는 168,172와 같은 값이며 \(\hat{y}\)는 170과 같은 값이 된다.

이제 잔차를 최소화하는 회귀계수(절편, 기울기)를 추정해보자.

 

회귀계수의 추정

최소제곱법으로 회귀계수를 추정하려면 미분을 사용하면 된다.

예를 들어, 위의 함수 \( y = x^2 \) 이라면, \( x \) 가 0인 부분에서 최소값을 갖는다.

\( y = x^2 \) 의 도함수 \( y' = 2x \) 가 최소가 될 때 \( y = x^2 \) 도 최소값을 얻는다(그 위치는 0이다).

즉, 미분값이 최소가 되는 지점에서 원래 함수도 최소값을 갖는다.

 

즉 우리는, \( D = \sum (y_i - \hat{Y})^2 \)을 미분하면 된다.

 

위 식을 다시 쓰면,  
\( D=\sum_{i=1}^n (y_i - (\beta_1 \times x_i + \beta_0))^2 \) 이다.

각각의 계수에 대해 미분을 해서  

\( \frac{\partial D}{\partial \beta_1} = 0 \) 인 지점과  
\( \frac{\partial D}{\partial \beta_0} = 0 \) 인 지점을 찾으면 된다.

\( \frac{\partial D}{\partial \beta_0 } = 2\sum(y_i - (\beta_1 x_i + \beta_0)) \times (-1) \) 이다.  
미분에 대한 방법은 알아서 찾아봐라. 나도 수학 잘 못한다.

이를 \( \beta_0 \) 에 대해 정리하면,  
\( \sum \beta_0 = \sum y_i -\beta_1 \sum x_i \) 이고,  
\( \beta_0 \) 은 상수니까, \( n \beta_0 \) 으로 쓸 수 있다.

다시 정리하면  
\[
\beta_0 = \frac{\sum y_i - \beta_1 \sum x_i}{n}
\]
이 나온다.

\( \frac{\partial D}{\partial \beta_1} = -2 \sum (y_i - (\beta_1 x_i +\beta_0)) \times (-x_i) \) 이다.  
위 식이 0이 되는 지점으로 정리하면  
\[
\sum y_i x_i -\beta_1 \sum x_i^2 - \beta_0 \sum x_i = 0
\]

위 두 식을 연립방정식으로 계산하면,  

\[
\beta_1 = \frac{SS_{XY}}{SS_{XX}}
\]

\[
\beta_0 = \bar{Y} - \beta_1 \bar{X}
\]

가 나온다.

 

2025.01.28 - [통계학/앤디필드의 유쾌한 통계학] - 단순 선형회귀분석 회귀계수 추정방법

 

단순 선형회귀분석 회귀계수 추정방법

챗지피티한테 물어봤다.# 최소제곱법에서 기울기 (\(\beta_1\))와 절편 (\(\beta_0\)) 유도### 1. 최소제곱법의 목표최소제곱법은 주어진 데이터를 통해 회귀 직선을 찾는 방법입니다. 이 

eunjin123123.tistory.com

 

자세한 회귀계수 유도과정은 챗지피티로 유도해봤는데, 저거 맞는 것 같다.

내가 손계산으로도 풀어봤는데 수식입력이 라텍스로 일일이 쳐야하는 관계로 지피티가 했는데 나보다 설명 잘한다.

 

 

회귀계수의 구현

파이썬을 통해 회귀계수를 구하는 과정을 알아보자.

 

데이터

(array([  10.256,  985.685, 1445.563, 1188.193,  574.513,  568.954,
         471.814,  537.352,  514.068,  174.093, 1720.806,  611.479,
      ]),
 array([330., 120., 360., 270., 220., 170.,  70., 210., 200., 300., 290.,
         70., 150., 190., 240., 100., 250., 210., 280., 230., 210., 230.,
        320., 210., 230., 250.,  60., 330., 150., 150., 180.,  80., 180.,
       ]))
       
       #너무길어서 좀 짤랐다. 데이터는 알아서 다운받아라

이런 식으로 된 데이터인데,

X: 광고비

Y: 판매량

광고비에 따른 음원판매량을 예측하는 데이터이다. 위의 데이터는 갯수가 안맞는데 너무 길어서 좀 짤랐다. 데이터는 앤디필드 책에서 제공하는 데이터를 그냥 사용했다.

 

 

데이터를 시각화해서 보니까 다음과 같은 모양이 있다.

어느정도 선형성을 띠고 있긴한데 그렇다고 엄청 예측을 잘할 것 같지는 않다.

 

**회귀계수의 추론에 필요한 것**  

회귀계수  

\( \beta_1 = \frac{SS_{XY}}{SS_{XX}} \)  

\( \beta_0 = \bar{Y} - \beta_1 \bar{X} \)  

\( \beta_1 \)을 구현하기 위해 우선 \( SS_{XY}, SS_{XX} \)를 구현해보자.  

1. \( SS_{XY} = \sum (X_i - \bar{X})(Y_i - \bar{Y}) \) 구현  

 

 (1) X와 Y의 평균 구하기

np.mean 또는 X.mean을 사용하여 평균을 바로 구할 수 있다.

X.mean()
Y.mean()

X=[1,2,3,4]라고 하면, X.mean()을 하면 2.5를 리턴한다.

 

(2) \(X_i - \bar{X}\)처럼 모든 값에 대해 평균을 빼주기

파이썬에선 다행히도 스칼라값과 리스트값을 연산하면 전체 리스트에서 스칼라 값을 빼준다.

예를 들면 [1,2,3,4,5] - 1 = [0,1,2,3,4]가 나온다.

X-X.mean()
Y-Y.mean()

 

 

(3) \(\sum\) 구현

 

sum을 하면 각 값을 다 더해준다.

X= [1,2,3,4]이면 sum(X)를 하면, 10(1+2+3+4)가 리턴된다.

sum(X)
sum(Y)

 

(4) 합치기

 (4-1) 분자 구하기

\(\qquad \sum (X_i - \bar{X}) * (Y_i -\bar{Y})\)

sum((X-X.mean() )* (Y-Y.mean()))

 

 (4-2) 분모 구하기

\(\qquad \sum (X_i - \bar{X})^2 \)

sum((x-x.mean())**2)

 

(5) 회귀계수(기울기, 절편) 구하기

 기울기 구하기

SS_XY=sum((X-X.mean() )* (Y-Y.mean())) 
SS_XX=sum((x-x.mean())**2)
SS_XY/SS_XX #beta_1 회귀계수의 기울기

공식에 의해 분자를 분모로 나오면 그 값이 나온다.

 

절편 구하기

(\( \beta_0 = \bar{Y} - \beta_1 \bar{X} \))

 

beta_0=Y.mean()-(SS_XY/SS_XX)*X.mean()
beta_0

 

함수화하기

def beta_estimate(X:list,Y:list)->float:
  SS_XY=np.sum((X-X.mean())*(Y-Y.mean()))
  SS_XX=np.sum((X-X.mean())**2)
  beta_1=SS_XY/SS_XX
  beta_0=Y.mean()-beta_1*X.mean()

  return beta_1,beta_0

beta_estimate(X,Y)

 

 

회귀계수의 추정을 다루었다.

나머지 회귀식의 평가(R, F-value, T-value)에 관한걸 다음 포스터에 쓰겠다.

 

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함
반응형