🤖

본 콘텐츠의 이미지 및 내용은 AI로 생성되었습니다.

⚠️

본 콘텐츠의 이미지 및 내용을 무단으로 복제, 배포, 수정하여 사용할 경우 저작권법에 의해 법적 제재를 받을 수 있습니다.

이미지 로딩 중...

선형 회귀 모델 완벽 가이드 - 슬라이드 1/8
A

AI Generated

2025. 12. 17. · 7 Views

선형 회귀 모델 완벽 가이드

데이터 분석과 머신러닝의 기본인 선형 회귀 모델을 처음부터 차근차근 배워봅니다. 수학적 원리부터 scikit-learn 활용까지, 실무에서 바로 쓸 수 있는 예측 모델 구축 방법을 알려드립니다.


목차

  1. 선형_회귀의_원리
  2. 단순_선형_회귀_구현
  3. 다중_선형_회귀_구현
  4. LinearRegression_임포트
  5. fit과_predict_사용
  6. 회귀_계수_해석하기
  7. 절편과_기울기_이해

1. 선형 회귀의 원리

어느 날 김개발 씨가 회사에서 첫 데이터 분석 과제를 받았습니다. "광고비와 매출 데이터로 다음 분기 매출을 예측해 보세요." 엑셀로 그래프를 그려보니 대충 직선 형태인데, 어떻게 예측해야 할까요?

선형 회귀는 데이터 간의 관계를 직선으로 표현하여 예측하는 방법입니다. 마치 산점도에 자를 대고 가장 잘 맞는 직선을 그리는 것과 같습니다.

x값이 주어지면 y값을 예측할 수 있고, 이 직선의 기울기와 절편만 알면 미래 값도 추정할 수 있습니다.

다음 코드를 살펴봅시다.

import numpy as np
import matplotlib.pyplot as plt

# 광고비(x)와 매출(y) 데이터
x = np.array([1, 2, 3, 4, 5])
y = np.array([2, 4, 5, 4, 6])

# 평균 계산
x_mean = np.mean(x)
y_mean = np.mean(y)

# 기울기(m)와 절편(b) 계산
m = np.sum((x - x_mean) * (y - y_mean)) / np.sum((x - x_mean) ** 2)
b = y_mean - m * x_mean

print(f"기울기: {m:.2f}, 절편: {b:.2f}")

김개발 씨는 입사 6개월 차 주니어 개발자입니다. 오늘 마케팅 팀장님께서 급하게 부탁하셨습니다.

"지난 5개월 광고비와 매출 데이터가 있는데, 다음 달 광고비를 500만 원 쓰면 매출이 얼마나 나올까요?" 김개발 씨는 엑셀에 데이터를 펼쳐놓고 그래프를 그려봤습니다. 점들이 대략 일직선 모양으로 올라가는 게 보입니다.

"이 직선만 정확히 그릴 수 있다면 예측할 수 있을 텐데..." 바로 이때 선배 개발자 박시니어 씨가 지나가다가 모니터를 힐끗 보더니 말했습니다. "아, 선형 회귀 쓰면 되겠네요." 선형 회귀란 무엇일까요? 쉽게 비유하자면, 선형 회귀는 마치 학생들의 키와 몸무게 관계를 하나의 직선으로 나타내는 것과 같습니다.

키가 클수록 몸무게도 증가하는 경향이 있죠. 이 관계를 y = mx + b라는 간단한 직선 방정식으로 표현하면, 새로운 학생의 키만 알아도 대략적인 몸무게를 예측할 수 있습니다.

선형 회귀도 똑같은 원리입니다. 광고비(x)와 매출(y)의 관계를 직선 하나로 요약하는 것입니다.

왜 선형 회귀가 필요할까요? 선형 회귀가 없던 시절에는 어땠을까요? 개발자들은 데이터를 보고 감으로 예측하거나, 복잡한 통계 공식을 직접 계산해야 했습니다.

데이터가 100개, 1000개로 늘어나면 손으로 계산하기는 불가능했습니다. 더 큰 문제는 예측의 근거를 명확히 설명하기 어렵다는 점이었습니다.

선형 회귀의 핵심 원리 선형 회귀의 핵심은 최소제곱법입니다. 데이터 점들과 직선 사이의 거리를 최소화하는 직선을 찾는 것이죠.

마치 여러 개의 핀이 박힌 판자에 고무줄을 팽팽하게 당겨서 가장 잘 맞는 직선을 만드는 것과 비슷합니다. 수식으로 표현하면 y = mx + b입니다.

여기서 m은 기울기이고, b는 절편입니다. 기울기는 "x가 1 증가할 때 y가 얼마나 증가하는가"를 나타냅니다.

절편은 "x가 0일 때 y의 값"입니다. 코드 분석 위의 코드를 한 줄씩 살펴보겠습니다.

먼저 x와 y 배열에 실제 데이터를 담습니다. x는 광고비, y는 매출이라고 생각하면 됩니다.

그 다음 각각의 평균을 계산합니다. 이 평균값들이 직선의 중심점이 됩니다.

기울기 m을 계산하는 공식은 조금 복잡해 보이지만, 사실 "x와 y가 함께 변하는 정도를 x의 변동성으로 나눈 값"입니다. 이렇게 하면 가장 잘 맞는 기울기가 나옵니다.

절편 b는 평균 y 값에서 "기울기 곱하기 평균 x"를 뺀 값입니다. 이렇게 하면 직선이 데이터의 중심을 정확히 통과하게 됩니다.

실무 활용 사례 실제 현업에서는 어떻게 활용할까요? 예를 들어 부동산 앱을 개발한다고 가정해봅시다.

평수와 매매가 데이터가 수천 건 있습니다. 선형 회귀를 사용하면 "이 지역에서 25평 아파트는 대략 얼마일까?"를 즉시 예측할 수 있습니다.

쿠팡이나 네이버 같은 대형 플랫폼에서도 초기 예측 모델로 선형 회귀를 자주 사용합니다. 주의사항 하지만 주의할 점도 있습니다.

초보 개발자들이 흔히 하는 실수 중 하나는 모든 데이터에 선형 회귀를 적용하려는 것입니다. 데이터가 직선 형태가 아니라 곡선이나 복잡한 패턴을 보인다면 선형 회귀는 잘 맞지 않습니다.

따라서 먼저 데이터를 시각화해서 대략적인 패턴을 확인해야 합니다. 정리 다시 김개발 씨의 이야기로 돌아가 봅시다.

박시니어 씨의 설명을 들은 김개발 씨는 고개를 끄덕였습니다. "아, 그래서 직선으로 예측하는 거군요!" 선형 회귀를 제대로 이해하면 데이터 분석의 첫걸음을 뗄 수 있습니다.

여러분도 오늘 배운 내용을 실제 데이터에 적용해 보세요.

실전 팁

💡 - 데이터를 분석하기 전에 항상 산점도를 그려서 선형 관계가 있는지 확인하세요

  • 기울기 값이 양수면 비례 관계, 음수면 반비례 관계입니다
  • NumPy의 polyfit 함수를 사용하면 더 간단하게 계산할 수 있습니다

2. 단순 선형 회귀 구현

김개발 씨가 선형 회귀의 원리를 이해하고 나니, 박시니어 씨가 물었습니다. "그럼 이제 직접 클래스로 만들어볼까요?" 라이브러리 없이 밑바닥부터 구현해보면 원리를 확실히 이해할 수 있다고 합니다.

단순 선형 회귀는 하나의 독립변수 x로 종속변수 y를 예측하는 모델입니다. 직접 클래스를 만들어 fit 메서드로 학습하고, predict 메서드로 예측하는 구조를 구현할 수 있습니다.

이렇게 하면 scikit-learn 같은 라이브러리의 내부 동작 원리도 이해하게 됩니다.

다음 코드를 살펴봅시다.

class SimpleLinearRegression:
    def __init__(self):
        self.slope = None  # 기울기
        self.intercept = None  # 절편

    def fit(self, x, y):
        # 평균 계산
        x_mean = np.mean(x)
        y_mean = np.mean(y)

        # 기울기와 절편 계산
        self.slope = np.sum((x - x_mean) * (y - y_mean)) / np.sum((x - x_mean) ** 2)
        self.intercept = y_mean - self.slope * x_mean

    def predict(self, x):
        return self.slope * x + self.intercept

박시니어 씨가 새 파이썬 파일을 열어주며 말했습니다. "라이브러리를 쓰면 편하지만, 한 번쯤은 직접 만들어봐야 진짜 이해가 됩니다." 김개발 씨는 고개를 끄덕이며 키보드를 잡았습니다.

"어떻게 만들어야 하죠?" 클래스 구조 설계 먼저 왜 클래스로 만들까요? 마치 자동차 설계도를 만드는 것과 같습니다.

자동차는 엔진을 시동 걸고(fit), 운전할 수 있어야(predict) 하죠. 선형 회귀 모델도 마찬가지입니다.

데이터로 학습하는 기능과 예측하는 기능을 하나의 객체에 담으면 재사용하기 쉽고 코드도 깔끔해집니다. 초기화 메서드 __init__ 메서드에서는 기울기와 절편을 None으로 초기화합니다.

아직 학습하지 않은 상태라는 뜻입니다. 마치 공장에서 막 출고된 자동차처럼, 아직 연료를 넣지 않은 상태인 것이죠.

fit 메서드 - 학습의 핵심 fit 메서드는 학습을 담당합니다. 데이터 x와 y를 받아서 최적의 기울기와 절편을 계산합니다.

먼저 x와 y의 평균을 구합니다. 이 평균점이 직선의 중심이 됩니다.

그 다음 앞에서 배운 최소제곱법 공식을 적용합니다. x와 y의 공분산을 x의 분산으로 나누면 기울기가 나옵니다.

절편은 간단합니다. y 평균에서 "기울기 곱하기 x 평균"을 빼면 됩니다.

이렇게 계산된 기울기와 절편이 self.slope와 self.intercept에 저장됩니다. predict 메서드 - 예측의 순간 predict 메서드는 새로운 x 값을 받아서 y를 예측합니다.

공식은 아주 간단합니다. y = slope * x + intercept입니다.

만약 광고비 500만 원을 넣으면, 매출 = 기울기 * 500 + 절편으로 계산됩니다. 마치 자판기에 돈을 넣으면 음료수가 나오는 것처럼 간단하죠.

실제 사용 예시 이제 이 클래스를 어떻게 사용하는지 봅시다. 먼저 model = SimpleLinearRegression()으로 모델 객체를 만듭니다.

그 다음 model.fit(x_train, y_train)으로 학습시킵니다. 학습이 끝나면 model.predict(500)으로 새로운 값을 예측할 수 있습니다.

이 구조는 scikit-learn과 똑같습니다. 실제로 scikit-learn도 내부적으로 이런 방식으로 동작합니다.

왜 직접 구현해야 할까요? 실무에서는 scikit-learn을 쓰면 되는데, 왜 직접 만들어볼까요? 자동차 운전을 배울 때 엔진 구조를 알면 고장이 났을 때 대처할 수 있듯이, 모델을 직접 구현해보면 문제가 생겼을 때 원인을 파악하기 쉽습니다.

또한 회사에서 특수한 요구사항이 있을 때 커스터마이징도 가능해집니다. 주의사항 직접 구현할 때 주의할 점이 있습니다.

x의 분산이 0이면 나눗셈에서 에러가 발생합니다. 즉, x 값이 모두 같으면 기울기를 계산할 수 없습니다.

실무에서는 이런 예외 처리를 추가해야 합니다. 정리 박시니어 씨가 김개발 씨의 코드를 보고 고개를 끄덕였습니다.

"좋아요. 이제 라이브러리가 어떻게 돌아가는지 감이 오죠?" 김개발 씨는 뿌듯한 표정으로 답했습니다.

"네, 이제 fit과 predict의 의미를 확실히 알겠어요!" 직접 구현해보면 블랙박스처럼 느껴지던 라이브러리가 투명하게 보이기 시작합니다.

실전 팁

💡 - fit 메서드를 호출하기 전에 predict를 호출하면 에러가 나므로, None 체크를 추가하면 좋습니다

  • 코드를 재사용하려면 클래스로 만드는 습관을 들이세요
  • 학습된 기울기와 절편을 출력해보면 데이터의 관계를 직관적으로 이해할 수 있습니다

3. 다중 선형 회귀 구현

단순 선형 회귀를 마스터한 김개발 씨에게 새로운 과제가 떨어졌습니다. "광고비뿐만 아니라 프로모션 횟수, 계절 요인도 함께 고려해서 매출을 예측해 주세요." 변수가 여러 개일 때는 어떻게 해야 할까요?

다중 선형 회귀는 여러 개의 독립변수로 하나의 종속변수를 예측하는 모델입니다. 2차원 직선이 아니라 다차원 공간의 평면 또는 초평면을 찾는 것입니다.

행렬 연산을 사용하면 변수가 아무리 많아도 간단하게 계산할 수 있습니다.

다음 코드를 살펴봅시다.

class MultipleLinearRegression:
    def __init__(self):
        self.coefficients = None  # 계수들

    def fit(self, X, y):
        # X에 절편을 위한 1열 추가
        X_b = np.c_[np.ones((X.shape[0], 1)), X]

        # 정규방정식: θ = (X^T X)^(-1) X^T y
        self.coefficients = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y)

    def predict(self, X):
        X_b = np.c_[np.ones((X.shape[0], 1)), X]
        return X_b.dot(self.coefficients)

김개발 씨는 당황했습니다. 변수가 하나일 때는 직선 하나만 그으면 됐는데, 변수가 세 개면 어떻게 그려야 할까요?

박시니어 씨가 화이트보드에 3차원 좌표계를 그리며 설명했습니다. "2차원에서는 직선이었지만, 3차원에서는 평면이 됩니다.

변수가 더 많으면 우리 눈에는 안 보이지만 수학적으로는 초평면이라고 부르죠." 다중 선형 회귀란? 쉽게 비유하자면, 아파트 가격을 예측하는 상황을 생각해봅시다. 평수만 고려하는 것이 단순 선형 회귀라면, 평수와 층수, 역세권 여부를 모두 고려하는 것이 다중 선형 회귀입니다.

수식으로는 y = b0 + b1*x1 + b2*x2 + b3*x3처럼 표현됩니다. 여기서 b0는 절편, b1, b2, b3는 각 변수의 계수입니다.

왜 행렬을 사용할까요? 변수가 10개, 100개로 늘어나면 일일이 계산하기 불가능합니다. 하지만 행렬 연산을 사용하면 변수 개수와 관계없이 같은 코드로 처리할 수 있습니다.

마치 엑셀에서 합계를 구할 때 SUM 함수를 쓰면 셀이 10개든 1000개든 상관없는 것과 비슷합니다. 정규방정식의 비밀 코드를 보면 np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y)라는 복잡한 수식이 나옵니다.

이것이 바로 정규방정식입니다. 이 수식은 "오차 제곱의 합을 최소화하는 계수들을 한 번에 구하는 마법의 공식"입니다.

미분을 이용해 유도되는 식인데, 여기서는 NumPy가 알아서 계산해 줍니다. 절편을 위한 트릭 코드에서 np.c_[np.ones((X.shape[0], 1)), X]라는 부분이 있습니다.

이것은 X의 맨 앞에 1로 채워진 열을 추가하는 것입니다. 왜 그럴까요?

절편 b0는 항상 1을 곱해줘야 하기 때문입니다. 이렇게 하면 절편도 다른 계수들과 똑같이 행렬 연산으로 계산할 수 있습니다.

아주 영리한 트릭이죠. 코드 분석 fit 메서드를 보면, 먼저 X에 1열을 추가합니다.

그 다음 정규방정식을 적용해서 모든 계수를 한 번에 계산합니다. 계산된 계수에는 절편과 각 변수의 기울기가 모두 들어있습니다.

predict 메서드에서도 똑같이 1열을 추가한 뒤, 행렬 곱셈으로 예측값을 계산합니다. 단 한 줄의 코드로 수백 개의 데이터를 동시에 예측할 수 있습니다.

실무 활용 사례 실제 현업에서는 어떻게 쓰일까요? 예를 들어 배달앱에서 배달 시간을 예측한다고 합시다.

거리, 시간대, 날씨, 주문 개수 등 여러 요인을 동시에 고려해야 합니다. 다중 선형 회귀를 사용하면 이 모든 변수를 한꺼번에 넣어서 배달 시간을 예측할 수 있습니다.

주의사항 변수가 너무 많으면 과적합이 발생할 수 있습니다. 학습 데이터에는 완벽하게 맞지만 새로운 데이터에는 예측이 엉망인 상태가 되는 것이죠.

또한 변수 간 상관관계가 높으면 다중공선성 문제가 생깁니다. 예를 들어 "평수"와 "방 개수"는 서로 연관이 높아서 함께 쓰면 문제가 될 수 있습니다.

정리 박시니어 씨가 김개발 씨의 코드를 실행해 보더니 만족스러운 표정을 지었습니다. "좋아요.

이제 실무에서 쓸 수 있는 수준이에요." 김개발 씨는 뿌듯했습니다. 변수 하나만 다루던 자신이 이제는 수십 개의 변수를 동시에 다룰 수 있게 되었으니까요.

다중 선형 회귀를 마스터하면 실무 데이터 분석의 80%는 해결할 수 있습니다.

실전 팁

💡 - 변수 간 상관관계를 먼저 확인하고, 너무 높은 변수는 하나만 선택하세요

  • 데이터를 표준화하면 계수의 크기로 변수의 중요도를 비교할 수 있습니다
  • 행렬의 역행렬이 존재하지 않으면 에러가 나므로, SVD 같은 다른 방법을 고려해야 합니다

4. LinearRegression 임포트

직접 구현한 코드를 보던 박시니어 씨가 웃으며 말했습니다. "원리는 이해했으니, 이제 실전에서는 scikit-learn을 쓰면 됩니다." 몇 줄만 쓰면 앞에서 고생해서 만든 기능을 모두 쓸 수 있다고 합니다.

scikit-learn은 파이썬에서 가장 많이 쓰이는 머신러닝 라이브러리입니다. LinearRegression 클래스를 임포트하면 검증된 고성능 선형 회귀 모델을 바로 사용할 수 있습니다.

내부적으로 최적화된 알고리즘이 적용되어 있어 직접 구현한 것보다 훨씬 빠르고 안정적입니다.

다음 코드를 살펴봅시다.

from sklearn.linear_model import LinearRegression
import numpy as np

# 샘플 데이터 준비
X = np.array([[1], [2], [3], [4], [5]])
y = np.array([2, 4, 5, 4, 6])

# 모델 생성
model = LinearRegression()

# 학습
model.fit(X, y)

# 예측
prediction = model.predict([[6]])
print(f"예측값: {prediction[0]:.2f}")

김개발 씨가 코드를 보고 놀랐습니다. "이렇게 간단해요?" 지금까지 수십 줄 짜던 코드가 단 몇 줄로 줄어들었습니다.

박시니어 씨가 고개를 끄덕였습니다. "바퀴를 다시 발명할 필요는 없죠.

하지만 원리를 모르고 쓰면 나중에 문제가 생겼을 때 대처하기 어려워요. 그래서 먼저 직접 만들어본 거예요." scikit-learn이란? scikit-learn은 마치 머신러닝 백화점과 같습니다.

회귀, 분류, 클러스터링, 전처리까지 필요한 모든 도구가 한곳에 모여 있습니다. 2007년에 처음 공개된 이후 수많은 개발자들이 검증하고 개선해 왔습니다.

전 세계 데이터 과학자들의 표준 라이브러리라고 할 수 있죠. 임포트 방법 from sklearn.linear_model import LinearRegression으로 임포트합니다.

sklearn은 scikit-learn의 줄임말입니다. linear_model 모듈 안에는 LinearRegression뿐만 아니라 Ridge, Lasso, ElasticNet 같은 다양한 회귀 모델이 들어있습니다.

필요에 따라 다른 모델도 같은 방식으로 임포트할 수 있습니다. 모델 생성과 학습 model = LinearRegression()으로 모델 객체를 만듭니다.

이때는 아직 아무것도 학습하지 않은 빈 껍데기 상태입니다. model.fit(X, y)를 호출하면 학습이 시작됩니다.

우리가 직접 구현했던 것과 똑같이 최적의 계수를 계산합니다. 차이점은 내부적으로 훨씬 효율적인 알고리즘을 사용한다는 점입니다.

예측하기 model.predict([[6]])으로 새로운 값을 예측합니다. 주의할 점은 2차원 배열을 넣어야 한다는 것입니다.

[[6]]처럼 대괄호를 두 번 씁니다. 왜 그럴까요?

scikit-learn은 여러 개의 데이터를 한꺼번에 예측할 수 있도록 설계되었기 때문입니다. [[6], [7], [8]]처럼 여러 값을 동시에 넣을 수도 있습니다.

일관된 API scikit-learn의 가장 큰 장점은 일관된 API입니다. LinearRegression뿐만 아니라 다른 모든 모델도 fit과 predict 메서드를 사용합니다.

마치 자동차 운전을 배우면 어떤 자동차든 운전할 수 있는 것과 비슷합니다. 한 번 배운 사용법으로 수십 가지 모델을 쓸 수 있습니다.

실무에서의 사용 실무에서는 거의 항상 scikit-learn을 사용합니다. 직접 구현하는 경우는 거의 없습니다.

예를 들어 네이버나 카카오 같은 대기업에서도 프로토타입을 만들 때는 scikit-learn으로 시작합니다. 빠르게 검증하고, 필요하면 나중에 최적화하는 것이죠.

주의사항 scikit-learn을 사용할 때 주의할 점은 데이터 형식입니다. X는 2차원 배열이어야 하고, y는 1차원 배열이어야 합니다.

만약 X가 1차원이면 X.reshape(-1, 1)로 변환해야 합니다. 이 부분을 놓쳐서 에러가 나는 경우가 많습니다.

정리 김개발 씨는 코드를 몇 번 실행해 보더니 감탄했습니다. "정말 간단하네요!" 박시니어 씨가 웃었습니다.

"하지만 원리를 모르면 fit과 predict가 그저 마법처럼 느껴졌을 거예요. 이제는 내부에서 뭘 하는지 아니까 자신 있게 쓸 수 있죠?" 좋은 도구를 아는 것도 중요하지만, 그 도구가 어떻게 작동하는지 이해하는 것이 진짜 실력입니다.

실전 팁

💡 - X는 항상 2차원, y는 1차원 배열로 준비하세요

  • model.coef_와 model.intercept_로 학습된 계수를 확인할 수 있습니다
  • 설치는 pip install scikit-learn으로 간단히 할 수 있습니다

5. fit과 predict 사용

김개발 씨가 모델을 만들고 보니 궁금증이 생겼습니다. "fit과 predict를 언제 어떻게 써야 정확한 예측을 할 수 있을까요?" 박시니어 씨가 학습 데이터와 테스트 데이터의 차이를 설명해 주기 시작했습니다.

fit은 학습 데이터로 모델의 계수를 학습하는 메서드이고, predict는 학습된 모델로 새로운 데이터를 예측하는 메서드입니다. 학습 데이터와 테스트 데이터를 분리해야 모델의 실제 성능을 평가할 수 있습니다.

데이터를 섞어서 쓰면 과적합이 발생하여 실전에서 예측이 빗나가게 됩니다.

다음 코드를 살펴봅시다.

from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
import numpy as np

# 데이터 준비
X = np.array([[1], [2], [3], [4], [5], [6], [7], [8]])
y = np.array([2, 4, 5, 4, 6, 7, 8, 9])

# 학습/테스트 분리 (80% 학습, 20% 테스트)
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)  # 학습 데이터로만 학습

# 테스트 데이터로 예측
predictions = model.predict(X_test)
print(f"예측: {predictions}")
print(f"실제: {y_test}")

박시니어 씨가 화이트보드에 데이터를 두 그룹으로 나누며 설명했습니다. "학습할 때는 이 데이터를 보여주고, 평가할 때는 처음 보는 데이터로 테스트해야 진짜 실력을 알 수 있어요." 김개발 씨가 고개를 갸웃했습니다.

"왜요? 전체 데이터로 학습하면 더 좋지 않나요?" 학습과 테스트를 분리하는 이유 쉽게 비유하자면, 시험 문제를 미리 알려주고 시험을 보는 것과 같습니다.

그 문제는 100점을 맞겠지만, 새로운 문제가 나오면 못 풀 수도 있습니다. 머신러닝도 마찬가지입니다.

학습 데이터만 보고 학습한 모델은 그 데이터에 대해서는 완벽하게 예측할 수 있지만, 실전에서 새로운 데이터가 들어오면 예측이 엉망일 수 있습니다. 이것을 과적합이라고 합니다.

train_test_split의 역할 scikit-learn의 train_test_split 함수는 데이터를 자동으로 섞어서 학습용과 테스트용으로 나눠줍니다. test_size=0.2는 전체의 20%를 테스트용으로 떼어놓는다는 뜻입니다.

보통 80:20 또는 70:30 비율을 많이 사용합니다. random_state=42는 랜덤 시드입니다.

같은 숫자를 넣으면 항상 같은 방식으로 데이터가 나뉩니다. 이렇게 하면 실험 결과를 재현할 수 있어서 디버깅이 쉬워집니다.

fit 메서드의 비밀 model.fit(X_train, y_train)을 호출하면 학습 데이터로만 계수를 계산합니다. 이때 테스트 데이터는 절대 보지 않습니다.

마치 학생이 교과서를 보고 공부하는 것과 같습니다. 시험 문제(테스트 데이터)는 절대 미리 보지 않는 것이죠.

predict 메서드의 활용 model.predict(X_test)를 호출하면 테스트 데이터에 대한 예측값이 나옵니다. 이 예측값을 실제 y_test와 비교하면 모델의 성능을 평가할 수 있습니다.

만약 예측값과 실제값이 비슷하면 좋은 모델이고, 차이가 크면 개선이 필요한 모델입니다. 실무에서의 사용 실무에서는 데이터를 학습, 검증, 테스트 세 그룹으로 나누기도 합니다.

학습 데이터로 모델을 학습하고, 검증 데이터로 하이퍼파라미터를 조정하고, 마지막에 테스트 데이터로 최종 성능을 평가하는 것입니다. 큰 프로젝트일수록 이런 3분할 방식을 선호합니다.

score 메서드 scikit-learn의 모델에는 score 메서드도 있습니다. model.score(X_test, y_test)를 호출하면 R² 점수가 나옵니다.

R² 점수는 0에서 1 사이 값인데, 1에 가까울수록 예측이 정확하다는 뜻입니다. 0.8 이상이면 꽤 좋은 모델이라고 볼 수 있습니다.

주의사항 절대 테스트 데이터로 fit을 호출하면 안 됩니다. 그러면 평가의 의미가 없어집니다.

또한 데이터가 시계열일 때는 train_test_split을 쓰면 안 됩니다. 미래 데이터로 학습하고 과거를 예측하는 이상한 상황이 벌어지기 때문입니다.

시계열은 순서대로 나눠야 합니다. 정리 박시니어 씨가 마무리했습니다.

"fit은 학습, predict는 예측. 이 두 메서드만 제대로 쓸 줄 알면 기본은 마스터한 거예요." 김개발 씨는 이제 확실히 이해했습니다.

학습과 평가를 분리해야 진짜 실력을 알 수 있다는 것을. 데이터를 제대로 나누는 것이 좋은 모델을 만드는 첫걸음입니다.

실전 팁

💡 - test_size는 데이터가 많으면 0.2, 적으면 0.3 정도로 설정하세요

  • random_state를 고정하면 같은 결과를 재현할 수 있어 디버깅이 쉬워집니다
  • model.score(X_test, y_test)로 간단히 성능을 평가할 수 있습니다

6. 회귀 계수 해석하기

모델이 학습을 마치자 김개발 씨가 물었습니다. "예측은 되는데, 어떤 변수가 더 중요한지 어떻게 알 수 있나요?" 박시니어 씨가 회귀 계수를 확인하는 방법을 알려주기 시작했습니다.

회귀 계수는 각 독립변수가 종속변수에 미치는 영향력을 나타내는 값입니다. 계수가 크면 그 변수가 예측에 큰 영향을 주고, 부호가 양수면 비례 관계, 음수면 반비례 관계입니다.

scikit-learn에서는 coef_와 intercept_ 속성으로 확인할 수 있습니다.

다음 코드를 살펴봅시다.

from sklearn.linear_model import LinearRegression
import numpy as np

# 다중 변수 데이터 (광고비, 프로모션 횟수)
X = np.array([[100, 5], [150, 7], [200, 10], [250, 12], [300, 15]])
y = np.array([200, 280, 350, 410, 500])

# 모델 학습
model = LinearRegression()
model.fit(X, y)

# 계수 확인
print(f"절편: {model.intercept_:.2f}")
print(f"계수: {model.coef_}")
print(f"광고비 계수: {model.coef_[0]:.2f}")
print(f"프로모션 계수: {model.coef_[1]:.2f}")

박시니어 씨가 모니터를 가리키며 말했습니다. "모델이 학습하면서 찾아낸 숫자들이 여기 있어요.

이걸 보면 어떤 변수가 중요한지 알 수 있죠." 김개발 씨가 코드를 실행해 보니 숫자들이 출력되었습니다. "이 숫자들이 뭘 의미하는 거죠?" 회귀 계수란? 쉽게 비유하자면, 회귀 계수는 마치 요리 레시피의 재료 비율과 같습니다.

간장 1스푼, 설탕 2스푼처럼, 각 재료가 맛에 얼마나 영향을 주는지 나타내는 것이죠. 매출 예측 모델에서도 마찬가지입니다.

"광고비가 1만 원 증가하면 매출이 1.5만 원 증가한다"처럼 정확한 관계를 숫자로 보여줍니다. 절편 intercept_ 절편은 모든 독립변수가 0일 때의 예측값입니다.

광고비도 0, 프로모션도 0일 때의 기본 매출이라고 생각하면 됩니다. 실무에서는 절편 자체보다는 계수들이 더 중요합니다.

하지만 절편이 음수로 나오면 해석에 주의가 필요합니다. 실제로는 매출이 음수일 수 없으니까요.

계수 coef_ model.coef_는 각 변수의 계수를 담은 배열입니다. 첫 번째 값은 첫 번째 변수(광고비)의 계수, 두 번째 값은 두 번째 변수(프로모션)의 계수입니다.

예를 들어 광고비 계수가 1.5라면, "광고비가 1만 원 증가할 때 매출이 1.5만 원 증가한다"는 뜻입니다. 프로모션 계수가 10이라면, "프로모션 1회 증가할 때 매출이 10만 원 증가한다"는 의미입니다.

계수의 크기 비교 계수의 절댓값이 클수록 그 변수가 예측에 큰 영향을 미칩니다. 만약 광고비 계수가 1.5이고 프로모션 계수가 10이라면, 프로모션이 더 중요한 변수라고 볼 수 있습니다.

하지만 여기에 함정이 있습니다. 변수의 단위가 다르면 직접 비교가 어렵습니다.

광고비는 만 원 단위이고 프로모션은 횟수 단위라면, 단순히 계수만 보고 판단하면 안 됩니다. 표준화의 필요성 이런 문제를 해결하려면 표준화를 해야 합니다.

모든 변수를 평균 0, 표준편차 1로 변환하면 계수의 크기를 직접 비교할 수 있습니다. scikit-learn의 StandardScaler를 사용하면 쉽게 표준화할 수 있습니다.

표준화 후 계수를 비교하면 진짜 중요한 변수를 찾을 수 있습니다. 양수와 음수 계수가 양수면 비례 관계입니다.

광고비가 증가하면 매출도 증가하는 것이죠. 계수가 음수면 반비례 관계입니다.

예를 들어 "재고 일수"가 늘어나면 매출이 감소하는 식입니다. 부호를 보면 변수와 결과의 관계 방향을 알 수 있습니다.

실무 활용 실무에서는 계수 분석이 매우 중요합니다. 마케팅 팀에서 "광고비를 늘릴까요, 프로모션을 늘릴까요?"라고 물어보면, 계수를 보고 답할 수 있습니다.

예를 들어 광고비 계수가 1.5이고 프로모션 계수가 10이라면, "같은 비용이라면 프로모션이 더 효과적입니다"라고 조언할 수 있습니다. 주의사항 계수가 크다고 무조건 중요한 것은 아닙니다.

통계적 유의성도 함께 확인해야 합니다. statsmodels 라이브러리를 쓰면 p-value도 함께 볼 수 있습니다.

또한 상관관계가 인과관계는 아닙니다. 광고비와 매출이 비례한다고 해서 광고비가 매출을 만드는지, 아니면 다른 요인이 둘 다 증가시키는지는 계수만으로 알 수 없습니다.

정리 박시니어 씨가 마무리했습니다. "계수를 해석할 줄 알면, 모델이 그냥 블랙박스가 아니라 실무에 유용한 인사이트를 주는 도구가 됩니다." 김개발 씨는 고개를 끄덕였습니다.

이제 모델이 어떤 논리로 예측하는지 설명할 수 있게 되었습니다. 숫자만 보는 것이 아니라, 그 숫자의 의미를 읽어낼 수 있어야 진짜 데이터 과학자입니다.

실전 팁

💡 - 계수의 크기를 비교하려면 StandardScaler로 표준화하세요

  • 계수의 부호로 비례/반비례 관계를 바로 알 수 있습니다
  • statsmodels 라이브러리를 쓰면 p-value와 신뢰구간도 확인할 수 있습니다

7. 절편과 기울기 이해

김개발 씨가 마지막으로 질문했습니다. "절편과 기울기가 정확히 뭐죠?

수학 시간에 배운 것 같은데 기억이 안 나요." 박시니어 씨가 좌표계를 그리며 친절히 설명해 주기 시작했습니다.

기울기는 x가 1 증가할 때 y가 얼마나 증가하는지를 나타내고, 절편은 x가 0일 때 y의 값입니다. y = mx + b 공식에서 m이 기울기, b가 절편입니다.

이 두 값만 알면 직선 전체를 완벽하게 표현할 수 있습니다.

다음 코드를 살펴봅시다.

from sklearn.linear_model import LinearRegression
import numpy as np
import matplotlib.pyplot as plt

# 데이터 준비
X = np.array([[1], [2], [3], [4], [5]])
y = np.array([3, 5, 7, 9, 11])

# 모델 학습
model = LinearRegression()
model.fit(X, y)

# 기울기와 절편
slope = model.coef_[0]
intercept = model.intercept_

print(f"기울기(m): {slope}")
print(f"절편(b): {intercept}")
print(f"직선 방정식: y = {slope}x + {intercept}")

박시니어 씨가 종이에 x축과 y축을 그렸습니다. "중학교 때 배운 일차함수 기억나요?

y = mx + b가 바로 그겁니다." 김개발 씨가 기억을 더듬었습니다. "아, 맞다.

m이 기울기고 b가 y절편이었죠?" 기울기란? 기울기는 마치 산의 경사도와 같습니다. 가파른 산은 기울기가 크고, 완만한 언덕은 기울기가 작습니다.

수학적으로는 "x가 1 증가할 때 y의 변화량"입니다. 만약 기울기가 2라면, x가 1 증가할 때 y는 2 증가합니다.

기울기가 0.5라면, x가 1 증가할 때 y는 0.5만 증가합니다. 절편이란? 절편은 직선이 y축과 만나는 점입니다.

마치 건물의 1층 로비 높이와 같습니다. 엘리베이터(x)를 타지 않아도(x=0) 이미 어느 정도 높이(y)에 있는 것이죠.

실무에서는 절편을 "기본값" 또는 "초기값"이라고 해석하면 됩니다. 광고비가 0원이어도 기본 매출이 있다면, 그것이 절편입니다.

y = mx + b 공식 이 공식이 왜 중요할까요? 단 두 개의 숫자(m과 b)만 알면 무한한 직선을 완벽하게 표현할 수 있기 때문입니다.

예를 들어 m=2, b=1이라면, x가 0일 때 y는 1, x가 1일 때 y는 3, x가 2일 때 y는 5입니다. 어떤 x 값이 들어와도 y를 즉시 계산할 수 있습니다.

기울기가 양수일 때 기울기가 양수면 x가 증가할수록 y도 증가합니다. 오른쪽 위로 올라가는 직선입니다.

광고비와 매출의 관계처럼 대부분의 비례 관계가 이에 해당합니다. 기울기가 클수록 증가 속도가 빠릅니다.

기울기가 음수일 때 기울기가 음수면 x가 증가할수록 y는 감소합니다. 오른쪽 아래로 내려가는 직선입니다.

예를 들어 연료가 줄어드는 상황, 재고가 소진되는 상황 등이 음수 기울기로 표현됩니다. 기울기가 0일 때 기울기가 0이면 x와 관계없이 y는 항상 일정합니다.

수평선이 됩니다. 이런 경우 x는 y에 아무 영향을 주지 않습니다.

즉, 무의미한 변수라는 뜻입니다. 실제 데이터에서의 해석 위 코드를 실행하면 기울기가 2, 절편이 1로 나옵니다.

이것은 "x가 1 증가할 때 y가 2 증가하고, x가 0일 때 y는 1"이라는 뜻입니다. 만약 x가 광고비(백만 원)이고 y가 매출(백만 원)이라면, "광고비를 100만 원 쓸 때마다 매출이 200만 원 증가하고, 광고를 안 해도 기본 매출은 100만 원"이라고 해석할 수 있습니다.

시각화의 중요성 matplotlib으로 그래프를 그려보면 기울기와 절편의 의미가 훨씬 명확해집니다. 직선이 y축을 지나는 점이 절편이고, 직선의 가파른 정도가 기울기입니다.

그래프를 보면 모델이 데이터를 얼마나 잘 설명하는지 한눈에 알 수 있습니다. 주의사항 절편이 실무적으로 말이 안 되는 값이 나올 수도 있습니다.

예를 들어 키와 몸무게 관계에서 절편이 음수로 나온다면, "키가 0일 때 몸무게가 음수"라는 이상한 해석이 됩니다. 이런 경우 절편을 억지로 해석하지 말고, 기울기에만 집중하는 것이 좋습니다.

정리 박시니어 씨가 마지막으로 정리했습니다. "기울기는 관계의 강도, 절편은 시작점.

이 두 개념만 확실히 알면 선형 회귀의 모든 게 명확해집니다." 김개발 씨는 이제 모델의 출력값을 보고 그 의미를 정확히 설명할 수 있게 되었습니다. 수학 공식이 추상적으로 느껴졌다면, 실제 데이터에 적용해 보세요.

숫자들이 살아 움직이는 스토리로 바뀔 것입니다.

실전 팁

💡 - matplotlib으로 그래프를 그려서 기울기와 절편을 눈으로 확인하세요

  • 절편이 실무적으로 말이 안 되면 무시하고 기울기만 해석해도 됩니다
  • 기울기의 부호만 봐도 변수 간 관계 방향을 바로 알 수 있습니다

이상으로 학습을 마칩니다. 위 내용을 직접 코드로 작성해보면서 익혀보세요!

#Python#LinearRegression#MachineLearning#scikit-learn#Regression

댓글 (0)

댓글을 작성하려면 로그인이 필요합니다.