콘텐츠로 이동

P4-10.2 선형회귀의 평가와 한계

Section ID: P4-10.2 Version: v2026.07.20

P4-10.1에서는 선형회귀(linear regression)를 관계를 직선으로 먼저 읽어 보는 모델로 보았습니다. 이제 다음 질문으로 넘어갑니다.

그 직선이 실제로 얼마나 잘 맞았는가, 그리고 어디서부터 쉽게 틀어지는가?

이 질문이 바로 평가(evaluation)와 한계(limit)의 출발점입니다.

종종 선형회귀를 학습한 뒤 기울기가 그럴듯하다, 예측값이 비슷해 보인다 정도에서 멈춥니다. 하지만 알고리즘 장에서는 거기서 한 단계 더 나가야 합니다. 예측과 실제의 차이를 어떻게 읽을지, 어떤 지표(metric)로 요약할지, 그리고 직선 가정이 언제 무리해지는지를 함께 봐야 합니다.

즉, 이 절은 직선을 그렸다에서 끝나지 않고, 그 직선이 데이터를 얼마나 설명했는가를 읽는 절입니다.

이 절은 선형회귀의 기본 정의를 다시 길게 반복하지 않습니다. 직선으로 관계를 읽는 모델이라는 핵심 직관은 P4-10.1과 개념사전을 기준으로 다시 연결하고, 여기서는 평가와 한계에만 초점을 둡니다.

선형회귀의 평가와 한계에서 닫을 질문

이 절은 다음 질문에 답합니다.

  • 잔차(residual)와 오차(error)는 어떻게 이해하면 좋은가?
  • 선형회귀의 예측이 잘 맞는다는 말은 무엇을 뜻하는가?
  • MAE, MSE, RMSE, R²를 입문 수준에서 어떻게 구분할 수 있는가?
  • 직선 가정이 어긋나면 어떤 한계가 생기는가?
  • 선형회귀 결과를 어디까지 믿고, 어디서부터 조심해야 하는가?

이 절에서는 선형회귀 결과를 얼마나 맞았는가어디서부터 쉽게 틀어지는가라는 두 질문으로 먼저 닫고, 잔차와 평가 지표를 그 판단 손잡이로 붙잡는 데 집중합니다.

대신 이번 절에서 바로 더 넓히지 않을 질문도 분명합니다. 회귀 진단의 기초 읽기, 유의성 검정, 다중공선성의 해석은 P4-10.3 보충학습에서 다시 정리하고, 정규화와 관련 하이퍼파라미터의 더 넓은 관점은 P4-9.1, P4-9.2에서 다시 연결합니다. feature engineering의 큰 흐름은 P4-7.1, P4-7.2와 P4-18.1, P4-18.2에서 다시 연결됩니다.

통계적 유의성 검정, 잔차의 정규성·등분산성에 대한 엄밀 검정, 다중공선성 진단, 정규화(regression regularization)와 feature engineering의 심화는 현재 절의 직접 범위를 넘어가므로 이 절에서는 자세히 다루지 않습니다.

선형회귀의 평가와 한계에서 남길 판단 기준

  • 잔차를 실제값과 예측값의 차이로 설명할 수 있습니다.
  • MAE, MSE, RMSE, R²를 각각 어떤 관점의 지표인지 말할 수 있습니다.
  • 큰 오차를 더 민감하게 보는 지표와 덜 민감하게 보는 지표를 구분할 수 있습니다.
  • 선형회귀가 잘 맞지 않는 전형적인 상황을 설명할 수 있습니다.
  • 좋은 숫자 하나만 보고 선형회귀를 과신하면 안 되는 이유를 이해할 수 있습니다.

학습 배경

P4-10.1은 선형회귀를 관계를 요약하는 첫 모델로 소개했습니다. 하지만 모델을 세웠다면 다음에는 반드시 얼마나 맞았는가를 읽어야 합니다.

  • 직선이 있어도 예측 오차는 남습니다.
  • 오차가 남는다면 그 크기를 어떻게 요약할지 정해야 합니다.
  • 지표가 좋아 보여도, 직선이 놓친 패턴이 있으면 모델을 다시 의심해야 합니다.

따라서 이 절은 알고리즘 장에서 다음 역할을 합니다.

커리큘럼 위치 이 절의 역할
P4-10.1 뒤 직관적 해석을 수치 평가로 연결
P4-6 평가 지표 뒤 회귀 지표를 실제 모델 문맥으로 재사용
P4-11 이후 다른 알고리즘 전 예측이 맞는가모델이 잘 설명하는가를 구분하는 기준 제공

즉, P4-10.1이 모델의 모양을 보는 절이었다면, P4-10.2는 모델의 남는 차이를 보는 절입니다.

회귀 평가에서도 다음 네 가지를 같이 남겨야 합니다.

먼저 확인할 것 왜 같이 봐야 하는가
baseline 오차 직선 모델이 단순 평균 예측보다 실제로 나아졌는지 알아야 해서
평균 오차(MAE, RMSE) 전체적으로 얼마나 멀리 빗나가는지 알아야 해서
큰 실패가 난 구간 평균값 뒤에 숨은 큰 오차를 따로 봐야 해서
대표 오류 사례 어떤 입력 조건에서 같은 방식으로 틀리는지 설명해야 해서

즉, 좋은 회귀 평가는 지표 하나를 읽고 끝나는 일이 아니라, baseline보다 나아졌는가, 평균적으로 얼마나 틀리는가, 어디서 크게 틀리는가, 그 실패가 어떤 장면에서 반복되는가를 함께 확인하는 일입니다.

여기서 한 가지를 더 고정해 두면 분류 절에서 배운 비교 구조가 회귀 절에도 그대로 이어집니다. 회귀에서도 baseline은 단순 평균 예측 같은 기준 모델일 수 있고, 최근 예측 오차를 평소 오차 분포와 나란히 두는 비교 기준선일 수도 있습니다. 즉, 회귀 평가도 절대 오차 숫자만 보는 일이 아니라 지금 오차가 평소보다 더 커졌는가, 특정 구간에서만 반복되는가를 함께 읽는 구조로 갑니다. 여기서도 큰 오차는 우선 변화 신호로 읽고, 원인 설명은 빠진 특징이나 구간 차이를 다시 확인한 뒤에 붙입니다.

즉, 회귀 평가에서도 비교 프레임은 하나로 묶여 있어야 합니다. baseline 오차, 현재 모델 오차, 최근 구간의 오차 분포를 서로 다른 단위나 다른 구간에서 따로 읽기 시작하면 무엇이 실제로 좋아졌는가를 말하기 어려워집니다.

회귀 평가 전에 같이 남길 것 왜 필요한가
baseline 오차 평균 예측보다 실제로 나아졌는지 먼저 보기 위해서입니다.
큰 오차가 몰린 구간 평균 뒤에 숨은 실패 구간을 바로 보기 위해서입니다.
오차 해석 경계 문장 큰 오차가 보여도 원인을 곧바로 확정하지 않기 위해서입니다.
다음 검토 우선순위 어떤 구간을 추가로 보고 특징을 보강할지 정하기 위해서입니다.

주요 학습내용

잔차(residual)와 오차(error)는 무엇이 다른가

두 용어는 처음 접하면 비슷해 보일 수 있지만, 이 책에서는 다음처럼 구분합니다.

  • 잔차(residual): 개별 데이터에서 실제값 - 예측값
  • 오차(error): 모델이 남긴 차이를 일반적으로 가리키는 말

예를 들어 실제 점수가 72점이고 예측값이 68점이면 잔차는 72 - 68 = 4입니다. 반대로 실제 점수가 64점인데 예측값이 67점이면 잔차는 64 - 67 = -3입니다.

이때 중요한 것은 부호(sign)와 크기(size)입니다.

  • 양수 잔차: 모델이 실제보다 작게 예측함
  • 음수 잔차: 모델이 실제보다 크게 예측함
  • 절댓값이 큼: 그 데이터에서는 예측이 더 많이 빗나감

점 하나만 놓고 보면 잔차는 실제 점회귀선 위 예측점 사이의 세로 거리입니다. 그래서 잔차를 보려면 숫자표만 보기보다, 선에서 얼마나 위나 아래로 떨어졌는가를 같이 보는 편이 더 빠릅니다.

실제 점과 회귀선 사이의 세로 간격으로 잔차를 보여 주는 차트

이 차이를 간단히 그리면 다음과 같습니다.

flowchart TD
  A["실제값"]
  B["예측값"]
  C["잔차 = 실제값 - 예측값"]
  D["양의 잔차<br/>너무 낮게 예측함"]
  E["음의 잔차<br/>너무 높게 예측함"]

  A --> C
  B --> C
  C --> D
  C --> E

이 도식은 잔차를 단순한 실패 표시가 아니라 방향이 있는 차이로 읽게 해 줍니다. 예측이 실제보다 낮았는지 높았는지를 함께 보아야, 모델이 특정 구간에서 한쪽 방향으로 치우치는지도 나중에 의심할 수 있습니다.

핵심은 잔차가 단순한 틀림이 아니라, 어느 방향으로 얼마나 틀렸는가를 보여 준다는 점입니다.

선형회귀의 예측이 잘 맞는다는 말은 무엇인가

회귀에서는 분류처럼 정답/오답으로 바로 나누기 어렵습니다. 숫자 예측은 대개 조금씩 빗나가기 때문입니다. 그래서 회귀 모델을 읽을 때는 얼마나 자주 맞는가보다 평균적으로 얼마나 멀리 빗나가는가를 먼저 봅니다.

예를 들어 같은 두 모델이 있다고 합시다.

모델 오차의 특징
모델 A 대부분 2~3점 정도씩 빗나감
모델 B 대부분은 비슷하지만 가끔 20점씩 크게 빗나감

둘 다 평균적으로 그럴듯해 보일 수 있지만, 실제 사용에서는 B가 더 위험할 수 있습니다. 그래서 회귀 평가는 오차를 어떻게 요약하느냐가 핵심입니다.

즉, 회귀에서 잘 맞는다는 말은 보통 다음 질문으로 다시 풀어야 합니다.

  • 평균적으로 얼마나 빗나가는가?
  • 큰 오차가 자주 있는가?
  • baseline보다 실제로 나아졌는가?
  • 직선이 놓치는 구조적 패턴이 있는가?

MAE, MSE, RMSE는 어떻게 구분하면 좋은가

scikit-learn의 회귀 지표 문서는 평균 절대 오차(mean absolute error), 평균 제곱 오차(mean squared error), 결정계수(R²) 같은 지표를 제공합니다. 독자는 수식보다 무엇을 더 민감하게 벌주느냐로 먼저 이해합니다.

MAE(mean absolute error)

MAE는 잔차의 절댓값을 평균낸 값입니다.

  • 해석이 직관적입니다.
  • 평균적으로 몇 점, 몇 분, 몇 원 정도 빗나가는지 읽기 쉽습니다.
  • 큰 오차를 특별히 과장하지는 않습니다.

즉, MAE는 평균적으로 얼마나 틀리는가를 가장 담백하게 보여 주는 지표입니다.

MSE(mean squared error)

MSE는 잔차를 제곱한 뒤 평균냅니다.

  • 큰 오차에 더 민감합니다.
  • 작은 오차 여러 개보다 큰 오차 몇 개를 더 무겁게 봅니다.
  • 해석은 직관적이지 않을 수 있습니다. 단위가 제곱되기 때문입니다.

즉, MSE는 큰 실수를 더 강하게 벌주고 싶을 때 유용합니다.

RMSE(root mean squared error)

RMSE는 MSE에 다시 제곱근을 취한 값입니다.

  • 큰 오차에 민감하다는 장점은 유지합니다.
  • 단위를 원래 값의 단위로 되돌려 읽기 쉬워집니다.

즉, RMSE는 큰 오차를 민감하게 보되, 해석은 실제 단위로 하고 싶을 때 자주 봅니다.

이 차이를 아주 짧게 정리하면 다음과 같습니다.

지표 입문적 해석
MAE 평균적으로 얼마나 틀리는가
MSE 큰 오차를 더 강하게 벌주는 평균 오차
RMSE 큰 오차에 민감하지만 단위는 원래 단위로 읽는 오차

실무형 장면으로 바꾸면 이 차이는 더 분명해집니다.

업무 상황 더 먼저 볼 지표 이유
택배 도착 시간 예측 MAE 평균적으로 몇 분 정도 빗나가는지 바로 읽고 싶기 때문
병원 대기 시간 예측 RMSE 일부 환자에게 너무 큰 지연이 생기면 더 민감하게 보고 싶기 때문
매출 예측 MAE + RMSE 평균적인 빗나감과 큰 실패를 함께 보고 싶기 때문
설비 고장 시점 예측 RMSE 드문 큰 오차가 운영 리스크로 이어질 수 있기 때문

즉, 지표 선택은 수학 취향이 아니라 어떤 실수가 더 아픈가의 문제와 연결됩니다.

R²는 무엇을 보여 주는가

R²(score, coefficient of determination)는 선형회귀 입문에서 자주 보이는 숫자지만, 쉽게 오해되기도 합니다.

R²는 이 모델이 단순한 평균 예측보다 데이터를 얼마나 더 설명하는지 보여 주는 요약값이다.

입문적으로는 다음처럼 읽을 수 있습니다.

  • R²가 1에 가까움: 현재 데이터에서 직선이 꽤 많은 변동을 설명함
  • R²가 0에 가까움: 평균으로 예측하는 것과 큰 차이가 없음
  • R²가 음수일 수도 있음: 평균 예측보다도 못할 수 있음

여기서 중요한 것은 R²가 무조건 높을수록 좋다는 단순 점수처럼 읽히기 쉽다는 점입니다. 하지만 R² 하나만으로는 큰 오차 몇 개가 숨어 있는지 알 수 없습니다. 따라서 MAE, RMSE 같은 오차 지표와 함께 봐야 합니다.

실증적으로도 이런 장면은 자주 나옵니다. 예를 들어 매출 예측에서 대부분의 평일은 잘 맞지만, 몇 번의 대형 행사일에 크게 틀릴 수 있습니다. 이 경우 전체 변동은 꽤 설명해서 R²는 높게 나올 수 있어도, 운영자는 그 몇 번의 큰 실패 때문에 모델을 신뢰하기 어려울 수 있습니다.

즉, R²는 전체 설명력에는 강하지만, 개별 큰 실패의 체감을 대신해 주지는 않습니다.

지표는 어떻게 같이 읽어야 하는가

선형회귀를 읽을 때 지표 하나만 보면 해석이 흔들리기 쉽습니다. 예를 들어 다음 장면이 나옵니다.

장면 해석 위험
R²는 높다 큰 오차가 몇 개 숨어 있을 수 있음
MAE는 낮다 특정 구간에서 구조적으로 틀릴 수 있음
RMSE가 높다 큰 실수가 일부 있다는 신호일 수 있음

회귀 평가는 다음 순서로 읽을 때 비교 기준이 분명해집니다.

  1. baseline보다 나아졌는가?
  2. 평균 오차는 어느 정도인가?
  3. 큰 오차가 유난히 존재하는가?
  4. 잔차가 한쪽 방향으로 몰리지는 않는가?

이 순서를 간단히 그리면 다음과 같습니다.

flowchart TD
  A["기준선과 비교"]
  B["평균 오차 확인<br/>MAE 또는 RMSE"]
  C["큰 빗나감 확인"]
  D["잔차 패턴 살피기"]

  A --> B --> C --> D

이 도식은 회귀 지표를 읽는 순서를 정리한 것입니다. 좋은 회귀 평가는 숫자 하나를 보는 일이 아니라, 기준선보다 나아졌는지, 평균 오차가 어느 정도인지, 큰 실패가 숨어 있는지를 차례로 확인하는 일입니다.

핵심은 숫자가 하나 좋아 보인다에서 멈추지 않는 것입니다.

회귀 평가 기록에는 다음 세 문장을 같이 남깁니다.

  • 변화는 관찰되지만 원인은 아직 확정되지 않았습니다.
  • 큰 오차 구간은 검토 우선순위를 올리는 신호입니다.
  • 적은 표본 구간에서의 큰 오차는 더 보수적으로 해석해야 합니다.

이 세 문장은 결국 같은 뜻을 가리킵니다. 회귀 평가도 오차 숫자 하나가 아니라 같은 기준선, 같은 구간, 같은 대표 실패를 나란히 두고 읽을 때 더 설명 가능한 비교가 됩니다.

어떤 지표를 먼저 읽어야 하는가

앞 절의 읽기 순서를 실제 판단 질문으로 다시 펼치면, 무슨 지표가 제일 좋은가보다 지금 어떤 실패를 먼저 읽으려 하는가를 먼저 정해야 합니다.

현재 관심사 먼저 볼 지표/기준 이유
평균적으로 얼마나 빗나가는지 알고 싶다 MAE 실제 단위로 담백하게 읽기 쉽기 때문
큰 실패를 더 민감하게 보고 싶다 RMSE 또는 MSE 큰 오차를 더 무겁게 반영하기 때문
평균 예측보다 정말 나아졌는지 확인하고 싶다 baseline 오차 + R² 단순 기준 대비 설명력과 개선 여부를 함께 보기 때문
특정 구간에서만 크게 틀리는지 의심된다 대표 오류 사례 + 큰 오차 구간 평균값 뒤에 숨은 실패를 직접 봐야 하기 때문
최근 성능이 흔들리는지 보고 싶다 최근 오차 vs 평소 기준선 오차 분포 변화가 있는지 비교 프레임으로 보기 위해

즉, 앞 절이 회귀 지표를 같이 읽는 공통 순서를 줬다면, 이 표는 그 순서를 현재 질문에 맞게 어디에 먼저 무게 둘지 정리한 것입니다.

세부 학습내용

선형회귀가 잘 맞지 않는 전형적인 상황은 무엇인가

선형회귀의 한계는 대부분 직선 하나로는 부족한데도 직선으로 밀어붙일 때 드러납니다.

대표적인 장면은 다음과 같습니다.

1. 관계가 비선형적일 때

입력이 커질수록 출력이 초반에는 빠르게 늘다가, 어느 지점 이후 완만해질 수 있습니다. 이런 경우 직선 하나는 초반과 후반을 동시에 잘 맞추기 어렵습니다.

예를 들어 공부 시간이 늘수록 점수는 올라가지만, 일정 시간 이상에서는 상승 폭이 줄어드는 경우가 그렇습니다.

2. 구간마다 관계가 달라질 때

어떤 데이터는 특정 구간 전후로 성격이 바뀝니다.

  • 소형 주택과 대형 주택의 가격 구조가 다를 수 있음
  • 짧은 배송 거리와 장거리 배송의 시간 패턴이 다를 수 있음

이런 경우 전체를 하나의 직선으로 요약하면 평균적으로는 그럴듯해 보여도, 각 구간에서는 계속 틀릴 수 있습니다.

3. 중요한 특징이 빠졌을 때

직선 자체가 문제가 아니라, 설명에 필요한 입력(feature)이 빠져 있을 수도 있습니다.

예를 들어 집값 예측에서 크기만 넣고 위치를 빼면, 모델은 크기와 가격의 관계를 읽는 척하지만 실제로는 중요한 구조를 놓치게 됩니다.

4. 이상치(outlier)가 강할 때

선형회귀는 큰 오차를 무시하지 못합니다. 데이터 몇 개가 유난히 멀리 있으면, 직선이 그 점들에 끌려가 전체 해석이 흔들릴 수 있습니다.

실증 장면으로는 다음과 같은 경우가 있습니다.

  • 평소 5분~20분 사이이던 배송 시간이, 폭우 하루 때문에 90분이 찍힘
  • 대부분 2천만~6천만 원이던 매출이, 특정 행사 한 번으로 20억 원이 찍힘
  • 일반 주택 가격대 속에 초고가 펜트하우스 몇 건이 섞임

이런 데이터는 현실적으로는 중요한 사건일 수 있지만, 직선 하나로 전체를 읽을 때는 모델을 과도하게 끌어당길 수 있습니다.

즉, 선형회귀의 한계는 알고리즘이 나쁘다기보다, 현재 문제를 직선 하나로 요약하는 것이 무리일 수 있다는 신호로 읽습니다.

대표적으로는 관계가 실제로는 휘어 있는 경우몇 개의 극단값이 선을 끌어당기는 경우를 먼저 의심할 수 있습니다.

비선형 관계와 이상치가 하나의 직선을 어렵게 만드는 두 장면을 비교한 차트

이 신호를 실무형 회고 메모로 줄이면 다음처럼 쓸 수 있습니다.

회고에 남길 항목
baseline 대비 변화 MAE는 줄었지만 큰 오차 구간은 남아 있다
반복되는 실패 장면 고값 구간에서 계속 과소예측한다
해석 경계 비선형 가능성은 보이지만 원인은 추가 특징 검토가 필요하다
다음 질문 직선 대신 구간 분리 또는 특징 추가가 필요한가

세부 학습내용 보충

학술적 배경과 역사

평가와 한계를 본 뒤에는, 선형회귀가 왜 오차를 줄이는 방향으로 설명되는지도 짧게 정리할 수 있습니다. 배경에는 두 흐름이 함께 있습니다.

  • least squares: 관측 오차가 있는 데이터를 가장 잘 설명하는 선을 찾으려는 계산 방법의 흐름
  • regression: 관계를 수량화해 해석하려는 통계적 흐름

오늘의 선형회귀는 이 두 흐름이 만난 결과입니다. 따라서 이 절에서 중요한 것은 역사 자체보다, 선형회귀가 관계를 읽는 모델이면서 동시에 오차를 줄이는 계산 규칙을 가진 모델이라는 점입니다.

주요 논란은 어디에서 생기는가

이제 지표와 한계를 본 뒤에야, 선형회귀를 둘러싼 논란도 더 정확히 읽을 수 있습니다. 선형회귀 자체는 오래된 고전 도구이지만, 해석을 둘러싼 논란은 지금도 반복됩니다. 중요한 논란은 다음 네 가지입니다.

1. 예측(prediction)과 설명(explanation)을 같은 말처럼 다루는 문제

어떤 회귀식이 예측을 꽤 잘한다고 해서, 그 계수가 곧 현실의 원인을 설명한다고 단정할 수는 없습니다. 예측 성능이 있는 것과 인과(causality)를 설명하는 것은 다른 문제입니다.

이 논란은 데이터 기반 서비스에서도 자주 보입니다.

  • 매출 예측이 잘 된다고 해서 광고비 계수가 곧 원인 효과를 증명하는 것은 아님
  • 집값 예측이 잘 된다고 해서 특정 변수 하나가 가격을 결정한다고 단정할 수는 없음

즉, 선형회귀는 설명을 돕지만, 인과를 자동으로 증명하지는 않습니다.

2. 계수(coefficient)를 곧 중요도(importance)로 읽는 문제

계수 숫자가 크다고 해서 그 특징이 더 본질적이라고 바로 말할 수는 없습니다. 단위(scale), 전처리(preprocessing), 변수 선택 방식이 함께 영향을 주기 때문입니다.

이 논란은 특히 다변수 회귀에서 자주 생깁니다. 독자는 선형회귀의 계수를 볼 때 크다/작다보다 먼저 어떤 단위로 측정되었는가를 물어야 합니다.

3. 높은 R²를 과신하는 문제

R²가 높으면 모델이 데이터를 잘 설명하는 것처럼 보입니다. 하지만 일부 큰 실패, 특정 구간의 구조적 오차, 중요한 변수 누락은 높은 R² 아래에서도 숨을 수 있습니다.

즉, R²는 유용한 요약값이지만 최종 판정값은 아닙니다.

4. 회귀의 역사적 출발점과 사회적 해석 사이의 문제

regression이라는 용어는 Galton의 유전 연구와 함께 널리 퍼졌고, 그 주변에는 오늘날 비판적으로 검토되는 유전 결정론(determinism)과 우생학(eugenics)의 역사도 있었습니다. 현대 통계학과 머신러닝에서 선형회귀를 배울 때는 그 수학적 도구 자체와, 당시의 사회적 해석을 분리해서 읽는 태도가 필요합니다.

이 지점은 기술적 한계와는 다른 종류의 논란이지만, 숫자로 관계를 설명한다는 일이 사회적 의미를 자동으로 정당화하지 않는다는 점을 보여 줍니다.

좋은 선형회귀 해석과 나쁜 선형회귀 해석

선형회귀는 해석 가능성이 높다는 장점이 있지만, 그만큼 섣부른 해석도 쉽게 나옵니다.

나쁜 해석 더 나은 해석
기울기가 양수이니 원인이다 양의 관계가 보이지만, 원인은 별도 검토가 필요하다
R²가 높으니 충분히 좋다 R²는 높지만 큰 오차와 잔차 패턴도 함께 봐야 한다
계수가 크니 가장 중요한 특징이다 계수는 단위와 전처리 맥락을 함께 봐야 한다
예측값이 76.4이니 실제도 그 근처다 현재 모델은 그 근처를 추정하지만, 오차 가능성은 남아 있다

특히 중요한 것은 다음 문장입니다.

선형회귀는 설명을 시작하게 해 주지만, 설명을 끝내 주지는 않는다.

사례 및 예시

사례 1. 평균적으로는 잘 맞는데 특정 고객 구간에서 크게 틀리는 배송 시간 예측

물류 팀이 배송 거리와 주문 시간대로 도착 시간을 예측하고 있습니다. 사람이 먼저 보던 기준은 거리가 멀수록 오래 걸리는가, 퇴근 시간 주문은 더 늦어지는가 같은 관계였습니다.

선형회귀를 돌려 보니 전체 R²는 꽤 높고 MAE도 나쁘지 않습니다. 표면적으로는 모델이 괜찮아 보일 수 있습니다. 하지만 자세히 보면 장거리 배송이나 폭우가 낀 날에는 예측이 크게 빗나가고, RMSE는 그 큰 실패들 때문에 생각보다 높게 나옵니다.

flowchart TD
  A["배송 시간 데이터"]
  B["선형 회귀"]
  C["기준선과 비교"]
  D["평균 빗나감을 MAE로 확인"]
  E["큰 빗나감을 RMSE로 확인"]
  F["노선과 날씨별 잔차를 본다"]
  G["선형 적합이 충분한지 판단한다"]

  A --> B --> C --> D
  D --> E --> F --> G

이 장면에서 회귀 평가는 숫자 하나로 끝나지 않습니다. MAE는 평균적으로 얼마나 빗나가는지 보여 주고, RMSE는 드문 큰 실패에 더 민감하게 반응하며, R²는 전체 설명력의 크기를 요약합니다. 따라서 R²가 높다만으로는 실제 운영 위험을 다 설명할 수 없습니다.

확인 가능한 결과는 잔차와 지표를 함께 볼 때 드러납니다. 평균 오차는 작아 보여도 특정 구간에서 잔차가 한쪽으로 크게 몰리거나 큰 실패가 반복되면, 선형회귀가 그 구간 구조를 충분히 설명하지 못하고 있다는 신호로 읽어야 합니다. 이 차이도 우선 어느 구간을 더 봐야 하는가를 알려 주는 검토 우선순위 신호이지, 원인을 자동으로 확정하는 문장은 아닙니다.

실증 예시 1. 배송 시간 예측

같은 지역 배송 시간을 예측한다고 해 보겠습니다.

모델 MAE RMSE 해석
모델 A 8분 9분 전반적으로 고르게 틀림
모델 B 7분 18분 평균은 더 좋아 보이지만, 큰 실패가 섞여 있음

이 경우 평균적인 숫자만 보면 B가 좋아 보일 수 있습니다. 하지만 일부 고객에게 30분, 40분씩 늦는 일이 섞여 있다면 실제 서비스 체감은 오히려 더 나쁠 수 있습니다.

즉, 실증 예시는 MAE와 RMSE를 함께 읽어야 하는 이유를 보여 줍니다.

실증 예시 2. 집값 예측

집값 예측에서는 대부분의 중간 가격대는 잘 맞는데, 아주 비싼 주택에서 크게 틀릴 수 있습니다.

  • MAE는 꽤 낮을 수 있습니다.
  • RMSE는 큰 고가 주택 오차 때문에 더 높아질 수 있습니다.
  • R²는 전체 변동을 많이 설명해서 높게 나올 수도 있습니다.

이 장면에서 중요한 질문은 평균적으로 괜찮은가가 아니라 어느 구간에서 특히 위험한가입니다.

즉, 지표는 전체 평균을 보여 주지만, 실무 해석은 구간별 실패 패턴까지 보아야 완성됩니다.

연습 및 예제

Python 예제로 잔차와 지표 함께 보기

아래 예제는 10.1의 공부 시간 데이터를 다시 사용해, 예측값과 잔차, MAE, RMSE, R²를 함께 확인하는 작은 실습입니다.

  • 문제 상황: 공부 시간으로 시험 점수를 예측한 뒤, 얼마나 빗나갔는지 확인합니다.
  • 입력(input): 공부 시간
  • 정답(label): 실제 시험 점수
  • 확인할 개념:
  • 잔차는 데이터마다 따로 생깁니다.
  • MAE와 RMSE는 오차를 요약합니다.
  • R²는 평균 예측보다 얼마나 더 설명하는지 보여 줍니다.
# 선형회귀 예측의 잔차와 MAE, MSE, RMSE 같은 평가 지표를 계산하는 예제입니다.
import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score

study_hours = np.array([1, 2, 3, 4, 5, 6]).reshape(-1, 1)
exam_score = np.array([52, 55, 61, 64, 68, 72])

model = LinearRegression()
model.fit(study_hours, exam_score)

pred = model.predict(study_hours)
residuals = exam_score - pred

print("predictions :", np.round(pred, 3))
print("residuals   :", np.round(residuals, 3))
print("MAE         :", round(mean_absolute_error(exam_score, pred), 3))
print("RMSE        :", round(mean_squared_error(exam_score, pred) ** 0.5, 3))
print("R2          :", round(r2_score(exam_score, pred), 3))

실행 결과 예시는 다음과 같습니다.

1
2
3
4
5
predictions : [51.714 55.829 59.943 64.057 68.171 72.286]
residuals   : [ 0.286 -0.829  1.057 -0.057 -0.171 -0.286]
MAE         : 0.448
RMSE        : 0.608
R2          : 0.992

이 출력은 다음처럼 읽을 수 있습니다.

  • 잔차가 양수와 음수로 섞여 있으므로, 한쪽으로만 계속 틀리는 모습은 강하지 않습니다.
  • MAE 약 0.448은 평균적으로 0.45점 정도 빗나간다는 뜻입니다.
  • RMSE 약 0.608은 큰 오차를 조금 더 민감하게 반영한 평균 오차입니다.
  • R² 약 0.992는 이 작은 예제에서는 직선이 데이터 변동을 상당히 잘 설명하고 있음을 보여 줍니다.

하지만 여기서도 조심할 점이 있습니다.

  • 이 예제는 데이터가 작고 단순합니다.
  • 학습 데이터와 같은 점에서 다시 평가했기 때문에 실제 일반화 성능과는 다를 수 있습니다.
  • 숫자가 예쁘게 나왔다고 해서, 모든 회귀 문제에서 선형회귀가 충분하다는 뜻은 아닙니다.

즉, 지표는 해석을 돕는 도구이지, 한 번에 최종 판정을 내려 주는 도구는 아닙니다.

Python 예제로 이상치가 지표를 어떻게 흔드는지 보기

아래 예제는 같은 흐름의 데이터에 마지막 한 점의 큰 오차를 일부러 넣어, MAE와 RMSE가 어떻게 다르게 반응하는지 보여 줍니다.

문제 상황:

  • 대부분은 비슷한 패턴인데 한 데이터만 크게 빗나가는 상황을 가정한다

입력(input):

  • 실제값 배열 actual
  • 일반적인 예측 pred_good
  • 마지막 점에 큰 오차를 넣은 예측 pred_outlier

기대 출력(output):

  • 두 경우의 MAE
  • 두 경우의 RMSE

확인할 개념:

  • MAE는 평균적인 빗나감을 보여 준다
  • RMSE는 큰 실패 하나에 더 민감하게 반응한다
# 선형회귀 예측의 잔차와 MAE, MSE, RMSE 같은 평가 지표를 계산하는 예제입니다.
import numpy as np
from sklearn.metrics import mean_absolute_error, mean_squared_error

actual = np.array([52, 55, 61, 64, 68, 72])
pred_good = np.array([51, 56, 60, 65, 67, 73])
pred_outlier = np.array([51, 56, 60, 65, 67, 90])

print("good MAE    :", round(mean_absolute_error(actual, pred_good), 3))
print("good RMSE   :", round(mean_squared_error(actual, pred_good) ** 0.5, 3))
print("outlier MAE :", round(mean_absolute_error(actual, pred_outlier), 3))
print("outlier RMSE:", round(mean_squared_error(actual, pred_outlier) ** 0.5, 3))

실행 결과 예시는 다음과 같습니다.

1
2
3
4
good MAE    : 1.0
good RMSE   : 1.0
outlier MAE : 3.833
outlier RMSE: 7.431

이 출력은 해석 훈련에 매우 유용합니다.

  • good 예측에서는 MAE와 RMSE가 거의 같습니다.
  • 마지막 한 점이 크게 틀린 outlier 예측에서는 MAE도 커지지만, RMSE가 훨씬 더 크게 반응합니다.

즉, 실증적으로 보면 RMSE는 큰 실패를 더 싫어하는 지표라는 말이 숫자로 바로 드러납니다.

값 하나 더 바꿔 보기: 큰 실패가 두 점으로 늘어나면 무엇이 유지되고 무엇이 달라지는가

이번에는 마지막 한 점만 크게 틀리는 대신, 마지막 두 점이 함께 크게 틀리는 장면으로 바꿔 봅니다.

# 선형회귀 예측의 잔차와 MAE, MSE, RMSE 같은 평가 지표를 계산하는 예제입니다.
import numpy as np
from sklearn.metrics import mean_absolute_error, mean_squared_error

actual = np.array([52, 55, 61, 64, 68, 72])
pred_outlier = np.array([51, 56, 60, 65, 67, 90])
pred_two_outliers = np.array([51, 56, 60, 65, 84, 90])

print("one-outlier MAE :", round(mean_absolute_error(actual, pred_outlier), 3))
print("one-outlier RMSE:", round(mean_squared_error(actual, pred_outlier) ** 0.5, 3))
print("two-outlier MAE :", round(mean_absolute_error(actual, pred_two_outliers), 3))
print("two-outlier RMSE:", round(mean_squared_error(actual, pred_two_outliers) ** 0.5, 3))

실행 결과 예시는 다음과 같습니다.

1
2
3
4
one-outlier MAE : 3.833
one-outlier RMSE: 7.431
two-outlier MAE : 6.5
two-outlier RMSE: 8.91

무엇이 유지되고 무엇이 바뀌었는가

  • 유지된 점: 두 경우 모두 RMSE가 MAE보다 더 크게 반응합니다. 큰 실패에 더 민감하다는 해석은 그대로 유지됩니다.
  • 바뀐 점: 큰 실패가 한 점에서 두 점으로 늘어나자 MAE도 더 빠르게 커집니다. 즉, 평균적으로도 많이 틀리고 있다는 신호가 더 강해집니다.
  • 먼저 남길 판단: 한 점짜리 사고인지, 여러 구간에서 반복되는 실패인지에 따라 같은 오차 증가도 전혀 다른 운영 질문으로 이어집니다.

이 비교의 핵심은 회귀 평가를 숫자 읽기에서 실패 구조 읽기로 바꿔 보는 데 있습니다. 문제는 단순히 오차가 커졌는가가 아니라, 어디서, 몇 점에서, 같은 방향으로 실패가 커졌는가입니다. MAE와 RMSE의 차이를 외우는 것보다 큰 실패가 한 점인지 반복 구간인지를 구분하는 훈련이 더 중요합니다.

공통 기록 언어 이번 연습에서 바로 남길 내용
보인 구조 한 점짜리 큰 실패와 여러 점으로 번진 큰 실패는 MAE와 RMSE를 서로 다른 속도로 키웠다
해석 경계 RMSE가 크게 튄 사실만으로 실패 원인이 이상치 하나인지 구조적 누락인지 바로 확정할 수는 없다
다음 질문 큰 오차가 특정 구간에 몰렸는지, 입력 누락이나 비선형 패턴이 반복되는지부터 다시 볼 것인가

이 절의 핵심은 회귀 지표 이름을 더 외우는 일이 아니라, 회귀 평가를 어디까지 함께 봐야 하는지 고정하는 데 있습니다.

같이 봐야 할 것 이 절에서 먼저 읽는 질문 뒤에서 다시 이어질 곳
baseline 오차 직선 모델이 단순 평균 예측보다 실제로 나은가 P4-8 baseline 비교
평균 오차와 큰 실패 구간 전체적으로 얼마나 틀리고, 어디서 유난히 크게 틀리는가 P4-6 회귀 지표
대표 오류 사례 어떤 입력 조건에서 같은 방식으로 반복 실패하는가 P4-18 feature engineering, 뒤 회귀 모델 비교

체크리스트

  • baseline보다 나아졌는지 확인하기 전에 오차 숫자 하나만 보고 결론내리고 있지 않은가?
  • 잔차(residual)가 실제값과 예측값의 차이라는 점을 설명할 수 있는가?
  • 잔차의 부호가 무엇을 뜻하는지 설명할 수 있는가?
  • MAE와 RMSE의 차이를 큰 오차에 대한 민감도로 설명할 수 있는가?
  • R²를 단순 점수처럼만 읽지 않고 baseline 대비 설명력으로 이해했는가?
  • 평균 오차와 큰 실패를 구분해 읽고 있는가?
  • 지표 하나만 보면 해석이 흔들릴 수 있으므로 baseline, 평균 오차, 큰 오차, 잔차 패턴을 함께 봐야 한다는 점을 이해했는가?
  • 큰 오차 구간이 보일 때 원인을 바로 확정하지 않고, 입력 누락이나 비선형 가능성을 다시 확인하고 있는가?
  • 선형회귀의 한계가 대개 직선 하나로는 부족한 문제에서 드러난다는 점을 알고 있는가?
  • 직선 가정이 어긋나는 장면을 한두 가지 예로 들 수 있는가?
  • 좋은 숫자가 나와도 왜 바로 과신하면 안 되는지 설명할 수 있는가?

출처와 참고 자료