회귀분석 개념
통계학에서 두 개 이상의 변수 사이의 관계를 분석하고 예측 모델을 구축하는 기법이다. 주어진 데이터로부터 변수 간의 상관관계를 파악하고, 미래의 값을 예측하거나 변수들이 어떻게 상호작용 하는지 이해하는 데 사용된다.
주요 구성요소
요소 | 개념 | 예시 |
---|---|---|
독립 변수 (X) | 종속 변수에 영향을 주는 변수 | 광고비, 운동량 |
종속 변수 (Y) | 분석의 목표가 되는 변수 | 매출, 체중 |
회귀모델의 형태
선형 또는 비선형 형태를 가지며, 최소제곱법(OLS)을 사용해 모델의 파라미터를 추정한다.
최소제곱법(OLS)
단순 회귀 분석에선 최소제곱법을 통해 절편과 기울기를 추정한다.
각 관측치에서 예측값과 실제값 사이의 잔차의 제곱합을 최소화하는 파라미터를 찾는 방법이다.
잔차분석: 모델이 데이터의 변동성을 얼마나 잘 설명하는지, 이상치나 패턴이 존재하는지 확인할 수 있다.
회귀분석은 변수 간 상관관계를 분석하지만, 인과관계를 확정하지는 않는다
단순 회귀 분석
하나의 독립 변수와 하나의 종속 변수 사이의 선형 관계를 모델링한다.
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score
# 1. 가상의 데이터 준비
data = {
"emails_sent": [1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 9000, 10000],
"click_rate": [1.2, 2.5, 3.8, 4.2, 5.1, 6.3, 7.0, 7.8, 8.5, 9.2]
}
df = pd.DataFrame(data)
# 2. 독립 변수(X)와 종속 변수(y) 설정
X = df[['emails_sent']]
y = df['click_rate']
# 3. 단순 회귀 모델 생성 및 학습
model = LinearRegression()
model.fit(X, y)
# 4. 모델 파라미터 및 결정계수(R²) 출력
intercept = model.intercept_
slope = model.coef_[0]
r2 = r2_score(y, model.predict(X))
print("회귀식: 클릭률 = {:.2f} + {:.5f} * 이메일 발송 수".format(intercept, slope))
print("결정계수 (R²): {:.4f}".format(r2))
# 5. 예측 및 시각화
df['predicted_click_rate'] = model.predict(X)
plt.scatter(df['emails_sent'], df['click_rate'], color='blue', label='실제 클릭률')
plt.plot(df['emails_sent'], df['predicted_click_rate'], color='red', label='회귀 직선')
plt.title('이메일 발송 수 대비 클릭률 분석')
plt.xlabel('이메일 발송 수')
plt.ylabel('클릭률')
plt.legend()
plt.show()
- 회귀식: 클릭률 = 0.77 + 0.00087 * 이메일 발송 수
- 결정계수: 0.9909
다중 회귀 분석
하나의 종속 변수와 두 개 이상의 독립 변수 간의 관계를 동시에 분석한다.
여러 요인이 종속 변수에 미치는 영향을 동시에 고려할 수 있으며, 보다 정교한 예측 모델을 구축할 수 있다.
한계
- 독립 변수의 수가 많아질수록 모델의 복잡성이 증가하고 과적합 위험이 커진다.
- 과적합: 모델 훈련이 지나치게 적합되어 실제 환경에서 적용했을 때 예측력이 낮아지며, 신뢰할 수 없는 결과를 초래한다.
- 과적합 문제를 보정하기 위해 조정된 결정계수 (Adjusted $R^2$)가 사용되기도 한다.
- 독립 변수들 간의 상관관계가 높으면 계수 추정이 불안정해지고 해석이 어려워지는 다중공선성 문제가 발생한다.
- VIF(Variance Inflation Factors): 다중 회귀 모델에서 독립 변수간 상관 관계가 있는지 측정하는 척도이다
- VIF(Variance Inflation Factors): 다중 회귀 모델에서 독립 변수간 상관 관계가 있는지 측정하는 척도이다
from statsmodels.stats.outliers_influence import variance_inflation_factor
vif["VIF Factor"] = [variance_inflation_factor(X.values, i) for i in range(X.shape[1])]
예시
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score
# 1. 가상의 데이터 준비
data = {
'ad_spend': [1200, 2500, 3000, 4500, 5500, 6000, 7000, 8000, 9000, 10000],
'promo_budget': [600, 800, 1000, 1200, 1400, 1600, 1800, 2000, 2200, 2400],
'website_traffic': [2100, 2700, 3200, 3800, 4500, 5000, 5500, 6200, 6800, 7500],
'sales': [16500, 21000, 25000, 30000, 34500, 37000, 41000, 45500, 50000, 55000]
}
df = pd.DataFrame(data)
# 2. 독립 변수와 종속 변수 설정
X = df[['ad_spend', 'promo_budget', 'website_traffic']]
y = df['sales']
# 3. 다중 회귀 모델 생성 및 학습
model = LinearRegression()
model.fit(X, y)
# 4. 모델 파라미터 및 결정계수(R²) 출력
print("회귀식: 매출 = {:.2f} + {:.5f} * 광고비 + {:.5f} * 프로모션 예산 + {:.5f} * 웹사이트 방문자 수".format(
model.intercept_, model.coef_[0], model.coef_[1], model.coef_[2]
))
print("결정계수 (R²): {:.4f}".format(r2_score(y, model.predict(X))))
# 5. 실제 매출과 예측 매출 비교 산점도 시각화
predicted_sales = model.predict(X)
plt.figure(figsize=(8, 6))
plt.scatter(y, predicted_sales, color='blue', label='예측 매출')
plt.plot([min(y), max(y)], [min(y), max(y)], color='red', linestyle='--', label='대각선 (y=x)')
plt.xlabel('실제 매출 (달러)')
plt.ylabel('예측 매출 (달러)')
plt.title('실제 매출 vs 예측 매출')
plt.legend()
plt.show()
- 회귀식:매출 = 6138.16 + 1.93007 * 광고비 + 0.44864 * 프로모션 예산 + 3.76224 * 웹사이트 방문자 수
- 결정계수: 0.9993
결정계수 (R²)
종속 변수의 변동 중에서 모델이 설명하는 비율을 나타낸다. 0
과 1
사이의 값을 가지며, 1
에 가까울수록 모델의 설명력이 좋은 것이다.
- 결정계수가
1
에 가까울수록 모델의 설명력이 높다는 것 - 결정계수가
0
이면 모델의 설명력이 없다는 것 - 결정계수가
음수
면 모델이 데이터 설명에 실패하고 있음을 의미함.
'회고' 카테고리의 다른 글
[멋쟁이사자처럼 그로스마케팅 부트캠프] 18일차 회고 (3) | 2025.02.26 |
---|---|
[멋쟁이사자처럼 그로스마케팅 부트캠프] 17일차 회고 (2) | 2025.02.25 |
[멋쟁이사자처럼 그로스마케팅 부트캠프] 15일차 회고 (0) | 2025.02.21 |
[멋쟁이사자처럼 그로스마케팅 부트캠프] 14일차 회고 (6) | 2025.02.20 |
[멋쟁이사자처럼 그로스마케팅 부트캠프] 13일차 회고 (8) | 2025.02.19 |