상관분석은 두 변수 간의 관계의 강도, 즉 얼마나 밀접하게 관려되어 있는지를 분석하는 것을 말한다. 그러나 때로는 관련성뿐만 아니라 독립변수에 따라 종속변수가 어떻게 변화하는가를 에측하기 원할 때가 있다. 회귀분석에서는 독립변수의 일정한 값에 대응되는 종속변수의 값을 예측하기 위하여 회귀방정식을 구한다. 상관분석에 의해 상관계수를 계산하고, 만일 상관계수가 높다면 두 변수 간의 관계를 회귀방정식으로 나타낸다. 따라서 회귀분석을 상관분석과 함께 사용한다면 변수들 간의 관련성에 대한 다양한 정보를 구할 수 있다.
ex. 어느 조립공장에서는 기능공들의 기술훈련을 자체적으로 실시하고 있는데, 훈련시간이 늘어남에 따라 숙련도가 얼마나 향상되는지를 알아보려고 한다. 훈련시간별로 임의로 1명씩을 표본으로 뽑아 그들의 하루 생산성을 조사하여 다음과 같은 결과를 얻었다.
In [1]:
import matplotlib.pylab as plt
X = [10, 20, 30, 40, 50, 60, 70]
y = [40, 45, 50, 65, 70, 70, 80]
plt.figure(figsize=(4, 2))
plt.scatter(X, y)
plt.xlabel("training time"); plt.ylabel("productivity")
plt.show()
scatter plot 을 보면 훈련시간이 늘어남에 따라 생산성도 높아지고 있음을 쉽게 볼 수 있다. 따라서 훈련시간과 생산성 사이에 밀접한 관계가 있음을 알 수 있다.
In [2]:
plt.figure(figsize=(6, 3))
plt.scatter(X, y)
plt.xlabel("training time")
plt.ylabel("productivity")
plt.plot((0, 70), (25, 85)); plt.plot((0, 70), (35, 75)); plt.plot((0, 70), (45, 65))
plt.ylim(20, 80); plt.xlim(0, 70)
plt.legend('abc', loc='upper left')
plt.show()
<img src="http://ssacstat.com/base/component/board/board_12/u_image/20151226063659_2105716877.png", width=350>
위 두 식을 충족시키는 표본의 회귀계수 $a$ 와 $b$ 는 다음과 같다. $$ \begin{align} & b = \frac{n \sum X_i Y_i - \sum X_i \sum Y_i}{n \sum X_i^2 - (\sum X_i)^2} = \frac{\sum X_i Y_i - n \bar{X}\bar{Y}}{\sum X_i^2 - n \bar{X}^2} \\ &a = \bar{Y} - b \bar{X} \end{align} $$
위 두 식과 같이 잔차제곱합을 최소화시키는 $a$ 와 $b$ 를 회귀모수 $\alpha$ 와 $\beta$ 에 대한 통상최소제곱추정량 ( ordinary least square estimator ) 혹은 최소제곱추정량이라 한다.
최소제곱법에 의해 도출된 추정량은 불편성을 가진다.
- 즉 추정량 $a$ 와 $b$ 의 평균값은 모수의 회귀계수인 $\alpha$ 와 $\beta$ 의 값과 일치한다.
$$ E(a) = \alpha $$
$$ E(b) = \beta $$
최소제곱추정량 $a$ 와 $b$ 는 종속변수 $Y$ 의 1차함수, 즉 직선의 관계를 갖는다.
최소제곱추정량은 모든 가능한 선형불편추정량 중에서 최소의 분산값을 갖는다.
- 이때문에 $a$ 와 $b$ 를 $\alpha$ 와 $\beta$ 에 대한 최량선형불편추정량 ( best linear unbiased estimator ) 이라고도 한다.
예제. 10명의 기능공이 일하는 공장에서 그들에게 생산성을 높이는 훈련을 실시하였다. 훈련시간의 정도에 따른 생산성을 예측하기 위해 회귀식을 구하고자 한다. 생산성은 하루에 만들 수 있는 제품의 수로 측정하였다. 회귀식을 구하고, 만약 15시간 훈련을 받은 사람의 예상 생산량은 얼마인지 구하여라.
기능공 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|
훈련시간 | 2 | 4 | 6 | 8 | 10 | 12 | 14 | 16 | 18 | 20 |
생산성 | 10 | 14 | 17 | 19 | 21 | 22 | 24 | 26 | 24 | 23 |
In [3]:
import matplotlib.pylab as plt
import numpy as np
X = np.array([2, 4, 6, 8, 10, 12, 14, 16, 18, 20])
y = np.array([10, 14, 17, 19, 21, 22, 24, 26, 24, 23])
n = len(X)
plt.scatter(X, y)
plt.show()
In [4]:
print(np.dot(X, y))
print(np.dot(X, X))
print(np.sum(X))
print(np.sum(y))
In [5]:
b = (n * np.dot(X,y) - np.sum(X)*np.sum(y)) / (n*np.dot(X, X) - (np.sum(X))**2)
a = np.mean(y) - b * np.mean(X)
print(a)
print(b)
In [6]:
def linear_model(x):
result = b * x + a
print(result)
linear_model(15)
In [7]:
from sklearn.linear_model import LinearRegression
X = np.array([2, 4, 6, 8, 10, 12, 14, 16, 18, 20])
y = np.array([10, 14, 17, 19, 21, 22, 24, 26, 24, 23])
X = X.reshape(len(X), 1)
y = y.reshape(len(y), 1)
model = LinearRegression().fit(X, y)
print(model.coef_)
print(model.intercept_)
In [8]:
XX = np.arange(0, 25)
yy = model.coef_ * XX + model.intercept_
yy = np.array(yy).reshape(25)
plt.plot(XX, yy, "r-")
plt.scatter(X, y)
plt.xlim(0, 22)
plt.show()