그로스 마케팅

[ 멋쟁이사자처럼부트캠프 그로스마케팅 부트캠프 ] 회귀분석

rootedgrowth 2025. 3. 10. 20:53

1. 회귀분석 개요

  • 여러 개의 독립변수와 한 개의 종속변수 간의 상관관계모델링하는 기법을 통칭
  • 예를 들어 온도, 습도, 일조량, 이산화탄소 농도, 풍속 등의 독립변수와 사과의 당도라는 종속변수가 어떤 관계를 나타내는지 모델링하고 예측하는 것임

$$\hat{Y} = w_{0} + w_{1} * X_{1} + w_{2} * X_{2} + ... + w_{n} * X_{n}$$

다중회귀분석 식

  • 선형 회귀
    • $\hat{Y}$: 종속변수 $w_{n}$과 $X_{n}$ 값에 의해 예측되는 값(종속변수)
    • $X_{n}(n \geq 0)$: Y를 예측하기 위한 특성의 실제값(독립변수)
    • $w_{n}(n \geq 0)$: 각 독립변수 별 중요도를 설정하기 위한 가중치
    • $w_{0}$: 절편(intercept) 
  • 지도학습은 분류와 회귀로 나뉘는데, 회귀의 예측값은 연속형 숫자값이고 분류는 카테고리와 같은 이산형 클래스값임.
  • 회귀분석의 분류는 아래와 같음
독립변수 개수 종속변수와 독립변수 간 관계
1개: 단일 회귀 선형: 선형 회귀
n개: 다중 회귀 비선형: 비선형 회귀

 

 

2. 단일선형회귀

  • 단일선형회귀(단순선형회귀)는 독립변수와 종속변수가 각각 하나인 선형회귀임
  • 이해를 위해 사과의 가격을 결정하는 요인이 사과의 당도뿐이라고 가정
  • 당도와 가격의 실제값은 아래와 같음

 

  • 일반적으로 사과 가격은 사과의 당도가 높으면 올라가는 경향이 있기에 선형(직선)의 형태로 관계를 표현할 수 있음
  • 즉 예측값은 $\hat{Y} = w_{0} + w_{1} * X_{1}$로 모델링 가능

 

 

  • 실제 사과 가격은 이 예측값(1차 함수 값)에서 실제 값만큼의 오류를 빼거나 더한 값이 됨
  • 즉 실제 사과 값은  ${Y} = w_{0} + w_{1} * X_{1} + Error$가 됨

 

 

  • 실제값과 예측값(회귀 모델) 간 차이인 오류값을 잔차라고 부름
  • 최적의 회귀모델을 찾는다는 것은 이 잔차의 합이 최소가 되는 모델을 찾는다는 의미와 동일
  • 잔차는 $+$와 $-$를 모두 가질 수 있기에 단순히 더하다간 잔차가 크게 줄어들 수 있음
  • 따라서 잔차에 절댓값을 취해서 더하거나(MAE, Mean Absolute Error), 제곱값을 더하는 방식(RSS, Residual Sum of Square)를 택함. 즉 $Error^{2} = RSS$
  • 잔차의 합이 최소가 되는 회귀계수($w_{n}$)를 찾는 것이 곧 최적의 모델을 찾는 것임

 

  • 아래는 예시 코드
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt


# 재현성 유지를 위해 랜덤 시드 설정
np.random.seed(42)

# 100개의 랜덤 당도(10~15 사이의 값) 생성
sugar_content = np.random.uniform(10, 15, 1000)

# 당도와 가격 간의 관계 (기울기를 줄이고 절편을 높임)
# 가격 = 1.5 * 당도 + 5 + (랜덤 오차)
# 가상의 실제값 데이터를 만드는 과정
price = 1.5 * sugar_content + 5 + np.random.normal(0, 1, 1000)

# 데이터프레임으로 정리
data = pd.DataFrame({
    'Sugar Content': sugar_content,
    'Price': price
})
y_target = data['Price']
X_data = data[['Sugar Content']]

# train set과 test set 분리
X_train, X_test, y_train, y_test = train_test_split(X_data, y_target, test_size = 0.3, random_state = 156)

# LinearRegression 객체로 학습/예측/평가 수행
lr = LinearRegression()
# train set으로 학습 수행
lr.fit(X_train, y_train)
# X_test로 예측 수행
y_preds = lr.predict(X_test)
# mse와 r2로 모델 평가
mse = mean_squared_error(y_test, y_preds)
r2 = r2_score(y_test, y_preds)

# 정보 출력
print(f'MSE: {mse:.2f}')
print(f'r2: {r2:.2f}')
print(f'절편값: {lr.intercept_:.2f}')
print('회귀 계수값:', np.round(lr.coef_, 2))

# 그래프 설정
plt.figure(figsize=(8, 6))

# 데이터 산점도 (점의 색은 baby blue, 원형 마커, 투명도 0.7)
plt.scatter(X_test, y_test, color='#89CFF0', marker='o', alpha=0.7, label="Actual Data")

# 회귀선 생성
x_range = np.linspace(X_test.min(), X_test.max(), 100).reshape(-1, 1)  # X 범위 설정
y_range = lr.predict(x_range)  # 회귀선 예측 값

# 회귀선 플로팅 (색상: darkblue)
plt.plot(x_range, y_range, color='darkblue', linewidth=2, label="Regression Line")

# 그래프 제목 및 라벨 설정
plt.xlabel("Sugar Content")
plt.ylabel("Price")
plt.title("Linear Regression: Sugar Content vs. Price")
plt.legend()
plt.show()