데이터 분석 심화_선형회귀 모델
선형회귀 모델
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처럼 특정 지역 거주 여부도 보험료에 영향을 줌
#부트캠프후기 #멀티캠퍼스부트캠프 # 데이터마케팅부트캠프
'부트캠프 > 멀티캠퍼스_퍼포먼스 마케팅과 데이터 분석' 카테고리의 다른 글
| [멀티캠퍼스 부트캠프 8주차(2)] 데이터 분석 심화_머신러닝 실습 (0) | 2026.03.11 |
|---|---|
| [멀티캠퍼스 부트캠프 8주차] 데이터 분석 심화_머신러닝 (0) | 2026.03.09 |
| [멀티캠퍼스 부트캠프 7주차(1)] 데이터 분석 심화_검정의 이해 (0) | 2026.02.20 |
| [멀티캠퍼스 부트캠프 6주차(2)] 데이터 분석 기본_시각화 (0) | 2026.02.12 |
| [멀티캠퍼스 부트캠프 6주차(1)] 데이터 분석 기본_웹 크롤링(selenium) (0) | 2026.02.09 |