티스토리 뷰
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)에 관한걸 다음 포스터에 쓰겠다.
'통계학 > 앤디필드의 유쾌한 통계학' 카테고리의 다른 글
단순 선형회귀분석 회귀계수 추정방법 (0) | 2025.01.28 |
---|
- Total
- Today
- Yesterday
- EBS
- 류근관
- stl
- c++
- 회계
- 보세사
- 백준
- 사회심리학
- 파이썬
- 데이터분석
- C
- 여인권
- 심리학
- 코딩테스트
- C/C++
- 인프런
- 오블완
- 일본어
- 정보처리기사
- K-MOOC
- Python
- 열혈프로그래밍
- 일문따
- 통계학
- 티스토리챌린지
- 뇌와행동의기초
- 인지부조화
- jlpt
- 일본어문법무작정따라하기
- 윤성우
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |