회귀가 무엇인지 대해 이해하기
다양한 회귀 종류에 대해서 설명할 수 있고 특징 이해하기
사람의 키!? 세대를 거쳐갈수록 조금씩 차이는 있겠지만 결국엔 평균적인 키로 돌아오려고 함!
사람의 키가 결국 돌아오는 경향이 있더라!!
4-1. 단순선형회귀
한개의 변수에 의한 결과를 예측
- 하나의 독립 변수(x)와 하나의 종속 변수(y) 간의 관계를 직선으로 모델링 하는 방법

➡️ 우리가 가지고 있지 않은 데이터까지도 예측이 가능해짐!
회귀식
- Y = β0 + β1X, 여기서 β0는 절편, β1는 기울기 (Like 일차방정식 y=ax + b)
- 결국엔 a와 b의 값을 찾으면 되는 것 👀
- 특징
- 독립변수 → 종속변수 변화 설명 예측
- 직선적 경향
- 간단하고 해석 용이
- 데이터가 선형적이지 않은 경우 비적합
단순선형회귀는 언제 사용해?
하나의 독립변수와 종속변수와의 관계를 분석 및 예측할 때 사용
- 광고비(x)와 매출(y) 간의 관계 분석
- 현재의 광고비를 바탕으로 예상되는 매출을 예측 가능
- 파이썬 실습 ↓
# 예시 데이터 생성
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)
# 회귀 계수 및 절편 출력
print("회귀 계수:", model.coef_)
print("절편:", model.intercept_)
# 모델 평가
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print("평균 제곱 오차(MSE):", mse)
print("결정 계수(R2):", r2)
# 시각화
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()
회귀 계수: [[2.9902591]]
절편: [4.20634019]
평균 제곱 오차(MSE): 0.9177532469714293
결정 계수(R2): 0.6521157503858555

4-2. 다중선형회귀
두 개 이상의 변수에 의한 결과를 예측
- 두 개 이상의 독립 변수(x1, x2 ... )와 하나의 종속 변수(y) 간의 관계를 모델링.

➡️ 변수가 여러개인 회귀를 할 때 다중선형회귀!!
회귀식
- Y = β0 + β1X1 + β2X2 + ... + βnXn
- 여러 독립 변수의 변화 → 종속 변수를 설명하고 예측
- 변수들 간의 다중공선성 문제가 발생할 수 있음
▼ 다중공선성이란?
독립 변수들 간에 높은 상관관계가 있는 경우를 말함!! 좋지 않은 케이스 😩
왜 문제가 될까?
변수들 끼리 이미 관계를 가지고 있으면, 서로 간섭을 일으킬 수 있음
모델의 성능과 해석에 여러 가지 문제
- 각 변수의 개별적인 효과를 분리해내기 어려워..
- 실제로 중요한 변수가 통계적으로 유의하지 않게 나타날 수 있음
진단은 어떻게 해?
- 상관계수를 계산하여 상관계수가 높은(약 0.7) 변수들이 있는지 확인하는 방법
- 팽창 계수(VIF) 계산하여 값이(10 이상) 높은지 확인하는 방법
해결법은?
- 높은 계수를 가진 변수 중 하나를 제거
- 변수들을 효과적으로 줄이는 차원 분석 방법 중 하나인 주성분 분석(PCA) 적용
다중선형회귀는 언제 사용해?
두 개 이상의 독립 변수와 종속 변수와의 관계를 분석 및 예측
- 다양한 광고비(TV, Radio, Newspaper)과 매출 간의 관계 분석.
- 현재의 광고비(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_)
print("절편:", model.intercept_)
# 모델 평가
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print("평균 제곱 오차(MSE):", mse)
print("결정 계수(R2):", r2)
회귀 계수: [ 0.03643284 -0.28447836 0.20222485]
절편: 53.86789996849347
평균 제곱 오차(MSE): 932.4675361205491
결정 계수(R2): -0.38007233278777464
4-3. 범주형 변수
회귀에서 범주형 변수의 경우 특별히 변환을 해줘야 함!!
- 수치형 데이터가 아닌 주로 문자형 데이터로 이루어져 있는 변수가 범주형 변수
- 종류
- 순서가 있는 범주형 변수
- 옷의 사이즈, 수능 등급과 같이 범주지만 순서가 있는 변수
- 1등급 → 1, 2등급 → 2 처럼 순서가 잘 반영되도록 숫자로 변환
- 순서가 없는 범주형 변수
- 성별(남, 여), 지역(부산, 대구, 서울, 대전,,,, 등)과 같이 순서가 없는 변수
- 2개 박에 없는 경우 상관없지만,
- 3개 이상인 경우엔 무조건 원-핫 인코딩 변환 해야함!! 판다스의 get_dummies를 활용
- 예: 부산 = [1,0,0,0], 대구 = [0,1,0,0] ... 이런 식으로!
범주형 변수는 어떻게 사용할까?
범주형 변수를 찾고 더미 변수로 변환한 후 회귀 분석 수행
- 성별, 근무 경력과 연봉 간의 관계
- 성별이 범주형 변수에 해당 → 해당 변수를 더미 변수로 변환 → 회귀 수행
- 파이썬 실습
# 예시 데이터 생성
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)
# 독립 변수(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)
회귀 계수: [ 2.57281553 -6.01941748]
절편: 40.63106796116506
평균 제곱 오차(MSE): 3.1067961165048588
결정 계수(R2): 0.9580162686958803
4-4. 다항회귀, 스플라인 회귀
데이터가 훨씬 복잡할 때 사용하는 회귀!
- 다항회귀 : 독립변수와 종속변수 간의 관계가 선형이 아닐 때 사용. 독립변수의 다항식을 사용하여 종속변수를 예측.
- 곡선적인 경향을 따를 때
- 비선형 관계를 모델링할 수 있음
- 고차 다항식의 경우 과적합(overfitting) 위험이 있음

- 스플라인 회귀
- 독립변수의 구간별로 다른 회귀식을 적용, 복잡한 관계를 모델링
- 전체적으로 매끄러운 곡선 생성
- 데이터가 국부적으로 다른 패턴 보일 때
- 복잡한 비선형 관계를 유연하게 모델링
- 적절한 매듭점(knots)의 선택이 중요

다항회귀는 어떨 때 사용해?
독립변수와 종속변수의 관계가 비선형 관계일 때 사용
- 주택 가격 예측(면적과 가격 간의 비선형 관계)
- 파이썬 실습
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)
X = X[:, np.newaxis]
# 다항 회귀 (2차)
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)
print("결정 계수(R2):", r2)
# 시각화
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()
평균 제곱 오차(MSE): 9.447441952450275
결정 계수(R2): 0.9898873384220381

끝.
'통계 (Statistics)' 카테고리의 다른 글
| [통계/세션] 3회차 (이론)- 가설검정 & 상관관계 (3) | 2025.10.01 |
|---|---|
| [통계/인강] 챕터3 - 유의성 검정(A/B 테스트) | 가설검정 | t-검정 | 다중검정 | 카이제곱검정 | 제 1종 오류와 제 2종 오류 (0) | 2025.09.29 |
| [통계/실습] 세션 2회차(실습) - t-검정 : 단일표본 & 독립표본 & 대응표본 (0) | 2025.09.25 |