4-1. 단순선형회귀
한 개의 변수에 의한 결과를 예측
하나의 독립 변수(X) - 하나의 종속 변수(Y) 간의 관계를 직선으로 모델링하는 방법
회귀식
Y = β0 + β1X
(1차 함수) β0: 절편, β1: 기울기 = 회귀 계수 - - - y = b + ax 꼴 임
특징
독립 변수의 변화에 따라 종속 변수가 어떻게 변화하는지 설명 및 예측
데이터가 직선적 경향 따를 때 사용 = 데이터가 선형적이지 않은 경우, 적합하지 않음
간단, 해석 용이
사용 예시
하나의 독립 변수와 종속 변수의 관계 분석 및 예측
광고비(X) - 매출(Y)간 관계 분석 : 현재 광고비를 바탕으로 예상되는 매출 예측 가능
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, r2_score
예시 데이터 생성
np.random.seed(0)
X = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1)
데이터 분할 ▶ 학습 데이터 / 평가 데이터 구분
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
단순선형회귀 모델 생성 및 훈련
model = LinearRegression()
model.fit(X_train, y_train)
예측
y_pred = model.predict(X_test)
회귀 계수(▶기울기, coef) 및 절편(intercept) 출력
print("회귀 계수:", model.coef_) 출력 : [[2.9902591]]
print("절편:", model.intercept_) 출력 : [4.20634019]
모델 평가
▶ MSE : (가장 대중적) 오차를 수치화함 = 낮을수록 좋음!
▶ r2 : (r스퀘어) 이 회귀가 얼마나 설명력을 잘 갖추고 있나 = 높을수록 좋음!
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print("평균 제곱 오차(MSE):", mse) 출력 : 0.9177532469714291
print("결정 계수(R2):", r2) 출력 : 0.6521... 약 65% 낫밷
# 시각화
plt.scatter(X, y, color='blue')
plt.plot(X_test, y_pred, color='red', linewidth=2)
plt.title('linear regeression')
plt.xlabel('X : cost')
plt.ylabel('Y : sales')
plt.show()
4-2. 다중선형회귀
두 개 이상의 독립 변수(X1, X2, ... Xn) - 하나의 종속 변수(Y)간의 관계를 모델링, 결과 예측
회귀식
Y = β0 + β1X1 + β2X2 + ... + βnXn
평면이 됨
특징
여러 독립 변수의 변화를 고려하여 종속 변수를 설명하고 예측
= 종속변수에 영향을 미치는 여러 독립변수 있을 때 사용
= 여러 변수의 영향 동시 분석 가능
변수들 간 다중공선성 문제 발생 가능
다중공선성 multicollinearity |
회귀분석에서 독립 변수들 간에 높은 상관관계가 있는 경우 → 회귀분석 모델의 성능과 해석이 여러 가지 문제 일으킬 수 있음 - - - 독립 변수들 간 높은 상관관계 = 각 변수의 개별적 효과 분리 어려움 = 회귀 해석 어려움 - - - 다중공선성으로 실제 중요한 변수가 통계적으로 유의하지 않게 나올 수 있음 진단방법 1) 상관계수 >= 0.7 상관계수가 높은(약 0.7) 변수들이 있는지 확인 2) 분산 팽창 계수(VIF) >= 10 VIF값이 10이 높은지 확인하는 방법 해결방법 1) 높은 계수를 가진 변수 중 하나를 제거 2) 주성분 분석(PCA)과 같이 변수들을 효과적으로 줄이는 차원 분석 방법 적용해서 해결 |
사용 예시
두 개 이상의 독립 변수와 종속 변수와의 관계 분석 및 예측
다양한 광고비(TV, radio, newspaper)과 매출 간 관계 분석 = 현재 광고비를 바탕으로 매출 예상
예시 데이터 생성
data = {'TV': np.random.rand(100) * 100,
'Radio': np.random.rand(100) * 50,
'Newspaper': np.random.rand(100) * 30,
'Sales': np.random.rand(100) * 100}
df = pd.DataFrame(data)
독립 변수(X)와 종속 변수(Y) 설정
X = df[['TV', 'Radio', 'Newspaper']] ▶ 다중공선성 계산해야 하는데 생략됨
y = df['Sales']
데이터 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
다중선형회귀 모델 생성 및 훈련
model = LinearRegression()
model.fit(X_train, y_train)
예측
y_pred = model.predict(X_test)
회귀 계수 및 절편 출력
print("회귀 계수:", model.coef_) 출력 : [ -0.022... -0.045... 0.369... ]
print("절편:", model.intercept_) 출력 : 47.474...
모델 평가
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print("평균 제곱 오차(MSE):", mse) 출력 : 953.845..
print("결정 계수(R2):", r2) 출력 : -0.140...
4-3. 범주형 변수
범주형 변수의 경우 특별히 (더미 변수로) 변환해서 회귀 분석에 사용해야 함
범주형 변수 수치형 데이터가 아닌 주로 문자형 데이터로 이루어져 있는 변수
변환
- 순서가 있는 범주형 변수 → 순서가 잘 반영될 수 있게 각 문자를 임의의 숫자로 변환!
옷 사이즈(L, M,...) / 수능 등급(1, 2,...)
변환 XL = 3 / L = 2 / M =1 / S = 0 - 순서가 없는 범주형 변수
성별(남, 여) / 지역(부산, 대구, 대전,...)
→ 2개인 경우 임의의 숫자로 바로 변환
→ 3개 이상인 경우 pd.get_dummies(df, drop_first = True)
원-핫 인코딩(하나만 1이고 나머지는 0인 벡터) 변환 필수 = pandas의 get_dummies로 쉽게 구현 가능
변환 부산 = [1,0,0,0] / 대전 = [0,1,0,0] / 대구 = [0,0,1,0] / 광주 = [0,0,0,1]
사용 예시
범주형 변수 찾기 → 더미 변수로 변환 → 회귀 분석
1) 성별, 근무 경력 - 연봉 간의 관계
2) 성별 = 범주형 요인변수에 해당
3) 성별 = 더미 변수로 변환
4) 회귀 수행
예시 데이터 생성
data = {'Gender': ['Male', 'Female', 'Female', 'Male', 'Male'],
'Experience': [5, 7, 10, 3, 8],
'Salary': [50, 60, 65, 40, 55]}
df = pd.DataFrame(data)
범주형 변수 더미 변수로 변환
df = pd.get_dummies(df, drop_first=True)
▶ drop_first = True
>>> 범주형 변수 개수 중 1개를 빼는 것 = 어차피 마지막 1개 변수는 있으나 마나한 존재이기 때문
>>> female 빼고 male만 컬럼 생성
>>> 다중공선성을 완화해주기도 함
독립 변수(X)와 종속 변수(Y) 설정
X = df[['Experience', 'Gender_Male']]
y = df['Salary']
단순선형회귀 모델 생성 및 훈련
model = LinearRegression()
model.fit(X, y)
예측
y_pred = model.predict(X)
회귀 계수 및 절편 출력
print("회귀 계수:", model.coef_)
print("절편:", model.intercept_)
모델 평가
mse = mean_squared_error(y, y_pred)
r2 = r2_score(y, y_pred)
print("평균 제곱 오차(MSE):", mse)
print("결정 계수(R2):", r2)
4-4. 다항회귀, 스플라인 회귀
데이터가 훨씬 복잡할 때 사용
다항회귀 polynomial regression | 스플라인 회귀 spline regression |
독립 변수와 종속 변수 간의 관계가 선형이 아닐 때 사용 = 데이터가 곡선적 경향을 따를 때 사용 = 비선형 관계 모델링 가능 독립 변수의 다항식을 사용해 종속 변수를 예측 = 고차 다항식의 경우 *과적합(overfitting) 위험이 있음 |
독립 변수의 구간별로 다른 회귀식을 적용, 복잡한 관계를 모델링 = 데이터가 부분적(=국부적)으로 다른 패턴을 보일 때 사용 = 구간마다 다른 다항식을 사용, 전체적으로 매끄러운 곡선 생성 = 복잡한 비선형 관계 모델링 가능 적절한 매듭점(knots) 선택 중요 |
* 과적합 : 경향성 파악이 목적 but 오버해서 관계를 다 선으로 그어버림
- 예컨대 아래 표는 degree 2인 2차식인데(포물선 나와야 함) 근데 직선이 나와버리면 과적합인 것 = 너무 일반화 한 것
사용 예시
독립 변수 - 종속 변수 관계 : 비선형일 때 사용
from sklearn.preprocessing import PolynomialFeatures
예시 데이터 생성
np.random.seed(0)
X = 2 - 3 * np.random.normal(0, 1, 100)
y = X - 2 * (X ** 2) + np.random.normal(-3, 3, 100) ▶ 2차식
X = X[:, np.newaxis]
# 다항 회귀 (2차)
▶ PolynomialFeatures를 이용해 차수를 적용해야 한다는 점 외 나머지는 선형 회귀랑 동일함
polynomial_features = PolynomialFeatures(degree=2)
X_poly = polynomial_features.fit_transform(X)
model = LinearRegression()
model.fit(X_poly, y)
y_poly_pred = model.predict(X_poly)
# 모델 평가
mse = mean_squared_error(y, y_poly_pred)
r2 = r2_score(y, y_poly_pred)
print("평균 제곱 오차(MSE):", mse) 평균 제곱 오차(MSE): 9.447441952450275
print("결정 계수(R2):", r2) 결정 계수(R2): 0.9898873384220381
# 시각화
plt.scatter(X, y, s=10)
# 정렬된 X 값에 따른 y 값 예측
sorted_zip = sorted(zip(X, y_poly_pred))
X, y_poly_pred = zip(*sorted_zip)
plt.plot(X, y_poly_pred, color='m')
plt.title('polynomial regerssion')
plt.xlabel('area')
plt.ylabel('price')
plt.show()
연습문제
1) 단순선형회귀 모델에서 독립변수 X와 종속변수 Y의 관계를 설명하는 회귀 직선의 방정식은 무엇인가요?
해설 : 1) 단순선형회귀 모델은 단순한 직선을 긋기 때문에 1번 방정식의 형태로 X와 Y관계를 설명 (1차 함수)
2) 다중선형회귀 모델에서 다음 중 올바른 회귀 방정식을 고르세요.
해설 : 1) 다중선형회귀는 단순선형회귀와는 다르게 여러개의 독립변수와 Y의 관계를 설명하기 때문에 X와 그 계수가 여러개 있어야 하며 2차식이나 3차식과 같은 고차항은 존재하지 않아 평면을 만들게 되는 방정식
3) 다항회귀 모델에서 독립변수가 한 개이고 X와 Y의 관계가 비선형(2차)일 때, 회귀 방정식의 형태로 올바른 것을 고르세요.
해설 : 1) 2차원 비선형관계를 가지고 있기 때문에 2차식(X제곱) 형태를 가지고 있어야 하며 독립변수가 한 개이기 때문에 각 차수(1차, 2차)마다 1개의 X를 가지고 있음. 2번의 경우, 2개의 독립변수를 가진 2차식임
4. 스플라인 회귀는 주로 어떤 문제를 해결하기 위해 사용되나요?
1) 변수 간의 상관관계를 분석하기 위해
2) 데이터의 복잡한 비선형적 관계를 모델링하기 위해
3) 두 그룹 간의 평균 차이를 비교하기 위해
4) 범주형 변수를 처리하기 위해
해설 : 2) 스플라인 회귀는 데이터의 복잡한 비선형적 관계(특히, 시간에 따라 비선형관계가 계속 바뀌는)를 모델링하기 위해 사용됩니다. 이를 통해 독립변수와 종속변수 간의 비선형적 패턴을 더 잘 설명할 수 있습니다.
'통계' 카테고리의 다른 글
[통계학 기초] 6. 가설검정의 주의점 (0) | 2025.06.27 |
---|---|
[통계학 기초] 5. 상관관계 (0) | 2025.06.27 |
[통계학 기초] 3. 유의성 검정 (6) | 2025.06.26 |
[통계학 기초] 2. 데이터의 분포 (12) | 2025.06.25 |
[통계학 기초] 1. 데이터 분석과 통계 (0) | 2025.06.24 |