데이터 분석 part

회귀분석 (단순회귀분석과 다중회귀분석)

bleufonce 2025. 2. 25. 01:17

지난 수업 예제

 

코드 ( 광고비와 판매량 사이의 관계를 선형회귀분석으로 분석)

# statsmodels - 통계분석 라이브러리
# numpy - 숫자를 다루기 위한 라이브러리
import statsmodels.api as sm
import numpy as np

# 독립변수(광고비)와 종속변수(판매량) 예제 데이터
# np.array()를 써서 데이터를 숫자로 다루기 쉽게 한다.
X = np.array([1, 2, 3, 4, 5])  # 광고비(독립변수)
Y = np.array([3, 6, 7, 8, 11])  # 판매량(종속변수)

# 상수항 추가
# 상수항(절편)(b)을 추가하는 코드
# sm.OLS() 같은 함수는 절편을 따로 수동으로 추가해줘야 함.
X = sm.add_constant(X)

# 선형 회귀 모델 학습
# sm.OLS(Y, X).fit()는 "최소제곱법(OLS)"으로 회귀 모델을 학습하는 코드.
# Y는 종속변수(판매량)
# X는 독립변수 (광고비 + 상수항)
# .fit(): 데이터를 학습해서 최적의 선형 회귀식을 찾음.
model = sm.OLS(Y, X).fit()

# 회귀 분석 결과 출력
# model.summary()는 회귀 분석 결과(기울기, 절편, p-value, R² 등)를 보여주는 코드.
print(model.summary())

 

결과:

# R² 값이 0.953이니까, 이 모델이 판매량(Y)을 95.3% 설명할 수 있다는 뜻.
(즉, 광고비(X)와 판매량(Y) 사이의 관계가 아주 강하다는 의미) R²이 1에 가까울수록 모델이 데이터를 잘 설명.

(Adjusted R² (0.937)도 높은데, 이 값은 독립변수(광고비)의 개수를 고려해서 보정된 결정계수)

독립변수가 많아지면 R²는 커지지만, Adjusted R²는 의미 없는 변수에는 벌점을 줘서 더 신뢰할 수 있음.

# const (절편): 1.6  → 광고비가 0원일 때, 예상 판매량이 1.6이라는 뜻

# x1 (광고비의 기울기): 1.8  

# P>|t| (절편): 0.128 (유의하지 않음)  → 절편(const)의 P-value ≥ 0.05 - 절편은 통계적으로 유의하지 않음.

# P>|t| (광고비의 기울기): 0.004 (유의함) → 광고비 (x1)의 P-value < 0.05 - 광고비는 판매량에 유의한 영향을 준다.

# Prob (F-statistic) = 0.00440 → 회귀식 전체의 유의성을 나타내는 값

0.00440 < 0.05 → 회귀식이 전체적으로 유의하다. (즉, 광고비가 판매량을 잘 설명함)

# Durbin-Watson: 2.600 - 잔차 분석 : 잔차(오차)들이 독립적인지 확인

1.5 ~2.5 사이면 괜찮고, 2에 가까울수록 좋다. 2.6이면 약간 크지만 크게 문제될 정도는 아님.

 

※ 최소제곱법(OLS)이란?

최소제곱법(OLS)회귀 분석에서 가장 많이 사용하는 방법으로, 오차(잔차, Residuals)의 제곱합을 최소화하는 방식으로 최적의 회귀선을 찾는 방법.

OLS가장 적절한 직선을 찾는 방법이고, statsmodels에서 sm.OLS()를 사용하면
자동으로 최소제곱법을 적용해서 최적의 회귀선을 계산.

 

sm.OLS() 같은 함수는 상수항(절편)을 따로 추가하지 않으면 자동으로 계산하지 않기 때문에, 수동으로 상수항(절편)을 X에 추가해줘야 함. sklearn.linear_model.LinearRegression() 함수에서는 상수항(절편)을 자동으로 포함시켜 모델을 학습시켜줌.

 

 

 

코드 ( stats.pearsonr()를 이용한 상관 분석 ) - 위의 코드랑 이어지는 코드

- 광고비(X)와 판매량(Y) 사이의 관계를 알아보기 위해 '피어슨 상관계수'를 계산하는 코드. 

# scipy.stats 라이브러리를 불러옴.
# 이 안에 있는 stats.pearsonr() 함수를 사용해서 두 변수 간의 상관계수를 계산
from scipy import stats

# 독립변수(광고비)와 종속변수(판매량)
# 두 변수 간의 상관계수 계산
# 피어슨 상관계수(상관도)와 p-value(유의확률)를 계산하는 부분
# X[:, 1]: X가 2차원 배열(예: [[1, 2], [3, 4], [5, 6]])일 때, 두 번째 열(광고비)을 가져옴.
# Y: 종속변수(판매량)
# 두 변수(X와 Y) 간의 상관관계(r 값)와 p-value(통계적 유의미성)를 계산.
correlation_coefficient, p_value = stats.pearsonr(X[:, 1], Y)

#상관계수(correlation_coefficient)와 p-값(p_value)을 출력.
print(f"상관계수: {correlation_coefficient}")
print(f"P-값: {p_value}")

#  p-value를 기준으로 결과를 해석
if p_value < 0.05:
    print("두 변수 간 상관관계가 통계적으로 유의미함")
else:
    print("두 변수 간 상관관계가 통계적으로 유의미하지 않음")

 

  • 상관계수 (r 값)
    • 1에 가까울수록 강한 양의 상관관계 (광고비 증가 → 판매량 증가)
    • -1에 가까울수록 강한 음의 상관관계 (광고비 증가 → 판매량 감소)
    • 0에 가까우면 상관관계가 거의 없음
  • p-value (유의확률)
    • p-value < 0.05 → 상관관계가 통계적으로 유의미함 (신뢰할 수 있음)
    • p-value ≥ 0.05 → 상관관계가 통계적으로 유의미하지 않음 (우연일 가능성이 큼)

 

결과:

상관계수(r) = 0.9761 은 거의 1에 가까운 값. 강한 상관관계.

즉, 광고비(X)가 증가할수록 판매량(Y)도 거의 비례해서 증가한다는 의미.

P-value = 0.004 → 0.05보다 작으므로 통계적으로 유의미함.

광고비와 판매량 사이의 상관관계가 우연이 아닐 가능성이 높고, 실제로 연관성이 있다고 볼 수 있음.

 

 

회귀분석이란?

 

- 두 개 이상의 변수 사이의 관계를 분석하고 예측 모델을 구축하는 기법.

- 주어진 데이터로부터 변수 간의 상관관계를 파악하고, 이를 바탕으로 미래의 값을 예측하거나 변수들이 어떻게 상호작용하는지 이해하는데 사용

 

회귀분석의 개념

 

주요 구성 요소

 

# 종속변수 (label) - Y

- 분석의 목표가 되는 변수

- 알고싶은 항목

 

# 독립변수 - X

- 종속변수에 영향을 주는 변수

 

# 오차항 (입실론)

- 실제값에서 추정값을 뺀 값. (측정오차나 누락된 변수 등)

 

 

회귀모델의 형태

- 선형(linear) 또는 비선형(nonlinear) 형태

- 대표적인 방법으로 최소제곱법(OLS, R-Squared)을 사용하여 모델의 파라미터를 추정

 

 

단순회귀분석

- 하나의 독립변수하나의 종속변수 사이의 선형관계

 

최소제곱법 (OLS, R-Squared)

- 단순회귀분석에서는 최소제곱법을 통해 절편과 기울기를 추정.

- 각 관측치에서 예측값과 실제값 사이의 잔차의 제곱합을 최소화하는 파라미터를 찾는 방법

→ 에러를 0으로 수렴시키겠다.

 

회귀분석의 기본 가정

# 선형성

- 직선이어야 한다.

※ 데이터가 선형적이지 않을 경우 비선형 변환이나 다른 모델링 기법 필요

 

# 독립성

- 각 관측치가 서로 독립적이어야 함

 

# 등분산성 (같은 간격)

- 모든 수준의 독립 변수에서 오차의 분산이 동일하다는 가정

 

# 정규성

- 오차항이 정규분포를 따른다는 가정

 

 

모델 적합도 평가 및 검정

결정계수 (R²)

- 0과 1사이의 값을 가지며, 1에 가까울수록 회귀 모델의 설명력이 좋음을 의미

(0이면 모델이 평균값만큼도 설명하지 못한다는 뜻. 음수가 나오면 그 모델은 심히 안좋다.)

분모가 분산(TSS)이고 분자(RSS)가 오차값

결정계수는 1에서 오차 제곱합(RSS)을 총 제곱합(TSS)으로 나눈 값을 빼는 방식으로 계산.

 

t-검정 및 p-값

  • t-검정: 각 회귀계수가 통계적으로 유의한지를 검정.
  • p-값: 기울기나 절편이 0이라는 귀무가설을 기각할 수 있는지 판단. 일반적으로 p-값이 0.05 미만이면 유의하다고 봄.

F-검정

  • 전체 모델의 유의성을 검정하는 방법으로, 독립 변수가 종속 변수의 변동을 설명하는 데 유의한지 평가.

 

※ 유의사항

- 회귀분석은 변수간 상관관계를 분석하지만 인과관계를 확정하지는 않음

- 선형성, 독립성, 등분산성, 정규성 등의 가정이 위배되면 모델의 추정치와 해석에 문제발생할 수 있음

- 중요한 독립변수가 누락되면 결과가 왜곡될 수 있음

- 이상치는 회귀계수 추정에 큰 영향을 미칠 수 있으므로, 데이터 전처리와 이상치 처리가 필요

 

 

 

 

단순 회귀분석 예시 코드

import numpy as np   # numpy는 수치계산, 대규모 배열 및 행렬 다루는 라이브러리
import pandas as pd  # pandas : 데이터분석 라이브러리
import matplotlib.pyplot as plt  # 그래프 시각화 라이브러리
from sklearn.linear_model import LinearRegression  # 선형회귀모델 사용하는 라이브러리
from sklearn.metrics import r2_score  # 결정계수 계산하는 라이브러리

# 1. 가상의 데이터 생성
# np.random.seed(42): 랜덤 값을 고정해서 실행할 때마다 같은 값이 나오도록 설정.
np.random.seed(42)  # 결과 재현을 위한 시드 설정
# 광고비 데이터: 1,000 ~ 10,000 달러 사이의 50개 포인트
# np.linspace(1000, 10000, 50): 광고비 데이터를 1000~10000 사이에서 50개 생성.
ad_spend = np.linspace(1000, 10000, 50)
# 실제 전환수: 실제로는 광고비가 증가할수록 전환수가 증가한다고 가정
# 실제 모형: conversions = intercept + slope * ad_spend + noise
# true_intercept = 50: 광고비가 0일 때 전환수가 50.
true_intercept = 50  
# true_slope = 0.05: 광고비가 1달러 증가할 때 전환수가 0.05 증가.
true_slope = 0.05      
# noise = np.random.normal(0, 30, ad_spend.shape[0]): 전환수에 노이즈(랜덤 값)를 추가해서 현실적인 데이터처럼 보이게 만듬.
noise = np.random.normal(0, 30, ad_spend.shape[0])  # 랜덤 노이즈 추가
# conversions = true_intercept + true_slope * ad_spend + noise: 광고비에 따라 전환수를 계산.
conversions = true_intercept + true_slope * ad_spend + noise

# 데이터프레임 생성
# pandas.DataFrame을 이용해 광고비(ad_spend)와 전환수(conversions) 데이터를 표로 만듬.
df = pd.DataFrame({'ad_spend': ad_spend, 'conversions': conversions})

# 2. 회귀분석을 위한 데이터 준비
# X = df[['ad_spend']]: 광고비를 독립 변수로 설정.
# y = df['conversions']: 전환수를 종속 변수로 설정.
X = df[['ad_spend']]  # 독립 변수 (광고비)
y = df['conversions']  # 종속 변수 (전환수)

# 3. 단순 회귀 모델 생성 및 학습
# LinearRegression(): 선형 회귀 모델을 만든다.
# model.fit(X, y): 광고비(X)를 이용해서 전환수(y)를 예측하도록 모델을 학습시킨다.
model = LinearRegression()
model.fit(X, y)

# 4. 모델 파라미터 출력
# model.intercept_: 모델이 학습한 절편 (광고비가 0일 때 예상 전환수).
# model.coef_[0]: 모델이 학습한 기울기 (광고비가 1달러 증가할 때 전환수 증가량).
print("모델 절편 (Intercept):", model.intercept_)
print("모델 기울기 (Slope):", model.coef_[0])

# 5. 예측값 계산 및 결정계수 평가
# model.predict(X): 학습한 모델을 이용해 전환수를 예측.
# r2_score(y, y_pred) : 결정계수를 계산. r2값이 1에 가까울 수록 모델이 데이터를 잘 설명하는 것.
y_pred = model.predict(X)
print("결정계수 (R²):", r2_score(y, y_pred))

# 6. 결과 시각화
# 파란 점 : 실제 데이터.
# 빨간 선 : 회귀 모델이 예측한 선.
plt.scatter(df['ad_spend'], df['conversions'], color='blue', label='실제 데이터')
plt.plot(df['ad_spend'], y_pred, color='red', label='회귀 직선')
plt.title('광고비 대비 전환수 분석')
plt.xlabel('광고비 ($)')
plt.ylabel('전환수')
plt.legend()
plt.show()

# 광고비가 증가할수록 전환수가 증가한다.
# 절편 : 광고비가 0일때 예상 전환수는 약 53.87명
# 기울기 : 광고비가 1달러 증가할 때 전환수는 0.0481명 증가
# 결정계수 : 0.956이므로 1에 가까우므로 모델이 데이터를 잘 설명.

 

 

 

단순회귀분석 문제 풀기 코드

# 문제1,2,3 코드
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. 주어진 데이터
# 광고비와 전환수 데이터를 numpy 배열로 저장함.
ad_spend = np.array([1000, 3000, 5000, 7000, 9000])  # 광고비 (독립 변수)
conversions = np.array([105, 195, 310, 395, 505])  # 전환수 (종속 변수)

# 데이터프레임 생성
# pandas.DataFrame()을 이용해 데이터프레임(df) 형태로 변환.
# 독립변수(X) → 광고비
# 종속변수(Y) → 전환수
df = pd.DataFrame({'ad_spend': ad_spend, 'conversions': conversions})

# 2. 회귀분석을 위한 데이터 준비
# X = df[['ad_spend']] → 독립변수(광고비)를 2차원 배열 형태로 준비 (대괄호 2개 [[ ]] )
# y = df['conversions'] → 종속변수(전환수)를 1차원 배열로 저장
X = df[['ad_spend']]  # 독립 변수 (광고비)
y = df['conversions']  # 종속 변수 (전환수)

# 3. 단순 회귀 모델 생성 및 학습
# LinearRegression().fit(X, y) → 광고비와 전환수 사이의 관계를 학습
model = LinearRegression()
model.fit(X, y)

# 4. 모델 파라미터 출력
# model.intercept_ → 절편(β₀), 즉 X=0일 때 예상되는 Y 값
# model.coef_[0] → 기울기(β₁), 즉 광고비가 1 증가할 때 전환수가 얼마나 증가하는지
print("모델 절편 (Intercept):", model.intercept_)
print("모델 기울기 (Slope):", model.coef_[0])

# 5. 예측값 계산 및 결정계수 평가
# model.predict(X) → 학습한 모델을 이용해 주어진 광고비 데이터(X)에 대해 예측된 전환수(y_pred)를 계산.
# r2_score(y, y_pred) → 실제 값(y)과 예측값(y_pred)의 일치 정도 (결정계수인 R² 값) 확인
y_pred = model.predict(X)
print("결정계수 (R²):", r2_score(y, y_pred))

# ad_spend_new = np.array([[6000]]) : 예측할 광고비를 넘파이 배열 형태로 저장
# [[6000]] → 2차원 배열로 변환해야 sklearn의 predict() 함수가 정상적으로 동작함
# predicted_conversion = model.predict(ad_spend_new) : 학습된 회귀 모델(model)을 사용해 광고비 6000달러일 때 전환수를 예측
# predict() 함수는 입력된 광고비를 기반으로 회귀 방정식을 적용하여 전환수를 계산
# predicted_conversion[0] → 예측된 값은 배열 형태이므로 [0]으로 첫 번째 값을 가져옴
# .2f → 소수점 둘째 자리까지 출력
ad_spend_new = np.array([[6000]])  # 예측할 광고비 (2차원 배열 형태)
predicted_conversion = model.predict(ad_spend_new)  # 예측
print(f"광고비 6000달러일 때 예상 전환수: {predicted_conversion[0]:.2f}")

# 6. 결과 시각화
# 파란색 점 (산점도) → 실제 광고비 & 전환수 데이터
# 빨간색 선 (회귀선) → 학습한 회귀 모델이 예측한 값
plt.scatter(df['ad_spend'], df['conversions'], color='blue', label='실제 데이터')
plt.plot(df['ad_spend'], y_pred, color='red', label='회귀 직선')
plt.title('광고비 대비 전환수 분석')
plt.xlabel('광고비 ($)')
plt.ylabel('전환수')
plt.legend()
plt.show()

# y = 52 + 0.05x
# 광고비 6000달러를 투자할때 예상되는 전환수는 352명이다.
# 결정계수는 0.998이므로 거의 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': [1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 9000, 10000],
    'conversions': [120, 150, 180, 210, 240, 265, 290, 320, 345, 370]
}
df = pd.DataFrame(data)

# 2. 독립 변수(X)와 종속 변수(y) 설정
X = df[['ad_spend']]
y = df['conversions']

# 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_conversions'] = model.predict(X)

plt.scatter(df['ad_spend'], df['conversions'], color='blue', label='실제 전환수')
plt.plot(df['ad_spend'], df['predicted_conversions'], color='red', label='회귀 직선')
plt.title('광고비 대비 전환수 분석')
plt.xlabel('광고비 ($)')
plt.ylabel('전환수')
plt.legend()
plt.show()

 

 

 

 

※ 상관계수와 결정계수의 차이

지표 의미 값 범위 목적/용도
상관계수 두 변수 간의 선형 관계의 강도와 방향을 나타냄 -1 ~ 1 두 변수 간의 관계를 이해하고, 상관도을 평가
결정계수 (R²) 회귀 모델이 종속 변수의 변동을 얼마나 잘 설명하는지 평가 0 ~ 1 회귀 모델의 설명력을 평가

 

 

 

 

다중 회귀 분석

- 하나의 종속 변수두 개 이상의 독립 변수간의 관계를 동시에 분석.

- 마케팅에서는 여러 요인이 매출에 미치는 영향을 동시에 분석 가능.

오차항은 실제 계산식에서 잘 안씀. (개념적으로 본다.)

 

# 최소제곱법(OLS, R-Squared) :

- 관측된 데이터와 모델에 의한 예측 값 사이의 잔차 제곱합을 최소화하는 방법

→ 에러를 0으로 수렴하게...

 

# 결정계수 :

- 모델이 종속변수의 변동성을 얼마나 설명하는지 나타냄. 0과 1사이의 값

 

※ 결정계수가 1이라면 ??? → 과적합을 의심해 봐야된다.  

모델이 훈련 데이터에 너무 잘 맞춰져서 새로운 데이터(테스트 데이터)에는 잘 일반화되지 않는 상태일 수 있음.

 

 

# 조정된 결정계수 :

- 독립 변수의 개수가 늘어날 때 발생할 수 있는 과적합 문제를 보정하기 위해 사용.

 

# F-검정:

- 전체 모델의 유의성을 평가하여, 적어도 하나의 독립 변수가 종속 변수와 유의한 관계가 있는지를 검정.

 

 

 

다중 회귀 분석의 기본 가정

# 선형성

# 독립성

# 등분산성

# 정규성

# 다중 공선성

- 독립 변수들 간에 높은 상관관계가 존재하면 계수 추정의 불안정성이 발생할 수 있음.

 

 

다중 회귀 분석의 장점과 한계

- 장점 : 단순회귀분석보다 복합 요인 분석과 예측력이 향상된다는 것

- 단점 : 모형복잡성, 다중공선성 문제, 가정 위배

 

 

다중회귀분석 예시 코드

#필요한 라이브러리 불러오기
# numpy: 수학 연산을 다룰 때 사용하는 라이브러리로, 여기선 데이터 생성과 무작위 값 생성을 위해 사용.
# pandas: 데이터를 다룰 때 매우 유용한 라이브러리로, 데이터프레임 형태로 데이터를 처리할 수 있음.
# matplotlib.pyplot: 데이터를 시각화(그래프 그리기)하는 라이브러리로, 데이터를 보기 좋게 그래프나 차트로 그릴 때 사용.
# sklearn.linear_model.LinearRegression: 선형 회귀 모델을 만들기 위한 라이브러리.
# sklearn.metrics.r2_score: 모델의 성능을 평가할 때 쓰는 결정계수(R²)를 계산하는 함수.
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

# 가상의 데이터 생성
# 예: 매출(Y)은 광고비(X1)와 프로모션 예산(X2)의 영향을 받음
# np.random.seed(42): 이 코드를 실행할 때마다 같은 값을 생성할 수 있도록 하는 "시드"를 설정.
# ad_spend: 광고비 데이터를 1,000에서 10,000 달러 사이의 값으로 50개 포인트 생성.
# promo_budget: 프로모션 예산 데이터를 500에서 5,000 달러 사이의 값으로 50개 포인트 생성.
np.random.seed(42)
n = 50
ad_spend = np.random.uniform(1000, 10000, n)   # 광고비 (달러)
promo_budget = np.random.uniform(500, 5000, n)   # 프로모션 예산 (달러)

# 실제 모델: Y = 50 + 0.03*ad_spend + 0.05*promo_budget + noise
# noise: 데이터에 랜덤 노이즈를 추가하여 현실적인 데이터의 변동성을 나타냄.
# 최종적으로 sales는 실제 매출 값을 생성하는 코드
true_intercept = 50
true_coef_ad = 0.03
true_coef_promo = 0.05
noise = np.random.normal(0, 30, n)

sales = true_intercept + true_coef_ad * ad_spend + true_coef_promo * promo_budget + noise

# 데이터프레임 생성
# pandas의 DataFrame을 사용하여, ad_spend, promo_budget, sales를 하나의 표 형태로 묶음.
df = pd.DataFrame({
    'ad_spend': ad_spend,
    'promo_budget': promo_budget,
    'sales': sales
})

# 독립 변수와 종속 변수 설정
# X는 독립 변수로, 광고비와 프로모션 예산이 포함된 데이터셋.
# y는 종속 변수로, 매출을 나타냄.
X = df[['ad_spend', 'promo_budget']]
y = df['sales']

# 다중 회귀 모델 생성 및 학습
# LinearRegression()을 사용하여 선형 회귀 모델을 생성.
# fit()을 사용하여 모델을 학습시킴. 이 때, 광고비와 프로모션 예산을 기반으로 매출을 예측하는 모델을 학습함.
model = LinearRegression()
model.fit(X, y)

# 모델 파라미터 및 결정계수 출력
# model.intercept_: 절편 값 (기본값 50)
# model.coef_[0]: 광고비에 대한 기울기 (0.03)
# model.coef_[1]: 프로모션 예산에 대한 기울기 (0.05)
# r2_score(): 결정계수(R²)를 출력. 모델이 얼마나 잘 데이터를 설명하는지 나타내는 지표.
print("회귀식: 매출 = {:.2f} + {:.5f} * 광고비 + {:.5f} * 프로모션 예산".format(
    model.intercept_, model.coef_[0], model.coef_[1]
))
print("결정계수 (R²): {:.4f}".format(r2_score(y, model.predict(X))))

# 산점도와 회귀면 시각화(2차원 시각화는 독립 변수가 2개이므로 다소 복잡할 수 있음)
# 여기서는 광고비에 따른 예측 매출을 예시로 시각화합니다.
# 파란점 : 실제 매출 / 빨간점 : 예측된 매출
plt.scatter(df['ad_spend'], y, color='blue', label='실제 매출')
plt.scatter(df['ad_spend'], model.predict(X), color='red', label='예측 매출', alpha=0.5)
plt.xlabel('광고비 ($)')
plt.ylabel('매출')
plt.title('광고비 대비 매출 예측 (프로모션 예산 고려)')
plt.legend()
plt.show()

 

  • 절편 (75.84): 광고비와 프로모션 예산이 모두 0일 때, 기본 매출이 약 75.84 달러.
  • 광고비의 기울기 (0.02557): 광고비가 1달러 증가할 때, 매출은 0.02557 달러 증가.
  • 프로모션 예산의 기울기 (0.04888): 프로모션 예산이 1달러 증가할 때, 매출은 0.04888 달러 증가.
  • 결정계수 값이 0.9350이라는 것은 모델이 매출의 변동을 약 93.5% 정도 설명 (모델이 잘 작동)

 

 

 

 

다중회귀분석 예시코드2

# numpy: 수학적 계산을 할 때 사용하는 라이브러리로, 주로 배열 연산에 사용됨.
# pandas: 데이터 처리 및 분석에 유용한 라이브러리로, 테이블 형태(데이터프레임)로 데이터를 다룰 수 있음.
# matplotlib.pyplot: 그래프를 그릴 때 사용하는 라이브러리. 데이터를 시각적으로 표현할 때 필요.
# sklearn.linear_model.LinearRegression: 선형 회귀 모델을 사용하기 위한 클래스. 데이터를 기반으로 예측 모델을 만들 때 사용.
# sklearn.metrics.r2_score: 모델의 성능을 평가할 때 쓰는 결정계수(R²)를 계산하는 함수.
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, promo_budget,website_traffic(3개의 독립변수), sales(종속변수)에 대한 데이터가 들어 있는 딕셔너리.
# 이 데이터를 pandas의 데이터프레임으로 변환해서 df라는 이름의 표로 저장함.
data = {
    'ad_spend': [1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 9000, 10000],
    'promo_budget': [500, 700, 900, 1100, 1300, 1500, 1700, 1900, 2100, 2300],
    'website_traffic': [2000, 2500, 3000, 3500, 4000, 4500, 5000, 5500, 6000, 6500],
    'sales': [15000, 18000, 22000, 25000, 29000, 32000, 36000, 40000, 44000, 48000]
}
df = pd.DataFrame(data)

# 2. 독립 변수와 종속 변수 설정
# 독립변수인 ad_spend, promo_budget, website_traffic 이 3개의 변수를 사용해서 매출을 예측.
# 종속 변수인 sales는 예측하려는 대상(알고싶은 값)
X = df[['ad_spend', 'promo_budget', 'website_traffic']]
y = df['sales']

# 3. 다중 회귀 모델 생성 및 학습
# LinearRegression(): 선형 회귀 모델을 만드는 클래스.
# model.fit(X, y): 모델을 학습하는 부분. 주어진 독립 변수(X)를 바탕으로 종속 변수(y)를 예측하는 방법을 학습.
model = LinearRegression()
model.fit(X, y)

# 4. 회귀식과 및 결정계수(R²) 출력
# 회귀식: model.intercept_는 절편(Intercept), model.coef_는 기울기(coefficient)를 나타냄.
# 결정계수(R²): r2_score(y, model.predict(X))는 모델이 실제 매출을 얼마나 잘 예측하는지를 평가하는 값.
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.scatter(y, predicted_sales, color='blue'): 실제 매출과 예측된 매출을 비교하는 산점도 그래프.
# 대각선(y=x): 빨간색 대각선은 실제 매출과 예측 매출이 완전히 일치하는 상태를 나타냄.
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()

 

  • model.coef_[0]는 광고비(ad_spend)에 대한 기울기
  • model.coef_[1]은 프로모션 예산(promo_budget)에 대한 기울기
  • model.coef_[2]는 웹사이트 방문자 수(website_traffic)에 대한 기울기

 

# 광고비가 1달러 늘어날수록 매출은 평균적으로 2.84달러 증가한다.
# 프로모션 예산이 1달러 늘어날수록 매출은 평균적으로 0.57달러 증가한다.
# 웹사이트 방문자수가 1명 늘어날수록 매출은 평균적으로 1.42달러 증가한다.

# 결정계수값이 0.99이므로 거의 1에 가깝기 때문에 모델이 매출의 변화를 잘 예측하고 있다.

 

 

 

 

다중회귀분석 예시코드3 - 회귀계수가 음수일 때 해석해보기

import numpy as np
import pandas as pd
from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score

# 주어진 데이터로 데이터프레임 생성
data = {
    "광고비_TV ($)": [10000, 15000, 20000, 25000, 30000, 35000, 40000, 45000, 50000, 55000],
    "광고비_온라인 ($)": [5000, 10000, 15000, 20000, 25000, 30000, 35000, 40000, 45000, 50000],
    "SNS_언급량 (건)": [200, 400, 800, 1200, 1600, 2000, 2400, 2800, 3200, 3600],
    "검색량_브랜드명 (건)": [5000, 7000, 9000, 12000, 15000, 18000, 21000, 24000, 27000, 30000],
    "웹사이트 방문자 수 (명)": [8000, 11000, 14000, 18000, 22000, 26000, 30000, 34000, 38000, 42000],
    "고객 설문 점수 (100점 만점)": [65, 68, 72, 75, 78, 82, 85, 88, 90, 93],
    "SNS 공유 횟수 (회)": [100, 300, 600, 1000, 1500, 2000, 2500, 3000, 3500, 4000],
    "인플루언서 협업 수 (건)": [5, 8, 12, 15, 18, 22, 25, 28, 30, 35],
    "브랜드 인지도 점수 (100점 만점)": [50, 55, 60, 65, 70, 75, 80, 85, 90, 95]
}

df = pd.DataFrame(data)

# 다중 회귀 분석 수행
X = df.drop(columns=["브랜드 인지도 점수 (100점 만점)"])
y = df["브랜드 인지도 점수 (100점 만점)"]

model = LinearRegression()
model.fit(X, y)

# 예측 결과
predicted_brand_awareness = model.predict(X)
r2 = r2_score(y, predicted_brand_awareness)

# 회귀 계수 출력
광고비_TV_coef = model.coef_[X.columns.get_loc("광고비_TV ($)")]
광고비_온라인_coef = model.coef_[X.columns.get_loc("광고비_온라인 ($)")]
SNS_언급량_coef = model.coef_[X.columns.get_loc("SNS_언급량 (건)")]
검색량_브랜드명_coef = model.coef_[X.columns.get_loc("검색량_브랜드명 (건)")]
웹사이트_방문자_수_coef = model.coef_[X.columns.get_loc("웹사이트 방문자 수 (명)")]
고객_설문_점수_coef = model.coef_[X.columns.get_loc("고객 설문 점수 (100점 만점)")]
SNS_공유_횟수_coef = model.coef_[X.columns.get_loc("SNS 공유 횟수 (회)")]
인플루언서_협업_수_coef = model.coef_[X.columns.get_loc("인플루언서 협업 수 (건)")]

coef_list = [
    ("광고비_TV ($)", 광고비_TV_coef),
    ("광고비_온라인 ($)", 광고비_온라인_coef),
    ("SNS_언급량 (건)", SNS_언급량_coef),
    ("검색량_브랜드명 (건)", 검색량_브랜드명_coef),
    ("웹사이트 방문자 수 (명)", 웹사이트_방문자_수_coef),
    ("고객 설문 점수 (100점 만점)", 고객_설문_점수_coef),
    ("SNS 공유 횟수 (회)", SNS_공유_횟수_coef),
    ("인플루언서 협업 수 (건)", 인플루언서_협업_수_coef)
]

# 절대값 기준으로 정렬
sorted_coef_list = sorted(coef_list, key=lambda x: abs(x[1]), reverse=True)

# 가장 영향력이 큰 변수
most_influential_variable = sorted_coef_list[0]

# 최종 결과 출력
final_results = {
    "회귀 분석 결정계수 (R²)": r2,
    "가장 영향력이 큰 변수": most_influential_variable,
    "회귀 계수 목록": sorted_coef_list,
}

final_results




# Q1
# 가장 중요한 변수는 광고비_온라인 인것으로 나타났다.(광고비_TV와 극소한 차)
# 광고비_온라인이 1달러 증가할 때마다 브랜드 인지도 점수는 약 0.000495점 증가한다.
# Q2
# TV 광고와 온라인 광고는 극소한 차이를 보이므로 둘 다 효과적인 광고채널이다. (1위, 2위)
# TV 광고와 온라인 광고 동등하게 예산배분을 하는 것이 좋음.
# Q3
# 인플루언서 협업의 회귀계수 값이 거의 0에 수렴해서 브랜드 인지도 증가에 거의 영향을 주지 않는다고 봄.
# 인플루언서 협업의 중요도는 적은 것으로 보인다.
# 인플루언서 협업의 중요도가 적으므로 브랜드 인지도 점수를 90으로 만들기 위해서는
# 인플루언서 협업보다는 영향력이 큰 다른 변수들에 신경을 쓰는 것이 좋다.
# Q4
# SNS공유 횟수와 SNS 언급량은 브랜드 인지도 증가에 거의 기여를 하지 않는다고 볼 수 있음.(0에 수렴)
# 둘다 브랜드 인지도 증가에 거의 영향을 끼치지 않는다.
# 둘다 부정적, 긍정적 영향 거의 없음
# Q5
# 고객설문점수 80점, 웹사이트 방문자수 30,000명일때 예측된 브랜드 인지도 점수: 1.49
# 고객설문점수가 증가하면 브랜드 인지도 점수는 미미하게 떨어지나 영향이 거의 없다.(0에 가까운 음수)
# 고객설문점수를 85점으로 높이면 브랜드 인지도 점수는 미미하게 떨어짐. (0에 가까운 음수)

 

※ 다중 회귀분석에서 회귀계수가 음수인 경우, 해당 독립변수가 종속변수에 부정적인 영향을 미친다는 의미.

즉, 그 독립변수가 1단위 증가할 때 종속변수는 그만큼 줄어든다고 해석할 수 있음.