통계 공부 | 회귀(regression), 파이썬으로 구하는 방법

2025. 1. 10. 00:16·Python

단순선형회귀

  • 한 개의 변수에 의한 결과를 예측
  • 하나의 독립 변수(X)와 하나의 종속 변수(Y) 간의 관계를 직선으로 모델링하는 방법
  • 데이터가 직선적 경향을 따를 때 사용, 간단하고 해석이 용이함
  • `회귀식`
    • Y = β0 + β1X
    • 여기서 β0는 절편, β1는 기울기
    • 중학교 때 배웠던 1차 함수를 생각하면 이해하기 쉬움! y = ax + b 여기서 b는 y절편, a는 기울기.
    • β0, β1만 알면 x, y가 무엇이든 구할 수 있는 것
  • 독립 변수(X)의 변화에 따라 종속 변수(Y)가 어떻게 변화하는지 설명하고 예측
    • ex. 광고비(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)

# 회귀 계수 및 절편 출력
print("회귀 계수:", model.coef_)
print("절편:", model.intercept_)

# 모델 평가 - 가장 많이 쓰는 평가 방법이 mse로 오차를 수치화한 것임. 낮을 수록 좋음
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()

다중선형회귀

  • 두 개 이상의 변수에 의한 결과를 예측
  • 종속변수에 영향을 미치는 여러 독립변수가 있을 때 사용, 여러 독립 변수의 변화를 고려하여 종속 변수를 설명하고 예측
  • 변수들 간의 다중공선성 문제가 발생할 수 있음
    • `다중공선성` : 회귀분석에서 독립 변수들 간에 높은 상관관계가 있는 경우
    • 문제 : 독립 변수들이 서로 강하게 상관되어 있으면, 각 변수의 개별적인 효과를 분리하기 어려워 회귀의 해석이 어려움
    • 진단 방법 : 상관계수를 계산하여 상관계수가 높은(약 0.7) 변수들이 있는지 확인
    • 가장 간단한 해결 방법 : 높은 계수를 가진 변수 중 하나를 제거
  • `회귀식`
    • Y = β0 + β1X1 + β2X2 + ... + βnXn
  • 두 개 이상의 독립 변수와 종속변수와의 관계를 분석 및 예측
    • ex. 다양한 광고비(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)

범주형 변수

  • 수치형 데이터가 아닌 주로 문자형 데이터로 이루어져 있는 변수
  • 회귀에서 범주형 변수의 경우 특별히 변환을 해주어야 함
  • 범주형 변수 종류
    • 순서가 있는 범주형 변수
      • ex. 옷의 사이즈(S,M,L..) 수능 등급(1~9등급)
      • 각 문자를 임의의 숫자로 변환해도 됨
    • 순서가 없는 범주형 변수
      • ex. 성별, 지역
      • 2개밖에 없으면 임의의 숫자로 변환해도 됨
      • 3개 이상이면 무조건 원-핫 인코딩 변환해야 함(하나만 1이고, 나머지는 0인 벡터) → `pandas의 get_dumies
  • 범주형 변수를 찾고 더미 변수로 변환한 후 회귀 분석 수행
    • ex. 성별, 근무 경력과 연봉 간의 관계 (성별이 요인 변수에 해당하므로 더미 변수로 변환 후 회귀 수행)
# 예시 데이터 생성
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)

다항회귀, 스플라인 회귀

  • 데이터가 훨씬 복잡할 때 사용하는 회귀!

스플라인 회귀

  • 독립 변수의 구간별로 다른 회귀식을 적용하여 복잡한 관계를 모델링
  • 데이터가 국부적으로 다른 패턴을 보일 때 사용
  • 구간마다 회귀식을 다르게 해서(복잡) 전체적으로 매끄러운 곡선을 생성
  • 복잡한 비선형 관계를 유연하게 모델링할 수 있음

다항회귀

  • 독립 변수와 종속 변수 간의 관계가 선형이 아닐 때 사용. 독립 변수의 다항식을 사용하여 종속 변수를 예측
  • 데이터가 곡선적 경향을 따를 때 사용
  • 고차 다항식의 경우 과적합(overfitting) 위험이 있음
  • 독립변수와 종속변수의 관계가 비선형 관계
    • ex. 주택 가격 예측(면적과 가격 간의 비선형 관계)
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()
'Python' 카테고리의 다른 글
  • 통계 공부 | 가설검정의 주의점
  • 통계 공부 | 상관관계, 파이썬으로 구하는 방법
  • Python 실습 | x만큼 간격이 있는 n개의 숫자
  • 통계 공부 | 유의성 검정, 파이썬으로 구하는 방법
초담
초담
4년차 마케터입니다
  • 초담
    그로스마케터의 기록
    초담
  • 전체
    오늘
    어제
  • 글쓰기 관리
    • 분류 전체보기 (117)
      • Data Analytics Project (3)
      • SQL (55)
      • Python (43)
      • GA4 (0)
      • Tableau (8)
      • 아티클 스터디 (7)
  • 인기 글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
초담
통계 공부 | 회귀(regression), 파이썬으로 구하는 방법
상단으로

티스토리툴바