단원 홈

Ⅰ. 데이터 과학의 이해5차시

이 표로 무엇을
물을 수 있나

계산은 되는데 뜻이 없을 때

서울시가 공개한 공공자전거 이용정보에서 2,000줄을 받았습니다. 칸이 열한 개, 그중 일곱 개가 숫자로 적혀 있고 컴퓨터는 일곱 개 모두 평균을 내 줍니다 — 뜻이 있든 없든. 오늘은 칸마다 뜻을 붙이고, 칸과 칸 사이를 재고, 마지막으로 이 표의 한 줄이 무엇인지 묻습니다.

  • [12데과01-02]
  • 50분네 정거장
  • 새 도구pandas
  • 자료서울 공공자전거 이용정보(월별) 2024년 6월 · 무작위 2,000행
Ⅰ 단원 지도5 / 9차시
  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9

학습 목표

  1. 개념에서

    칸마다 뜻(측정 수준)을 가려, 그 칸으로 무엇을 계산해도 되는지 말할 수 있다.

  2. 손으로

    pandas 로 표를 읽어 칸 사이의 관계를 재고, 합 ÷ 합으로 한 번 몫을 낼 수 있다.

  3. 확인에서

    이 표로 답할 수 있는 물음과 없는 물음을 갈라, 모자란 칸을 적을 수 있다.

1
여는 장면 · 5분

받은 파일을 열었더니 — 한 줄이 408.8km

서울 열린데이터광장에서 「서울특별시 공공자전거 이용정보(월별)」를 내려받았습니다. 2024년 6월 한 달치가 108,197줄, 그 가운데 2,000줄을 무작위로 뽑아 오늘 자료로 씁니다. 칸 이름은 손대지 않고 받은 그대로예요.

표 1받은 파일의 첫 두 줄칸이 열한 개라 가로로는 넘친다 — 세로로 세웠다
칸 이름첫째 줄둘째 줄
대여일자202406202406
대여소번호0010200102
대여소명102. 망원역 1번출구 앞102. 망원역 1번출구 앞
대여구분코드정기권정기권
성별FF
연령대코드40대~10대
이용건수15614
운동량9638.661302.54
탄소량93.5712.43
이동거리(M)408795.4153600.79
이용시간(분)4796458

열한 칸 가운데 일곱 칸이 숫자로 적혀 있습니다. 컴퓨터는 이 일곱 칸 모두의 평균을 내 줍니다 — 대여소번호의 평균까지도. 자료: 서울열린데이터광장 「서울특별시 공공자전거 이용정보(월별)」(OA-15248, 공공누리 제1유형) 2024년 6월 무작위 2,000행 — ../data/bike_use_sample.csv

눈에 먼저 걸리는 칸은 이동거리(M)입니다. 첫 줄이 408,795m — 408.8km예요. 마라톤 코스를 9.7번 달린 거리를 자전거로 갔다는 말이 됩니다.

그럴 리가 없지요. 그렇다면 이 한 줄은 누구의, 언제의, 몇 번의 기록일까요? 바로 옆 칸에 힌트가 있습니다 — 이용건수 156.

오늘 우리가 할 일은 이 표에 대고 세 가지를 묻는 것입니다. ① 이 칸은 무슨 뜻인가 ② 이 표의 한 줄은 무엇인가 ③ 이 칸은 다른 칸으로 계산된 것인가. 세 물음에 답하고 나면 마지막 물음에 답할 수 있습니다 — 이 표로 무엇을 물을 수 있나.

첫 줄408,795m
첫 줄이 말하는 이동거리408.8km눈금 하나가 마라톤 한 번(42.195km) — 모두 9.7번그런데 이 줄에는 대여가 156번 들어 있다2,620m= 408.8km ÷ 156번0100200300400km
한 줄이 말하는 거리 408.8km156으로 나누면 2,620m

자료: 표 1 첫째 줄(원장 계산) · 마라톤 42.195km

먼저 예측

아직 아무것도 계산하지 않았습니다. 이 표의 한 줄은 무엇인지 한 문장으로 적어 두세요 — "한 줄은 대여 한 번이다"처럼. 3정거장 「손으로」 미션 ①에서 여러분이 적은 문장과 실제 표를 맞대어 봅니다.

체크포인트 1

표 한 장을 눈으로 훑고, '이 한 줄이 무엇인가'를 한 문장으로 적어 두었다 — 아직 아무것도 계산하지 않았다.

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

칸에도 뜻이 있고, 한 줄에도 뜻이 있다

2-1컴퓨터는 수와 글자만 본다

컴퓨터가 한 칸을 보고 가릴 수 있는 것은 둘뿐입니다 — 수인가, 글자인가. 수이면 더하고 나눌 수 있으니 평균을 내 줍니다. 그 값에 뜻이 있는지는 묻지 않아요.

사람이 보는 것은 넷입니다. 그 칸이 무엇을 가리키는 이름표인지(식별자), 차례 없는 갈래인지(명목), 차례가 있는 갈래인지(순서), 양을 잰 값인지(양). 이것을 측정 수준이라고 부릅니다.

수준이 정해지면 해도 되는 요약이 정해집니다. 식별자는 세는 것까지, 명목은 가장 흔한 값과 비율까지, 순서는 가운데 값까지, 양이라야 평균과 합계가 뜻을 얻습니다. 컴퓨터는 이 층계를 모릅니다. 수처럼 생기면 무엇이든 평균을 냅니다.

표 2네 가지 뜻과, 그 뜻에 허락된 요약위로 갈수록 할 수 있는 일이 적다
뜻무엇인가할 수 있는 요약이 표의 칸
식별자대상을 가리키는 이름표개수 세기만대여소번호 · 대여소명
명목차례 없는 갈래가장 흔한 값 · 비율대여구분코드 · 성별
순서차례는 있으나 간격은 모르는 갈래가장 흔한 값 · 가운데 값연령대코드 · 대여일자
양크기와 간격에 뜻이 있는 값평균 · 합계 · 범위이용건수 · 운동량 · 탄소량 · 이동거리(M) · 이용시간(분)

열한 칸을 이 넷에 나눠 담으면 양은 다섯 칸입니다. 오늘의 물음에 대한 답이 여기 있어요 — 컴퓨터가 수로 읽은 칸은 일곱인데, 평균을 내도 되는 칸은 다섯입니다. 나머지 둘은 대여일자(순서)와 대여소번호(식별자)예요. 표의 ‘뜻’ 칸은 3정거장 코드 ②에서 여러분이 직접 채웁니다(빈칸 ①).

2-2파일에 적힌 글자와 컴퓨터가 읽은 값은 다르다

표 1의 대여소번호를 다시 보세요. 파일에는 00102라고 다섯 자리로 적혀 있습니다. 그런데 pd.read_csv 로 읽으면 102가 됩니다 — 맨 앞의 0 두 개가 사라져요. 수로 읽었기 때문입니다. 이 표만 볼 때는 아무 일도 일어나지 않지만, 다른 표와 이을 때는 00102와 102가 짝을 찾지 못합니다(7차시).

대여일자도 같은 함정입니다. 202406은 수처럼 생겼지만 ‘2024년 6월’이라는 한 달이에요. 이 표 전체에서 대여일자의 서로 다른 값은 딱 하나입니다. 더하거나 평균을 내면 아무 뜻이 없고, 차례를 매기는 데에만 쓸 수 있습니다.

규칙칸의 뜻을 먼저 정하고, 그 뜻에 맞게 읽는다 — 이름표 칸은 읽을 때부터 글자로.

Ⅰ-3 에서 가져옴같은 정보가 글자·표·나무 세 모양으로 올 수 있고, 읽는 틀은 받는 쪽이 긋는다고 했습니다. 오늘은 그 틀이 한 칸 더 안쪽으로 들어옵니다 — 칸마다 어떤 값으로 읽을지까지 우리가 정합니다.

여기까지를 숫자 두 개씩으로 다시 봅니다. 네 자리 모두 같아야 할 것 같은 두 숫자가 다릅니다 — 그 차이가 곧 칸의 뜻이 하는 일이에요.

수로 읽힌 칸 · 평균이 뜻 있는 칸
7칸컴퓨터가 수로 읽었다
인데
5칸평균이 뜻 있는 칸
수 7칸(진한 칸) · 평균이 뜻 있는 칸 5(아래 주황)

대여일자(순서) · 대여소번호(식별자) 둘은 수지만 평균이 뜻 없다.

연령대를 차례대로 놓기 전 · 놓은 뒤
2,000행놓기 전
→
1,660행일곱 구간으로 놓은 뒤
2,0001,660기타 340행

순서는 우리가 알려 줘야 하는데, 알려 준 목록에 없는 ‘기타’ 340행이 말없이 빠졌다.

파일에 적힌 글자 · 읽어 들인 값
00102파일의 대여소번호
vs
102수로 읽은 값
0 0 1 0 2파일의 글자1 0 2수로 읽은 값맨 앞의 0 두 개가 사라진다

같은 대여소인데 글자가 다릅니다 — 다른 표와 이을 때 짝이 안 맞습니다(7차시).

성별 · 가장 흔한 값과 빈칸
711행M — 가장 흔한 값
vs
597행빈칸
M711F692(빈칸)597

빈칸이 29.8%입니다. ‘남자가 가장 많다’를 말하기 전에 빈칸부터 세어야 합니다.

자료: 표본 2,000행(원장 계산) — 위 네 쌍의 숫자는 모두 3정거장 코드 ② · ③이 찍는 값이다.

2-3칸과 칸 사이 — 새 정보인가, 다른 이름인가

칸 하나하나에 뜻을 붙였으면 이제 칸 사이를 봅니다. 이 표에는 자전거가 잰 값이 아니라 다른 칸에서 계산해 적은 칸이 섞여 있거든요. 그런 칸을 파생 속성이라고 합니다.

가려내는 방법은 간단합니다. 나눠 보는 것이에요. 탄소량을 이동거리(km)로 나누면 2,000줄이 거의 한 값으로 모입니다 — 평균 0.2311, 표준편차 0.0081. 거리에 0.232쯤을 곱해 적은 칸이라는 뜻입니다. 같은 방식으로 운동량을 km로 나누면 넓게 퍼져요(표준편차 3.37). 운동량은 거리만으로 정해지지 않는다는 말입니다.

그림 1같은 나누기, 다른 모양이동거리(km)로 나눈 두 칸 · 주황 칸이 가장 높은 칸
탄소량 ÷ 이동거리(km)1,995행 · 칸 하나 = 0.005한 칸에 1,826행 — 거의 한 값04569131,3701,8261,826행0.200.220.240.26가로: 나눈 값 · 세로: 행 수운동량 ÷ 이동거리(km)1,995행 · 칸 하나 = 2.5가장 높은 칸도 634행 — 넓게 퍼진다0158317476634634행51525354555가로: 나눈 값 · 세로: 행 수 탄소량 ÷ 이동거리(km)1,995행 · 칸 하나 = 0.005한 칸에 1,826행 — 거의 한 값04569131,3701,8261,826행0.200.230.26가로: 나눈 값 · 세로: 행 수운동량 ÷ 이동거리(km)1,995행 · 칸 하나 = 2.5가장 높은 칸도 634행 — 넓게 퍼진다0158317476634634행5203550가로: 나눈 값 · 세로: 행 수

왼쪽은 한 칸에 1,826행이 쌓였습니다 — 나눠 보니 한 값이었다는 뜻이고, 그래서 탄소량은 이동거리의 다른 이름입니다. 오른쪽은 가장 높은 칸도 634행뿐이에요 — 운동량은 거리 말고 다른 것도 담고 있습니다. 자료: 2,000행 가운데 이동거리가 0이 아닌 1,995행(원장 계산, 3정거장 코드 ④와 같은 값). 왼쪽은 0.20 미만 10행을 그림 밖에 두었다.

거꾸로, 두 칸을 엮어 어느 칸에도 없던 뜻을 만들 수도 있습니다. 이동거리를 이용시간으로 나누면 시속이 나옵니다 — 거리 칸에도 시간 칸에도 없던 값이에요. 다만 시속도 두 칸 밖의 정보는 아닙니다. 새로 잰 것이 아니라 두 칸의 관계를 읽은 것이지요.

2-4한 줄이 무엇인지부터

이제 여는 장면의 408.8km로 돌아갑시다. 이 표의 한 줄은 대여 한 번이 아닙니다. 기관은 파일을 내놓기 전에 달 · 대여소 · 대여구분 · 성별 · 연령대 다섯 칸이 같은 대여를 모두 한 줄로 묶습니다. 그래서 이용건수라는 칸이 따로 있는 거예요 — 그 줄에 몇 번의 대여가 들어 있는지 적은 칸입니다.

이 표에서 이용건수는 가장 작게 1, 가운데 15, 가장 크게 1,236입니다. 대여 87,063건이 2,000줄에 담겨 있어요. 줄마다 크기가 이렇게 다르면, 줄 수로 나눈 평균은 거리가 아니라 묶음 크기를 잽니다.

그림 2두 줄만으로도 갈린다 — 무엇으로 나누나표 1의 첫 두 줄 · 주황 칸 하나가 대여 한 번
줄 수 2 로 나누면한 줄 평균 — 한 줄이 평균 몇 km 를 담고 있나줄 1408.8km대여 156번 …줄 253.6km대여 14번(408.8 + 53.6) ÷ 2줄231.2km줄 크기가 다른데 한 표로 셌다건수 합 170 으로 나누면한 번 몫 — 한 번 빌리면 몇 m 를 가나줄 1408.8km대여 156번 …줄 253.6km대여 14번462,396m ÷ 170건2,720m대여 한 번의 몫 줄 수 2 로 나누면한 줄 평균 — 한 줄이 평균 몇 km 를 담고 있나줄 1408.8km대여 156번 …줄 253.6km대여 14번(408.8 + 53.6) ÷ 2줄231.2km줄 크기가 다른데 한 표로 셌다건수 합 170 으로 나누면한 번 몫 — 한 번 빌리면 몇 m 를 가나줄 1408.8km대여 156번 …줄 253.6km대여 14번462,396m ÷ 170건2,720m대여 한 번의 몫

두 줄의 거리를 줄 수 2로 나누면 231.2km, 건수 합 170으로 나누면 2,720m입니다. 같은 두 줄인데 답이 백 배 넘게 다릅니다 — 묻는 것이 다르기 때문이에요. ‘한 줄이 평균 몇 km를 담고 있나’와 ‘한 번 빌리면 몇 m를 가나’는 다른 물음입니다. 자료: 표 1의 첫 두 줄(원장 계산)

Ⅰ-1 에서 가져옴제멜바이스의 6년치 사망률을 낼 때도 해마다의 비율을 평균 내지 않고 사망자를 모두 더하고 출산도 모두 더해서 나눴습니다. 크기가 다른 묶음을 공정하게 견주는 방법은 그때나 지금이나 하나입니다 — 합쳐서 나눈다.

표를 받으면 묻는 네 가지 — 이 차시의 나침반

  1. 뜻이 칸은 식별자 · 명목 · 순서 · 양 가운데 무엇인가 — 평균을 내도 되나
  2. 한 줄한 줄은 무엇 하나인가 — 사건 하나인가, 묶음인가
  3. 관계이 칸은 다른 칸으로 계산된 것인가 — 새 정보인가, 다른 이름인가
  4. 없는 칸답하고 싶은데 칸이 없는 물음은 무엇인가 — 무엇을 더 받아야 하나

네 물음에 답하고 나면 마지막 판단이 나옵니다 — 이 자료가 내 물음에 쓸 만한가. 쓸 만하지 않다면 무엇이 더 필요한지까지 적을 수 있어야 합니다(6 · 7차시가 그 답을 만들러 갑니다).

체크포인트 2

칸의 뜻 넷을 가릴 수 있고, 파생 속성을 나눠서 알아볼 수 있고, 한 줄이 묶음일 수 있다는 것을 안다. 이제 진짜 표에 대고 확인한다.

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

pandas 로 표를 읽고, 묶음을 푼다

오늘의 장비

pandas — 표를 통째로 다루는 도구

Ⅰ-3 에서는 표준 라이브러리 csv 로 한 줄씩 읽었습니다. 오늘부터 표는 pandas 로 읽습니다. 오늘은 읽는 명령만 씁니다 — 표를 고치는 일은 Ⅱ 단원의 몫이에요. 처음 실행은 몇 초 멈춥니다(pandas 를 처음 받는 중 · 쪽마다 한 번).

부르는 모양

import pandas as pd
from pyodide.http import open_url

파일 = "../data/bike_use_sample.csv"
df = pd.read_csv(open_url(파일))
df["이용건수"].mean()  # 칸 하나를 통째로

오늘 쓰는 것 넷

read_csv
파일을 표(DataFrame)로 — shape 로 행·열 수
df["칸"]
칸 하나를 통째로 — mean·median·isna
value_counts
값마다 몇 줄인지 세기 — sort_index·reindex
groupby
같은 값끼리 묶어 mean·sum

csv 모듈과 다른 셋

  1. 칸이 단위줄을 도는 for 없이 df["탄소량"] / km 처럼 칸끼리 한 번에
  2. 값으로 읽어 준다'156' 이 아니라 156 — 대신 '00102' 도 102 로 읽는다
  3. 묶어서 센다groupby 한 줄로 갈래마다 평균·합계

대가 — pandas 는 칸의 뜻을 모릅니다. 수처럼 보이면 무엇이든 평균을 내 줍니다(코드 ③이 그 장면입니다).

1

한 줄을 열어 본다 — 표의 첫인상, 그리고 실험실

9분

여는 장면에 적어 둔 내 예측입니다. 코드 ①의 출력과 맞대어 보세요 — 특히 이용건수의 가장 큰 값이 얼마인지가 이 문장의 운명을 가릅니다.

기본 코드 ①은 채워져 있습니다. 그대로 ▶ 실행해 행·열 수와 첫 두 줄, 그리고 이용건수의 가장 작은 값 · 가운데 값 · 가장 큰 값을 확인하세요.

도전 df["이용건수"].sum() 을 찍어 보세요. 2,000줄에 담긴 대여가 모두 몇 건인지 나옵니다 — 줄 수와 견주면 한 줄이 무엇인지 더 또렷해집니다.

탐구 이용건수가 1 인 줄은 어떤 줄일까요? df[df["이용건수"] == 1].head(3) 로 세 줄만 꺼내 보고, 그 줄의 이동거리가 얼마인지 보세요.

이제 실험실로 갑니다. 예측을 먼저 잠그고 코드 칩을 넣어 막대를 세운 뒤, 막대 → 벽돌 → 대여로 파고듭니다. 여기서 벽돌은 표의 한 줄이고, 대여는 그 줄에 묶여 있는 대여 한 번입니다. 마지막에 세로축의 분모 칸(÷ □)에 칸 하나를 넣으면 묶음이 풀립니다.

시뮬레이터

묶음 풀기

한 번에 마라톤 다섯 번을 타는 20대? — 막대를 열면 벽돌이, 벽돌을 열면 대여가 나온다

  1. 1한 줄의 뜻 · 1위 연령대 · 한 번 거리를 골라 잠근다
  2. 2코드 칩을 넣어 막대를 세우고 막대 → 벽돌 → 대여로 파고든다
  3. 3분모 칸(÷ □)에 칸을 넣어 묶음을 풀고 판정을 받는다
① 이 표의 한 줄은?
② 한 번 빌려 가장 멀리 가는 연령대
③ 20대가 한 번에 가는 거리
④ 다음 한 걸음
⑤ 세로축 분모 ÷ □
⑥ 들여다볼 두 칸
예측을 잠그기 전지금 돌린 코드 — (아직 없음)

한 줄 평균 = 값의 합 ÷ 줄 수 · 한 번 몫 = 값의 합 ÷ 이용건수의 합 — 분모 칸에 넣은 칸이 곧 ‘무엇 하나의 몫인가’를 정한다

판정 — 잠근 1위가 한 번 몫 순위에서 몇 위인지(자리 차)와, 잠근 거리가 20대의 한 번 몫에서 몇 m 떨어졌는지로 점수를 낸다. ‘기타’는 뜻이 열린 칸이라 회색으로 두고 순위에서 뺀다

20대 한 번 몫—m
지금 축의 1위—
내 1위의 자리—
파고든 층막대
가장 큰 벽돌—
점수0
도전 1

예측을 잠그고 막대를 세운 뒤, 분모 칸에 이용건수를 넣어 시상대를 뒤집어라 — 20대는 일곱 구간 가운데 몇 위로 내려가는가?

도전 2

대여구분 × 이용시간과 성별 × 이동거리를 차례로 열어 두 분모를 모두 눌러라 — 뒤집히는 쪽과 뒤집히지 않는 쪽이 갈린다.

도전 3

금고 — 이 표로 못 여는 물음 셋에 ‘모자란 것’ 카드를 하나씩 붙여 금고를 열어라.

자료: 서울열린데이터광장 「서울특별시 공공자전거 이용정보(월별)」(OA-15248) 2024년 6월 무작위 2,000행 — 코드 ① ~ ⑤ 가 읽는 ../data/bike_use_sample.csv 와 같은 2,000줄을 쪽 안에 실었다(원장이 구웠다).

이 표에서 ‘연령대별 평균 이동거리’를 groupby(...).mean() 으로 내면 그 값은 거리가 아니라 를 잰 것이다. 한 번 빌려 간 거리를 알고 싶으면 로 나눠야 하고, 그때 20대는 위가 된다.

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

칸마다 뜻을 붙인다 — 모양과 뜻이 어긋나는 칸 찾기

3분

표 2 를 덮어 두고 생각해 보세요. 열한 칸 가운데 컴퓨터가 보는 모양(수/글자)과 우리가 붙이는 뜻이 어긋나는 칸은 몇 개일까요? 숫자 하나만 먼저 짐작해 둡니다.

기본 빈칸 ①은 네 칸의 뜻입니다 — 식별자 · 명목 · 순서 · 양 가운데 하나를 따옴표째 적으세요. 나머지 일곱 칸은 채워 두었습니다. 다 채우고 ▶ 실행하면 세 열짜리 표가 나옵니다.

빈칸을 그대로 두고 ▶ 을 누르면 KeyError: '?????' 가 납니다. 이 칸의 빈칸은 따옴표 안에 있어서 문법으로는 탈이 없고, 그래서 파이썬은 끝까지 돌리다가 할수있는["?????"] 를 찾는 자리에서 멈춥니다 — 할수있는 에는 식별자 · 명목 · 순서 · 양 넷만 적어 두었으니까요. 오류 글에 ????? 가 보이면 아직 못 채운 칸이 있다는 뜻입니다. 막히면 🔑 정답 코드 넣기로 끝까지 돌려 본 뒤, ↺ 처음 코드로 를 눌러 다시 채워 보세요.

도전 KIND 에서 "대여일자" 를 "양" 으로 바꾸면 표는 아무 불평 없이 다시 찍힙니다. 틀린 뜻을 붙여도 프로그램은 멈추지 않는다는 것 — 뜻은 사람이 지킵니다.

탐구 이용건수 는 ‘양’으로 두었습니다. 그런데 이 칸은 묶음의 크기예요. 묶음 크기에 평균을 내는 것은 무엇을 재는 일일까요? 미션 ①의 실험실에서 본 벽돌 탑을 떠올려 보세요.

대여소명 은 글자인데 뜻은 이고, 연령대코드 는 글자인데 뜻은 다. 모양이 뜻을 정하지 못하는 까닭은 이기 때문이다.

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

계산은 되는데 뜻이 없을 때 · 새 정보인가 다른 이름인가

5분

두 가지를 먼저 짐작해 두세요. ① 연령대코드를 일곱 구간 목록으로 다시 놓으면 몇 행이 남을까요? ② 탄소량을 이동거리(km)로 나눈 값의 표준편차는 0에 가까울까요?

기본 1 코드 ③은 채워져 있습니다. 그대로 ▶ 실행해 반례 셋을 보세요 — 뜻 없는 평균 · 글자 순서로 늘어선 연령대 · 빈칸.

도전 출력의 마지막 줄을 보세요. AGE_ORDER 에서 무엇이 빠졌기에 2,000행이 1,660행이 되었을까요? 목록을 고쳐 2,000이 그대로 남게 하세요. reindex 는 목록에 없는 값을 오류 없이 버립니다.

기본 2 빈칸 ②에 ‘km 당 탄소량’을 적고 ▶ 실행해, 나눈 값이 한 자리에 모이는지 보세요.

탐구 운동량 ÷ km 는 왜 흩어질까요? 아래 두 줄을 덧붙여 성별로 묶은 가운데 값을 찍어 보세요. 빈칸까지 한 갈래로 세려면 dropna=False 가 필요합니다.

kcal = df["운동량"] / km
print(kcal.groupby(df["성별"], dropna=False).median().round(2))

탄소량은 이므로 ‘탄소량과 이동거리의 상관이 높다’는 가 아니다. 시속은 두 칸을 엮어 를 만들지만, 두 칸 밖의 정보를 .

확인 문제 3 · 4에 적어 제출 →
4

합 ÷ 합 — 막대를 다시 그린다

3분

실험실에서 본 것을 이제 코드로 다시 냅니다. 막대 두 장이 나올 텐데, 첫 장은 일부러 틀린 물음의 답입니다. 두 장의 1위가 같을까요, 다를까요?

기본 빈칸 ③에 ‘거리의 합을 무엇의 합으로 나누나’를 적고 ▶ 실행하세요. 실험실에서 분모 칸에 넣었던 바로 그 칸입니다.

도전 마지막 표의 ‘한 줄 = 몇 번’ 칸을 보세요. 20대는 90.0번, 70대이상은 4.2번입니다. 이 숫자만으로 첫 막대가 왜 뒤집혔는지 한 줄로 설명할 수 있습니다.

탐구 "이동거리(M)" 를 "이용시간(분)" 으로 바꾸고 "연령대코드" 를 "대여구분코드" 로 바꿔 돌려 보세요. 실험실의 도전 2와 같은 장면이 코드로 나옵니다.

이 표로 답할 수 있는 물음은 이고, 답할 수 없는 물음은 이다. 답하려면 이 더 있어야 한다.

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

칸 열한 개에 뜻을 붙였고, 계산은 되지만 뜻 없는 값을 직접 찍어 보았고, 묶음을 풀어 한 번 몫을 냈다.

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

오늘의 탐험 일지

  1. 찾은 것

    컴퓨터가 수로 읽은 칸은 일곱인데 평균이 뜻 있는 칸은 다섯이었다. 그리고 이 표의 한 줄은 대여 한 번이 아니라 대여 여러 번의 합계였다.

  2. 도구의 한계

    pandas 는 칸의 뜻을 묻지 않는다 — 이름표의 평균도 내 준다. reindex 는 목록에 없는 값을 오류 없이 버린다(기타 340행).

  3. 보고의 규칙

    표를 보고할 때 한 줄이 무엇인지 먼저 적고, 나눈 값을 쓸 때는 무엇으로 나눴는지를 함께 적는다.

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

1. 대여소번호의 평균(2,398.7)은 왜 뜻이 없는가? 마침 02398번 대여소(‘더라움’)가 실제로 있다면 “평균 대여소는 더라움”이라고 말할 수 있는가? 그리고 대여소번호로 할 수 있는 뜻있는 계산을 하나 쓰시오.
📖 모범 답안

대여소번호는 대여소를 가리키는 이름표(식별자)라서 크기와 간격에 뜻이 없다. 번호를 더하고 나눈 값은 어느 대여소의 성질도 아니다 — 102번과 6172번을 더하는 일에 현실의 뜻이 없기 때문이다.

“평균 대여소는 더라움”이라고 말할 수 없다. 02398번 대여소가 실제로 있는 것은 우연이다. 표본이 조금만 달라져도 평균은 다른 번호로 옮겨 가고, 번호를 다시 매기면(예: 이름 순서로) 같은 대여소가 전혀 다른 값이 된다. 번호를 바꿔도 대여소는 그대로인데 평균만 바뀐다 — 그 값이 대여소의 성질이 아니라는 증거다.

뜻있는 계산은 세는 것뿐이다 — 대여소별 이용 건수 세기, 표본에 대여소가 몇 곳인지 세기(1,415곳), 가장 자주 나오는 대여소 찾기. 평균·합계·범위는 쓰지 않는다.

2. 연령대코드를 정렬했더니 20대 30대 40대 50대 60대 70대이상 ~10대 기타 차례가 나왔고, 일곱 구간 목록(AGE_ORDER)으로 다시 놓았더니 행 수가 2,000에서 1,660으로 줄었다. ① 무엇이 잘못되었고 어떻게 바로잡는가? ② 이 칸으로 평균을 내도 되는가?
📖 모범 답안

① 컴퓨터는 연령대코드를 글자로 보고 글자 순서로 늘어놓았다. 그래서 ~ 로 시작하는 ‘~10대’가 맨 뒤로 갔다. 이 칸은 순서 척도이므로 차례를 우리가 목록으로 알려 줘야 한다. 그런데 알려 준 목록에 ‘기타’를 빠뜨려 340행이 오류 한 줄 없이 사라졌다(2,000 → 1,660). 목록에 ‘기타’를 더하고, 놓기 전후의 행 수를 반드시 확인한다. 이 표에서 ‘기타’는 340행(17%)이나 되므로 빼고 논의하면 결론이 달라질 수 있다.

② 평균은 안 된다. 구간 사이 간격이 같다는 보장이 없고(‘~10대’와 ‘70대이상’은 끝이 열려 있다), ‘기타’는 나이 축 위에 자리가 없다. 가장 흔한 값과 가운데 값은 쓸 수 있다.

3. 코드 ④에서 탄소량 ÷ 이동거리(km)는 평균 0.2311, 표준편차 0.0081 이었다. 탄소량 칸은 무엇이고 분석에서 어떻게 다뤄야 하는가? 표준편차가 정확히 0이 아닌 까닭도 짐작해 쓰시오.
📖 모범 답안

이동거리에 거의 같은 수(약 0.232)를 곱해 만든 파생 속성이다. 이동거리를 알면 탄소량은 저절로 알 수 있으므로 새 정보가 아니다. 그래서 “탄소량과 이동거리의 상관이 높다”는 발견이 아니라 계산식을 다시 읽은 것이다. 분석에서는 둘 중 하나만 쓰거나, 함께 쓸 때는 계산으로 만든 칸임을 밝힌다.

표준편차가 0이 아닌 까닭 — 탄소량이 소수 둘째 자리까지 반올림되어 적혀 있어서, 거리가 짧은 줄에서는 반올림 오차가 비에 크게 나타난다. 그리고 1,995행 가운데 28행은 0.22~0.24 밖으로 벗어난다(탄소량이 0인데 거리가 있는 줄도 1행 있다). 정확한 산정 방식은 제공처 설명서에서 확인해야 한다 — 우리가 나누어 짐작한 것일 뿐이다.

4. 탄소량(이동거리에 같은 수를 곱한 것으로 보이는 칸)과 시속(이동거리 ÷ 이용시간)은 둘 다 다른 칸으로 계산한 칸이다. 그런데 하나는 새 정보가 아니고 하나는 새 뜻을 만든다. 차이를 쓰시오.
📖 모범 답안

탄소량은 한 칸(이동거리)에 같은 수를 곱한 것이라 이동거리를 알면 저절로 안다 — 새 정보가 없다. 시속은 두 칸을 엮어 어느 한 칸에도 없던 뜻(얼마나 빨리 달렸나)을 만든다. 한 칸을 늘이거나 줄이기만 한 것인지, 서로 다른 두 칸의 관계를 잰 것인지가 갈림이다.

다만 시속도 두 칸 밖의 정보는 아니다. 시속으로 찾은 것은 두 칸의 관계를 읽은 것이지 새로 잰 것이 아니다. 그리고 이 표에서는 묶음의 합끼리 나눈 값이라(거리 합 ÷ 시간 합), 한 사람이 실제로 낸 속도가 아니라 그 묶음 전체의 평균 속도다. 연령대별로 5.6~7.3km/h 가 나오는데, 이 값도 ‘누가 그렇게 달렸다’가 아니라 ‘묶음이 그렇다’로만 읽어야 한다.

5. 코드 ⑤의 두 막대는 순위가 뒤집혔다(한 줄 평균 20대 208.1km 1위 → 한 번 몫 20대 2,312m 는 일곱 구간 중 6위). ① 까닭을 ‘한 줄 = 몇 번’으로 설명하시오. ② 그리고 아래 표를 채워 이 표의 가치를 판단하시오.
물음내가 쓸 물음이 표로 답할 수 있나 · 없다면 무엇이 더 필요한가
답할 수 있는 물음 ①
답할 수 있는 물음 ②
답할 수 없는 물음
📖 모범 답안

① 한 줄이 대여 여러 번의 합계이고, 한 줄에 든 대여 수가 연령대마다 다르기 때문이다 — 20대는 한 줄에 평균 90.0번, 70대이상은 4.2번이 묶여 있다. 그래서 ‘한 줄 평균’은 거리가 아니라 묶음 크기를 잰 것이다. 묶음을 풀려면 합 ÷ 합으로 가야 한다 (거리의 합 ÷ 이용건수의 합) — Ⅰ-1 에서 사망자를 모두 더하고 출산도 모두 더해 나눈 것과 같은 식이다.

② 답할 수 있는 물음(예) — “연령대마다 한 번 빌리면 평균 몇 m를 가나?”(이동거리 합 ÷ 이용건수 합) · “정기권과 일일권 가운데 한 번 이용시간이 긴 쪽은?”(이용시간 합 ÷ 이용건수 합, 일일권 29.7분 대 정기권 19.6분) · “6월에 가장 많이 쓰인 대여소는 어디인가?”(대여소별 이용건수 합).

답할 수 없는 물음(예) — “비 오는 날에는 이용이 줄어드는가?” 대여일자가 202406 한 값뿐이라 날짜 축이 없다. 일 단위 날짜가 든 자료와 기상청 일별 강수량이 더 있어야 한다. “한 번에 가장 멀리 간 대여는 몇 m인가?”도 답할 수 없다 — 가장 큰 값은 묶음의 합(2,696.0km · 428번 묶음)이지 한 번의 거리가 아니다. 건별 대여 기록이 필요하다. “어디서 빌려 어디에 반납했나”도 반납 대여소 칸이 없어 못 답한다.

이 셋이 6 · 7차시로 가는 까닭이다 — 건별 기록을 어떻게 담고(6차시), 다른 표와 어떻게 잇는지(7차시).

+
더 알아보기

탐험 밖의 이야기 셋

척도마다 허용되는 셈세기흔한 값가운데평균비(倍)이름 척도성별 · 대여구분✓✓✕✕✕서열 척도연령대코드✓✓✓✕✕등간 척도섭씨온도 · 서기 연도✓✓✓✓✕비율 척도이동거리 · 이용건수✓✓✓✓✓등간과 비율의 차이 — 0 이 ‘없음’인가섭씨 — 0 은 물이 어는 자리0102030℃20 ÷ 10 = 2.00켈빈 — 0 은 정말 ‘없음’273283293303K293 ÷ 283 ≈ 1.04비는 0 이 ‘없음’일 때만 뜻이 있다
역사

‘평균을 내도 되는가’를 처음 표로 만든 사람

1946년, 심리학자 스탠리 스미스 스티븐스는 「측정의 척도 이론에 관하여」라는 짧은 논문에서 측정을 이름(nominal) · 서열(ordinal) · 등간(interval) · 비율(ratio) 네 척도로 나누고, 척도마다 허용되는 통계를 정리했습니다. 오늘 코드 ②에서 우리가 만든 KIND 표가 그 표의 후손이에요.

등간과 비율의 차이는 온도계에서 가장 잘 보입니다. 섭씨로는 20℃ ÷ 10℃ = 2 이니 “두 배로 따뜻하다”고 말하고 싶어집니다. 그런데 같은 두 온도를 켈빈으로 바꾸면 293K ÷ 283K ≈ 1.04 예요. 같은 두 온도인데 비가 달라집니다. 까닭은 섭씨의 0이 ‘열이 전혀 없음’이 아니라 물이 어는 자리라는 약속일 뿐이기 때문입니다. 차(20 − 10 = 10도)는 어느 눈금에서나 같지만, 비는 0이 정말 ‘없음’일 때만 뜻이 있습니다.

이 분류에 대한 반론도 오래됐습니다. 설문에서 흔한 5점 척도(매우 그렇다 ~ 전혀 아니다)는 엄밀히는 서열이라 평균을 내면 안 되는데, 실무에서는 평균을 내어 보고합니다. 스티븐스의 표는 금지 목록이라기보다, 어떤 계산을 할 때 무엇을 가정하고 있는지 적어 두게 하는 장치로 읽는 편이 낫습니다.

도해: 네 척도마다 허용되는 셈을 표로 정리하고, 섭씨·켈빈 두 눈금 위에 같은 10도 구간을 나란히 놓았다. · 출처: S. S. Stevens, “On the Theory of Scales of Measurement,” Science 103(2684), 1946

같은 한 줄, 두 가지로 읽기00102,102. 망원역 1번출구 앞,정기권,F,40대파일에 적힌 글자글자로 읽으면00102다섯 자리가 그대로수로 읽으면102맨 앞 0 두 개가 사라진다다른 표와 이을 때001020010200103001030010400104둘 다 글자면 — 세 줄이 짝을 찾는다10200102✕10300103✕10400104✕한쪽만 수면 — 0행칸의 뜻(식별자)이 읽는 방법까지 정한다 — 읽을 때부터 글자로(dtype=str).7차시에서 이 어긋남이 표 둘을 잇는 일을 망가뜨린다.
방법 더 깊이

맨 앞의 0은 어디로 갔나 — 수 모양의 이름표

오늘 파일의 대여소번호는 00102 입니다. 다섯 자리로 적힌 이름표예요. 그런데 표 프로그램이나 read_csv 가 이 칸을 ‘수’로 읽으면 102 가 되어 맨 앞의 0 두 개가 사라집니다. 같은 일이 우편번호에서도 일어납니다 — 2015년부터 쓰는 다섯 자리 우편번호(국가기초구역번호)는 서울 지역이 0으로 시작하는데, 수로 읽히면 네 자리가 되어 버립니다.

이 표 하나만 볼 때는 아무 일도 생기지 않습니다. 문제는 다른 표와 이을 때예요. 한쪽 표의 00102 와 다른 쪽 표의 102 는 컴퓨터에게 다른 값이라, 짝을 찾지 못한 행이 오류 한 줄 없이 조용히 빠집니다(7차시에서 실제로 0행이 되는 장면을 봅니다).

막는 방법은 읽는 자리에 있습니다 — pd.read_csv(…, dtype={"대여소번호": str}) 처럼 이 칸은 글자다라고 먼저 말해 두는 것이죠. 칸의 뜻(식별자)이 읽는 방법까지 정한다는 오늘의 규칙이 코드 한 조각으로 나타나는 자리입니다. 학번·사업자등록번호·계좌번호도 모두 같은 칸입니다.

도해: 파일의 한 줄을 글자로 읽었을 때와 수로 읽었을 때를 나란히 놓고, 두 표를 이을 때 짝이 맞는 경우와 맞지 않는 경우를 그렸다. · 자료: 오늘 파일의 대여소번호 00102(원장 확인 — 글자로 읽으면 00102, 수로 읽으면 102)

대여 한 번이 표의 한 줄이 되기까지① 잠금장치와 앱이 대여 한 번을 한 줄로 적는다… 6월 한 달, 이 대여소 · 정기권 · 20대에서만 428번② 기관이 다섯 칸이 같은 것끼리 묶는다달대여소대여구분성별연령대개인을 알아볼 수 없게 하려고 미리 묶는다 — 7차시 재식별과 이어진다③ 묶음 하나가 표의 한 줄이 된다대여소명583. 청계천 생태교실 앞이용건수428이동거리(M)2,696,009.07④ 재지 않고 계산해 적는 칸운동량 · 탄소량은 센서가 잰 값이 아니라 계산해 적은 칸이다.계산식을 모르면 ‘상관이 높다’를 발견으로 읽게 된다.제공처 설명서에서 칸의 산정 방식을 먼저 확인한다.
현장

이 한 줄은 어디서 태어났나

대여소 단말기와 자전거 잠금장치, 그리고 앱은 대여 한 번을 한 줄로 적습니다. 빌린 시각, 빌린 대여소, 반납한 시각, 반납한 대여소까지 들어 있는 건별 기록이에요. 그런데 기관이 공개하는 ‘이용정보(월별)’ 파일에는 그 줄들이 그대로 오지 않습니다. 달 · 대여소 · 대여구분 · 성별 · 연령대 다섯 칸이 같은 대여를 모두 한 줄로 묶어 내보냅니다.

묶는 까닭은 두 가지입니다. 하나는 개인을 알아볼 수 없게 하려는 것 — 건별 기록은 ‘어느 대여소에서 몇 시에 빌려 어디에 반납했는가’가 그대로 남아 몇 건만 겹쳐 봐도 사람이 좁혀집니다(7차시의 재식별). 다른 하나는 파일을 작게 만드는 것이고요. 오늘 표본에서 가장 큰 줄 하나가 대여 428번을 담고 있는 것이 그 결과입니다.

묶으면서 생기는 칸도 있습니다. 운동량과 탄소량은 센서가 잰 값이 아니라 이동거리에서 계산해 적은 칸이에요. 계산식을 모른 채 표만 보면 “탄소량과 이동거리의 상관이 아주 높다”를 발견으로 착각하게 됩니다. 그래서 파일을 받으면 숫자를 보기 전에 제공처 설명서에서 칸의 산정 방식부터 확인합니다.

도해: 건별 기록이 다섯 칸으로 묶여 표의 한 줄이 되는 과정과, 재지 않고 계산해 적는 칸을 함께 그렸다. · 자료: 표본에서 가장 큰 줄(583. 청계천 생태교실 앞 · 정기권 · 20대 · 이용건수 428 · 이동거리 2,696,009.07m, 원장 계산)