단원 홈
2단원 · 6차시

출석 번호로 시험 점수를 맞힐 수 있을까
쓸모 있는 특성 고르기

5차시에서 우리는 단위가 다른 특성을 같은 자리에 세우는 법(정규화)을 배웠습니다. 그런데 그보다 먼저 답해야 할 물음이 있어요 — 애초에 어떤 특성을 넣을 것인가. 오늘은 특성을 재고, 고르고, 잘못 고르면 무슨 일이 나는지를 직접 돌려서 봅니다.

성취기준 12인기02-02
상관계수상관과 인과 잡음 특성잔차 특성 공학원-핫 인코딩
🎯 학습 목표
  • 두 값이 함께 오르내리는 정도를 상관계수 r로 재고, 그 식을 손으로 한 번 따라갈 수 있다.
  • 상관이 높다는 말과 원인이라는 말이 왜 다른지, 숨은 제3의 변수를 데이터로 드러내 설명할 수 있다.
  • 쓸모없는 특성을 넣으면 훈련 오차와 시험 오차가 서로 반대로 움직인다는 것을 직접 재어 확인한다.
🤔

여는 장면 — 여섯 개 중 무엇을 넣을까

어느 반 학생 열 명의 기록입니다. 이번 시험 점수를 미리 맞혀 보는 프로그램을 만들려고 합니다. 쓸 수 있는 정보가 여섯 가지 있어요.

학생공부시간수면시간지난점수 신발크기출석번호무작위값이번 점수
A1.065825070.3758
B2.086427020.9161
C2.5770255100.1470
D3.056628040.6268
E3.577826510.0579
F4.067424590.8877
G4.588527530.2988
H5.078226060.7184
I5.569028580.4492
J6.079325050.1995
단위 — 공부시간(시간) · 수면시간(시간) · 지난점수(점) · 신발크기(mm) · 출석번호(번) · 무작위값(0~1 사이의 아무 숫자). 이 열 명은 6차시 실습 코드에 글자로 박혀 있는 데이터입니다.

먼저 예측해 봅시다. 여섯 개 중 예측에 쓸 두 개를 눈으로 골라 보세요. 아마 대부분 공부시간과 지난점수를 고를 거예요. 그리고 출석번호는 아무도 고르지 않겠지요. 당연합니다 — 출석 번호는 이름 순서로 붙은 번호일 뿐이니까요.

그런데 여기서 물음이 하나 생깁니다. '당연하다'는 느낌을 숫자로 바꿀 수 있을까요? "공부시간은 관계가 있어 보인다"와 "출석번호는 관계가 없어 보인다" 사이에는 몇 점짜리 차이가 있을까요. 사람이 열 줄을 눈으로 훑는 것은 되지만, 특성이 100개, 데이터가 10만 줄이면 눈으로는 못 합니다.

⚠️ 오늘 진짜로 놀랄 자리는 따로 있다

표의 맨 오른쪽에 무작위값이라는 열이 있습니다. 컴퓨터가 아무렇게나 뽑은 0~1 사이 숫자예요. 점수와는 정말로 아무 관계가 없습니다. 그러니 관계의 세기를 재면 0이 나와야 합니다. 오늘 그 값을 실제로 재 보면 −0.31이 나옵니다. 이 숫자가 어디서 왔는지가 오늘 수업의 중심입니다.

1

관계의 세기를 숫자 하나로 — 상관계수 r

두 값이 함께 오르내리는 정도를 −1에서 +1 사이의 숫자 하나로 나타낸 것을 상관계수(correlation coefficient) r이라고 합니다.

📈

r = +1

한쪽이 오르면 다른 쪽도 정확히 비례해서 오른다. 점을 찍으면 오른쪽 위로 향하는 직선에 딱 놓인다.

🌫️

r = 0

한쪽이 올라도 다른 쪽은 오르는 쪽도 내리는 쪽도 아니다. 점이 사방으로 흩어진다.

📉

r = −1

한쪽이 오르면 다른 쪽이 정확히 비례해서 내린다. 오른쪽 아래로 향하는 직선.

바위 위에 놓인 금속 버니어 캘리퍼스. 본자에 0부터 15까지 센티미터 눈금이, 위쪽에 인치 눈금이 새겨져 있다
길이를 재는 버니어 캘리퍼스 — 같은 자에 센티미터와 인치, 두 단위의 눈금이 함께 새겨져 있다. 출처: R. Henrik Nilsson, Wikimedia Commons (CC BY 4.0)
벽에 걸린 막대 온도계. 왼쪽에 섭씨(C), 오른쪽에 켈빈(K) 눈금이 있고 빨간 액체 기둥이 섭씨 10도와 20도 눈금의 한가운데쯤, 15도 가까이에 멈춰 있다
온도를 재는 온도계 — 왼쪽은 섭씨(C), 오른쪽은 켈빈(K). 같은 온도도 단위에 따라 다른 숫자로 읽힌다. 출처: Martinvl, Wikimedia Commons (CC BY-SA 3.0)

5차시에서 우리는 이런 자로 잰 값들을 나란히 세우는 법을 배웠습니다. 오늘 재려는 것은 길이도 온도도 아닌 관계예요. 그런데 재는 일에는 언제나 눈금과 단위가 필요합니다. 위의 두 자는 단위가 둘씩이라 같은 것을 재도 숫자가 달라지지요. 상관계수 r도 하나의 눈금인데, 단위가 없습니다 — 어떤 두 값을 재든 −1과 +1 사이의 같은 눈금으로 나옵니다. 그래서 ‘공부시간 ↔ 점수’와 ‘기온 ↔ 잔반량’처럼 전혀 다른 두 관계를 같은 자리에 놓고 견줄 수 있어요.

식이 왜 그렇게 생겼나

식을 외우기 전에 무엇을 재려는지부터 봅시다. “함께 움직인다”는 말은 “한쪽이 자기 평균보다 클 때 다른 쪽도 자기 평균보다 크다”는 뜻입니다. 그러니 각자 자기 평균에서 얼마나 벗어났는지를 재서 곱하면 됩니다.

  • 둘 다 평균보다 크면 → (양수) × (양수) = 양수
  • 둘 다 평균보다 작으면 → (음수) × (음수) = 양수
  • 하나는 크고 하나는 작으면 → (양수) × (음수) = 음수

이 곱을 모두 더한 값이 분자입니다. 함께 움직이면 양수가 쌓이고, 반대로 움직이면 음수가 쌓이고, 아무 규칙이 없으면 서로 상쇄되어 0 근처가 됩니다.

그런데 이 값만으로는 곤란합니다. 점수를 100점 만점 대신 1000점 만점으로 바꾸면 분자가 10배가 되어 버려요. 관계의 세기는 그대로인데 숫자만 커집니다. 그래서 각자 벗어난 정도(제곱합의 제곱근)로 나눠 −1~+1 안에 눌러 넣습니다. 이것이 분모입니다.

      Σ (x − x̄)(y − ȳ)          ← 함께 벗어난 정도를 모두 더한다
r = ───────────────────────────
    √Σ(x − x̄)² · √Σ(y − ȳ)²     ← 각자 벗어난 정도로 나눠 −1~1 로 만든다

손으로 한 번 따라가 보기 — 앞 다섯 명만

열 명을 다 계산하기 전에, 앞 다섯 명(A~E)의 공부시간과 점수만 떼어 손으로 해 봅시다. 평균은 공부시간 2.4시간, 점수 67.2점입니다.

학생x 공부시간x − x̄y 점수y − ȳ (x−x̄)(y−ȳ)(x−x̄)²(y−ȳ)²
A1.0−1.458−9.2+12.881.9684.64
B2.0−0.461−6.2+2.480.1638.44
C2.5+0.170+2.8+0.280.017.84
D3.0+0.668+0.8+0.480.360.64
E3.5+1.179+11.8+12.981.21139.24
합—0—0 29.103.70270.80
세로줄 「x − x̄」와 「y − ȳ」의 합이 언제나 0이 되는 것을 확인해 두세요. 평균에서 벗어난 정도를 모두 더하면 반드시 0입니다 — 평균의 정의가 그렇습니다.

분모를 마저 구합니다. √3.70 = 1.9235, √270.80 = 16.4560. 그러면

r = 29.10 ÷ (1.9235 × 16.4560) = +0.9193

다섯 명으로 재니 +0.9193입니다. 그런데 열 명을 다 넣고 재면 +0.9721이 나옵니다. 같은 관계인데 값이 달라졌어요. 이 차이를 기억해 두세요. 개념 2에서 다시 만납니다.

눈으로 익히기 — r이 다르면 그림이 어떻게 다른가

열 명의 점수를 세로축에 두고, 가로축을 세 가지로 바꿔 가며 점을 찍었습니다.

55100 55100 55100 공부시간 → 출석번호 → 무작위값 → r = +0.9721 r = +0.0144 r = −0.3057 점수 ↑

같은 열 명, 같은 세로축(점수). 가로축만 바꿨습니다. 왼쪽은 오른쪽 위로 거의 직선을 이루고, 가운데는 아무 방향도 없으며, 오른쪽은 살짝 오른쪽 아래로 기울어 보입니다 — 그런데 그 기울기는 우연입니다.

반례 — r이 0인데 관계가 완벽할 수 있다

상관계수는 직선 관계만 잽니다. 그래서 이런 일이 생깁니다.

−3−10 13 90 y = x² · r = 0.0000

x를 알면 y가 완벽하게 정해집니다(y = x²). 그런데 상관계수는 정확히 0입니다. 왼쪽 절반은 내려가고 오른쪽 절반은 올라가서, 분자의 양수와 음수가 딱 상쇄되기 때문이에요.

⚠️ r = 0은 “관계가 없다”가 아니다

r = 0은 “직선 관계가 없다”는 뜻일 뿐입니다. 위 그림처럼 곡선 관계는 잡지 못해요. 그래서 상관계수를 볼 때는 숫자만 보지 말고 점을 찍어 눈으로도 확인해야 합니다. 오늘 개념 5에서 이것과는 또 다른 방향의 실패를 만납니다 — 관계가 있는데도 r이 0 근처로 나오는 경우예요.

2

−0.31의 정체 — 표본이 적으면 우연이 상관을 만든다

열 명의 여섯 가지 정보를 전부 재면 이렇게 나옵니다.

특성r (두 자리)r (네 자리)막대읽는 법
지난점수+0.99+0.9935 ++++++++++++++++++++거의 직선. 가장 센 관계
공부시간+0.97+0.9721 +++++++++++++++++++역시 아주 세다
수면시간+0.16+0.1613 +++있는 듯 없는 듯
신발크기+0.16+0.1568 +++있는 듯 없는 듯
출석번호+0.01+0.0144 +사실상 관계 없음 — 예상대로
무작위값−0.31−0.3057 −−−−−−왜 0이 아닌가?
실습 코드가 화면에 찍어 주는 값입니다. 두 자리로 반올림한 것이 왼쪽, 네 자리까지가 오른쪽입니다.

여기서 멈춰 생각해 봅시다. 출석번호(+0.01)는 우리가 예상한 대로입니다. 아무 관계가 없으니 0 근처가 나왔어요. 그런데 무작위값은 출석번호보다도 더 관계가 없는 숫자입니다. 컴퓨터가 아무렇게나 뽑았으니까요. 그런데 왜 −0.31일까요?

어떤 학생은 이렇게 말할지도 모릅니다. “혹시 무작위값 안에 뭔가 숨은 규칙이 있나?” 아닙니다. 답은 훨씬 심심하고, 훨씬 중요합니다 — 열 명밖에 안 되기 때문입니다.

200번 되풀이해서 확인하기

서로 아무 관계가 없는 두 수열을 만들어 r을 재는 일을 200번 되풀이해 봅시다. “관계가 없으니 r은 0”이 맞다면 200번 다 0 근처가 나와야 합니다. 실제 결과는 이렇습니다.

사람 수|r| 평균|r| 최대 |r| > 0.3 인 횟수|r| > 0.6 인 횟수
10명0.28190.8269 85 / 200 (42.5%)15 / 200
30명0.13100.565014 / 200 (7.0%)0 / 200
100명0.08120.27240 / 2000 / 200
300명0.04530.25650 / 2000 / 200
1000명0.02430.08080 / 2000 / 200
서로 아무 관계 없는 두 난수열의 상관계수를 200번씩 잰 결과입니다. 실습 코드 【2】가 그대로 찍어 줍니다.

읽어 봅시다. 열 명일 때는, 아무 관계 없는 두 수열에서도 |r|이 0.3을 넘는 일이 200번 중 85번(42.5%)입니다. 거의 절반이에요. 최대 0.8269까지 나왔습니다. 0.83이면 누구라도 “이건 관계가 있다”고 말할 값이지요.

사람 수를 늘리면 |r| 평균이 0.2819 → 0.1310 → 0.0812 → 0.0453 → 0.0243으로 착실히 0 쪽으로 내려갑니다. 1000명이면 |r|이 0.3을 넘는 일이 200번 중 0번이에요.

ℹ️ 그럼 30명이면 안전한가

아닙니다. 30명도 200번 중 14번은 |r|이 0.3을 넘습니다. 7%예요. 표본을 늘리면 우연히 생기는 상관이 0에 가까워질 뿐, 0이 되지는 않습니다. “몇 명이면 안심해도 되나”에 딱 떨어지는 답은 없어요. 대신 같은 실험을 여러 번 되풀이해 보는 것이 훨씬 강한 증거가 됩니다 — 사람 수를 한 번 늘려 본 결과는 그 자체가 또 하나의 우연이니까요.

개념 1로 돌아가 보면

앞에서 우리는 앞 다섯 명만으로 r을 계산했지요. 그때 다른 특성도 같이 재 보면 이런 값이 나옵니다.

특성앞 다섯 명(5명)열 명 전부(10명)무슨 일이 났나
공부시간+0.9193+0.9721 진짜 관계는 사람이 늘어도 남는다
출석번호−0.2775+0.0144 다섯 명만 보면 “관계 있음”처럼 보인다
무작위값−0.6518−0.3057 −0.65! 부호까지 그럴듯하다
앞 다섯 명은 열 명에서 앞부분만 떼어 온 것입니다. 데이터를 바꾼 것이 아니라 덜 본 것뿐인데 결론이 이렇게 달라집니다.

다섯 명만 봤다면 우리는 “출석 번호가 작을수록 점수가 높다(−0.28)”는 엉뚱한 결론에 이를 뻔했습니다. 열 명으로 늘리자 그 값은 +0.0144로 사그라들었어요. 데이터가 적을 때 상관계수를 믿는 것이 왜 위험한지, 이 한 줄이 보여 줍니다.

💡 오늘 기억할 문장 하나

“r이 0이 아니다”와 “관계가 있다”는 같은 말이 아니다. 표본이 적으면 우연만으로도 r은 0에서 멀어집니다. 특성이 쓸모 있는지 없는지를 r 하나로 판정하려면 사람이 충분히 많아야 해요.

3

아이스크림을 금지하면 물놀이 사고가 줄어들까

이번에는 24개월치 기록을 봅시다. 세 가지를 달마다 적어 두었어요 — 그달의 평균 기온, 아이스크림 판매량, 물놀이 사고 건수입니다. 앞 12개월은 이렇습니다.

달123456 789101112
기온(℃)138141923 2728231793
아이스크림(만 개)58.973.4113.2240.7264.0323.1 350.1372.1336.6239.7151.579.6
물놀이 사고(건)1.43.97.38.810.212.8 15.114.413.69.37.03.2
⚠️ 이 표는 실제 통계가 아닙니다. 이 수업을 위해 지어낸 24개월치 자료예요. 지어낸 데이터인 것이 오히려 중요합니다 — 우리가 무엇을 심었는지 우리가 알기 때문입니다.

아이스크림과 사고의 상관을 재면 r = +0.9716입니다. 거의 +1이에요. 개념 1의 기준으로 보면 지난점수(+0.99)에 맞먹는 아주 센 관계입니다. 그렇다면 이렇게 말해도 될까요?

“아이스크림을 금지하면 물놀이 사고가 줄어든다.”

안 됩니다. 왜 안 되는지를 데이터로 보이겠습니다. 먼저 세 번째 열, 기온과의 상관을 재 봅시다.

무엇과 무엇r읽는 법
아이스크림 ↔ 사고+0.9716함께 오르내린다
기온 ↔ 아이스크림+0.9911더워지면 아이스크림이 팔린다
기온 ↔ 사고+0.9821더워지면 물에 들어간다

세 값이 전부 0.97 위입니다. 즉 기온이 두 가지를 동시에 밀어 올리고 있습니다. 아이스크림과 사고는 서로를 일으키는 것이 아니라, 같은 것에 함께 끌려다니는 중이에요. 이렇게 뒤에 숨어서 둘을 함께 움직이는 것을 숨은 변수(confounder)라고 합니다.

① A가 B를 일으킨다 A B 공부시간 → 점수 ② B가 A를 일으킨다 A B 아플수록 병원에 간다 ③ 숨은 C가 둘을 민다 C (기온) A 아이스크림 B 사고 A와 B 사이에는 화살표가 없다

r이 높게 나오는 까닭은 적어도 세 가지입니다. 상관계수는 이 셋을 구별하지 못합니다. 어느 쪽인지는 데이터가 아니라 세상에 대한 우리의 지식으로 판단해야 해요.

기온의 몫을 덜어 내 보면

말로만 하지 말고 재 봅시다. 기온으로 아이스크림 판매량을 예측하는 직선을 하나 긋고, 실제 값에서 그 예측을 뺍니다. 남은 것이 잔차(residual)입니다. 사고 건수에도 같은 일을 합니다. 그런 다음 남은 것끼리 상관을 재요.

언제r(아이스크림, 사고)
그냥 잰 값+0.9716
기온의 몫을 각각 덜어 내고 남은 것끼리 −0.0680
+0.9716이 −0.0680으로 사라졌습니다. 둘을 함께 오르내리게 한 것은 아이스크림이 아니라 기온이었다는 뜻입니다.

그래도 예측에는 쓸 수 있을까 — 재 보자

여기서 조심할 것이 있습니다. “인과가 아니다”가 “쓸모없다”는 말은 아닙니다. 사고 건수를 예측하는 세 가지 방법을 실제로 만들어 오차를 재 보면 이렇습니다.

무엇으로 사고를 예측하나오차(RMSE)아이스크림 계수
아이스크림만0.9918+0.03682
기온만0.7902(안 씀)
기온 + 아이스크림0.7884 −0.00365
RMSE는 오차를 제곱해 평균 낸 뒤 제곱근을 씌운 값입니다. 작을수록 잘 맞힌 것이에요. 회귀는 9차시에서 제대로 배웁니다. 여기서는 성능을 재는 자로만 씁니다.

읽어 봅시다. 아이스크림만으로도 꽤 맞힙니다(0.9918). 그러니 “예측에 쓸 수 있느냐”는 물음의 답은 예입니다. 그런데 기온을 이미 알고 있으면 이야기가 달라져요. 0.7902에서 0.7884로, 아이스크림이 줄여 주는 오차가 거의 없습니다. 그때 아이스크림의 계수는 −0.00365 — 0에 딱 붙습니다. 더 보탤 정보가 없다는 뜻이에요.

⚠️ 예측하는 것과 개입하는 것은 다르다

아이스크림 판매량을 보고 “오늘 사고가 몇 건쯤 나겠다”고 짐작하는 것은 됩니다. 하지만 “아이스크림을 금지해서 사고를 줄이자”는 안 됩니다. 금지해도 더위는 그대로고, 사람들은 그대로 물에 들어갈 테니까요.
데이터는 “함께 움직였다”까지만 말해 줍니다. 무엇이 무엇을 일으켰는지는 말해 주지 않습니다. 이 구분은 3단원에서 인공지능의 사회적 영향을 다룰 때 다시 크게 쓰입니다.

4

쓸모없는 특성은 그냥 무시될까 — 아니다

학생들이 흔히 하는 생각이 있습니다. “쓸모없는 특성이면 기계가 알아서 무시하겠지. 그러니까 일단 다 넣고 보자.” 그럴듯합니다. 정말 그런지 실제로 재 봅시다.

이번에는 학생 260명짜리 데이터를 씁니다. 이 데이터는 우리가 만들었기 때문에 점수를 정하는 진짜 규칙을 우리가 압니다.

점수 = 5.0 × 공부시간 + 0.55 × 지난점수 + 20.0 + (약간의 흔들림)

즉 점수를 정하는 것은 공부시간과 지난점수 둘뿐입니다. 여기에 아무 뜻 없는 특성 열세 개(출석번호 하나와 난수 열두 개)를 나란히 붙여 두었어요. 이 열세 개는 점수와 정말로 아무 관계가 없습니다.

ℹ️ 훈련 데이터와 테스트 데이터를 미리 빌려 쓴다

아래 표에는 훈련 오차와 시험 오차가 따로 나옵니다. 260명 중 앞에서부터 몇 명만 보여 주고(훈련 데이터), 보여 주지 않은 200명으로 시험을 봅니다(테스트 데이터).
이렇게 훈련 데이터와 테스트 데이터를 가르는 법은 11차시에서 제대로 배웁니다. 오늘은 미리 빌려 씁니다 — 그렇게 하지 않으면 “쓸모없는 특성을 넣으면 어떻게 되나”를 아예 잴 수가 없기 때문이에요. 지금은 이렇게만 기억하면 됩니다. 훈련 오차는 “외운 것을 얼마나 잘 되뇌나”, 시험 오차는 “처음 보는 사람을 얼마나 잘 맞히나”.

훈련 인원 특성 2개
진짜 둘만
특성 4개특성 6개 특성 10개
난수 잔뜩
훈련시험훈련시험훈련시험훈련시험
10명2.0733.9792.0433.966 1.7484.5410.0005.285
16명3.4272.8793.4022.932 3.1263.4212.8494.185
20명3.2932.8983.2572.981 3.1623.1722.9293.942
30명2.9972.8782.9852.867 2.9382.9342.9003.155
60명2.7392.9272.6872.977 2.5603.0882.5103.290
칸의 값은 RMSE(점)입니다. 시험은 언제나 같은 200명으로 봅니다. 왼쪽에서 오른쪽으로 갈수록 아무 뜻 없는 특성이 늘어납니다.

표에서 세 가지를 읽는다

  • 훈련 오차는 예외 없이 내려간다. 스무 칸을 왼쪽에서 오른쪽으로 훑어보세요. 한 번도 올라가지 않습니다. 이건 우연이 아니라 수학이에요 — 최소제곱은 오차 제곱을 줄이도록 맞추므로, 손잡이(특성)가 늘면 줄일 여지도 늡니다. 새 특성이 순전한 난수여도 그렇습니다. 난수의 우연한 들쭉날쭉함까지 외워 버려요.
  • 시험 오차는 대체로 올라간다. “반드시”가 아니라 “대체로”입니다. 스무 칸 중 두 칸(훈련 10명·4개, 훈련 30명·4개)은 아주 조금 내려갔어요. 우연입니다. 훈련 쪽은 예외가 없고, 시험 쪽은 예외가 있습니다. 이 차이를 정확히 말할 줄 아는 것이 오늘의 공부입니다.
  • 가장 무서운 칸은 왼쪽 맨 아래. 훈련 10명에 특성 10개를 넣으면 훈련 오차가 0.000이 됩니다. 한 명도 안 틀렸어요. 그런데 시험 오차는 5.285로 이 표에서 가장 나쁩니다.
⚠️ 훈련 오차 0은 좋은 소식이 아니다

맞출 값이 10개인데 손잡이가 11개 (특성 10 + 절편 1)입니다. 미지수가 식보다 많으니 무엇이든 완벽히 외울 수 있어요. 기계는 “공부시간이 많으면 점수가 높다”를 배운 것이 아니라 “3번 학생은 82.7점”을 통째로 외운 것입니다. 처음 보는 사람 앞에서 그 외운 것은 아무 쓸모가 없지요. 이것이 과적합(overfitting)입니다 — 11차시에서 정면으로 다룹니다.

왜 그런가 — 두 가지 까닭

🌫️ 잡음이 신호를 흐린다

  • 난수 열두 개 중 하나쯤은 우연히 점수와 함께 움직인다(개념 2).
  • 기계는 그 우연을 규칙으로 받아들이고 가중치를 준다.
  • 새 사람에게 그 우연은 다시 나타나지 않는다.
+

📦 데이터가 성겨진다

  • 특성이 1개면 데이터는 선 위에 놓인다.
  • 2개면 평면, 3개면 공간… 특성이 늘 때마다 자리가 폭발한다.
  • 같은 20명이 훨씬 넓은 자리에 흩어져 이웃이 사라진다 — 이것을 차원의 저주라고 부른다.

중복된 특성 — 나쁘지는 않지만 보태는 것도 없다

쓸모없는 특성 말고, 이미 있는 특성과 거의 같은 특성을 넣으면 어떻게 될까요? 키와 발 크기를 둘 다 넣는 경우가 그렇습니다. 사람의 키와 발 크기는 아주 세게 함께 움직여요. 그러면 발 크기가 새로 알려 주는 것이 거의 없습니다.

개념 3에서 우리는 이미 이 장면을 봤습니다. 기온을 이미 알고 있을 때 아이스크림의 계수가 −0.00365로 0에 붙던 것 — 바로 그것이에요. 중복 특성은 잡음처럼 성능을 크게 망치지는 않지만, 대신 가중치가 둘 사이에 아무렇게나 나뉘어 모델을 설명하기 어렵게 만듭니다. “키의 영향이 얼마인가”를 물었을 때 답이 흔들리게 되지요.

5

상관계수 하나로 특성을 버리면 안 되는 까닭

지금까지의 이야기는 한 방향이었습니다 — “관계 없는 특성은 빼라.” 그런데 반대 방향의 사고도 있습니다. 쓸모 있는 특성이 상관계수 순위에서 조용히 탈락하는 것이에요. 2차시의 급식 데이터로 돌아가 그 장면을 만나 봅시다.

점심시간 전의 빈 학교 급식실. 긴 식탁마다 투명 칸막이가 서 있고 자줏빛 의자가 줄지어 놓여 있다
점심시간을 기다리는 한 학교의 급식실. 날마다 이런 곳에서 남은 음식의 무게가 쌓입니다. 2차시 마지막에 스무 날치 잔반 기록을 따로 떼어 두었지요 — 6차시가 이어받을 몫이었어요. 그때 가진 특성은 요일 하나뿐이었습니다. 오늘 두 개를 더 붙입니다. 출처: 김신주, Wikimedia Commons (CC BY-SA 4.0)

2차시는 그 스무 날치로 두 가지 기준선을 세웠지요.

어떻게 예측하나평균 오차뜻
기준선 ① 늘 전체 평균(13.4kg)이라고 답한다3.18 kg 아무것도 안 본 것과 같다
기준선 ② 요일별 평균으로 답한다0.70 kg 요일 하나로 4.5배 줄었다
2차시가 이 스무 날치로 정한 합격선이 0.70kg이었습니다. (이 스무 날치는 요일 패턴이 유난히 또렷하게 지어진 연습용 데이터입니다. 2차시의 예순 날치에서는 같은 일이 이만큼 크게 일어나지 않습니다.)

2차시는 여기서 물음 하나를 남겨 두었습니다 — “날씨나 행사를 더하면 어디까지 내려갈까? 6차시에서 실제로 재 본다.” 오늘 그 값을 확정합니다.

새 특성 둘의 상관을 재면 — 둘 다 버려야 할 것처럼 보인다

같은 스무 날에 그날 낮 기온과 학교 행사가 있었는지를 덧붙였습니다. 개념 1에서 배운 대로 상관계수를 재 봅시다.

특성잔반량과의 r순위만 보면?
그날 낮 기온(℃)+0.15210에 가깝다 → 버린다
학교 행사 여부(0/1)−0.0413더 0에 가깝다 → 버린다

둘 다 0 근처입니다. 개념 2에서 배운 것을 떠올리면 스무 날짜리 데이터에서 |r| 0.15는 우연으로도 흔히 나오는 값이에요. 그러니 “쓸모없는 특성”이라고 결론 내리고 버려도 될 것 같습니다.

그런데 그러면 안 됩니다. 왜 그런지 보려면, 이 데이터에서 잔반량을 지배하는 것이 무엇인지부터 봐야 해요.

요일월화수목금
네 주치 잔반(kg)10 · 11 · 9 · 1213 · 12 · 14 · 13 20 · 21 · 19 · 2214 · 15 · 13 · 149 · 8 · 10 · 9
요일별 평균10.513.0 20.514.09.0
수요일이 20.5kg, 금요일이 9.0kg. 요일 하나가 오르내림을 통째로 지배합니다. 기온이 만드는 차이는 이 큰 파도에 완전히 묻혀 버려요.

요일의 몫을 덜어 내고 다시 재면

개념 3에서 배운 잔차를 여기서도 씁니다. 각 날의 잔반량에서 그 요일의 평균을 뺍니다. 남는 것이 “요일로는 설명되지 않는 부분”이에요.

잔차 = [-0.5, 0.0, -0.5, 0.0, 0.0,  0.5, -1.0, 0.5, 1.0, -1.0,
        -1.5, 1.0, -1.5, -1.0, 1.0,  1.5, 0.0, 1.5, 0.0, 0.0]

이 잔차와 기온·행사의 상관을 다시 재 봅시다.

0 0.25 0.50 0.75 1.00 기온 ↔ 잔반량 +0.1521 기온 ↔ 요일 잔차 +0.7420 행사 ↔ 잔반량 −0.0413 행사 ↔ 요일 잔차 +0.4697 회색 막대만 보고 버렸다면, 초록 막대를 잃는다

같은 특성, 같은 스무 날입니다. 재는 상대만 바꿨을 뿐인데 +0.15가 +0.74로, −0.04가 +0.47로 바뀌었습니다.

숨어 있었던 겁니다. 요일이라는 큰 파도가 잔반량의 오르내림을 통째로 지배하는 바람에, 기온의 효과가 그 밑에 깔려 원자료 상관으로는 보이지 않았던 것이에요.

그래서 오차는 얼마나 내려갔나

쓴 특성평균 오차기준선 ②에 견주면
요일만 (= 2차시의 합격선)0.7000 kg—
요일 + 기온0.5091 kg1.4배 좋아짐
요일 + 행사0.6000 kg1.2배 좋아짐
요일 + 기온 + 행사0.3219 kg 2.2배 좋아짐
2차시가 정한 합격선 0.70kg을 0.32kg까지 내렸습니다. 알고리즘은 하나도 바꾸지 않았습니다. 좋은 특성 둘을 찾았을 뿐이에요.
⚠️ 특성의 쓸모는 혼자 정해지지 않는다

그렇다면 기온과 행사가 좋은 특성일까요? 조건이 붙습니다. 요일을 빼고 기온·행사만 쓰면 평균 오차가 기온만 3.1380 · 행사만 3.2176 · 기온+행사 3.1805 kg입니다. 기준선 ①의 3.18kg과 다를 게 없어요. 행사만 쓰면 오히려 기준선보다 나쁩니다.
특성의 쓸모는 그 특성 혼자가 아니라 조합으로 정해집니다. “r이 낮으니 버린다”도, “r이 높으니 쓴다”도 그 자체로는 규칙이 못 됩니다.

정리하면 상관계수는 이렇게 두 방향으로 우리를 속입니다.

😵 없는 관계를 있다고 한다

  • 표본이 적으면 우연이 상관을 만든다(개념 2).
  • 숨은 변수가 둘을 함께 밀면 인과가 없어도 r이 크다(개념 3).
  • 실습의 무작위값 −0.31이 그 예.
↔

🙈 있는 관계를 없다고 한다

  • 더 센 특성이 지배하면 그 밑에 깔려 안 보인다(개념 5).
  • 직선이 아닌 관계는 아예 못 잡는다(개념 1의 y = x²).
  • 급식의 기온 +0.15가 그 예.
6

없는 특성은 만들어 낸다 — 특성 공학

지금까지는 있는 특성 중에서 고르는 이야기였습니다. 그런데 실제 일은 그다음이 더 큽니다. 쓸 만한 특성이 데이터 안에 그대로 들어 있는 경우가 드물기 때문이에요. 가진 열을 조합하고 바꿔서 새 특성을 만들어 내는 일을 특성 공학(feature engineering)이라고 합니다.

나무 책상 위에 카드 판독 장치가 있고, 그 뒤 나무 틀에 노란 계수 다이얼 수십 개가 네 줄로 박혀 있으며, 오른쪽에 뚜껑 달린 칸이 늘어선 분류 상자가 놓인 기계
홀러리스 천공 카드 집계기(복제품, 컴퓨터 역사 박물관). 1890년 미국 인구 조사에서 쓰였어요. 사람 한 명의 대답을 카드의 정해진 자리에 뚫은 구멍으로 옮기면, 기계가 구멍을 읽어 다이얼을 한 칸씩 돌렸습니다. 카드에 자리가 없는 항목은 셀 수 없었지요 — 특성을 고르는 일은 무엇을 적어 둘지 정하는 자리에서 이미 시작됩니다. 출처: Adam Schuster, Wikimedia Commons (CC BY 2.0)

① 있는 열에서 뽑아낸다

가진 열만들어 낸 특성왜 더 나은가
생년월일 2009-03-14나이 17 생년월일은 숫자로 크기를 비교할 수 없다. 나이는 된다.
입장 시각 · 퇴장 시각체류 시간(분) 우리가 궁금한 것은 얼마나 머물렀나이지 몇 시에 왔나가 아니다.
키(cm) · 몸무게(kg)체질량지수 = 몸무게 ÷ 키² 두 열이 함께 만드는 뜻을 한 열로 모은다.
날짜요일 · 시험 기간인가 개념 5에서 본 그것. 날짜 자체보다 요일이 훨씬 세다.

2차시의 급식 데이터가 좋은 예입니다. 기록에는 날짜가 적혀 있었지, “수요일”이라고 적혀 있지 않았어요. 날짜를 요일로 바꾼 그 한 걸음이 평균 오차를 3.18kg에서 0.70kg으로 끌어내렸습니다. 좋은 특성 하나를 찾는 것이 알고리즘을 바꾸는 것보다 성능을 더 올리는 일은 아주 흔합니다.

② 범주를 숫자로 바꾼다 — 원-핫 인코딩

“월·화·수·목·금”은 글자입니다. 기계는 숫자만 다루니 바꿔야 해요. 가장 쉬운 방법은 번호를 매기는 것입니다 — 월=1, 화=2, 수=3, 목=4, 금=5. 그런데 이러면 기계가 “금요일은 월요일의 다섯 배”라고 읽습니다. 요일에는 그런 크기 관계가 없는데도요.

그래서 원-핫 인코딩(one-hot encoding)을 씁니다. 요일 하나를 칸 여러 개로 펼치고, 해당하는 칸만 1로 둡니다.

그날월?화?수?목?읽는 법
월요일1000월 칸만 켠다
수요일0010수 칸만 켠다
금요일0000 넷 다 0 — 그것으로 금요일이 정해진다
요일이 다섯인데 칸은 넷입니다. 넷이 모두 0이면 자동으로 금요일이니 다섯 번째 칸은 필요가 없어요. 굳이 넣으면 다섯 칸이 서로를 완전히 설명하는 중복이 되어 계산이 불안정해집니다. 개념 5의 실습 코드가 실제로 네 칸만 씁니다.
💡 정규화는 언제 하나 — 5차시와 이어 붙이기

5차시에서 우리는 걸음 수(5100)와 공부 시간(4.5)처럼 자릿수가 다른 특성을 같은 자리에 세우는 법(정규화)을 배웠습니다. 오늘 만든 특성들도 마찬가지예요 — 기온은 13~25, 행사는 0 또는 1, 요일 칸도 0 또는 1입니다. 순서는 이렇습니다. ① 특성을 만든다(오늘) → ② 쓸 것을 고른다(오늘) → ③ 정규화한다(5차시). 그리고 5차시의 규칙을 여기서도 지켜야 합니다 — 정규화의 기준(최솟값·최댓값)은 훈련 데이터에서만 구합니다. 시험 데이터를 보고 정하면 그 순간 반칙이에요.

⚠️ 특성을 고르는 것도 학습이다 — 반칙에 주의

오늘 우리는 상관계수를 재서 특성을 고릅니다. 그런데 그 상관계수를 무엇으로 재느냐가 중요해요. 테스트 데이터까지 다 보고 순위를 매기면 그것도 데이터 누수입니다. 실제로 해 보면 시험 오차가 2.898에서 2.887로 좋아 보입니다. 차이는 작지만, 더 나쁜 것은 “난수를 하나 더 넣는 게 좋다”는 틀린 결론에 이르게 한다는 점이에요. 특성 순위는 반드시 훈련 데이터만 보고 매깁니다.

💻

손으로 ① — 특성 스위치판을 직접 켜고 끈다

개념 4의 표는 누가 미리 재 둔 것이었습니다. 이제 여러분이 직접 재 보세요. 아래 스위치판에는 학생 260명의 특성 열다섯 개가 스위치로 놓여 있습니다. 초록 테두리 둘이 점수를 실제로 정하는 진짜 특성이고, 나머지 열셋은 출석번호와 난수 — 아무 뜻도 없는 것들이에요.

스위치를 누를 때마다 그 자리에서 최소제곱을 다시 풀어 훈련 오차와 시험 오차를 계산합니다. 미리 적어 둔 답을 여는 것이 아닙니다. 공책을 펴 두세요. 아래 과제의 값은 확인 문제에서 다시 묻습니다.

🎛️ 특성 스위치판 — 260명, 특성 열다섯 INTERACTIVE

스위치(또는 위쪽 막대)를 눌러 특성을 켜고 끕니다. 막대는 훈련 데이터만 보고 잰 상관계수를 |r| 순으로 줄 세운 것이고, 아래 곡선은 여러분이 스위치를 바꿀 때마다 한 점씩 쌓입니다. ▶ 순위대로 하나씩을 누르면 |r|이 큰 것부터 자동으로 하나씩 켜면서 두 곡선이 갈라지는 장면을 보여 줍니다.

20명
켠 특성 수2
훈련 인원20
훈련 오차3.293
시험 오차2.898
벌어짐−0.395
진짜 특성 둘만 켠 상태로 시작합니다. 훈련 오차 3.293 · 시험 오차 2.898.
[안내] 스위치를 눌러 보세요. 누를 때마다 최소제곱을 다시 풉니다.

※ 오차는 RMSE(점)입니다. 시험은 언제나 훈련에 안 쓴 200명으로 봅니다 (260명 중 61번째부터 260번째까지). 훈련은 앞에서부터 잘라 씁니다. 이 계산은 실습 파이썬 코드와 같은 방식·같은 데이터라서 소수 셋째 자리까지 같은 값이 나옵니다.

과제 ① 표를 채운다 — 훈련 20명에서

🔄 초기화를 누르고 훈련 인원이 20명인지 확인한 뒤, 아래 네 줄을 차례로 만들어 값을 적으세요. ‘앞에서부터’는 스위치판 왼쪽 위에서 오른쪽으로 세어 가라는 뜻입니다.

켜는 특성켠 개수훈련 오차시험 오차시험 − 훈련
공부시간 · 지난점수 (진짜 둘만)
위 둘 + 출석번호 + 난수01
위 넷 + 난수02 · 난수03
위 여섯 + 난수04~난수07

‘훈련 오차’ 세로줄부터 보세요. 위에서 아래로 내려가며 한 번이라도 올라갔나요? 그다음 ‘시험 오차’ 세로줄을 보세요. 두 줄이 반대 방향으로 움직입니다. 이 네 줄이 개념 4 표의 ‘20명’ 가로줄과 같은지 맞춰 보세요.

과제 ② 반례를 만든다 — 훈련 오차 0을 찍어 본다

  • 훈련 인원을 10명으로 내립니다. 진짜 둘만 켜기를 눌러 두 값을 적어 두세요.
  • 거기에 스위치판 순서대로 여덟 개를 더 켭니다(출석번호 · 난수01~난수07). 훈련 오차가 0.000으로 떨어지는 순간을 보세요. 그때 시험 오차는 얼마인가요?
  • 다른 여덟 개를 골라도 훈련 오차가 0.000이 되는지 확인하세요. 그리고 “훈련 정확도 100%”가 왜 나쁜 소식인지 한 줄로 공책에 적으세요.
  • 거꾸로도 해 봅니다. 전부 켜기를 누른 채 훈련 인원을 10에서 60까지 천천히 올려 보세요. 시험 오차가 처음으로 4.0 아래로 내려가는 인원은 몇 명입니까? 사람이 늘면 왜 난수의 해가 줄어드는지 개념 2와 이어 설명해 보세요.
💡 15~16명 부근에서 시험 오차가 갑자기 튈 것이다 — 겁내지 말 것

전부 켠 채로 인원을 올리다 보면 15명에서 시험 오차가 19.189, 16명에서 22.265까지 튑니다 (그 앞의 14명은 9.487입니다). 고장이 아니에요. 특성 15개에 절편 하나를 더하면 손잡이가 16개인데, 맞출 값이 딱 그만큼일 때가 가장 불안정한 자리입니다. 방정식이 겨우 하나로 풀려서 계수가 터무니없이 커지거든요. 인원을 더 올리면 곧 가라앉습니다. ‘손잡이 수와 데이터 수가 비슷해지는 자리가 가장 위험하다’는 것만 기억해 두세요.

과제 ③ 순위의 한계를 확인한다

▶ 순위대로 하나씩을 훈련 20명에서 눌러 보세요. |r|이 큰 것부터 하나씩 켜지며 곡선이 열다섯 점까지 그려집니다.

  • 시험 오차가 가장 낮은 지점이 몇 개째인지 적으세요. 그때 켜진 특성은 무엇입니까?
  • 세 번째로 켜지는 특성의 이름과 r을 적으세요. 그것은 진짜 특성입니까, 난수입니까? 왜 3위를 차지했을까요? (개념 2를 떠올리세요.)
  • 맨 마지막으로 켜지는 특성은 무엇입니까? 그 r은 얼마인가요? “출석 번호로 시험 점수를 맞힐 수 있을까”라는 오늘의 제목에 한 줄로 답하세요.
💻

손으로 ② — 급식 잔반, 세 스위치로 0.70kg을 깎는다

개념 5의 급식 데이터입니다. 스위치는 셋뿐이에요 — 요일 · 기온 · 행사. 여덟 가지 조합을 전부 눌러 볼 수 있습니다. 누를 때마다 스무 날의 예측을 다시 계산해 평균 오차(MAE)를 찍어 줍니다.

🍚 급식 스위치판 — 스무 날, 특성 셋 INTERACTIVE

회색 점이 실제 잔반량, 노란 점이 예측입니다. 둘을 잇는 세로 선의 길이가 그날의 오차예요. 스위치를 바꾸면 노란 점이 움직입니다. 요일은 원-핫 네 칸으로 들어갑니다(개념 6).

쓴 특성요일
평균 오차0.7000
기준선 ①3.18
기준선 ② 대비같음 (합격선)
2차시가 정한 합격선 0.70 kg 상태입니다. 기온과 행사를 켜면 어디까지 내려갈까요?

※ 평균 오차는 MAE(kg)입니다 — 틀린 양의 절댓값을 그냥 평균 낸 값이에요. 2차시가 쓰던 자와 같은 자라서 0.70kg이 그대로 재현됩니다.

과제 ④ 여덟 칸을 다 채운다

요일기온행사평균 오차(kg)기준선 ①(3.18)보다 좋은가
끔끔끔
끔켬끔
끔끔켬
끔켬켬
켬끔끔
켬켬끔
켬끔켬
켬켬켬

표를 다 채운 뒤 위 네 줄(요일 끔)과 아래 네 줄(요일 켬)을 견주어 보세요. 기온과 행사는 좋은 특성입니까, 나쁜 특성입니까? 이 물음에 한 낱말로 답할 수 없다는 것이 개념 5의 결론이었습니다. 그 까닭을 표로 설명해 보세요.

💻

손으로 ③ — 상관계수를 내 손으로 짠다

시뮬레이터는 누군가 미리 만들어 둔 것입니다. 이제 코드로 갑니다. 아래 프로그램은 오늘 본 여섯 장면을 한 번에 다 찍어 줍니다 — 열 명의 상관계수, 200번 되풀이 실험, 아이스크림, 260명 표, 순위대로 고르기, 그리고 급식.

다만 네 곳이 비어 있습니다. 그 넷을 채워야 돌아갑니다. 그중 둘은 상관계수 식의 분자와 분모예요. 개념 1에서 손으로 따라간 바로 그 식입니다.

⚠️ 빈칸 네 곳 (?????는 일곱 군데)
  • ① corr()의 분자 — 두 값이 ‘함께’ 벗어난 정도. 개념 1의 표에서 (x−x̄)(y−ȳ) 세로줄을 만들던 그 자리입니다.
  • ② corr()의 분모 두 줄 — 각자 벗어난 정도. 제곱합에 ** 0.5를 씌우면 제곱근입니다.
  • ③ 【3】의 잔차 두 줄 — ‘기온으로 설명되지 않고 남은 것’. 실제 값에서 기온으로 예측한 값을 뺍니다.
  • ④ 【5】의 정렬 기준 — 관계가 ‘센’ 것부터 줄 세우려면? 부호는 상관없고 크기만 봅니다. 큰 것이 앞에 오게 하세요.

채우지 않고 그냥 실행하면 SyntaxError가 납니다 — 정상입니다. 다 채우고 실행하면 166줄이 찍혀요. 맨 처음 【1】에 +0.97 · +0.16 · +0.99 · +0.16 · +0.01 · −0.31이 나오면 corr()를 제대로 짠 것입니다.

과제 ⑤ 시뮬레이터와 코드를 나란히 놓는다

이 코드의 【5】가 찍어 주는 순위표와, 손으로 ①의 막대 그림을 나란히 놓아 보세요. 열다섯 줄이 같은 차례로 늘어서 있고, r 값도 소수 넷째 자리까지 같아야 합니다. 다르면 둘 중 하나가 틀린 것입니다.

같은 방식으로 【4】의 ‘20명’ 가로줄과 과제 ①의 표를, 【6】의 마지막 표와 과제 ④의 아래 네 줄을 맞춰 보세요. 화면에서 손으로 만든 값과 코드가 찍은 값이 같다는 것을 확인하는 일이 오늘 실습의 마지막 단계입니다.

과제 ⑥ 코드를 부숴 본다

  • 【5】의 정렬 기준에서 abs를 빼 보세요(-t[1]). 순위표 아래쪽 차례는 눈에 띄게 바뀝니다 — r이 음수인 난수들이 뒤로 밀려서 3위였던 난수12(−0.2909)가 꼴찌로 갑니다. 그런데 결론은 하나도 달라지지 않아요. 상위 두 개도, 가장 낮은 시험 오차 2.898도 그대로입니다. 왜 그럴까요? 순위표의 위 두 줄 부호를 보면 답이 보입니다. 그리고 어떤 데이터였다면 큰일이 났을지 한 줄로 적으세요.
  • 【2】의 TRIALS = 200을 20으로 줄여 보세요. 표의 숫자가 얼마나 흔들리는지 보고, ‘되풀이 횟수’도 표본 크기라는 것을 확인하세요.
  • 【1】의 X10에서 뒤 다섯 줄을 지워 다섯 명만 남겨 보세요. 출석번호와 무작위값의 r이 어떻게 바뀌나요? 개념 2의 표와 맞춰 보세요.
ℹ️ 코드 안의 solve · fit은 지금 열어 보지 않아도 된다

이 넷(solve · fit · predict · rmse)은 성능을 재는 자입니다. 최소제곱으로 직선(평면)을 맞추는 코드예요. 회귀는 9차시에서 제대로 배웁니다. 오늘은 ‘특성을 넣고 빼면 성능이 어떻게 되나’만 보면 됩니다. 자를 어떻게 만들었는지는 그때 열어 보세요.

📖

정리 — 오늘 확인한 것

물음오늘의 답근거가 된 숫자
관계의 세기를 어떻게 재나 상관계수 r — 함께 벗어난 정도를 더해 각자 벗어난 정도로 나눈다 공부시간 +0.9721
r이 0이 아니면 관계가 있는 것인가 아니다. 표본이 적으면 우연이 상관을 만든다 10명일 때 |r|>0.3이 85/200
r이 높으면 원인인가 아니다. 숨은 변수가 둘을 함께 밀 수 있다 +0.9716 → −0.0680
쓸모없는 특성은 무시되나 아니다. 훈련은 좋아지고 시험은 나빠진다 20명: 3.293/2.898 → 2.929/3.942
r이 낮으면 버려도 되나 아니다. 더 센 특성 밑에 깔려 있을 수 있다 기온 +0.1521 → +0.7420
그래서 무엇을 얻었나 알고리즘을 하나도 안 바꾸고, 좋은 특성 둘로 급식 예측을 2.2배 정확하게 0.70 kg → 0.32 kg

오늘의 제목에 답해 봅시다. 출석 번호로 시험 점수를 맞힐 수 있을까? 열 명으로 재면 r은 +0.0144, 260명 중 훈련 20명으로 재면 +0.0069로 열다섯 개 중 꼴찌입니다. 맞힐 수 없어요. 그런데 넣어도 그만인 것은 아닙니다. 넣으면 훈련 오차를 조금 낮춰 주고, 그 대가로 시험 오차를 올립니다. 쓸모없는 특성은 ‘무해’가 아니라 ‘유해’입니다.

💡 실무에서 쓰는 순서
  1. 만든다 — 날짜에서 요일을, 시각 둘에서 체류 시간을 뽑아낸다(개념 6).
  2. 본다 — 상관계수를 재되 숫자만 보지 말고 점도 찍어 본다(개념 1).
  3. 의심한다 — 표본이 충분한가? 숨은 변수는 없나? 더 센 특성에 가려지지 않았나?
  4. 재 본다 — 넣은 판과 뺀 판을 훈련/시험으로 갈라 실제 성능으로 겨룬다(11차시).
✅

확인 문제

✍️ 문제마다 답을 쓰고 제출하기를 누르세요. 제출하면 모범 답안이 열리고, 제출한 답은 선생님께 전달됩니다.

1. 상관계수 r의 값이 +1 · 0 · −1일 때 두 값의 관계를 각각 한 줄로 설명하시오. 그리고 r이 0인데도 두 값의 관계가 완벽한 예를 하나 들고, 왜 r이 0이 되는지 쓰시오.
📖 모범 답안

+1 — 한쪽이 오르면 다른 쪽도 정확히 비례해 오른다. 점을 찍으면 오른쪽 위로 향하는 직선 위에 모두 놓인다.
0 — 한쪽이 올라도 다른 쪽은 오르는 쪽도 내리는 쪽도 아니다. 직선 관계가 없다는 뜻이다.
−1 — 한쪽이 오르면 다른 쪽이 정확히 비례해 내린다.

r = 0인데 관계가 완벽한 예 — 개념 1의 y = x². x가 −3, −2, −1, 0, 1, 2, 3일 때 y는 9, 4, 1, 0, 1, 4, 9다. x를 알면 y가 하나로 정해지므로 관계는 완벽하다. 그런데 r은 정확히 0이다.

왜 0이 되나 — 왼쪽 절반에서는 x가 평균보다 작고 y는 평균보다 크므로 분자의 곱이 음수, 오른쪽 절반에서는 둘 다 평균보다 크므로 양수다. 좌우가 대칭이라 양수와 음수가 정확히 상쇄된다. 상관계수는 직선 관계만 재기 때문에 이런 곡선 관계를 못 잡는다. 그래서 r을 볼 때는 반드시 점을 찍어 눈으로도 확인해야 한다.

2. 오늘 실습에서 열 명의 여섯 가지 정보와 시험 점수의 상관을 쟀다. 가장 높은 둘과 가장 낮은 둘을 r 값과 함께 적으시오 (여기서 ‘낮다’는 절댓값이 작다는 뜻이다). 그리고 낮은 둘 중 하나는 “당연히 관계가 없다”고 말할 수 있는데 다른 하나는 그렇게 말하기 어렵다. 어느 쪽이며 왜 그런가?
📖 모범 답안

가장 높은 둘 — 지난점수 +0.99(네 자리로 +0.9935), 공부시간 +0.97(+0.9721).

가장 낮은 둘 — 절댓값이 작은 순서로 출석번호 +0.01(+0.0144)과 신발크기 +0.16(+0.1568)이다. 수면시간(+0.1613)이 신발크기와 거의 같은 자리에서 셋째다. (무작위값은 −0.31로 절댓값이 오히려 크다 — 그것이 이 문제의 함정이다.)

말하기 어려운 쪽 — 신발크기다(수면시간도 사정이 똑같다). r이 0.16이면 “약한 관계가 있다”고 읽고 싶어지지만, 열 명짜리 표본에서는 아무 관계 없는 두 수열도 |r|이 0.3을 넘는 일이 200번 중 85번(42.5%)이었다. 0.16은 그보다 훨씬 작은 값이므로 우연으로 충분히 설명된다. 반대로 출석번호는 ‘이름 순서로 붙인 번호’라는 사실을 우리가 알고 있으므로 데이터 없이도 관계가 없다고 말할 수 있다.

즉 r을 읽을 때는 표본 크기를 함께 봐야 하고, 세상에 대한 지식도 함께 써야 한다.

3. 손으로 ①의 과제 ①에서 채운 표를 보고 답하시오. 훈련 20명일 때 특성 2개(진짜 둘만)와 특성 10개의 훈련 오차·시험 오차를 각각 쓰고, 두 값이 서로 반대 방향으로 움직인 까닭을 설명하시오. 또 그때 켠 특성 여덟 개는 점수와 아무 관계가 없는데도 왜 훈련 오차가 내려갔는가?
📖 모범 답안

특성 2개 — 훈련 3.293 / 시험 2.898
특성 10개 — 훈련 2.929 / 시험 3.942

훈련 오차는 0.364 좋아졌고 시험 오차는 1.044 나빠졌다.

훈련 오차가 내려간 까닭 — 최소제곱은 훈련 데이터의 오차 제곱을 줄이도록 계수를 맞춘다. 특성이 늘면 조절할 손잡이가 늘어나므로 줄일 여지가 반드시 는다. 새 특성이 순전한 난수여도 마찬가지다. 난수 열이 우연히 들쭉날쭉한 모양을 그 20명에 맞게 써먹으면 오차가 조금이라도 줄어든다. 이건 우연이 아니라 수학이라서 예외가 없다.

시험 오차가 올라간 까닭 — 그렇게 외운 들쭉날쭉함은 그 20명에게만 있던 우연이다. 처음 보는 200명에게는 다시 나타나지 않으므로, 난수에 준 가중치가 그대로 오차가 된다.

다만 시험 오차가 반드시 올라가는 것은 아니다. 개념 4의 스무 칸 중 두 칸(훈련 10명·4개, 훈련 30명·4개)은 우연히 조금 내려갔다. 훈련 쪽은 예외가 없고, 시험 쪽은 대체로 그렇다고 말해야 정확하다.

4. 손으로 ①의 과제 ③에서 ‘순위대로 하나씩’을 돌려 보았다. 훈련 20명에서 ① 시험 오차가 가장 낮은 지점은 몇 개째이며 그때의 값은 얼마인가? ② 세 번째로 켜지는 특성의 이름과 r은? ③ 그 특성이 3위를 차지한 까닭을 손으로 ①이 아닌 다른 실험의 숫자를 근거로 설명하시오.
📖 모범 답안

① 특성 2개일 때 시험 오차 2.898로 가장 낮다. 그 둘은 공부시간(+0.7918)과 지난점수(+0.6148) — 점수를 실제로 정하는 바로 그 둘이다. 상관 순위가 제 일을 한 것이다.

② 세 번째는 난수12, r은 −0.2909다. 이름 그대로 아무 뜻 없는 난수다.

③ 근거는 개념 2의 200번 실험이다. 훈련이 20명뿐이라 아무 관계 없는 수열도 |r|이 0.3 근처까지 흔히 올라간다 (10명일 때 |r| 평균 0.2819 · 최대 0.8269이고, 30명일 때도 200번 중 14번은 0.3을 넘었다. 20명은 그 사이다). 난수 열두 개 중 하나쯤은 우연히 그런 값을 갖게 되고, 그것이 3위로 올라온 것이다. 실제로 이 특성을 넣은 순간 시험 오차가 2.898 → 3.137로 나빠진다.

덧붙여 맨 마지막(15위)은 출석번호, r = +0.0069다. “출석 번호로 시험 점수를 맞힐 수 있을까”에 대한 오늘의 답이 이 한 줄이다.

5. 아이스크림 판매량으로 물놀이 사고를 예측하는 모델은 꽤 잘 맞는다(RMSE 0.9918). 그런데 이 모델을 근거로 “아이스크림을 금지하면 사고가 줄어든다”고 말하면 안 된다. 그 까닭을 오늘 실습에서 나온 숫자 두 개를 들어 설명하시오.
📖 모범 답안

숫자 ① — 기온의 몫을 각각 덜어 내고 남은 것끼리 상관을 재면 +0.9716이던 r이 −0.0680으로 사라진다. 즉 둘을 함께 오르내리게 한 것은 아이스크림이 아니라 기온이었다.

숫자 ② — 기온을 이미 쓰고 있을 때 아이스크림을 더해도 RMSE가 0.7902 → 0.7884로 거의 안 줄고, 아이스크림의 계수는 −0.00365로 0에 붙는다. 더 보탤 정보가 없다는 뜻이다.

왜 그것이 ‘금지하면 안 된다’로 이어지나 — 아이스크림 판매량은 ‘더운 날’을 알려 주는 표시일 뿐 사고의 원인이 아니다. 판매를 금지해도 더위는 그대로이고 사람들은 그대로 물에 들어간다. 예측하는 것과 개입하는 것은 다르다. 데이터는 ‘함께 움직였다’까지만 말해 주고, 무엇이 무엇을 일으켰는지는 말해 주지 않는다.

(덧붙임 — 이 24개월 자료는 실제 통계가 아니라 이 수업을 위해 지어낸 것이다. 기온이 두 값을 함께 밀도록 우리가 직접 심었기 때문에, 숨은 변수가 있다는 사실을 확실히 알고 확인할 수 있었다.)

6. 다음 두 물음에 답하시오. (가) 키와 발 크기를 둘 다 특성으로 넣으면 무엇이 문제인가? (나) ‘입장 시각’과 ‘퇴장 시각’만 있는 데이터에서 더 쓸모 있는 특성을 하나 만들어 내고, 왜 더 나은지 설명하시오. 또 그 데이터에 ‘요일’ 열이 있다면 월=1, 화=2, …, 금=5로 번호를 매겨 넣어도 되는가?
📖 모범 답안

(가) 키와 발 크기는 서로 아주 세게 함께 움직인다. 그래서 발 크기가 새로 알려 주는 것이 거의 없다. 잡음 특성처럼 성능을 크게 망치지는 않지만, 가중치가 두 특성 사이에 아무렇게나 나뉘어 모델을 설명하기 어렵게 만든다. “키의 영향이 얼마인가”를 물었을 때 답이 흔들린다. 개념 3에서 기온을 이미 알 때 아이스크림 계수가 −0.00365로 0에 붙던 것과 같은 이야기다.

(나) 체류 시간 = 퇴장 시각 − 입장 시각을 만든다. 우리가 알고 싶은 것은 얼마나 오래 머물렀나이지 몇 시에 왔나가 아니다. 두 열을 그대로 넣으면 모델이 ‘두 값의 차’라는 관계를 스스로 찾아내야 하지만, 빼 주면 그 정보가 처음부터 한 열에 담겨 있다. (덧붙여 ‘오전 방문인가’ 같은 특성도 만들 수 있다.)

요일에 번호를 매기면 안 된다. 그렇게 넣으면 모델이 “금요일(5)은 월요일(1)의 다섯 배”, “수요일(3)은 월과 금의 한가운데”라고 읽는다. 요일에는 그런 크기 관계가 없다. 원-핫 인코딩으로 0과 1의 칸 넷으로 펼쳐야 한다 (다섯 칸이 아니라 넷 — 넷이 모두 0이면 자동으로 금요일이므로). 실제로 급식 실습이 그렇게 넣어 평균 오차를 0.70kg에서 0.32kg까지 내렸다.

🔁 되돌아보기

오늘 우리는 특성 하나하나를 상관계수로 재고, 그 숫자가 두 방향으로 우리를 속이는 것을 직접 확인했다 — 없는 관계를 있다고 하는 쪽(무작위값 −0.31)과 있는 관계를 없다고 하는 쪽(급식의 기온 +0.15 → +0.74). 그래서 특성은 재기만 해서는 못 고르고 넣은 판과 뺀 판을 실제로 겨루어 봐야 한다는 것까지 왔다. 그런데 ‘겨룬다’고 하려면 훈련 데이터와 테스트 데이터를 제대로 가를 줄 알아야 한다 — 오늘은 그것을 11차시에서 미리 빌려 썼다. 다음 시간에는 한 걸음 뒤로 물러나, 기계가 배우는 방식에 어떤 갈래가 있는지 (지도학습 · 비지도학습 · 강화학습) 지도를 그린다.

🔎

더 알아보기

상관계수는 어디서 왔고, 어디서 모자라며, 특성은 실제로 어떻게 고르나

어두운 배경 앞에서 오른쪽을 바라보는 대머리 노신사의 옆모습 흑백 사진. 흰 구레나룻에 물방울무늬 넥타이를 맸다
역사

상관계수는 사람의 몸을 재다가 태어났다 — 골턴과 피어슨

영국의 프랜시스 골턴(Francis Galton)은 19세기 후반, 수많은 사람의 키·팔 길이·머리 크기 같은 몸의 치수를 모았습니다. 그리고 1888년에 두 치수가 얼마나 함께 움직이는지를 숫자 하나로 나타내는 방법을 발표하며 이것을 ‘co-relation’이라 불렀어요. 오늘 우리가 공부시간과 점수를 나란히 놓고 던진 물음과 똑같은 물음입니다.

골턴이 부딪힌 문제도 오늘 개념 1과 같았습니다. 키와 팔 길이는 길이가 다르고 흩어진 정도도 다르니, 그대로 견주면 숫자가 단위에 끌려다닙니다. 그래서 각 치수를 자기가 흩어진 정도로 나누어 눈금을 맞추었지요. 골턴의 작업을 이어받은 칼 피어슨(Karl Pearson)이 1890년대에 지금 우리가 쓰는 식으로 다듬었습니다. 그래서 오늘 짠 corr()를 흔히 피어슨 상관계수라고 부릅니다.

그런데 골턴은 ‘우생학’이라는 말을 만들고 퍼뜨린 사람이기도 합니다. 집단에서 잰 상관을 원인처럼, 또 개인의 타고난 운명처럼 읽은 것 — 개념 3에서 경계한 바로 그 실수가 사람을 차별하는 근거로 쓰였어요. 도구는 중립이어도 그 숫자를 읽는 방식은 그렇지 않을 수 있다는 것, 3단원에서 다시 만나게 됩니다.

사진: 프랜시스 골턴(1890년대) · 출처: Eveleen Myers (née Tennant), Wikimedia Commons (Public domain)

값 그대로 순위로 바꾸면 128 7위 피어슨 r = 0.88 순위 상관 = 1 y = 2ˣ (x = 1~7). 늘기만 하면 순위는 한 줄로 선다.
원리 더 깊이

휘어도 늘기만 한다면 — 순위로 재는 스피어만 상관

개념 1에서 본 상관계수는 직선 관계만 잽니다. 그런데 “늘 올라가기는 하는데 직선은 아닌” 관계는 아주 흔해요. 그림 왼쪽은 x가 1씩 늘 때 y가 2배씩 커지는 경우(y = 2ˣ)입니다. x를 알면 y가 정확히 정해지고, 한 번도 내려가지 않는데도 피어슨 r은 0.88에 머뭅니다. 뒤로 갈수록 점이 가파르게 치솟아 직선에서 벗어나기 때문이에요.

그럴 때는 값을 그대로 쓰지 않고 순위로 바꾼 다음 상관을 잽니다. 가장 작은 값이 1위, 그다음이 2위… 이렇게 바꾸면 오른쪽처럼 일곱 점이 한 줄로 서고, 상관은 정확히 1이 됩니다. 이것이 스피어만 순위 상관(Spearman’s rank correlation)이에요. 순위로 바꾸면 유난히 큰 값 하나가 결과를 휘두르는 일도 줄어듭니다 — 128이든 12,800이든 7위는 7위니까요.

다만 만능은 아닙니다. 개념 1의 y = x²는 순위로 바꿔도 잡지 못해요. 내려갔다가 다시 올라가니 순위도 내려갔다 올라가서 양수와 음수가 또 상쇄됩니다. 순위 상관이 잡는 것은 ‘한 방향으로만 가는’ 관계까지입니다. 그래서 어떤 상관계수를 쓰든 점을 찍어 눈으로 보는 일은 빼먹을 수 없습니다.

① 걸러 내기 특성 15개 |r|로 추림 학습 1번 빠르다 · 조합의 효과는 못 본다(개념 5) ② 싸 붙이기 조합 하나 학습 → 시험 오차 되풀이 정확하다 · 15개면 32,767가지 조합 ③ 학습에 맡기기 특성 전부 학습 + 벌점 w = 0 쓸모없는 가중치를 스스로 0으로 민다 오늘 한 것은 ①, 스위치판에서 손으로 해 본 것은 ②
현장

특성을 고르는 세 갈래 — 재고, 겨루고, 맡긴다

걸러 내기(filter)는 오늘 코드 【5】가 한 방법입니다. 학습을 돌리기 전에 상관 같은 잣대로 특성마다 점수를 매겨 먼저 추려요. 계산이 가볍지만, 특성을 하나씩 따로 재기 때문에 개념 5의 기온처럼 ‘다른 특성과 함께 있어야 빛나는’ 특성을 놓칩니다.

싸 붙이기(wrapper)는 조합을 실제로 넣어 학습시키고 시험 오차로 겨룹니다. 손으로 ①의 스위치판에서 여러분이 한 일이 바로 이것이에요. 정확하지만 조합이 폭발합니다 — 특성 15개로 만들 수 있는 조합은 2¹⁵ − 1 = 32,767가지이고, 특성이 하나 늘 때마다 두 배가 됩니다. 그래서 실제로는 하나씩 더하거나 빼 가며 좋은 쪽으로만 나아가는 식으로 줄여서 찾습니다.

학습에 맡기기(embedded)는 특성을 전부 넣되, 가중치가 크면 벌점을 주어 학습 스스로 쓸모없는 가중치를 0 쪽으로 밀게 합니다. 벌점을 절댓값으로 주는 라소(Lasso) 회귀는 가중치를 정확히 0으로 만들어 특성을 아예 지워 버려요. 기온을 알 때 아이스크림 계수가 −0.00365로 0에 붙던 장면을 규칙으로 못 박은 셈입니다. 다만 어느 방법도 데이터에 없는 특성을 만들어 내지는 못합니다. ‘날짜에서 요일을 뽑는다’는 판단은 여전히 급식이 어떻게 돌아가는지 아는 사람의 몫이에요.