데이터 과학

통계적 회귀 분석과 기계학습 회귀 분석

같은 데이터 앞에 두 갈래 길이 있습니다.
식 하나를 구하는 길과 규칙을 만드는 길입니다.

학습 목표

  1. 최소 제곱법이 수많은 직선 가운데 하나를 고르는 기준을 설명할 수 있다.
  2. 최소 제곱법으로 단순 선형 회귀식의 기울기와 절편을 직접 구할 수 있다.
  3. 의사결정트리와 k-최근접 이웃이 회귀 모델을 만드는 방식을 설명할 수 있다.
  4. 같은 데이터를 두 가지 방법으로 분석해 보고 결과가 어떻게 달라지는지 비교할 수 있다.

어떤 선이 가장 좋은 선일까?

중고 자전거 여섯 대의 데이터에 가장 잘 맞는 직선은 y = −6x + 45입니다. 그런데 왜 하필 그 직선일까요?

아래가 그 여섯 대의 데이터입니다. 점 여섯 개 사이로 직선을 그어 보라고 하면, 사람마다 조금씩 다른 선을 그을 것입니다. 아래 세 직선은 모두 「그럴듯해」 보입니다.

사용 연수(년) x 1 2 3 4 5 6
거래 가격(만 원) y 41 30 28 22 12 11

수업에서 원리를 확인하려고 지어낸 값입니다.

y = −5x + 42 y = −6x + 43 y = −6x + 45

모든 점을 지나는 직선은 거의 언제나 없습니다

점이 두 개뿐이라면 그 둘을 지나는 직선이 딱 하나 있습니다. 그러나 점이 셋만 되어도 일직선 위에 놓이는 일은 좀처럼 없고, 데이터가 많아질수록 모두를 지나는 직선은 사실상 존재하지 않습니다. 그러니 「모든 점을 지나는 선」을 찾는 대신 「가장 좋은 선」이 무엇인지 기준을 먼저 정해야 합니다. 사람마다 눈대중이 다르면 결과도 달라지니까요.

벗어난 정도를 어떻게 측정하면 좋을까?

기준을 세우려면 먼저 얼마나 벗어났는지를 숫자로 나타내야 합니다.

점 하나마다 실젯값과 선이 내놓은 예측값이 있습니다. 둘의 차이를 오차(error)라고 합니다. 점이 선보다 위에 있으면 오차가 양수, 아래에 있으면 음수입니다.

실젯값 회귀선이 내놓는 예측값 오차 — 둘 사이의 세로 거리

오차를 그냥 더해 보면

파란 선 y = −6x + 45로 여섯 점의 오차를 직접 구해 봅시다.

사용 연수 x 실젯값 y 예측값 −6x + 45 오차 = 실젯값 − 예측값 오차²
1 41 39 +2 4
2 30 33 −3 9
3 28 27 +1 1
4 22 21 +1 1
5 12 15 −3 9
6 11 9 +2 4
합계 0 28

오차의 합이 0이 되어 버렸습니다

여섯 점 모두 선에서 벗어나 있는데도 합은 0입니다. 양수와 음수가 서로 지워 버렸기 때문입니다. 오차의 합을 기준으로 삼으면 엉뚱한 선도 0점을 받을 수 있으므로 좋은 선을 구별할 수 없습니다.

그래서 제곱해서 더합니다. 제곱하면 음수가 사라지므로 상쇄가 일어나지 않고, 덤으로 크게 벗어난 점일수록 더 큰 벌점을 받게 됩니다. 3만큼 벗어난 점은 1만큼 벗어난 점보다 9배의 몫을 차지합니다.

최소 제곱법(least squares method)

오차 제곱의 합이 가장 작아지는 회귀식을 고르는 방법

세 직선을 같은 기준으로 비교해 봅시다

앞에서 그럴듯해 보였던 직선 셋을 오차 제곱합으로 비교하면 순위가 분명해집니다.

직선 각 점의 오차 오차 제곱합
y = −5x + 42 +4, −2, +1, 0, −5, −1 47
y = −6x + 43 +4, −1, +3, +3, −1, +4 52
y = −6x + 45 +2, −3, +1, +1, −3, +2 28  ← 가장 작다

눈대중 대신 숫자 하나로 우열이 분명해졌습니다. 그리고 최소 제곱법이 찾아 주는 직선은 이 세 개 중에서 고른 것이 아니라, 그을 수 있는 모든 직선 가운데 오차 제곱합이 가장 작은 하나입니다.

오차와 잔차는 다른 말인가요?

실젯값과 예측값의 차이를 잔차(residual)라고도 부릅니다. 엄밀하게는 오차와 잔차를 구별해서 쓰는 경우가 있지만, 지금 단계에서는 같은 것을 가리키는 두 이름으로 알아 두면 충분합니다. 최소 제곱법을 「잔차 제곱합을 최소로 만드는 방법」이라고 설명한 글을 만나도 같은 이야기입니다.

회귀 분석이 잘 통하려면 — 네 가지 가정 (이름까지 외울 필요는 없습니다)

최소 제곱법으로 구한 결과를 믿으려면 데이터가 몇 가지 조건을 어느 정도 갖추어야 합니다. 지금은 「아무 데이터에나 직선을 그으면 되는 것은 아니다」라는 것만 알아 두세요.

가정 뜻
선형성 독립 변수와 종속 변수의 관계가 대체로 곧게 이어져야 한다
독립성 어느 점의 오차가 다른 점의 오차에 영향을 주지 않아야 한다
등분산성 오차가 흩어진 정도가 구간마다 비슷해야 한다
정규성 오차가 0을 가운데 두고 좌우 대칭인 종 모양으로 퍼져 있어야 한다
스스로 확인

제곱 대신 절댓값을 씌워 더해도 부호는 사라집니다. 그런데도 제곱을 쓰는 까닭은 무엇일까요? 크게 벗어난 점 하나가 있을 때 두 방법이 그 점을 얼마나 다르게 대하는지 생각해 보세요.

기울기와 절편을 직접 구해 봅시다

y = −6x + 45가 정말 나오는지 손으로 확인합니다.

수많은 직선을 하나씩 그어 보며 오차 제곱합을 비교할 수는 없습니다. 다행히 오차 제곱합이 가장 작아지는 지점을 수학으로 풀어 두면 기울기와 절편을 바로 구하는 식이 나옵니다. 식을 유도하는 과정은 지금 다루지 않고, 결과인 두 식을 쓰겠습니다.

① 기울기 a

a = (x − x̄)(y − ȳ)의 합
(x − x̄)²의 합

② 절편 b

b = ȳ − a × x̄

x̄(엑스 바)는 독립 변수의 평균, ȳ(와이 바)는 종속 변수의 평균입니다. 순서가 중요합니다. 절편 식 안에 기울기 a가 들어 있으므로 기울기를 먼저 구하고, 그 값으로 절편을 구합니다.

자전거 데이터에 넣어 보기

먼저 두 평균을 구합니다. x̄ = (1+2+3+4+5+6) ÷ 6 = 3.5, ȳ = (41+30+28+22+12+11) ÷ 6 = 144 ÷ 6 = 24. 이제 표를 채웁니다.

x y x − 3.5 y − 24 둘의 곱 (x − 3.5)²
1 41 −2.5 17 −42.5 6.25
2 30 −1.5 6 −9 2.25
3 28 −0.5 4 −2 0.25
4 22 0.5 −2 −1 0.25
5 12 1.5 −12 −18 2.25
6 11 2.5 −13 −32.5 6.25
합계 −105 17.5

① a = −105 ÷ 17.5 = −6

② b = 24 − (−6) × 3.5 = 24 + 21 = 45

처음에 제시한 y = −6x + 45와 같습니다. 이제 그 숫자가 어디에서 나왔는지 알게 되었습니다.

이 식의 위와 아래에는 이름이 있습니다

기울기 식의 분자를 데이터 개수로 나누면 공분산, 분모를 데이터 개수로 나누면 x의 분산이 됩니다. 위아래를 같은 수로 나누므로 결과는 달라지지 않습니다. 그래서 기울기를 「공분산을 x의 분산으로 나눈 값」이라고 설명하기도 합니다. 공분산은 두 속성이 얼마나 함께 움직였는지를 모아 놓은 값이고, 분산은 한 속성이 얼마나 넓게 흩어져 있는지를 나타내는 값입니다.

스스로 확인

절편 식 b = ȳ − a × x̄ 를 옮기면 ȳ = a × x̄ + b 가 됩니다. 이것은 회귀선이 반드시 지나는 점이 하나 있다는 뜻입니다. 어떤 점일까요? 자전거 데이터에서 그 점의 좌표를 구해 산점도 위에 찍어 보세요.

데이터가 100개라면 어떻게 할까?

손으로 표를 채우는 것은 여섯 줄까지입니다. 그다음은 프로그램에 맡깁니다.

엑셀이나 구글 스프레드시트에는 같은 계산을 대신해 주는 기능이 이미 들어 있습니다. 방법은 두 가지입니다.

① 함수로 구하기

독립 변수가 A2:A7에, 종속 변수가 B2:B7에 들어 있다고 하면 이렇게 씁니다.

구하려는 값 입력하는 수식
기울기 =SLOPE(B2:B7, A2:A7) — 종속 변수를 앞에 씁니다
절편 =INTERCEPT(B2:B7, A2:A7)

두 함수 모두 y 범위를 먼저, x 범위를 나중에 씁니다. 순서를 바꾸면 오류가 나지 않고 엉뚱한 값이 조용히 나오므로 주의하세요.

앞에서 만든 표를 그대로 가져오고 싶다면

SUMPRODUCT 함수를 쓰면 우리가 손으로 채운 표를 수식 한 줄로 그대로 옮길 수 있습니다. 분자는 (x − x평균)과 (y − y평균)을 짝지어 곱한 뒤 모두 더한 값, 분모는 (x − x평균)을 자기 자신과 곱해 모두 더한 값이고, 분자를 분모로 나누면 기울기가 됩니다. 절편은 y의 평균 − 기울기 × x의 평균으로 구합니다. SLOPE가 훨씬 짧지만, 안에서 무슨 일이 벌어지는지 확인하고 싶을 때 이 방법이 쓸모 있습니다.

② 차트에 선을 그려 구하기

숫자만 얻는 것보다 산점도 위에 직선이 얹힌 그림을 함께 보는 편이 좋습니다. 데이터가 정말 직선을 따르는지 눈으로 확인할 수 있기 때문입니다.

  1. 독립 변수와 종속 변수 두 열을 함께 선택합니다.
  2. 분산형 차트(산점도)를 넣습니다. 선그래프가 아니라 분산형이어야 합니다.
  3. 차트에 추세선을 추가합니다.
    • 구글 스프레드시트 — 차트 편집기에서 맞춤설정 → 계열 → 추세선
    • 엑셀 — 점 위에서 오른쪽 클릭 후 추세선 추가
  4. 수식과 R²을 화면에 표시하도록 켭니다.
    • 구글 스프레드시트 — 라벨에서 등식 사용, 그리고 R 제곱 표시
    • 엑셀 — 수식을 차트에 표시, R-제곱 값을 차트에 표시

같이 나오는 R²은 무엇일까요?

추세선을 켜면 수식과 나란히 R²이라는 값이 하나 더 나옵니다. 이 모델이 데이터를 얼마나 잘 설명하는지 알려 주는 숫자로, 결정 계수라고 부릅니다. 지금은 「선을 구했다고 끝이 아니라, 그 선이 쓸 만한지 따로 평가해야 한다」는 것만 기억해 두세요.

움직이는 것으로 보고 싶다면

선형 회귀 시뮬레이터는 공식으로 한 번에 구하지 않고, 아무 선에서 시작해 벗어난 정도가 줄어드는 쪽으로 선을 조금씩 옮겨 가며 찾습니다. 그렇게 찾아 도착하는 선은 보폭이 알맞으면 최소 제곱법이 구하는 선과 같습니다. 찾아가는 길이 다를 뿐입니다. 그림을 눌러 점을 더 찍어 보고, 한 걸음의 보폭(학습률)을 크게 했을 때 어떻게 되는지도 해 보세요.

직선으로 담을 수 없는 데이터라면?

최소 제곱법은 직선을 긋기로 이미 정해 놓고 시작합니다.

놀이공원의 인기 놀이기구 앞에서 시각마다 대기 시간을 측정해 보았습니다. 우리가 알고 싶은 것은 「오후 1시 40분쯤 가면 얼마나 기다릴까」입니다.

시각 10시 11시 12시 13시 14시 15시 16시 17시 18시 19시 20시
대기 시간(분) 5 10 15 40 45 50 45 35 25 15 5

수업에서 원리를 확인하려고 지어낸 값입니다.

이 데이터에 최소 제곱법을 그대로 적용하면 어떤 직선이 나올까요? 아래 파란 선이 그 결과입니다.

시각(가로) · 대기 시간(세로) 최소 제곱법이 찾아 준 직선

거의 평평한 직선이 나왔습니다

계산이 잘못된 것이 아닙니다. 이 데이터는 올랐다가 내려가는 산 모양이라 어떤 직선을 그어도 잘 맞을 수 없습니다. 최소 제곱법은 「직선 중에서 가장 나은 것」을 찾아 줄 뿐, 「직선을 써도 되는가」는 묻지 않습니다. 그 판단은 사람의 몫입니다.

그래서 다른 길도 필요합니다. 여기서 볼 기계학습 회귀 분석의 두 방법은 식의 모양을 미리 정해 놓지 않고, 데이터를 어떻게 나눌지 · 누구를 참고할지 같은 규칙을 데이터로부터 직접 만듭니다. 여기서는 대표적인 두 가지를 봅니다.

「통계적」과 「기계학습」은 서로 경쟁하는 사이가 아닙니다

최소 제곱법으로 구하는 선형 회귀는 기계학습 도구 안에도 그대로 들어 있습니다. 여기서 둘을 나눈 기준은 「모델을 하나의 함수식으로 쓰는가, 규칙의 묶음으로 두는가」일 뿐입니다. 실제로 하는 일은 같은 데이터에 두 방법을 모두 적용해 보고 더 잘 맞는 쪽을 고르는 것입니다. 어느 한쪽이 언제나 더 좋다는 뜻이 아닙니다.

구간을 나누어 평균을 답한다면?

의사결정트리(decision tree)는 질문을 던져 데이터를 나누어 나갑니다.

의사결정트리는 「시각이 12시 30분보다 이른가?」 같은 질문을 던져 데이터를 둘로 나누고, 나뉜 쪽에서 또 질문을 던지며 내려갑니다. 분류에서는 맨 끝에서 범주를 답하지만, 회귀에서는 맨 끝에서 숫자를 답합니다. 그 숫자는 그 구간에 들어온 데이터들의 평균입니다.

어디에서 잘라야 할까요?

아무 데나 자르는 것이 아닙니다. 여러 자리에서 잘라 본 뒤, 자르고 나서 각 구간의 오차 제곱합이 가장 작아지는 자리를 고릅니다. 최소 제곱법에서 쓴 것과 같은 잣대가 여기서도 쓰입니다. 방법이 달라도 「벗어난 정도를 제곱해서 더한다」는 기준은 그대로입니다.

시각이 12시 30분보다 이른가?

예 — 10시 ~ 12시

5, 10, 15분

평균 10분

아니오 → 17시 30분보다 이른가? — 예

40, 45, 50, 45, 35분

평균 43분

아니오 → 17시 30분보다 이른가? — 아니오

25, 15, 5분

평균 15분

이 모델이 그리는 선을 그림으로 옮기면 직선이 아니라 계단이 됩니다. 구간이 바뀌는 자리에서만 값이 껑충 뛰고, 구간 안에서는 어디를 물어도 같은 답이 나옵니다.

실제로 측정한 대기 시간 의사결정트리가 내놓는 예측 구간을 자른 자리

좋아진 점

직선이 전혀 담지 못했던 오르내림을 담았습니다. 13시 40분에 가면 43분쯤 기다린다고 답할 수 있고, 이 답은 실제 데이터와 꽤 가깝습니다.

아쉬운 점

구간 안에서는 값이 전혀 변하지 않습니다. 13시에 가든 17시에 가든 모두 43분이라고 답합니다. 실제로는 50분이 될 때도, 40분이 될 때도 있는데 말입니다.

의사결정트리는 회귀 모델과 분류 모델을 모두 만들 수 있습니다. 끝에서 숫자를 답하면 회귀, 범주를 답하면 분류가 됩니다. 구조는 같고 답의 종류만 다릅니다.

가까운 데이터에게 물어본다면?

식도 만들지 않고 구간도 나누지 않는 방법이 있습니다.

k-최근접 이웃(k-nearest neighbor, k-NN)은 예측하려는 지점에서 가장 가까운 k개의 데이터를 찾아 그 종속 변수 값들의 평균을 답으로 내놓습니다. 미리 만들어 두는 것이 없고, 물어볼 때마다 이웃을 찾습니다.

13시 40분에 가면 얼마나 기다릴까?

k = 3 — 가장 가까운 셋에게 묻기

13시 40분에서 가장 가까운 시각은 14시(20분 차) · 13시(40분 차) · 15시(80분 차)입니다.

(45 + 40 + 50) ÷ 3 = 45분

k = 5 — 다섯으로 늘려 보기

12시와 16시가 이웃에 새로 들어옵니다. 12시의 대기 시간은 15분으로 꽤 짧습니다.

(15 + 40 + 45 + 50 + 45) ÷ 5 = 39분

이웃으로 뽑힌 세 점 뽑히지 않은 점 예측한 값

k를 바꾸면 답이 바뀝니다

같은 데이터, 같은 물음인데 45분과 39분이 나왔습니다. k는 데이터가 정해 주는 값이 아니라 우리가 골라야 하는 값입니다.

  • k가 너무 작으면 — 바로 옆 한둘에 휘둘려 튀는 값까지 그대로 따라갑니다. 이렇게 데이터의 우연한 흔들림까지 외워 버리는 것을 과적합이라고 합니다.
  • k가 너무 크면 — 멀리 있는 데이터까지 섞여 차이가 뭉개집니다. 이렇게 있어야 할 특징까지 놓치는 것을 과소적합이라고 합니다.
  • k를 데이터 개수만큼 키우면 어디를 물어도 같은 답이 나옵니다. 여기서는 언제 가도 약 26분이라고 답하게 됩니다. 예측이라 부르기 어려울 것입니다.
「가깝다」는 것을 측정하는 방법도 여러 가지입니다

우리 예처럼 속성이 하나(시각)뿐이면 거리를 측정하기가 쉽습니다. 그러나 속성이 둘 이상이면 「가깝다」를 어떻게 측정할지 정해야 합니다.

유클리드 거리 — 두 점을 곧게 이은 길이 맨해튼 거리 — 축을 따라 꺾어 간 길이

보통은 유클리드 거리를 씁니다. 또 가까운 이웃의 의견에 더 큰 몫을 주는 방법도 있습니다. 이름까지 외울 필요는 없고, 거리를 측정하는 방식에 따라 결과가 달라진다는 것만 알아 두세요.

대가도 있습니다

k-최근접 이웃은 미리 만들어 두는 식이 없어서 학습이랄 것이 거의 없습니다. 대신 예측할 때마다 모든 데이터와의 거리를 다시 계산해야 합니다. 데이터가 수십만 개라면 답 하나를 얻는 데도 시간이 걸립니다. 일을 앞에서 하느냐 뒤에서 하느냐의 차이입니다.

스스로 확인

k = 1로 두면 가장 가까운 하나의 값을 그대로 답으로 씁니다. 이때 모든 데이터 지점에서 예측이 정확히 들어맞게 됩니다. 그렇다면 k = 1이 가장 좋은 선택일까요? 새로 들어온 데이터를 예측할 때 무슨 일이 벌어질지 생각해 보세요.

두 길은 무엇이 어떻게 다를까?

같은 데이터를 두고 나란히 비교해 봅시다.

비교 항목 통계적 회귀 분석 기계학습 회귀 분석
대표 방법 최소 제곱법으로 구한 선형 회귀 의사결정트리, k-최근접 이웃
모델의 모습 함수식 하나. 기울기와 절편 두 숫자면 끝난다 규칙의 묶음. 나누는 기준이나 이웃을 찾는 절차로 되어 있다
그린 선의 모양 곧게 뻗은 직선 계단(트리) 또는 들쭉날쭉한 선(k-최근접 이웃)
읽어 내기 쉽다. 「1년 더 오래 탄 자전거가 6만 원 싸더라」처럼 말로 옮길 수 있다 어렵다. 대신 곧지 않은 관계를 그대로 반영한다
잘 맞는 상황 관계가 대체로 곧게 이어질 때 오르내리거나 꺾이는 관계일 때
데이터 범위 밖 선을 늘여 답을 낸다. 그럴듯해 보이지만 근거가 없다 맨 끝 구간이나 이웃의 값을 계속 반복한다

「데이터 범위 밖」 줄을 눈여겨보세요

자전거 직선 y = −6x + 45에 사용 연수 8년을 넣으면 −6 × 8 + 45 = −3, 곧 가격이 음수(−3만 원)가 나옵니다. 직선은 데이터가 하나도 없는 곳까지 거침없이 뻗어 나갑니다. 반면 의사결정트리와 k-최근접 이웃은 아예 밖으로 나가지 못합니다. 21시를 물어도 마지막 구간의 값인 15분을 반복할 뿐입니다. 어느 쪽도 데이터 밖을 정말로 아는 것은 아닙니다. 틀리는 방식만 다를 뿐입니다.

그래서 결론은 「둘 다 해 본다」입니다

표를 아무리 살펴보아도 어느 쪽이 좋은지는 데이터를 봐야 알 수 있습니다. 자전거 데이터는 직선이 잘 맞았고, 놀이공원 데이터는 계단이 잘 맞았습니다. 실제 분석에서는 같은 데이터에 두 방법을 모두 적용해 보고, 결과를 숫자로 비교해 고릅니다. 그러려면 「잘 맞는다」를 숫자로 측정하는 방법이 있어야 합니다.

스스로 확인

중고 자전거 데이터에 의사결정트리를 적용하면 어떤 모양의 선이 나올까요? 그리고 「사용 연수가 1년 더 길면 6만 원 싸다」처럼 한 문장으로 요약할 수 있을까요? 없다면, 그것이 왜 아쉬운 일인지 이야기해 보세요.

핵심 정리

최소 제곱법

least squares method

  • 오차 = 실젯값 − 예측값
  • 그냥 더하면 부호가 상쇄되므로 제곱해서 더한다
  • 오차 제곱합이 가장 작은 회귀식을 고른다
  • 직선 가운데 가장 나은 것을 찾을 뿐, 직선을 써도 되는지는 묻지 않는다. 그 판단은 사람이 한다

기울기와 절편 구하기

통계적 수치 찾기

  • 기울기 = (x−x̄)(y−ȳ)의 합 ÷ (x−x̄)²의 합
  • 절편 = ȳ − 기울기 × x̄
  • 기울기가 먼저다. 스프레드시트에서는 SLOPE · INTERCEPT

의사결정트리 회귀

decision tree

  • 질문으로 구간을 나누고 각 구간의 평균을 답한다
  • 자르는 자리는 오차 제곱합이 가장 작아지는 곳
  • 선이 계단 모양이 된다. 구간 안에서는 답이 같다

k-최근접 이웃 회귀

k-nearest neighbor

  • 가장 가까운 k개의 값을 평균내어 답한다
  • k가 작으면 과적합, 크면 과소적합
  • 학습은 가볍지만 예측할 때마다 거리를 다시 측정한다

확인 퀴즈

배운 내용을 확인해 봅시다.

Q1

최소 제곱법에서 오차를 그냥 더하지 않고 제곱해서 더하는 가장 중요한 까닭은?

Q2

최소 제곱법으로 회귀식을 구할 때 순서가 정해져 있는 까닭은?

Q3

놀이공원 대기 시간 데이터에 최소 제곱법을 적용했더니 거의 평평한 직선이 나왔습니다. 이것이 뜻하는 바는?

Q4

회귀에 쓰이는 의사결정트리가 맨 끝 노드에서 내놓는 값은?

Q5

k-최근접 이웃에서 k를 너무 크게 잡으면 어떤 일이 벌어지나?