단원 홈

Ⅲ. 데이터 모델링과 평가3차시

기온이 1도 오르면
몇 대가 더 나갈까

353일이 당겨 세운 직선

따릉이를 운영한 353일을 기온과 하루 대여로 찍으면 점구름 하나가 남습니다. 여기에 직선을 하나 그으면 “기온 1°C 당 몇 대”라는 문장이 나오는데, 그 직선은 누가 어떻게 정하는 걸까요. 오늘은 353일이 직접 자를 당겨 세우게 하고, 거기서 나온 숫자를 얼마나 믿어도 되는지까지 잽니다.

  • [12데과03-02]
  • 50분네 정거장
  • 새 도구LinearRegression
  • 자료서울 따릉이 하루 353일
Ⅲ 단원 지도3 / 14차시
  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14

학습 목표

  1. 개념에서

    최소제곱 직선의 기울기를 단위와 함께 한 문장으로 읽고, ‘올리면’이 왜 틀린 말인지 말할 수 있다.

  2. 손으로

    공식으로 구한 기울기가 LinearRegression 의 coef_ 와 같음을 확인하고 R² 를 직접 구할 수 있다.

  3. 확인에서

    다시 뽑기로 잰 흔들림의 폭이 넓다·좁다가 무엇을 뜻하는지 한 줄로 적을 수 있다.

1
여는 장면 · 5분

같은 점 위에 그은 세 직선 — 누구 것이 맞나

자전거 수요를 다루는 기사에는 이런 문장이 자주 나옵니다. “기온이 1도 오르면 하루 600대쯤 더 나간다.” 한 문장이고, 단위가 붙어 있고, 무엇보다 숫자가 하나라서 그대로 옮겨 적기 좋습니다.

그런데 이 문장은 어디서 왔을까요. 1년치 기록을 앞에 놓고 누군가 직선 하나를 그었기 때문에 나온 숫자입니다. 같은 점을 보고도 사람마다 직선은 다르게 그어집니다 — 그러니 먼저 물어야 할 것은 “몇 대인가”가 아니라 “그 직선을 무엇으로 정했는가” 입니다.

생활 · 가상 기사

따릉이, 기온이 1도 오르면 하루 600대쯤 더 나간다

지난해 일별 대여 기록 분석 · 이 기사는 수업을 위해 지어낸 것입니다
그림 1점 353개와, 학생 셋이 눈대중으로 그은 직선점 하나 = 하루 · 주황 점 = 비 온 날
01만2만3만4만-100102030하루 대여(대)하루 평균 기온(°C) 01만2만3만4만-100102030하루 대여(대)하루 평균 기온(°C)가나다 01만2만3만4만-100102030하루 대여(대)하루 평균 기온(°C) 01만2만3만4만-100102030하루 대여(대)하루 평균 기온(°C)가나다

왼쪽은 점만 찍은 그림입니다. 기온이 높은 날일수록 대여가 많지만, 같은 기온에서도 위아래로 넓게 흩어져 있습니다. 오른쪽은 같은 점 위에 세 학생이 그은 직선입니다. 가운데 어디쯤에서 서로 엇갈린 뒤 양쪽 끝으로 갈수록 크게 벌어집니다 — 30°C 부근에서는 셋의 예측이 1만 대 넘게 차이가 나요. 여름 하루를 예측하면 셋이 아주 다른 답을 냅니다. 자료: UCI Seoul Bike Sharing Demand(2017-12-01~2018-11-30) 를 하루 단위로 묶은 353일 · CC BY 4.0 · DOI 10.24432/C5F62R

먼저 예측

세 직선 가운데 어느 것이 이 353일에 가장 잘 맞을까요? 눈으로 고른 뒤, 그 직선의 기울기를 숫자로 적어 보세요 — 기온이 1°C 높은 날은 몇 대쯤 더 빌렸을 것 같은가요? 100대 · 600대 · 2,000대 가운데 하나를 골라도 좋습니다. 3정거장 「손으로」 미션 ①에서 여러분의 예측과 353일이 세운 자리를 맞대어 봅니다.

체크포인트 1

같은 점 위에 직선이 여러 개 그어질 수 있다는 것을 보았고, 내 예측을 숫자 하나로 적어 두었다.

다음 정거장 · 개념 15분 →
2
개념 · 15분

자가 멈추는 자리, 그리고 그 숫자를 읽는 법

2-1무엇을 가장 작게 만드는 직선인가

Ⅱ-10 에서 가져옴기온과 하루 대여의 상관계수를 재어 “함께 오르내린다”까지는 말했습니다. 상관계수는 단위가 없는 숫자라서 “1도에 몇 대”로는 옮길 수 없었어요. 오늘 그 관계를 단위가 붙은 직선의 식으로 바꿉니다.

직선 셋 가운데 하나를 고르려면 먼저 틀린 정도를 재는 자가 있어야 합니다. 우리가 맞히려는 것은 그날의 대여량이므로, 빗나간 정도도 세로로 잽니다 — 점에서 직선까지 세로 거리가 그날의 빗나감입니다.

이 차시에서는 날마다 점과 자를 잇는 용수철이 하나씩 걸려 있다고 봅니다. 용수철이 늘어난 길이가 그날의 빗나감이고, 그 길이를 제곱해서 353일치를 모두 더한 값을 늘어남이라고 부르겠습니다. 늘어남이 가장 작아지는 자리에서 자는 멈춥니다 — 그 직선이 최소제곱 직선입니다.

왜 그냥 더하지 않고 제곱할까요. 위로 빗나간 날과 아래로 빗나간 날이 서로 지워지지 않게 하려는 것이 첫째이고, 멀리 빗나간 날이 훨씬 세게 당기게 하려는 것이 둘째입니다. 2배 빗나간 날은 4배로 당깁니다. 이 선택 때문에 뒤에서 단 하루가 자를 크게 돌리는 일이 생깁니다(3정거장 미션 ⑤).

공식353일
기울기 b = Σ(x−x̄)(y−ȳ) ÷ Σ(x−x̄)²
절편   a = ȳ − b·x̄

# 이 353일에서는
b = 30,879,534 ÷ 48,333.8 = 638.9
a = 9,324

끌림의 합(분자)
30,879,534
흩어짐의 합(분모)
48,333.8

그림 2늘어남을 재는 법 — 세로로 재고, 제곱해서 더한다353일 가운데 여덟 날만 골라 크게 그렸다
01만2만3만-551525하루 평균 기온(°C)−16,112대늘어남 = 점에서 직선까지 세로 길이 01만2만3만-551525하루 평균 기온(°C)가장 큰 넓이늘어남을 한 변으로 한 정사각형 — 넓이를 모두 더한다 01만2만3만-551525하루 평균 기온(°C)−16,112대늘어남 = 점에서 직선까지 세로 길이 01만2만3만-551525하루 평균 기온(°C)가장 큰 넓이늘어남을 한 변으로 한 정사각형 — 넓이를 모두 더한다

왼쪽 — 점에서 자까지 세로 길이가 그날 용수철이 늘어난 길이입니다. 자 위에 있는 날과 아래에 있는 날이 섞여 있습니다. 오른쪽 — 그 길이를 한 변으로 하는 정사각형을 그리면, 멀리 빗나간 날의 넓이가 눈에 띄게 큽니다. 353일치 넓이를 모두 더한 것이 늘어남이고, 자는 그 합이 가장 작은 자리에서 멈춥니다. 자료: 같은 353일 가운데 기온 −5 · 0 · 5 · 10 · 15 · 20 · 25 · 30°C 에 가장 가까운 여덟 날 · 직선은 353일 전체의 최소제곱 직선

353일이 세운 직선은 대여 = 9,324 + 638.9 × 기온 이었습니다. 여기서 638.9 를 문장으로 옮길 때가 가장 조심스러운 자리입니다.

규칙계수는 “…이 1 높은 날은 평균적으로 …” 로 읽는다 — “올리면” 은 값을 우리가 직접 바꿔 본 실험을 했을 때에만 쓴다.

“기온이 1°C 높은 날은 (낮은 날보다) 평균적으로 약 639대 더 빌렸다.” 여기까지가 데이터가 한 말입니다. 두 가지가 들어 있어요 — 평균적으로(하루하루가 아니라 경향), 그리고 높은 날은(다른 날들끼리 견준 것).

우리는 서울의 기온을 1도 올려 본 적이 없습니다. 가진 것은 기온이 저마다 다른 353일뿐이고, 그 날들은 기온만 다른 것이 아니라 비·습도·요일·계절까지 함께 다릅니다. 옆의 반례가 그 실물입니다 — 비 온 날은 평균 기온이 3.40°C 더 높았습니다.

2-2얼마나 설명했나 — 평균선을 100%로 놓고 잰다

직선 하나를 얻었으니 다음 물음은 “그래서 잘 맞나”입니다. 기준이 필요한데, 가장 게으른 예측 — 기온을 아예 보지 않고 언제나 평균 17,485대라고 답하는 평균선 — 을 기준으로 삼습니다.

표 1평균선으로 맞출 때와 직선으로 맞출 때353일 · 늘어남(제곱합)을 평균선 = 100%로 놓았다
무엇으로 맞히나남은 늘어남이름뜻
평균선 — 늘 17,485대100.0%SST기온을 보지 않았을 때의 흩어짐 전부
최소제곱 직선43.2%SSE직선으로 맞춘 뒤에도 남는 흩어짐
줄어든 몫 = R²56.8%1 − SSE/SST흩어짐 가운데 기온이 설명한 몫

R² = 0.568 — 날마다 다른 대여량의 흩어짐 가운데 약 57% 를 기온 하나로 설명했다는 뜻입니다. 단순 회귀(설명 변수가 하나)에서는 이 값이 상관계수의 제곱과 정확히 같습니다(r² = 0.568). 나머지 43%는 비·요일·행사처럼 이 직선이 보지 않은 것들입니다. 자료: 353일 · 값은 원장이 브라우저(Pyodide 0.26.4)에서 잰 것 — 3정거장 코드 ③이 같은 숫자를 찍는다

세운 자와 눕힌 자 — 같은 353일, 다른 기울기(대/°C)
638.9대여를 맞히는 자
vs
1,125.6기온을 맞히는 자
세운 자638.9눕힌 자1,125.6

세로로 재느냐 가로로 재느냐에 따라 자가 다르게 섭니다. 둘의 비 638.9 ÷ 1,125.6 = 0.568 이 정확히 R² 입니다 — 3정거장 실험실에서 용수철을 눕혀 확인합니다.

남은 늘어남 — 평균선으로 맞출 때와 직선으로 맞출 때
100.0%평균선으로 맞출 때
→
43.2%직선으로 맞출 때
평균선100.0직선43.2

직선이 흩어짐의 절반 넘게를 걷어냈습니다 — 줄어든 몫 56.8%가 곧 R² 입니다. 다만 높다고 직선이 맞는 모양이라는 뜻은 아닙니다 — 비 온 날 100일 가운데 74%가 직선 아래에 몰려 있어요(4차시).

2-3무엇을 붙들어 두고 잰 숫자인가 — 다중 회귀

“비 오는 날은 얼마나 덜 빌릴까”를 재는 가장 간단한 방법은 비 온 날 평균에서 안 온 날 평균을 빼는 것입니다. 그렇게 하면 −4,271대가 나옵니다. 그런데 이 숫자에는 비 말고 다른 것이 섞여 있습니다 — 2-1 에서 본 대로 비 온 날이 3.40°C 더 따뜻했기 때문에, ‘따뜻해서 많이 빌린 몫’이 ‘비 때문에 줄어든 몫’을 가리고 있습니다.

기울기를 하나가 아니라 둘로 두면 됩니다. 대여 = 10,758 + 671.9 × 기온 − 6,554.2 × 비 에서 비의 계수 −6,554 는 기온이 같은 날끼리 견준 비의 몫입니다. 이렇게 다른 변수를 고정해 두고 재는 것을 붙들어 두고 잰다고 말하겠습니다.

두 숫자가 어긋나는 만큼이 곧 기온이 가리고 있던 몫이고, 그 크기는 덧셈 한 줄로 맞아떨어집니다 — −6,554 + 671.9 × 3.40 = −4,271.

비의 몫(대) — 그냥 견주기 vs 기온을 붙들고 견주기
−4,271두 평균의 차
인데
−6,554기온이 같은 날끼리
단순 비교4,271기온 붙들고6,554

붙들고 재니 손해가 더 커졌습니다. 비의 몫이 커진 것이 아니라, 가려져 있던 것이 드러난 것입니다.

가린 것의 정체 — 두 무리의 평균 기온
11.8°C비 안 온 날 253일
vs
15.2°C비 온 날 100일
안 온 날11.8비 온 날15.2

비는 여름에 몰려 옵니다. 그래서 ‘비 온 날 묶음’은 처음부터 더 따뜻한 날들의 묶음이었습니다.

Ⅱ-14 에서 “비 오면 얼마나 줄까”라는 한 물음에 스물네 개의 답이 나왔던 것을 떠올려 보세요. 다중 회귀가 내는 −6,554 는 그 가운데 ‘기온을 붙들어 둔’ 한 답입니다. 넣지 않은 것(공휴일 · 미세먼지 · 행사)은 여전히 섞여 있고, 무엇을 넣을지는 우리의 선택입니다 — 3정거장 미션 ④의 탐구에서 습도를 하나 더 넣어 보면 비의 몫이 다시 움직입니다.

2-4다른 1년이었다면 — 다시 뽑기로 흔들림을 본다

638.9 는 이 353일이 세운 숫자입니다. 다른 1년이었다면 다른 숫자가 나왔겠지요. 그런데 1년을 다시 살 수는 없습니다. 그래서 가진 날들 속에서 같은 날 수만큼 다시 뽑아(한 날이 두 번 뽑혀도 됩니다) 기울기를 다시 재 봅니다. 이것을 다시 뽑기라고 부르겠습니다(부트스트랩, 에프론 1979).

353일을 1,000번 다시 뽑았더니 기울기가 처음 다섯 번만 해도 632 · 683 · 633 · 576 · 631 로 흔들렸고, 가운데 95%가 593 ~ 690 사이였습니다(폭 97). 만약 우리가 아무 30일만 가졌다면 같은 방법으로 잰 폭이 433 ~ 752(폭 319)로, 세 배 넘게 넓어집니다.

그림 3날이 적으면 기울기가 더 크게 흔들린다같은 방법으로 1,000번씩 다시 뽑아 잰 가운데 95%
353일을 다시 뽑으면1,000번 가운데 95%638.9593690폭 97400500600700800기울기(대/°C) 30일을 다시 뽑으면1,000번 가운데 95%638.9433752폭 319400500600700800기울기(대/°C) 353일을 다시 뽑으면1,000번 · 95%638.9593690폭 97400500600700800기울기(대/°C) 30일을 다시 뽑으면1,000번 · 95%638.9433752폭 319400500600700800기울기(대/°C)

폭이 좁으면 “표본이 바뀌어도 기울기가 크게 달라지지 않는다 — 이 숫자로 꽤 단단히 말할 수 있다”, 넓으면 “표본이 바뀌면 크게 달라질 수 있다 — 조심해서 말해야 한다”는 뜻입니다. 날이 적으면 우연히 뽑힌 몇 날(아주 더운 날 하나 같은)이 기울기를 크게 움직이기 때문에 폭이 넓어집니다. 자료: 353일 · 씨앗 2026 으로 1,000번씩 — 3정거장 코드 ⑤가 같은 숫자를 찍는다

규칙이 폭은 “같은 353일을 다시 뽑아도 이만큼 흔들린다”는 뜻이지, 참값이 이 안에 있다는 보증이 아니다. 날씨처럼 어제와 오늘이 이어진 자료에서는 폭이 실제보다 좁게 보이기도 한다(더 알아보기 ③).

계수 하나를 받으면 묻는 네 가지 — 이 단원의 나침반

  1. 단위무엇이 1 높은 날에 무엇이 얼마나 — 단위를 붙여 한 문장으로 말할 수 있나
  2. 붙든 것무엇을 같게 놓고 견준 숫자인가 — 넣지 않은 것은 무엇인가
  3. 설명한 몫흩어짐의 얼마를 설명했나(R²) — 남은 것은 한쪽으로 쏠려 있나
  4. 흔들림표본이 바뀌면 얼마나 달라지나 — 폭이 좁은가 넓은가

네 물음에 답하고 나면 마지막 판단이 나옵니다 — 이 숫자를 보고서에 어떤 문장으로 적을 것인가. 4 · 5 · 11 · 12차시가 이 나침반을 계속 들고 다닙니다.

체크포인트 2

자가 멈추는 자리(최소제곱)와 그 숫자를 읽는 네 가지 — 단위 · 붙든 것 · 설명한 몫 · 흔들림 — 을 손에 넣었다.

다음 정거장 · 손으로 20분 →
3
손으로 · 20분

353일에게 자를 맡기고, 나온 숫자를 캐묻는다

오늘의 장비

LinearRegression — 공식을 대신 계산해 주는 도구

scikit-learn 은 Ⅱ 단원에서 빈칸 채우기·자 바꾸기로 이미 썼습니다. 오늘 처음 쓰는 것은 직선을 맞추는 도구예요. 먼저 공식으로 손수 구한 뒤 같은 것을 도구에게 시켜 소수 셋째 자리까지 같은지 확인합니다. scikit-learn 과 matplotlib 이 든 칸은 처음 실행이 몇 초 멈춥니다 — 고장이 아니라 쪽마다 한 번 받는 중이에요.

부르는 모양

from sklearn.linear_model import LinearRegression

직선 = LinearRegression().fit(df[["temp"]], y)
직선.coef_[0]      # 기울기
직선.intercept_     # 절편

오늘 쓰는 것 넷

fit
표(X)와 답(y)을 주면 직선을 맞춘다
coef_
기울기 — 설명 변수마다 하나씩, 목록으로
intercept_
절편 — 하나뿐이라 목록이 아니다
score
R² — 1 − SSE/SST 를 대신 계산한다

공식과 다른 셋

  1. 표 모양을 요구한다df[["temp"]] — 대괄호 두 겹. 한 겹이면 오류가 난다
  2. 변수를 여러 개df[["temp", "비"]] — 공식이 길어져도 계산은 그대로
  3. 계수가 목록coef_[0] · coef_[1] — 넣은 순서대로

대가 — 도구는 왜 그 숫자인지도, 얼마나 믿을 만한지도 말해 주지 않습니다. 그래서 오늘 공식을 먼저 손으로 짚습니다.

1

자를 놓아 보고, 멈춘 자리를 공식으로 확인한다

6분

여는 장면에 적어 둔 내 예측입니다. 실험실에서 자를 끌어다 놓고 잠근 뒤 손을 떼면, 353개의 용수철이 자를 끌어 한 자리에 세웁니다. 내가 놓은 자리와 353일이 세운 자리는 얼마나 다를까요?

실험실의 1~3단계를 차례로 엽니다 — ① 자를 놓아 보고 ② 기울기 핀을 셋으로 바꿔 꽂아 보고 ③ 평균선에서 천천히 풀어 봅니다. 단계는 예측을 잠가야 열립니다.

시뮬레이터

용수철 자

353개의 용수철이 자를 당긴다 — 자는 어디서 멈추고, 왜 거기서 멈추나

  1. 1자의 양 끝을 끌어 ‘여기서 멈출 것 같다’에 놓는다
  2. 2[잠그고 놓기] — 예측이 잠기고 자가 미끄러져 멈춘다
  3. 32~6단계로 멈춘 까닭을 캔다
단계
1 — 내 자를 놓는다
1단계 · 내 자를 놓는다자의 양 끝(주황 손잡이)을 끌어 자리를 잡으세요

늘어남 = 날마다 점에서 자까지의 세로 길이를 제곱해 353일치를 모두 더한 값 · 평균선에 걸었을 때를 100% 로 놓는다 · 자는 늘어남이 가장 작은 43.2% 자리에서 멈춘다

별 — 내가 놓은 자의 늘어남이 멈춘 자리의 ×1.05 이하면 ★★★ · ×1.20 이하면 ★★ · 그보다 넘치면 ★ · 넘친 몫은 높이 몫 + 기울기 몫으로 쪼개어 보여 준다

늘어남—% · 평균선 = 100
기울기(대/°C)—
절편(대)—
줄어든 몫—
넘친 늘어남—
별—
도전 1

2단계 — 기울기 핀을 셋 모두 바꿔 꽂아 보라. 어떤 기울기로 꽂아도 세 자가 반드시 지나는 한 점이 있다. 어디인가?

도전 2

4단계 — 가닥을 하나만 끊어 자를 가장 크게 돌릴 날을 찾아라. 81mm 폭우가 내린 7월 1일일까?

도전 3

6단계 — 1년과 아무 30일로 열두 번씩 다시 걸어, 흔들림의 폭이 어느 쪽에서 더 넓은지 눈으로 재라.

자료: 353일(기온 · 하루 대여 · 비 여부)을 쪽 안에 실었다 — 코드 ①~⑤가 읽는 ../data/seoul_bike_daily.csv 와 같은 값이다. 판의 숫자는 모두 그 자리에서 계산한 것이고, 6단계 다시 걸기만 이 화면의 난수(씨앗은 화면에 적는다)를 쓴다.

기본 빈칸 ①에 기울기의 분자를 채우고 ▶ 실행하세요 — 두 편차 (x − x.mean()) 와 (y − y.mean()) 를 곱해 모두 더하면 됩니다(판의 ‘끌림의 합’). 자가 멈춘 자리와 같은 숫자가 나오는지 보세요.

도전 x = df["temp"] 를 x = df["humidity"](습도)로 바꿔 보세요. 기울기가 +22.4대/% 로 나옵니다 — 습한 날에 더 빌린다는 뜻일까요? (습한 날은 여름에 몰려 있습니다. 미션 ④가 이 덫을 푸는 방법을 꺼냅니다.)

탐구 분모 Σ(x − x̄)² 는 기온이 얼마나 넓게 퍼져 있는가입니다. 만약 서울 대신 사철 기온이 비슷한 도시의 자료였다면 이 분모가 작아집니다. 기울기를 재기가 쉬워질까요, 어려워질까요? 실험실 6단계의 ‘아무 30일’이 그 답을 보여 줍니다.

353일이 세운 직선은 이고, 기울기 638.9 는 “기온이 1°C 날은 평균적으로 약 대 ”라는 뜻이다. 여기에 라는 말은 쓸 수 없다.

확인 문제 1에 적어 제출 →
2

그림으로 본다 — 직선이 지나간 자리와 남은 것

2분

비 온 날의 점은 직선 위에 많을까요, 아래에 많을까요? 숫자를 하나 짐작해 두세요 — 비 온 100일 가운데 직선 아래에 있는 날은 몇 %일까요?

기본 코드 ②는 채워져 있습니다. 그대로 ▶ 실행해 그림을 띄우고, 실험실에서 자가 멈춘 자리와 같은 직선인지 눈으로 맞대어 보세요.

도전 ax.plot(끝, a + b * 끝, …) 아래에 ax.axhline(y.mean(), color="C4") 한 줄을 더해 평균선을 함께 그려 보세요 — 2-2 의 표에서 100%였던 그 선입니다. 직선과 평균선 사이의 간격이 곧 기온이 설명한 몫입니다.

탐구 30°C 위쪽에서 점들이 직선 아래로 꺾이는 것이 보이나요? 그렇다면 직선이 맞는 모양이 아닐 수 있습니다. 어떤 그림을 더 그려 보면 확인할 수 있을지 생각해 두세요(4차시에서 꺼냅니다).

3

도구와 맞댄다 — 같은 직선인가, 그리고 R²

3분

LinearRegression 은 경사하강 같은 방법으로 조금씩 찾아가는 도구일까요, 아니면 우리가 쓴 것과 같은 공식을 쓰는 도구일까요? 두 기울기가 소수 셋째 자리까지 같을지 먼저 짐작해 보세요. 그리고 R² 는 몇 %일 것 같은가요?

기본 빈칸 ②에 R² 를 채우고 ▶ 실행하세요 — 평균선의 흩어짐(SST) 가운데 직선이 설명한 몫이므로 1에서 남은 몫을 빼면 됩니다. 이 칸은 scikit-learn 을 받으므로 처음 실행이 몇 초 걸립니다.

도전 fit(df[["temp"]], y) 의 대괄호를 한 겹으로 바꿔 fit(df["temp"], y) 로 돌려 보세요. ValueError: Expected a 2-dimensional container … 가 납니다 — 도구는 열이 하나여도 표로 받기를 요구합니다. 일부러 한 번 겪어 두면 미션 ④에서 열을 둘로 늘릴 때 헷갈리지 않습니다.

탐구 직선.score(...) 가 내놓은 0.568 과 우리가 손으로 구한 R² 가 같았습니다. 그렇다면 도구가 대신해 준 것은 정확히 무엇이고, 도구가 말해 주지 않은 것은 무엇인가요? 둘을 적어 보세요(확인 문제 2).

도구는 를 대신해 주었지만, 와 는 말해 주지 않는다. 그리고 R² 0.568 은 를 뜻한다.

확인 문제 2와 3에 적어 제출 →
4

붙들고 잰다 — 비의 몫은 정말 −4,271대인가

4분

비 온 날 평균에서 안 온 날 평균을 빼면 −4,271대입니다. 기온을 같게 놓고 다시 재면 이 숫자는 커질까요, 작아질까요? 부호까지 짐작해 두세요.

실험실 5단계 「평행 자」를 엽니다 — 비 온 날의 자와 맑은 날의 자를 같은 기울기로 묶어 놓고, 기울기를 0에서부터 천천히 올리며 두 자 사이의 틈이 어떻게 벌어지는지 봅니다. 실험실 5단계 열기 →

기본 코드 ④는 채워져 있습니다. 그대로 ▶ 실행해 다중 회귀의 세 숫자를 확인하고, 판의 틈과 같은 값인지 맞대어 보세요.

도전 열 = ["temp", "비"] 의 순서를 ["비", "temp"] 로 바꿔 보세요. coef_ 가 넣은 순서대로 나오므로 출력 줄이 바뀝니다 — 계수를 읽을 때 어느 칸의 계수인지를 늘 확인해야 하는 까닭입니다.

탐구 열 에 "humidity"(습도)를 더해 셋으로 만들어 보세요. 비의 몫이 −6,554 → −4,034 로 줄고 습도가 −130.2대/% 로 붙습니다. 어느 식을 보고서에 쓰겠습니까? 까닭과 함께 적어 두세요 — Ⅱ-14 의 스물네 개의 답이 여기서 되살아납니다.

단순 비교가 비의 손해를 보이게 한 것은 비 온 날이 때문이다. 다중 회귀의 −6,554 는 견준 값이고, 그래도 는 여전히 섞여 있다.

확인 문제 4에 적어 제출 →
5

흔들어 본다 — 한 날을 끊고, 1년을 다시 뽑는다

5분

두 가지를 미리 짐작해 두세요. ① 용수철 한 가닥만 끊어 자를 가장 크게 돌릴 날은 어떤 날일까요 — 81mm 폭우가 쏟아진 날일까요, 가장 더웠던 날일까요? ② 우리가 아무 30일만 가졌다면 흔들림의 폭은 1년치의 몇 배가 될까요?

실험실 4단계 「끊어 보기」에서 점을 하나 눌러 그날의 용수철을 끊고, 자가 얼마나 도는지 봅니다(도전 2). 이어 6단계 「다시 걸기」에서 1년과 아무 30일로 열두 번씩 다시 걸어 봅니다(도전 3). 실험실 4단계 열기 →

기본 코드 ⑤는 채워져 있습니다. 그대로 ▶ 실행해 판에서 손으로 본 흔들림을 1,000번씩 돌린 숫자로 확인하세요. 씨앗이 같으면 몇 번을 돌려도 같은 값이 나옵니다.

도전 끊어 보기의 날짜를 "2018-07-01"(81mm 폭우)로 바꿔 보세요. +3.86 으로 353일 가운데 14위입니다 — 가장 크게 빗나간 날(잔차 −20,148)이 가장 크게 돌리는 날은 아니었습니다. 왜 그럴까요?

탐구 날씨는 어제와 오늘이 비슷합니다. 이 자료에서 어제 잔차와 오늘 잔차의 상관은 0.52 예요. 그렇다면 하루씩 따로 뽑는 다시 뽑기는 흔들림을 실제보다 작게 보이게 할까요, 크게 보이게 할까요? 이어진 7일씩 묶어 뽑으면 폭이 207 로 넓어집니다(확인 문제 6).

폭이 좁다는 것은 는 뜻이고, 넓다는 것은 는 뜻이다. 날이 적으면 폭이 넓어지는 까닭은 이다. 다만 이 폭은 가 아니다.

확인 문제 5에 적어 제출 →
체크포인트 3

자를 직접 놓아 보고, 공식과 도구가 같은 직선을 내는 것을 확인했고, 비의 몫을 붙들고 다시 쟀고, 그 숫자가 얼마나 흔들리는지까지 보았다.

다음 정거장 · 정리·확인 10분 →
4
정리·확인 · 10분

오늘의 탐험 일지

  1. 찾은 것

    “기온 1°C 당 +638.9대”는 353일이 당겨 세운 자리다 — 늘어남이 가장 작은 한 자리이고, 공식 한 번으로 나온다.

  2. 도구의 한계

    LinearRegression 은 계산을 대신해 줄 뿐, 계수가 얼마나 흔들리는지도 직선이 맞는 모양인지도 말하지 않는다.

  3. 보고의 규칙

    계수는 단위 · 붙든 것 · 설명한 몫 · 흔들림 네 가지를 함께 적는다. ‘올리면’은 실험을 했을 때만 쓴다.

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

1. 어떤 학생이 대여 = 9,324 + 638.9 × 기온 을 얻고 “기온을 1°C 올리면 대여가 639대 는다”고 썼다. 이 문장에서 고쳐야 할 곳 두 군데를 찾아 바르게 다시 쓰시오.
📖 모범 답안

“기온이 1°C 높은 날은 (낮은 날보다) 평균적으로 약 639대 더 빌렸다.”

고친 곳 ① ‘올리면’ → ‘높은 날은’. 우리는 기온을 올려 본 적이 없다. 가진 것은 기온이 저마다 다른 353일이고, 회귀는 그 날들을 견준 것이다. 기온이 다른 날은 비·습도·계절까지 함께 다르다 (실제로 비 온 날이 3.40°C 더 따뜻했다).

고친 곳 ② ‘는다’ → ‘평균적으로 … 더 빌렸다’. 639대는 하루하루에 대한 약속이 아니라 경향이다. 같은 기온의 날들 사이에서도 대여량은 크게 흩어져 있다(설명하지 못한 몫이 43%).

2. 공식으로 구한 기울기와 LinearRegression 의 coef_ 가 소수 셋째 자리까지 같았다(638.880). “그럼 앞으로는 도구만 쓰면 되겠네”라는 말에 답하시오 — 도구가 알려 주지 않는 것 둘을 들어서.
📖 모범 답안

계산은 도구에 맡겨도 된다. 변수가 여럿이면 공식이 길어져 손으로는 사실상 못 하므로 더욱 그렇다(미션 ④의 다중 회귀).

그러나 도구는 두 가지를 말해 주지 않는다. ① 그 계수가 표본에 따라 얼마나 흔들리는지 — 다시 뽑기로 재 보면 593~690 사이였고, 30일만 가졌다면 433~752 로 세 배 넘게 넓었다. ② 직선이 맞는 모양인지 — 비 온 날 100일 가운데 74%가 직선 아래에 몰려 있었다. 남은 것을 그림으로 봐야 한다(4차시).

그리고 공식을 알아야 coef_ · intercept_ · score 가 각각 무엇인지 읽을 수 있고, 이상한 값이 나왔을 때 알아챌 수 있다.

3. R² = 0.568 을 친구에게 한 문장으로 설명하고, 이 숫자가 알려 주지 않는 것 하나를 쓰시오.
📖 모범 답안

“날마다 다른 대여량의 흩어짐 가운데 약 57%를 기온 하나로 설명했다.” 기온을 보지 않고 늘 평균 17,485대라고 답할 때의 흩어짐을 100%로 놓으면, 직선으로 맞춘 뒤 남는 것이 43.2%다.

알려 주지 않는 것(하나만 들면 된다) — 관계가 직선 모양인지, 어느 기온대에서 크게 틀리는지, 기온이 원인인지, 표본이 바뀌면 이 값이 얼마나 달라지는지. R² 가 높아도 직선이 맞는 모양이라는 뜻은 아니고, R² 가 낮아도 기울기는 믿을 만할 수 있다.

4. 다중 회귀의 비 계수(−6,554)가 단순 비교(−4,271)보다 절댓값이 훨씬 컸다. 그 까닭을 ‘계절’이라는 말을 써서 설명하시오.
📖 모범 답안

비는 따뜻한 계절에 몰려 내린다. 그래서 ‘비 온 날 묶음’은 처음부터 더 따뜻한 날들의 묶음이었다 — 평균 기온이 15.2°C(100일) 대 11.8°C(253일) 로 3.40°C 차이가 난다.

단순 비교(−4,271)에서는 ‘따뜻해서 많이 빌린 몫’이 ‘비 때문에 줄어든 몫’을 가린다. 다중 회귀는 기온이 같은 날끼리 견주므로 가려져 있던 비의 몫(−6,554)이 드러난다. 두 숫자는 덧셈 한 줄로 이어진다 — −6,554 + 671.9 × 3.40 = −4,271.

5. 다시 뽑기로 잰 기울기의 가운데 95% 폭이 1년치에서는 97, 아무 30일치에서는 319 였다. ① 두 폭이 각각 무엇을 말해 주는지, ② 날 수가 적으면 왜 넓어지는지 쓰시오.
📖 모범 답안

① 좁은 폭(593~690)은 “표본이 바뀌어도 기울기가 크게 달라지지 않는다 — 이 숫자로 꽤 단단히 말할 수 있다”는 뜻이다. 넓은 폭(433~752)은 “표본에 따라 크게 달라질 수 있다 — 조심해서 말해야 한다”는 뜻이다. 같은 638.9 라도 앞의 경우에는 “약 640대”라고, 뒤의 경우에는 “433~752대 사이 어디쯤”이라고 적어야 한다.

② 날이 적으면 우연히 뽑힌 몇 날이 기울기를 크게 움직인다. 아주 더운 날 하나가 들어오느냐 마느냐로 직선이 크게 돌아간다 (353일에서도 8월 2일 한 날을 끊으면 +4.45 가 움직였다). 기온이 넓게 퍼져 있을수록 분모 Σ(x−x̄)² 가 커져 흔들림이 줄어드는데, 날이 적으면 그 분모부터 작아진다.

다만 이 폭은 “같은 353일을 다시 뽑아도 이만큼 흔들린다”는 뜻이지, 참값이 그 안에 있다는 보증이 아니다.

6. 날씨는 어제와 오늘이 비슷하다(이 자료에서 어제 잔차와 오늘 잔차의 상관이 0.52). 하루씩 따로 뽑는 다시 뽑기가 흔들림을 실제보다 작게 보이게 할 수 있는 까닭을 쓰시오.
📖 모범 답안

이어진 날들은 거의 같은 정보를 두 번 세는 셈이다. 어제가 더웠으면 오늘도 덥고, 어제 많이 빌렸으면 오늘도 많이 빌린다. 그래서 서로 독립인 날의 수는 353보다 적다.

하루씩 따로 뽑으면 353개의 독립된 증거가 있는 것처럼 계산되어 폭이 실제보다 좁게 나온다. 이어진 7일씩 묶어 뽑으면 폭이 97 → 207 로 두 배 넘게 넓어진다 — 이쪽이 더 정직한 폭이다. 공식으로 붙이는 신뢰구간(580~697 · 폭 117)도 ‘날들이 서로 독립’이라는 같은 가정 위에 있어서 같은 문제를 안고 있다(더 알아보기 ③).

+
더 알아보기

계수 하나를 둘러싼 이야기 셋

① 섭씨 자로 재면−100102030하루 평균 기온(°C)② 화씨 자로 재면1030507090하루 평균 기온(°F)점의 자리는 하나도 움직이지 않았다 — 바뀐 것은 자뿐이다
방법 더 깊이

계수를 잘못 읽는 세 가지 길

① ‘올리면’으로 읽기. 오늘 내내 붙들고 온 오해입니다. 계수는 값이 다른 대상들을 견준 차이이지, 값을 바꿔 보았을 때의 변화가 아닙니다. 바꿔 본 변화를 재려면 우리가 직접 값을 정하는 실험이 필요합니다.

② 절편을 그냥 읽기. 9,324대는 “기온이 0°C 인 날의 예측”입니다. 서울에는 0°C 인 날이 실제로 있으니 여기서는 읽을 수 있지만, 예를 들어 ‘키 → 몸무게’ 직선의 절편은 키가 0cm 인 사람의 몸무게라서 뜻이 없습니다. 절편은 x = 0 이 관측 범위 안에 있을 때만 문장으로 옮깁니다.

③ 단위가 바뀌면 관계도 바뀐다고 생각하기. 위 그림의 두 판은 같은 353일, 같은 직선입니다. 아래 자만 섭씨에서 화씨로 바꿔 끼웠어요. 점은 하나도 움직이지 않았고 눈금 숫자만 달라졌습니다. 화씨로 재면 1도 사이가 좁아지므로 계수는 9분의 5 배로 작아지지만, 관계 자체는 조금도 변하지 않습니다. 그러니 계수를 적을 때는 반드시 단위를 함께 적어야 합니다 — 단위 없는 ‘638.9’는 아무 말도 아닙니다.

도해: 같은 353일과 같은 최소제곱 직선을 두 번 그리고 가로축 눈금만 섭씨 · 화씨로 바꿔 달았다. · 자료: UCI Seoul Bike Sharing Demand · CC BY 4.0

① 잰 그대로기온(°C) →직선이 서 있다② 가로로 흔들리는 자로 재면① 의 직선기온(°C) →직선이 더 눕는다
방법 더 깊이

재는 자가 흔들리면 기울기가 눕는다

지금까지는 가로축 값 — 하루 평균 기온 — 을 정확한 숫자로 여겼습니다. 그런데 이 기온은 어디서 왔을까요? 서울 관측소 한 곳의 기록입니다. 그 하루 서울 전역의 기온은 강남과 은평, 한강변과 도심이 조금씩 달랐을 텐데, 우리는 그 하나의 숫자로 서울 전체의 대여를 설명하고 있습니다.

가로축 값에 이런 흔들림이 섞이면 무슨 일이 생길까요. 위 그림이 그것입니다 — 세로는 그대로 둔 채 점을 가로로만 밀면 점구름이 옆으로 퍼지고, 최소제곱 직선은 더 눕습니다. 가로로 퍼진 만큼 분모 Σ(x−x̄)² 가 커지는데 분자는 그만큼 커지지 않기 때문입니다.

통계학에서는 이것을 희석 편향(regression dilution)이라고 부릅니다. 방향이 정해져 있다는 것이 중요해요 — 재는 값이 흔들리면 기울기는 아무 쪽으로나 틀리는 것이 아니라 0 쪽으로 작아집니다. 그러니 우리가 얻은 638.9 도 실제 관계보다 작은 값일 수 있습니다. 설문 응답처럼 재기 어려운 값을 가로축에 놓을 때 특히 조심할 일입니다.

도해: 353일 가운데 고르게 고른 80날. ①은 잰 그대로, ②는 같은 80날을 가로로만 흔들어 옮긴 모양을 보인 예시다(흔든 폭은 그림을 위해 정한 값이고, 세로 값은 그대로다).

기울기 638.9 대/°C 에 붙는 폭 셋같은 353일, 같은 직선 — 폭을 재는 방법만 다르다다시 뽑기 1,000번593690폭 97statsmodels 공식 95%580697폭 117한 주씩 묶어 뽑기542749폭 207550600650700750대/°C
도구

통계 전용 도구가 붙여 주는 폭

우리는 흔들림을 손으로 봤습니다 — 다시 뽑기 1,000번. 그런데 통계학에는 같은 폭을 공식 한 줄로 내놓는 방법이 있고, 파이썬에서는 statsmodels 의 OLS 가 그 일을 합니다. LinearRegression 이 계수만 주는 것과 달리 계수마다 95% 신뢰구간을 나란히 붙여 줍니다.

두 폭을 견주면 크기가 비슷합니다 — 공식은 580~697(폭 117), 다시 뽑기는 593~690(폭 97). 길이 달라도 같은 자리를 가리킨 셈이지요. 그래서 다시 뽑기는 공식을 외우지 않고도 흔들림을 눈으로 보게 해 주는 좋은 사다리입니다.

그러나 둘 다 같은 가정 위에 서 있습니다 — ‘날들이 서로 독립이다’. 이 자료는 그렇지 않았어요(잔차 자기상관 0.52). 이어진 7일씩 묶어 뽑으면 폭이 542~749(폭 207) 로 두 배 넘게 넓어집니다. 세 막대 가운데 가장 정직한 폭은 맨 아래 것입니다. p값 같은 판정 숫자를 다루는 일은 대학 통계의 몫이지만, “어떤 가정 위에서 나온 폭인가”를 묻는 습관은 지금부터 들여도 됩니다.

도해: 같은 353일에서 잰 세 가지 폭을 한 자 위에 겹쳤다. 값은 원장이 브라우저(Pyodide 0.26.4)에서 잰 것이다.