회귀분석이란 추세선을 찾아가는 과정이라고 볼 수 있다.
기존의 데이터를 통해 경향성과 추세에 대한 일반화된 선을 구하고, 새로운 데이터에 대해서 예측되는 결과값을 구하도록 하는 것이다.
예를 들어서, 과연 주택의 크기에 따른 주택의 가격에 대해서 예측해보자고 하자.
주택의 크기와 주택의 가격에 대해서 회귀분석을 하면, 추세선을 그릴 수 있다.
이 추세선은 기본적으로 일차함수의 형식을 보인다.
y = a + bx + e이다.
y는 결과값, a는 상수(절편), b는 회귀계수(기울기), e는 노이즈(오차)
주택 크기와 주택 가격에 대한 식으로 대입하자면, y는 주택가격, a는 주택의 크기가 0일때의 주택 가격**, b는 주택의 크기가 1 커질 때, 오르는 주택 가격, e는 실제 주택 가격과 예측된 주택 가격의 차이이다.
** 주택 크기가 0인 경우가 현실적으로 존재하지 않기에, 해석하기 어렵거나 무의미하다. 일반적으로는 훈련된 데이터에 기반해서 주택 크기가 0이 아닌 평균적인 경우의 주택 가격을 나타내고, 평균적인 시작점으로 해석 가능하다.
그렇다면, 이 추세선은 어떻게 구할까?
가장 오차가 적게 예측할 수 있도록 구하는 것이 좋을 것이다.
따라서, 오차를 가장 줄이는 방향으로 계수를 구할 수 있도록 하는 최소제곱법(OLS)를 이용해서 구할 수 있다.
OLS를 이용해서 추세선을 그렸다. 그런데, 과연 이게 정말 옳은 값일까?
오차를 최대로 낮추는 추세선을 그릴 수 있게 도와주긴 했지만, 이게 과연 모집단을 잘 보여주는 값인지에 대해서는 아려주지 않는다.
모집단을 전수조사해서 추세선을 그리기는 현실적으로 어렵기에, 표본을 가지고 추세선을 그렸지만, 이번에 그린 추세선이 모집단을 잘 보여주는지는 알 수 없다. 다시 다른 표본을 뽑아서 그린 추세선이 오차가 더 적고 모집단을 잘 표현할 가능성이 분명 존재한다. 따라서, 최소제곱법으로 구한 추세선이 모집단을 잘 보여주고 올바른 추세선일지를 검정해볼 필요가 있다. 따라서, 모평균이 참값이라고 할 때, 표본평균이 모평균으로부터 얼마나 떨어져있는지를 계산하고 이 차이의 평균을 편차를 구하면 표준오차를 구할 수 있다. 표준오차가 작으면, 표본을 이용한 회귀선이 우연일 가능성이 낮고, 만약 표준오차가 크면, 우연일 가능성이 높을 것이다.
결국, 회귀계수는 최소제곱법으로 구해지는데 이렇게 구한 계수가 우연인지 아닌지를 모르기에, 회귀 계수가 우연일 확률을 알기 위해서 표준오차를 사용한다. 이 확률은 어떻게 구할까?
t-test를 이용해서 구할 수 있다. 왜냐하면, 회귀계수는 t-test의 평균값의 차이와 동일한 개념이기 때문이다.
귀무가설에 대한 검정통계량은 다음과 같다.
유의수준 95퍼센트에서 t-value가 1.96보다 크면 유의하다고, 즉, 관찰값이 우연에 의한 것이 아니라는 결론 내릴 수 있고, 작으면 우연에 의한 것이라고 볼 수 있다.
한편, 회귀분석은 독립변수와 종속변수의 직선관계에서만 분석 가능하다. 직선관계가 아닌 경우에 회귀분석을 하면 잘못된 회귀계수를 얻게 됨으로 회귀 분석 전에 산포도를 확인해야 한다.
gpt를 이용해서 임의의 데이터를 생성 후 회귀분석을 한 후 결과값을 분석해보자.
import numpy as np
import pandas as pd
from scipy.stats import linregress
from tabulate import tabulate
# 수정된 데이터 생성
np.random.seed(42)
# 주택 크기 데이터 (예: 제곱 피트)
house_size = np.random.normal(loc=1500, scale=200, size=100)
# 주택 가격 데이터 (예: 달러)
house_price = 120000 + 100 * house_size + np.random.normal(scale=50000, size=100)
# 단순 선형 회귀 분석 수행
slope, intercept, r_value, p_value, std_err = linregress(house_size, house_price)
# 결과를 DataFrame으로 저장
result_data = {
"항목": ["기울기 (회귀 계수)", "절편", "상관 계수", "t-값", "P-값", "표준 오차"],
"값": [slope, intercept, r_value, slope / std_err, p_value, std_err]
}
result_df = pd.DataFrame(result_data)
# 테이블 형식으로 출력
print(tabulate(result_df, headers='keys', tablefmt='pretty', showindex=False))

y = 174,092 + 64*x + 26인 회귀식이 나왔다.
평균적 주택 가격은 174,092이고, 평수가 1이 늘때, 가격은 64달러가 상승한다.
그리고 이것은 95퍼센트의 유의수준에서, 유의하다. t값이 2.44로 1.96보다 크며 p값이 0.016으로 0.05보다 작기 때문이다.