단순회귀분석

변수들간의 함수관계를 추구하는 통계적 방법을 회귀분석이라고 부른다. 회귀라는 말은 영국의 우생학자 F.Galton 이 처음으로 불렀다고 한다. 그는 아버지의 신장(키)과 아들의 신장의 관계를 조사했다. 그리고 아들들의 신장은 인간 전체의 평균 신장에 되돌아가려는 경향이 있다는걸 밝혔다. 이러한 함수관계를 'regression' 이라는 용어로 처음 표현한 사람이 F.Galton 이고 유래가 되었다.

먼저 제일 간단한 경우에 해당하는 선형관계에 관한 분석을 다뤄보자.

광고가 상품 판매량에 미치는 관계를 알아보기 위해 10개의 상점 표본(sample)을 추출하여 아래와 같이 표로 정리했다.

파이썬으로 산점도를 그리면 다음과 같다.

import matplotlib.pyplot as plt

xData = [4,8,9,8,8,12,6,10,6,9] # 광고료
yData = [9,20,22,15,17,30,18,25,10,20] # 총판매액
plt.scatter(xData, yData)
plt.xlabel('ad cost')
plt.ylabel('total')
plt.title('result')
plt.grid(True)
plt.show()

여기서 변수 x는 광고료고 y는 총판매액이다. 이 상황에서 단순회귀모형을 표현하면 다음과 같다.

갑자기 수식이 나와서 이게 뭔가 싶지만 하나씩 살펴보면 크게 어려운것은 없다. 수식에 대해 알아보기 전에 먼저 우리가 뭘 하고자 하는지 명확하게 짚고 넘어갈 필요가 있다.

주어진 샘플을 이용해 회귀선(아까 말한 1차함수)을 구하면 그 추정치를 통해 다음을 예측할 수 있다. 다시 단순회귀모형으로 돌아와서 하나씩 자세히 살펴보자.

회귀선의 추정

최소 제곱법

정리하면 다음과 같은 결과를 얻게 된다.

하지만 편미분해서 얻어진 결과를 0으로 놓고 해를 구했다고 해서 그 해가 S 를 최소화한다는 보장은 없다. 미분해서 0이 되는 것만으로는 2차원 그래프의 최대 최소를 알 수 없고 부가적인 정보가 필요하다.

cf) 수학적으로 이에 대한 추가 설명이 있는데 일단 생략(이차 편미분 행렬이 PD 행렬이면 볼록함수고 역도 성립)

수식은 복잡해 보이지만 파이썬으로 구하면 금방이다.

# 최소제곱법 계산(method of least squares)
# x평균, y평균 구하기
xAvg = np.mean(xData)
yAvg = np.mean(yData)

# b1 구하기
numerator = sum((xData - xAvg) * (yData - yAvg)) # 분자
denominator = sum((xData - xAvg) ** 2) # 분모

b1 = numerator/denominator
print(b1)

# b0 구하기
n = len(xData)
b0 = (sum(yData) / n) - (b1 * (sum(xData) / n))
print(b0)

구한 회귀선을 위의 산점도와 합쳐서 함께 보면 다음과 같다.

xData = [4,8,9,8,8,12,6,10,6,9] # 광고료
yData = [9,20,22,15,17,30,18,25,10,20] # 총판매액
plt.scatter(xData, yData)
plt.xlabel('ad cost')
plt.ylabel('total')
plt.title('result')
plt.grid(True)

x = np.arange(4, 13, 1)
y = -2.2695652173913032 + 2.608695652173913 * x

plt.plot(x, y)
plt.show(

회귀선의 정도

회귀선만 갖고는 이 점들을 어느 정도 잘 대변하여 주고 있는가를 알 수 없다. 물론 위와 같이 산점도 위에 회귀선을 그려 보아 대략 짐작할 수 있으나, 추정된 회귀선의 정도(precision)를 측정하는 여러 가지 측도(measure)에 대해서 알아보자.

추정값의 표준오차(standard error of estimate)

문제 : 위 표에 있는 표본자료에 대해 추정값의 표준오차를 구해라

# 추정값의 표준오차 구하기
print("/////")
result = 0
for x, y in zip(xData, yData):
    eachHatY = b0 + (b1* x)
    eachEpsilon = y - eachHatY
    result += (eachEpsilon **2)

print(math.sqrt(result / (n - 2)) # 2.630506646521028

답은 2.630506646521028 (단위 : 만원) 이다.

결정계수(coefficient of determination)

참고1 : 회귀분석 박성현 저 참고2 : https://brunch.co.kr/@gimmesilver/66

Last updated