초보자를 위한 선형 회귀: 단순 선형 회귀
출처: Dev.to
매일 기업들은 미래 결과를 예측하려고 합니다:
- 얼마나 많은 매출을 올릴 수 있을지
- 어떤 주택의 가치가 상승할지
- 학생들의 성적이 시간에 따라 어떻게 변할지
- 광고가 매출에 어떤 영향을 미치는지
이러한 예측을 위해 가장 간단하면서도 강력한 도구 중 하나가 선형 회귀입니다.
공부한 시간에 따라 시험 점수를 예측해 본 적이 있다면, 축하합니다 — 이미 데이터 과학자처럼 생각한 것입니다.
공부 시간과 시험 점수 사이의 관계가 바로 선형 회귀가 이해하도록 설계된 관계입니다.
선형 회귀는 가장 간단하고 중요한 머신러닝 알고리즘 중 하나입니다. 데이터에서 패턴을 찾아내고, 그 패턴을 기반으로 예측을 수행합니다. 또한 오늘날 사용되는 많은 고급 머신러닝 시스템의 기반이 됩니다.
초보자에게 친숙하면서도 실제 산업 현장에서 널리 활용됩니다:
- 금융
- 의료
- 교육
- 스포츠
- 마케팅
- 부동산
배울 내용
이 글을 통해 다음을 배웁니다:
- 선형 회귀가 무엇인지
- 어떻게 작동하는지 (쉽게 설명)
- 중요한 용어를 시각적으로 설명
- 단순 선형 회귀 vs 다중 선형 회귀
- Ridge와 Lasso 회귀
- 파이썬으로 첫 모델 만들기
- 결과를 시각적으로 이해하기
- Joblib으로 모델 저장하기
- Flask로 모델 배포하기
- 초보자가 흔히 저지르는 실수
실생활 비유로 이해하는 선형 회귀
벽에 여러 개의 핀을 무작위로 꽂았다고 상상해 보세요.
그 다음 고무줄을 벽에 걸쳐 모든 핀을 가능한 한 가깝게 통과하도록 늘립니다.
고무줄이 모든 핀에 완벽히 닿지는 않지만, 가능한 한 가깝게 머무르려고 합니다.
이 고무줄이 바로 회귀선입니다.
선형 회귀는 모든 데이터를 외우는 대신,
**“모든 데이터를 동시에 가장 잘 설명하는 직선”**을 찾습니다.
혼돈을 단순한 직선 하나로 요약하려는 것이죠.
선형 회귀는 수치 값을 예측하는 머신러닝 알고리즘이며, 변수 간 관계를 가장 잘 나타내는 직선을 찾는 방식으로 동작합니다.
| 공부 시간 | 시험 점수 |
|---|---|
| 1 | 40 |
| 2 | 50 |
| 3 | 60 |
| 4 | 70 |
| 5 | 80 |
공부 시간이 늘어남에 따라 시험 점수도 상승합니다.
각 행을 일일이 외우는 대신, 모델은 다음과 같이 학습합니다:
“시간이 늘어나면 점수도 일정한 패턴으로 증가한다.”
수식: y = mx + b
y: 예측값x: 입력 변수m: 기울기 (증가 속도)b: 절편 (시작점)
왜 “선형”(Linear)이라고 할까?
‘선형’이라는 말은 관계가 직선 형태임을 의미합니다.
즉, 곡선이나 무작위가 아니라
“X가 증가하면 Y도 일정한 직선 형태로 변한다.” 라고 가정합니다.
- 공부 시간이 늘어나면 점수도 상승
- 큰 집일수록 가격도 상승
- 광고가 많을수록 매출도 증가
선형 회귀의 목표
목표는 모든 점을 완벽히 통과시키는 것이 아니라,
모든 점에 동시에 가장 가깝게 위치하는 직선을 찾는 것입니다.
학생이 흩어진 점들을 연결하려고 할 때와 비슷합니다:
1️⃣ 첫 시도 → 직선이 별로 좋지 않음
2️⃣ 약간 조정 → 조금 나아짐
3️⃣ 다시 조정 → 더 나아짐
✅ 최종 결과 → 최적의 적합선
컴퓨터는 이 과정을 자동으로 수행합니다.
단순 선형 회귀는 하나의 입력 변수로 하나의 출력 변수를 예측합니다.
예) 공부 시간 → 시험 점수
우리는 오직 한 가지 요인만을 살핍니다:
“공부를 더 하면 점수가 올라갈까?”
수식: y = mx + b
그래프에 하나의 직선을 그리면 됩니다:
- X축 = 공부 시간
- Y축 = 시험 점수
다중 선형 회귀
다중 선형 회귀는 하나 이상의 입력 변수를 사용합니다.
예) 공부 시간, 수면 시간, 출석률
모두가 시험 점수에 영향을 미칩니다.
수식: y = b + m1·x1 + m2·x2 + m3·x3
단순히 “공부 시간이 중요한가?”를 묻는 대신,
“어떤 요인들의 조합이 성과에 영향을 미치는가?” 라고 질문합니다.
식물 성장도 햇빛만이 아니라
- 햇빛
- 물
- 비료
- 토양
- 온도
와 같은 여러 요인의 결합으로 이루어집니다.
실제 세계는 대부분 다중 회귀 형태이며, 우리는 이를 활용해 예측합니다.
예시: 공부 시간
종속 변수 (Y)
예측하고자 하는 대상입니다.
예) 시험 점수
기울기 (Slope)
출력이 얼마나 빠르게 변하는지를 나타냅니다.
- 양의 기울기 → 두 변수가 함께 증가
- 음의 기울기 → 한 변수는 증가하고 다른 변수는 감소
절편 (Intercept)
X = 0 일 때 직선이 시작되는 위치입니다.
잔차 (Residual)
잔차 = 실제값 - 예측값
잔차가 작을수록 모델이 더 좋습니다.
산업별 활용 예시
| 산업 | 적용 분야 |
|---|---|
| 금융 | 시장 추세 예측 |
| 의료 | 회복 시간 예측 |
| 부동산 | 주택 가격 추정 |
| 마케팅 | 매출 예측 |
| 교육 | 학생 성적 예측 |
| 스포츠 | 선수 성과 분석 |
실습 코드
pip install numpy pandas matplotlib scikit-learn joblib
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
data = {
"Hours": [1, 2, 3, 4, 5],
"Scores": [40, 50, 60, 70, 80]
}
df = pd.DataFrame(data)
X = df[["Hours"]]
y = df["Scores"]
model = LinearRegression()
model.fit(X, y)
# 모델이 하는 일:
# - 패턴을 찾아봄
# - 시간과 점수 사이의 관계 학습
# - “최적의 직선”을 찾음
6단계: 예측하기
model.predict([[6]])
# “학생이 6시간 공부한다면, 어느 정도 점수를 받을까?” 라는 질문에 대한 예측
plt.scatter(X, y)
plt.plot(X, model.predict(X))
plt.xlabel("공부 시간")
plt.ylabel("시험 점수")
plt.show()
# 점 = 실제 데이터
# 선 = 모델이 만든 예측선
8. 모델 평가
R² 점수
model.score(X, y)
# 1 → 완벽히 설명
# 0 → 전혀 설명 못함
과적합 (Overfitting)
모델이 외우는 대신 학습하도록 해야 합니다.
학생이 답을 외우는 것이 아니라 개념을 이해하는 것과 같습니다.
- 가중치를 축소해 과적합 방지
- 불필요한 특성을 완전히 제거
import joblib
joblib.dump(model, "linear_model.joblib") # 모델을 효율적으로 저장
model = joblib.load("linear_model.joblib")
Flask 로 배포하기
from flask import Flask, request, jsonify
import joblib
app = Flask(__name__)
model = joblib.load("linear_model.joblib")
@app.route("/predict", methods=["POST"])
def predict():
data = request.json["hours"]
prediction = model.predict([[data]])
return jsonify({
"predicted_score": float(prediction[0])
})
if __name__ == "__main__":
app.run(debug=True)
피해야 할 실수
- 잡음이 많거나 비선형인 데이터를 그대로 사용
- 결측값을 무시
- 과적합된 모델 사용
- 상관관계를 인과관계로 착각
왜 선형 회귀가 중요한가?
- 기계가 패턴을 학습하는 방법을 알려줍니다.
- 예측이 어떻게 이루어지는지 이해하게 합니다.
- 모델