본문 바로가기

부트캠프/멀티캠퍼스_퍼포먼스 마케팅과 데이터 분석

[멀티캠퍼스 부트캠프 7주차(2)] 데이터 분석 심화_선형회귀 모델

데이터 분석 심화_선형회귀 모델



선형회귀 모델

1. 변수의 이해

-관심 변수(Interest Variable): 예측하고자 하는 대상(종속 / 타깃 / 출력 변수)

-설명 변수(Explanatory Variable): 관심변수에 영향을 미치는 요인(독립 / 입력변수 / 피쳐)

 

 

2. 선형회귀 모델의 이해

1) 선형회귀 모델이란?

 -독립변수(x)와 종속변수(y) 사이의 직선적인 관계를 일차 함수 형태로 표현한 모델

 -데이터를 가장 잘 대변하는 추세선을 그리는 과정(적합, Fit)

 

2) 단순 선형회귀(Simple Linear Regression)

 -수치형 관심변수를 수치형 설명변수의 정비례로 설명하는 모델

      Y = a + bX

 -a(절편, constant): x가 0일 때 y의 값

 -b(기울기, slope): x가 1단위 증가할 때 y가 변화하는 양

 

3) 다중 선형회귀(Multiple Linear Regression)

 -여러 개의 설명변수(x_1, x_2, ...)를 사용하여 종속변수를 설명하는 모델

     y = b0 + b1*x1 + b2*x2 + ... + bp*xp + ε

 ①b_i(회귀계수)

   -각 변수가 결과값에 주는 영향력

   -회귀계수에 대한 t-검정 → 해당 변수가 정말로 종속변수에 영향을 주는지 확인

  • 귀무가설: b_i = 0(변수 x_i는 y와 아무 상관이 없다)
  • 대립가설: b_i ≠ 0(변수 x_i는 y와 연관성이 있다)

 ②ε(오차항)

   -모델이 설명하지 못하는 나머지 부분

   -오차항에 대항 3대 가정(모델의 신뢰도 확보를 위함)

  • 정규성: 오차(error)는 정규분포를 따름
  • 등분산성: 독립변수의 값과 상관없이 오차의 분산(σ^2) 일정
  • 독립성: 오차들끼리는 서로 아무런 상관 x

 

3. 선형회귀 통계 해석

1) 결정계수(R-squared)

 -모델의 데이터 설명력(에러를 모델이 얼마나 개선했는가)

 -클수록 좋은 모델(0.8 이상이면 충분히 큰 모델)

 -Adj.(Adjusted R-square, 수정된 결정계수): 독립변수의 개수(p)와 표본의 크기(n)를 고려하여 계산한 값

   → R2는 독립변수의 개수가 늘어가면 해당 변수가 실제 결과와 상관이 있든 없든 유지되거나 증가하지만, 

        Adj R2는 변수를 추가했을 때 모델의 설명력이 크게 향상되지 않는다면, 오히려 값이 감소할 수 있음

 

2) 회귀계수(Coefficient)

 -회귀선의 기울기

 -독립변수가 한 단위 변화함에 따라 종속변수에 미치는 영향력 크기

 -특정 독립변수의 회귀계수가 크면, 독립변수 값이 조금만 커져도 종속 변수가 크게 변함

 

3) 유의확률(p-value)

 -신뢰할 수 있는 결과인가?에 대한 척도

 -일반적으로 0.05 미만이면 해당 변수가 종속변수와 유의한 관계가 있다고 판단

 


 

0. 라이브러리 설치 및 불러오기

-sklearn.linear_model.LinearRegression: 데이터를 학습시켜 새로운 값에 대한 예측치를 내놓는 모델을 만듦

-statsmodels.api: 통계적 해석을 위한 리포트 제공

-sklearn.metrics.r2_score: 결정계수(R-square) 값 계산

import pandas as pd
import numpy as np

# 그래프 라이브러리
import matplotlib.pyplot as plt
import seaborn as sns

# 회귀 라이브러리
from sklearn.linear_model import LinearRegression
import statsmodels.api as sm
from sklearn.metrics import r2_score

# 워닝 무시
import warnings
warnings.filterwarnings('ignore')

 

 

1. Scikit-learn을 사용한 선형회귀

-보험료(charges) 예측 선형회귀 모델 만들기

1) 변수 설정 및 모델 선언

# X : 설명변수/독립변수, y: 관심변수/종속변수
X = df_ins[ ['age', 'bmi', 'children', 'period'] ]
# 수치형 변수만 선택

y = df_ins['charges']

 

 -LinearRegression(): 선형회귀를 이용하여 데이터 분석

 -fit_intercept: 선형회귀식 y = ax + b에서 b 포함 여부

  • True(기본값):  절편 b를 자동으로 계산(그래프가 원점(0, 0)을 지날 필요가 없을 때 사용)
  • False: 절편을 0으로 고정(그래프가 반드시 원점(0,0)을 지나도록)
model = LinearRegression(fit_intercept=True)  # 상수항 추가함으로써 유연성 부여

 

2) 모델 적합 및 보험료 예측

 -.fit(독립변수, 종속변수): 독립변수와 종속변수 사이의 관계를 가장 잘 설명하는 최적의 기울기와 절편 계산

# 선형회귀 모델 적합(fit)
model.fit(X, y)

 -.intercept_: 절편

 -.coef_: 회귀계수

print(model.intercept_)  # 절편(상수항)
# >>> -7959.16107831167
print(model.coef_)       # 회귀계수
# >>> [233.47906496 337.36480124 555.55931003 209.69390419]
# → y = 233.5*x1 + 337.4*x2 + 555.5*x3 + 209.7*x4 -7959.2

 -.predict([리스트 형태]): 학습을 통해 찾아낸 회귀 방정식에 새로운 데이터 대입하여 결과값 추론

# 보험료 예측
print(model.predict([[25, 33, 2, 4.5]]))
# >>> [11065.59517576]

 

3) 모델 성능 평가

 -결정계수(R-squre) 계산

 -.score(독립변수, 종속변수): 모델 내부에서 예측값을 스스로 만든 뒤 실제 정답과 비교하여 점수 출력

 -r2_score(실제값, 예측값): 이미 계산되어 나온 실제값과 비교(.predict() 선행 必)

y_pred = model.predict(X)  # 모델 예측값

print(r2_score(y, y_pred))  # >>> 0.1202530351569705
print(model.score(X, y))  # >>> 0.1202530351569705

 

 

2. 변수 선택과 모델 성능

1) 범주형 변수의 수치화

 -pd.get_dummies(data=데이터프레임, 옵션): 범주형 변수를 0과 1로만 이루어진 여러 개의 새로운 열로 변환

 -원-핫 인코딩(One-Hot Encoding): 범주형 데이터의 각 카테고리를 새로운 컬럼으로 만든 후 해당 데이터는 1, 해당 x 데이터는 0

 -dtype: 데이터 타입 지정

 -drop_first: 생성된 더미 변수 중 첫 번째 카테고리 열 삭제

   → 다중공선성 방지(ex. 성별_여성이 0이면 무조건 남성이므로, 한쪽 정보만 있어도 충분)

df_dummies = pd.get_dummies(data=df_ins, dtype='int', drop_first=True)
df_dummies.head(5)

 

2) 변수 재설정 및 모델 적합 

-.drop(columns/index=컬럼명/인덱스 번호): 데이터프레임에서 원하지 않는 행/열 삭제

# 모든 컬럼 사용하여 변수 재설정
X = df_dummies.drop(columns=['charges'])  
y = df_dummies['charges']
# 선형회귀 모델 적합(fit)
linear_model = LinearRegression(fit_intercept=True)
linear_model.fit(X, y)
print(linear_model.intercept_)
print(linear_model.coef_)
# >>> -12068.229473302756
#     [  250.88802329   345.84717412   463.55011366    71.14446418
#       -210.97951778 22730.98447422  -396.30451611 -1750.58599023
#      -1008.13753106    77.00625202   228.35874577]
# R2 score
y_pred = linear_model.predict(X)
r2_score(y, y_pred)
# >>> 0.716499172403353

 

3) statsmodels를 사용한 선형회귀

 -sm.add_constant(독립변수): 기존 데이터의 맨 앞에 값이 전부 1로 채워진 상수항 추가

X_sm = sm.add_constant(X)   # 상수항 추가(모델을 유연하게 만들어줌)

 -sm.OLS(종속변수, 독립변수): 최소자승법(Ordinary Least Squares)을 통해 직선 추정

  ※.fit(독립변수, 종속변수)와는 순서가 반대

 -.summary(): 모델의 설명력돠 변수의 유의성을 보여주는 종합 성적표

# 선형회귀 모델 적합(fit)
ls = sm.OLS(y, X_sm).fit()
ls.summary()

통계적 가정(독립성, 등분산성)이 지켜졌다는 전제 하의 표준적인 분석 결과

 -R-squared 값이 0.716으로 나이, bmi 등의 정보가 전체 보험료 변동의 약 71.6%를 설명함

 -age, bmi, children 모두 p-value가 0.000~0.001로 매우 낮음 → 보험료에 확실한 영향을 줌

 -smoker_yes의 p-value는 0.000이며, coef가 2.273e+04(약 22,703)로 흡연자가 비흡연자보다 보험료를 훨씬 많이 냄

 -region_southeast, resion_southwest처럼 특정 지역 거주 여부도 보험료에 영향을 줌

 


 

#부트캠프후기 #멀티캠퍼스부트캠프 # 데이터마케팅부트캠프