단원 홈

Ⅱ. 데이터 준비와 분석3차시

파일을 받으면 먼저
신상명세서를 쓴다

출처 · 규모 · 자료형 · 통계적 특성

기상청에서 받은 서울 2024년 일자료 한 개가 손에 있습니다. 계산을 시작하기 전에 이 파일이 무엇인지를 네 칸으로 재어 적어 두면, 뒤에 오는 열한 차시가 그 네 칸에 기댑니다. 오늘은 그 신상명세서를 쓰고, 그것으로 바꿔치기한 사본 열두 벌을 걸러 냅니다.

  • [12데과02-01]
  • 50분네 정거장
  • 새 도구pandas 점검 함수 넷
  • 자료기상청 ASOS 서울 2024 366일 · 사본 12벌
Ⅱ 단원 지도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. 손으로

    pandas 로 규모·자료형·빈칸·요약 통계를 재고, 표준편차를 손으로 한 번 계산할 수 있다.

  3. 확인에서

    잰 값으로 데이터 신상명세서 여섯 칸을 채우고, 그것이 막는 사고와 못 막는 사고를 말할 수 있다.

1
여는 장면 · 5분

파일을 그대로 열었다 — 여기서 무엇을 알 수 있나

기상청 기상자료개방포털에서 서울 2024년 일자료를 내려받아 그대로 열었습니다. 머리글에는 °C · mm · % 가 섞여 있고, 1월 4일 줄에는 빈칸이 둘 있으며, 맨 앞 두 열 지점 · 지점명 은 다섯 줄 내내 같은 값입니다.

여기까지가 눈으로 본 것입니다. 그런데 눈으로 본 것은 다섯 줄까지이고 나머지는 못 봅니다. 이 파일에 몇 줄이 더 있는지도 아직 모릅니다. 그래서 파일을 받으면 먼저 재서 적습니다. 무엇을 재야 할까요?

첫인상눈으로 본 것

다섯 줄만 보고 적은 것 — 나머지 줄은 아직 모른다.

표 1파일을 그대로 연 첫 화면머리글 한 줄 + 첫 다섯 줄 · 글자 그대로
지점지점명일시평균기온(°C)최저기온(°C)최고기온(°C)강수 계속시간(hr)일강수량(mm)평균 풍속(m/s)평균 상대습도(%)합계 일조시간(hr)
108서울2024-01-013.3-0.37.32.920.01.783.44.3
108서울2024-01-022.92.24.31.580.01.672.60.3
108서울2024-01-031.8-1.14.06.250.61.680.41.2
108서울2024-01-041.4-3.34.7빈칸빈칸1.974.30.5
108서울2024-01-055.01.49.10.420.02.377.15.7

열 열하나 가운데 둘은 이름표(지점 · 지점명)이고 하나는 날짜(일시)이며 나머지 여덟이 잰 값입니다. 1월 4일의 빈칸 둘이 '비가 안 왔다'인지 '못 쟀다'인지는 이 화면이 말해 주지 않습니다(그 물음은 4차시가 맡습니다). 자료: 기상청 기상자료개방포털 종관기상관측(ASOS) 일자료 · 지점 108 서울 · 기상청 제공(2026-09-23 내려받음) · ../data/asos_seoul_2024.csv

먼저 예측

아직 파이썬에게 묻지 않았습니다. 이 파일은 몇 행 × 몇 열일까요? 그리고 일시 열을 파이썬은 수 · 글자 · 날짜 가운데 무엇으로 읽을까요? 3정거장 미션 ①에서 여러분의 짐작과 실제를 맞대어 봅니다.

체크포인트 1

눈으로 본 것과 아직 모르는 것을 갈라 두었다 — 다섯 줄은 보았고 그 아래는 못 보았다.

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

네 칸을 재서 적는다 — 그것이 신상명세서다

2-1무엇을 묻는 네 칸인가

처음 받은 파일을 앞에 두고 물어야 할 것은 네 가지입니다. 출처(누가 · 어디서 · 어떤 장비로 쟀나), 규모(몇 행 × 몇 열이고 한 행이 무엇인가), 자료형(열마다 수인가 범주인가 날짜인가 이름표인가), 통계적 특성(대푯값 · 흩어짐 · 범위 · 빈칸 수).

이 네 칸을 재어 적어 둔 쪽지를 이 책에서는 데이터 신상명세서라고 부릅니다 — 파일 한 개를 한 장으로 줄인 쪽지입니다. 사람이 읽으려고 쓰는 것이기도 하지만, 오늘 보게 될 진짜 쓰임은 다릅니다. 명세서는 나중에 받은 파일이 그 파일이 맞는지 검사하는 자가 됩니다.

네 칸은 순서가 있습니다. 규모를 모르면 빈칸 수를 읽을 수 없고(206은 366 가운데 206일 때와 36,600 가운데 206일 때가 전혀 다릅니다), 자료형을 모르면 평균이 뜻을 갖는지조차 알 수 없습니다. 그래서 위에서 아래로 차례로 잽니다.

파일을 여는 나침반 — 네 칸을 차례로

  1. 출처누가 · 어디서 · 어떤 장비로 · 언제까지 쟀나
  2. 규모몇 행 × 몇 열인가, 그리고 한 행이 무엇인가
  3. 자료형열마다 수 · 범주 · 날짜 · 이름표 가운데 무엇인가
  4. 통계적 특성대푯값 · 흩어짐 · 범위 · 빈칸 수

이 나침반은 오늘 한 번 쓰고 마는 것이 아닙니다. Ⅳ단원에서 처음 보는 표를 받았을 때 여러분이 스스로 돌리게 될 틀입니다.

2-2파이썬이 읽은 자료형 ≠ 사람이 읽어야 할 자료형

자료형 칸이 가장 자주 어긋납니다. 파일에는 자료형이 적혀 있지 않으므로 read_csv 는 값의 생김새만 보고 짐작합니다. 짐작은 자주 맞고, 가끔 뜻과 어긋납니다.

표 2열 열하나의 신상파이썬이 읽은 것과 사람이 읽어야 할 것
열파이썬이 읽은 것첫 값사람이 읽어야 할 것
지점int64 (수)108이름표 — 더하거나 평균 낼 값이 아니다
지점명object (글자)서울이름표 — 맞게 읽혔다
일시object (글자)2024-01-01날짜 — 어긋난다. 바꾸지 않으면 달을 뽑을 수 없다
평균기온(°C) 등 여덟 열float64 (수)3.3잰 값 — 맞게 읽혔다. 단위는 열 이름에만 있다

열 열하나 가운데 수로 읽힌 것 아홉 · 글자로 읽힌 것 둘 · 날짜로 읽힌 것 0. 어긋난 칸은 둘입니다 — 지점(수로 읽혔지만 이름표)과 일시(글자로 읽혔지만 날짜). 자료: 코드 ①이 찍는 df.dtypes 와 같은 값

Ⅰ-5 에서 가져옴속성의 뜻은 식별자 · 명목 · 순서 · 양 네 가지였고, 대여소번호의 평균이 뜻 없는 숫자인 까닭을 거기서 보았습니다. 오늘은 그 이야기를 되풀이하지 않고 파이썬이 읽은 모양과 그 뜻이 어긋나는 칸만 짚습니다.

일시 가 글자라는 것은 화면으로는 보이지 않습니다. 2024-01-01 은 사람 눈에 완벽한 날짜니까요. 그런데 파이썬에게 이것은 열 글자짜리 문자열일 뿐이라 여기서 '달'을 뽑을 방법이 없습니다.

그래서 자료형 칸에는 읽힌 모양과 뜻을 함께 적습니다. "일시: 날짜 — 파일에서는 글자로 읽힘, pd.to_datetime 으로 바꿈" 처럼요. 바꾸는 한 줄까지 적어 두어야 다음 사람이 같은 표를 다시 만들 수 있습니다.

2-3흩어짐을 손으로 — 왜 n−1 로 나누나

통계적 특성 칸에는 대푯값만 적지 않습니다. 흩어짐을 함께 적습니다. 흩어짐을 재는 차례는 다섯 걸음입니다 — 편차(값 − 기준) → 편차² → 합 → 나누기 → 제곱근.

값 여덟 개 [2, 4, 4, 4, 5, 5, 7, 9] 로 해 봅시다. 평균은 40 ÷ 8 = 5 입니다. 편차는 −3 · −1 · −1 · −1 · 0 · 0 · 2 · 4 이고, 제곱해서 더하면 9 + 1 + 1 + 1 + 0 + 0 + 4 + 16 = 32 입니다. 여기서 갈립니다 — 8로 나누면 분산 4, 표준편차 2.0. 7로 나누면 분산 약 4.571, 표준편차 약 2.138.

왜 하나를 덜어 낸 7로 나눌까요? 편차를 표본 자신의 평균에서 쟀기 때문입니다. 평균은 편차² 합이 가장 작아지는 자리입니다 — 기준을 4로 옮기면 40, 6으로 옮겨도 40인데 평균 5에서만 32입니다(그림 1). 표본의 평균은 늘 그 표본에 가장 가까이 붙어 있으니, 그 자리에서 잰 흩어짐은 모집단의 흩어짐보다 작게 나오기 쉽습니다. 그 기울어짐을 되갚느라 나누는 수를 하나 줄입니다.

그래서 같은 값에 같은 식인데 도구마다 다른 숫자가 나옵니다. statistics.pstdev 는 n 으로 나누고(모집단), pandas .std() 는 n−1 로 나눕니다(표본). 명세서에 표준편차를 적을 때는 어느 쪽으로 쟀는지를 함께 적어야 다음 사람이 같은 값을 다시 얻습니다.

그림 1평균은 편차² 넓이가 가장 작은 자리다값 여덟 [2, 4, 4, 4, 5, 5, 7, 9] · 정사각형 한 변 = 기준에서 떨어진 거리
기준에서 떨어진 만큼을 한 변으로 — 정사각형 여덟 개기준 4넓이 합 40기준 5 = 평균넓이 합 32기준 6넓이 합 40평균 자리에서 잰 넓이가 가장 작다 — 어디로 옮겨도 커진다 기준을 옮기며 잰 편차² 합 — 평균에서 바닥을 친다05010015040324023456789가로: 기준세로: 편차² 합 기준에서 떨어진 만큼을 한 변으로 — 정사각형 여덟 개기준 4넓이 합 40기준 5 = 평균넓이 합 32기준 6넓이 합 40평균 자리에서 잰 넓이가 가장 작다 — 어디로 옮겨도 커진다 기준을 옮기며 잰 편차² 합 — 평균에서 바닥을 친다05010015040324023456789가로: 기준세로: 편차² 합

첫 판 — 기준을 4 · 5 · 6 으로 옮겨 가며 정사각형 여덟 개의 넓이를 더하면 40 · 32 · 40 입니다. 둘째 판 — 기준을 2에서 9까지 옮기며 그 합을 그리면 평균 5에서 바닥을 칩니다. 표본의 평균이 늘 이 바닥 자리라서, 그 자리에서 잰 흩어짐은 모집단보다 작게 나옵니다 — n−1 로 나누는 까닭입니다. 자료: 개념 예시 여덟 값 — 편차² 합은 손으로 검산할 수 있다(9+1+1+1+0+0+4+16 = 32)

2-4요약표를 읽는 법 — count 와 50%

describe() 는 열마다 여덟 줄을 한꺼번에 내놓습니다. 그 가운데 맨 윗줄 count 와 가운데 줄 50% 둘이 특히 많은 말을 합니다.

표 3요약 통계 — 네 열소수 첫째 자리까지 · 코드 ②가 찍는 값
평균기온(°C)최고기온(°C)일강수량(mm)평균 상대습도(%)
count366.0366.0160.0366.0
mean14.919.58.265.9
std10.510.617.713.2
min-11.7-8.20.028.6
25%4.89.70.056.0
50%16.321.61.165.8
75%24.428.57.875.5
max31.836.4128.895.8

count 가 행 수보다 작으면 빈칸이 있습니다. 일강수량만 160 — 366일 가운데 206일이 비어 있습니다. 평균과 50%(중앙값)가 크게 다르면 한쪽 꼬리가 깁니다. 일강수량은 평균 8.2 인데 중앙값은 1.1 — 비가 많이 온 며칠(가장 많은 날 128.8mm)이 평균을 끌어올렸습니다. 나머지 세 열은 평균과 중앙값이 1.4 · 2.1 · 0.1 만큼만 떨어져 있어 한쪽으로 크게 쏠리지 않았습니다. 자료: 기상청 ASOS 서울 2024 366일 — 코드 ②의 출력값

count 가 말해 주는 것은 몇 칸이 비었나까지입니다. 그 빈칸이 '비가 안 온 날'인지 '못 잰 날'인지는 말해 주지 않습니다. 그 물음은 4차시의 몫이고, 오늘 명세서의 빈칸 칸에는 센 수만 적습니다.

그리고 대푯값 하나로는 한 달의 성격을 다 말하지 못합니다. 2024년 서울의 1월과 12월은 평균기온이 −0.5°C 와 0.8°C 로 1.3°C 밖에 다르지 않습니다. 그런데 표준편차는 4.1 과 2.5 로 거의 두 배 차이입니다. 1월은 −11.7 에서 5.4 까지 오르내렸고, 12월은 −3.4 에서 6.4 사이에 머물렀습니다. 같은 '추운 달'인데 옷을 고르기 어려운 쪽은 1월입니다.

규칙대푯값을 적을 때는 흩어짐을 함께 적는다 — 평균 하나만 적은 줄은 명세서가 아니다.

1월 · 12월평균은 1.3°C 차이
1월 표준편차 4.112월 표준편차 2.5

점 하나 = 하루의 평균기온(위 1월 31일 · 아래 12월 31일) — 코드 ⑤가 찍는 값

일강수량 · 평균과 중앙값
1.1중앙값(mm)
vs
8.2평균(mm)

중앙값 평균 — 오른쪽 꼬리가 평균을 끌어올린다(점선 밖 옅은 막대 = 40mm 넘은 8일).

일강수량 · 행 수와 count
366행(일)
인데
160count

206칸이 비었다 — 뜻은 아직 모른다(4차시).

첫 주 7일 · 나누는 수만 바꾸면
2.751÷ n
vs
2.972÷ (n−1)

같은 값, 같은 식 — 도구가 다르면 숫자가 다르다.

1월과 12월 · 평균은 비슷한데
4.11월 표준편차
vs
2.512월 표준편차

평균 −0.5 대 0.8 — 대푯값이 못 하는 말이 있다.

자료: 위 네 쌍의 숫자는 모두 코드 ② · ③ · ⑤가 찍는 값이다(기상청 ASOS 서울 2024 366일).

체크포인트 2

네 칸이 무엇을 묻는지, 어느 칸이 가장 자주 어긋나는지, 흩어짐을 어떻게 재는지 말할 수 있다. 이제 직접 재 본다.

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

재서 적고, 그 명세서로 사본 열두 벌을 거른다

오늘의 장비

pandas 로 파일에게 묻는 네 마디

Ⅰ-5 에서 pandas 로 표를 읽고 고르는 법을 익혔습니다. 오늘은 같은 도구로 표에게 “너는 무엇이냐”고 묻습니다. 네 마디면 명세서 네 칸이 거의 채워집니다.

부르는 모양

rows, cols = df.shape
df.dtypes
df.isna().sum()
df.describe()
df["일시"] = pd.to_datetime(…)

오늘 쓰는 마디 넷

shape
규모 — (행, 열) 두 수를 한꺼번에
dtypes
자료형 — 열마다 파이썬이 짐작한 모양
isna().sum()
빈칸 — 열마다 몇 칸이 비었나
describe()
통계적 특성 — 여덟 줄(count · mean · std · min · 사분위 · max)

Ⅰ-5 에서 쓰던 것과 다른 셋

  1. 값이 아니라 표를 묻는다한 칸의 값이 아니라 열 전체의 성격을 돌려준다
  2. 답이 표로 온다describe() 가 주는 것은 수 하나가 아니라 8 × 열 개의 표
  3. 고치는 마디가 하나 낀다pd.to_datetime — 읽힌 모양을 뜻에 맞게 바꾼다

대가 — describe() 는 수로 읽힌 열만 요약합니다. 글자로 읽힌 열은 표에서 아예 빠지므로, 빠진 열이 있는지 먼저 봐야 합니다.

1

규모와 자료형 — 파이썬이 본 것과 사람이 읽어야 할 것

5분

여는 장면에 적어 둔 내 짐작입니다. 행과 열의 수, 그리고 일시 의 자료형 — 둘 다 맞았을까요?

기본 빈칸 ①에 규모를 한꺼번에 주는 이름을, 빈칸 ②에 글자를 날짜로 바꾸는 함수를 채우고 ▶ 실행합니다. 마지막 줄의 .dt.month 가 끝까지 도는지 보세요 — 그 줄이 빈칸 ②의 채점자입니다.

도전 — 일부러 틀린 길 빈칸 ② 가 든 두 줄(주석과 그 아래 줄)을 지우고 다시 돌려 보세요. 마지막 줄 df["일시"].dt.month 가 오류로 멈춥니다. 오류 메시지의 어느 낱말이 까닭을 말해 주나요? (되돌릴 때는 칸 위의 ↺ 처음 코드로 를 누릅니다.)

탐구 df["지점"].mean() 을 내면 108 이 나옵니다. 이 숫자에 뜻이 없는 까닭을 Ⅰ-5 의 이름표로 설명하고, 명세서의 자료형 칸에 지점 을 어떻게 적을지 정해 보세요.

명세서의 자료형 칸에 일시 는 라고 적는다. 파일에서는 로 읽혔고, 한 줄로 바꿔야 를 할 수 있기 때문이다.

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

빈칸 수와 describe — count 와 50%를 읽는다

3분

366일 가운데 비어 있는 칸이 가장 많은 열은 어디일까요? 그리고 일강수량의 평균과 중앙값(50%) 가운데 어느 쪽이 클까요? 두 물음에 먼저 답을 정해 두고 돌립니다.

기본 코드 ②는 채워져 있습니다. 그대로 ▶ 실행해 빈칸이 있는 열 넷과 count 가 366이 아닌 열을 찾으세요. 열 이름이 길어 표가 밀리므로 네 열만 짧은 이름으로 바꿔 요약합니다.

도전 .describe() 를 .describe(percentiles=[0.1, 0.5, 0.9]) 로 바꿔 보세요. 강수의 90% 줄이 25.4mm 로 나옵니다 — 중앙값 1.1mm 의 23배입니다. 꼬리가 얼마나 긴지를 한 숫자로 말할 수 있게 됩니다.

탐구 명세서의 '한 줄 특성' 칸에 이 표에서 딱 하나만 옮겨 적는다면 무엇을 고르겠습니까? 고른 수와 까닭을 함께 적어 두세요 — 미션 ④의 판이 그 선택을 채점합니다.

강수의 count 160 이 말해 주는 것은 이고, 말해 주지 않는 것은 이다. 그래서 오늘 명세서의 빈칸 칸에는 만 적는다.

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

표준편차를 손으로 — 한 줄은 공책에서 검산한다

3분

2024년 첫 주 7일의 평균기온으로 표준편차를 잽니다. n 으로 나눈 값과 n−1 로 나눈 값 가운데 어느 쪽이 클까요? 그리고 그 차이는 얼마쯤 될까요 — 0.2 쯤일까요, 2 쯤일까요?

기본 빈칸 ③에 편차를 제곱해 더하는 식을 채우고 ▶ 실행합니다. 출력된 표에서 아무 줄이나 하나를 골라 공책에 편차와 편차²를 손으로 계산해 맞대 보세요.

도전 week 줄을 week = [2, 4, 4, 4, 5, 5, 7, 9] 로 바꿔 개념 2-3 의 값으로 돌려 보세요 — 편차² 합 32 · ÷n 2.0 · ÷(n−1) 2.138 이 나옵니다. 값이 여덟 개로 늘었더니 두 값의 차이는 어떻게 되었나요? n 이 더 커지면 어디로 갈까요?

탐구 .iloc[:7] 을 .iloc[182:189] 로 바꾸면 7월 첫 주가 됩니다. ÷n 표준편차가 1.255 — 1월 첫 주의 절반 아래입니다. 여름 일주일과 겨울 일주일 가운데 어느 쪽이 더 흩어지는지, 그 까닭을 한 줄로 적어 보세요.

같은 7개 값인데 도구마다 다른 표준편차가 나오는 까닭은 이다. 그래서 명세서에 표준편차를 적을 때는 를 함께 적는다.

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

명세서 검문소 — 내 명세서로 사본 열두 벌을 걸러라

6분

지금까지 잰 값들이 사실 칩 열세 장으로 서랍에 들어 있습니다 — 칩 하나 = pandas 한 줄과 그 줄이 원본에서 낸 값입니다. 이 칩을 골라 신상명세서 여섯 칸을 채우면, 그 명세서가 그대로 검문 규칙이 됩니다. 문으로는 '서울 2024' 라고 적힌 사본 열두 벌이 지나갑니다. 여덟은 바꿔치기된 사고이고 넷은 멀쩡합니다.

칩을 만지기 전에 예측 둘을 잠급니다 — 실험실 왼쪽 위에 있습니다. ① 평균기온 평균 한 줄만 적으면 사고 여덟 중 몇 벌을 막을까? ② describe 를 통째로 적으면 다 막힐까?

예측을 잠그면 칩이 켜집니다. 1회전은 세 줄까지만 쓸 수 있어요 — 무엇을 버릴지가 곧 무엇을 아는지입니다. 도전 셋을 풀면 카드가 스스로 닫힙니다.

시뮬레이터

명세서 검문소

여섯 줄로 무엇을 막을 수 있나 — 그리고 무엇을 잘못 막나

  1. 1예측 둘을 잠근다
  2. 2사실 칩을 톡 쳐 명세서 여섯 칸에 넣는다
  3. 3문을 지나는 사본 열두 벌의 판정표를 읽는다
예측 ① — 평균 한 줄이면 사고 여덟 중
예측 ② — describe 를 통째로 적으면
회전 — 명세서에 쓸 수 있는 줄
내보내기
사실 서랍 — 칩 열세 장예측 둘을 잠그면 칩이 켜집니다

한 칩 = 한 줄. 칩이 낸 값이 사본에서 원본과 다르면 그 사본은 막힌다 — 값을 못 내고 오류가 나도 막힌다

판정 네 칸 — 사고를 막으면 잘 막음, 사고를 놓치면 놓침, 멀쩡한 사본을 막으면 헛막음, 멀쩡한 것을 보내면 잘 통과. ★★★ = 잘 막음 8/8 · 헛막음 0 · 여섯 줄 이내

내 명세서가 된 검문 코드 — def 검문(df) 로 나옵니다. 미션 ⑤의 코드 ④ 에 붙이면 같은 사본에서만 막힙니다


              
잘 막음0/8
놓침8
헛막음0
잘 통과4
쓴 줄0/3
등급—
도전 1

겉모습으로 여덟을 다 막아 보라. 두 줄이면 됩니다 — 그리고 헛막음 칸을 보세요. 무엇을 잘못 막았나요?

도전 2

정렬 사본을 겉모습 줄 없이 막아라. 헛막음 0 을 지키면서 asos_copy_03 을 막는 줄을 찾으세요.

도전 3

가장 짧은 ★★★. 잘 막음 8/8 · 헛막음 0 을 네 줄로 만드세요. 2회전에서만 됩니다.

자료: 기상청 ASOS 서울(108) 2024 일자료 366행 × 11열(../data/asos_seoul_2024.csv, 기상청 제공)과 원본에 코드 한두 줄씩을 적용해 만든 사본 열두 벌(../data/asos_copy_01.csv ~ 12.csv). 칩 열세 장 × 사본 열두 벌의 대조표는 브라우저 pandas 로 미리 재어 쪽 안에 실었다 — 판정은 그 표를 꺼내 볼 뿐이다.

내가 고른 여섯 줄은 이고, 버린 줄 가운데 은 때문에 넣지 않았다. 이 명세서가 못 막는 사고를 하나 든다면 이다.

확인 문제 6의 표에 명세서를 옮겨 제출 →
5

같은 판정이 두 곳에서 — 코드로 거르고, 달마다 표로 마무리한다

3분

판이 막은 사본과 같은 사본에서만 코드도 막힐까요? 코드 ④ 에는 ★★★ 모범 명세서 여섯 줄이 def 검문(df) 로 실려 있습니다. (실험실에서 [검문 코드 복사] 를 눌러 내 명세서로 갈아 끼워도 됩니다.)

기본 코드 ④는 채워져 있습니다. 그대로 ▶ 실행해 막힌 사본의 번호가 실험실과 같은지 맞대어 보세요. 검문의 여섯 줄은 숫자를 적어 두지 않고 원본에서 그때그때 잽니다 — 그래야 원본이 바뀌어도 고칠 곳이 없습니다.

도전 달마다 평균 줄 하나를 지우고 다시 돌려 보세요. 두 벌이 새어 나갑니다 — 03 과 12 입니다. 사본 이력을 펼쳐 그 둘이 무엇을 바꾼 사본이었는지 확인하세요.

탐구 사본 열두 벌에 없는 사고를 하나 지어내 보세요 (예: 같은 형식인데 다른 지점의 파일). 이 여섯 줄이 그것을 막을까요? 못 막는다면 어떤 줄을 더해야 할까요?

기본 마지막으로 코드 ⑤ 를 돌려 달마다의 성격을 봅니다. '평균은 1.5°C 안으로 비슷한데 표준편차가 가장 다른 두 달' 을 찾아 줍니다.

도전 1.5 를 3.0 으로 바꾸면 짝이 바뀔까요? 1위는 1월 · 12월 그대로인데 후보가 4쌍에서 10쌍으로 늘고, 3월과 11월이 표준편차 폭 1.5 로 바짝 따라붙습니다.

탐구 '어느 달에 무엇을 입을지 고르기가 더 어려울까' 에 답한다면 이 표의 네 숫자(평균 · 표준편차 · 최저 · 최고) 가운데 무엇을 근거로 삼겠습니까? 고른 숫자와 까닭을 명세서의 '한 줄 특성' 칸에 한 줄로 옮겨 적으세요.

'1월과 12월의 날씨는 비슷하다' 를 고쳐 쓰면 이다. 대푯값만 적은 문장이 위험한 까닭은 이기 때문이다.

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

네 칸을 직접 쟀고, 표준편차를 손으로 한 번 계산했고, 잰 값으로 명세서를 지어 사본 열두 벌을 걸렀고, 코드가 같은 판정을 내는 것을 보았다.

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

오늘의 탐험 일지

  1. 찾은 것

    파일 한 개를 네 칸으로 줄일 수 있다 — 출처 · 규모 · 자료형 · 통계적 특성. 열 열하나 가운데 뜻과 어긋나게 읽힌 칸이 둘이었다.

  2. 도구의 한계

    describe() 는 수로 읽힌 열만 요약하고, count 는 빈칸의 수만 말할 뿐 뜻은 말하지 않는다(4차시).

  3. 보고의 규칙

    명세서는 많이 적는 것이 아니라 뜻을 적는 것이다 — 겉모습 줄은 사고를 더 잡아 주지 않으면서 멀쩡한 사본 셋을 막았다.

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

1. describe() 에서 일강수량의 count 가 160 으로 다른 열(366)보다 훨씬 작다. 이 숫자가 말해 주는 것과 아직 말해 주지 못하는 것을 각각 쓰시오. 그리고 미션 ④에서 겉모습 줄(첫 줄 글자 · 열 이름)을 명세서에 넣지 않은 까닭을 덧붙이시오.
📖 모범 답안

말해 주는 것 — 366일 가운데 값이 적힌 날이 160일이고 나머지 206일이 비어 있다는 것. 그리고 mean 8.2 는 366일이 아니라 그 160일만의 평균이라는 것(빈칸을 0으로 채워 366일로 재면 다른 수가 나온다).

말해 주지 못하는 것 — 그 206일이 비가 안 온 날인지 못 잰 날인지. 숫자는 '비었다'까지만 말한다. 그 뜻은 설명서를 보거나 같은 날의 다른 열을 봐야 알 수 있다(4차시에서 '강수 계속시간' 열로 가려낸다).

겉모습 줄을 넣지 않은 까닭 — 헛막음 때문이다. '첫 줄 글자' 한 줄은 사고를 다섯 막지만 멀쩡한 사본 셋(거꾸로 저장 · 열 순서 바뀜 · 날짜를 2024/01/01 로 적음)도 함께 막는다. 셋 다 담긴 뜻은 원본과 똑같다. 명세서에 적을 것은 파일의 겉모습이 아니라 뜻이다.

2. 값 여덟 개 [2, 4, 4, 4, 5, 5, 7, 9] 의 표준편차를 n 으로 나눠 구하고, n−1 로 나누면 왜 더 커지는지 쓰시오.
📖 모범 답안

평균은 40 ÷ 8 = 5. 편차는 −3 · −1 · −1 · −1 · 0 · 0 · 2 · 4 이고 편차² 합은 9 + 1 + 1 + 1 + 0 + 0 + 4 + 16 = 32. ÷ n : 32 ÷ 8 = 분산 4 → 표준편차 2.0. ÷ (n−1) : 32 ÷ 7 ≈ 4.571 → 표준편차 약 2.138.

나누는 수가 작아지니 값이 커지는 것은 당연하지만, 왜 하나를 덜어 내느냐가 핵심이다. 편차를 표본 자신의 평균에서 쟀기 때문이다. 평균은 편차² 합이 가장 작아지는 자리다 — 기준을 4로 옮기면 40, 6으로 옮겨도 40인데 평균 5에서만 32다(그림 1). 표본의 평균은 늘 그 표본에 가장 가까이 붙어 있으므로, 거기서 잰 흩어짐은 모집단보다 작게 나오기 쉽다. 그 기울어짐을 되갚느라 나누는 수를 하나 줄인다.

그래서 같은 값에 statistics.pstdev(÷n)와 pandas .std()(÷(n−1))가 다른 수를 낸다. 명세서에는 어느 쪽으로 쟀는지를 함께 적어야 다음 사람이 같은 값을 다시 얻는다.

3. 일시 열을 날짜로 바꾸지 않으면 코드 ⑤의 달마다 표를 만들 수 없다. 그 까닭을 쓰고, 신상명세서의 자료형 칸에 이 열을 어떻게 적을지 쓰시오.
📖 모범 답안

2024-01-01 은 사람 눈에는 날짜지만 파이썬에게는 열 글자짜리 문자열(object)이다. 글자에서는 '달'을 뽑을 수 없다 — .dt.month 는 날짜형(datetime64)에만 있는 마디라 글자 열에 쓰면 오류로 멈춘다. 366줄 전부가 그렇게 읽혔다.

자료형 칸에 적을 것 — 읽힌 모양과 뜻을 함께, 그리고 바꾸는 한 줄까지. 예: “일시: 날짜 — 파일에서는 글자(object)로 읽힘, pd.to_datetime 으로 바꿔 씀 (바꾼 뒤 2024-01-01 ~ 2024-12-31, 366일, 겹침 없음)”.

같은 칸에 지점 도 적어 둔다 — 수(int64)로 읽혔지만 이름표다. 평균을 내면 108이 나오지만 그 숫자에는 뜻이 없다(Ⅰ-5).

4. 평균기온의 평균이 비슷한 두 달의 표준편차가 다르다면 “두 달 날씨가 비슷하다”를 어떻게 고쳐 써야 하는지, 코드 ⑤가 찾아 준 두 달의 숫자를 넣어 쓰시오.
📖 모범 답안

대푯값과 흩어짐을 함께 넣어 고쳐 쓴다. 예:

“2024년 서울의 1월과 12월은 평균기온이 −0.5°C 와 0.8°C 로 1.3°C 밖에 다르지 않다. 그러나 날마다의 오르내림은 다르다 — 표준편차가 4.1°C 와 2.5°C 로 1월이 거의 두 배다. 1월은 −11.7°C 에서 5.4°C 사이를 오갔고, 12월은 −3.4°C 에서 6.4°C 안에 머물렀다. 같은 '추운 달'이지만 무엇을 입을지 고르기 어려운 쪽은 1월이다.”

문턱을 1.5 에서 3.0 으로 넓혀도 1위 짝은 1월 · 12월 그대로다(후보만 4쌍에서 10쌍으로 는다). 덧붙여 — 열두 달 가운데 가장 흩어진 달은 11월(5.5), 가장 고른 달은 8월(1.2) 이다.

5. 일강수량의 평균(8.2mm)이 중앙값(1.1mm)보다 훨씬 큰 까닭과 이 열의 분포 모양을 쓰시오. 그리고 이 열의 '한 줄 특성' 을 명세서에 쓴다면 어떤 문장이 좋을지 쓰시오.
📖 모범 답안

비가 많이 온 며칠이 평균을 끌어올렸다. 가장 많은 날이 128.8mm 이고 90% 자리도 25.4mm 인데 중앙값은 1.1mm 다 — 값이 대부분 0 근처에 몰려 있고 오른쪽으로 꼬리가 긴 분포다. 25% 자리가 0.0 인 것도 같은 말이다 — 값이 적힌 160일 가운데 50일이 0.0mm 로 적혀 있다.

한 줄 특성(예) — “일강수량: 비가 온 160일의 평균 8.2mm, 중앙값 1.1mm, 최대 128.8mm. 오른쪽 꼬리가 길어 평균 하나로 말하면 안 되는 열. 나머지 206일은 빈칸(뜻은 미확인).”

평균과 중앙값이 크게 어긋나는 열을 만나면 중앙값을 함께 적는다 — 기온 세 열처럼 둘이 1~2 안으로 붙어 있는 열과는 다루는 법이 달라야 한다.

6. 오늘 잰 값으로 데이터 신상명세서를 완성하시오. (실험실의 [확인 문제 6에 명세서 넣기] 를 누르면 고른 칩이 표에 들어옵니다. 들어온 값을 보고 '한 줄 특성' 은 반드시 자기 말로 고쳐 쓰세요.) 그리고 이 명세서가 못 막는 사고를 하나 들고, 그것을 막으려면 어떤 줄을 더해야 할지 쓰시오.
칸내 명세서에 적은 것
출처
기간
규모
자료형
빈칸
한 줄 특성
📖 모범 답안

출처 — 기상청 기상자료개방포털 종관기상관측(ASOS) 일자료 · 지점 108(서울) · 기상청 제공 · 2026-09-23 내려받음.
기간 — 2024-01-01 ~ 2024-12-31 · 366일 · 날짜 겹침 없음(한 행 = 하루).
규모 — 366행 × 11열.
자료형 — 이름표 2(지점 · 지점명) · 날짜 1(일시, 파일에서는 글자로 읽힘 → pd.to_datetime) · 수 8.
빈칸 — 418칸이 네 열에만: 강수 계속시간 206 · 일강수량 206 · 평균 풍속 3 · 합계 일조시간 3. 나머지 일곱 열은 0. 뜻은 미확인(4차시).
한 줄 특성(예) — “평균기온 14.9°C(표준편차 10.5, −11.7 ~ 31.8). 달마다 평균은 −0.5 에서 29.3 까지 벌어지고, 평균이 비슷한 1월과 12월도 표준편차가 4.1 대 2.5 로 다르다 — 연평균 한 숫자로는 어느 달도 설명하지 못한다.”

못 막는 사고(예) — 같은 형식인데 다른 지점의 파일. 규모 · 자료형 · 빈칸 수는 우연히 같을 수 있고, 달마다 평균과 풍속 평균은 다르게 나오겠지만 그 줄이 없으면 그대로 통과한다. 확실히 막으려면 출처 칸을 검문 줄로 올린다 — df["지점"].unique() == [108] 한 줄이면 된다.

덧붙여, 오늘 판에서 확인한 것 — 출처 칸은 사람에게는 꼭 필요한 칸이지만 같은 지점 파일만 오는 이 열두 벌에서는 한 벌도 막지 못했다. 명세서에 적는 칸과 검문에 쓰는 줄은 겹치되 같지 않다.

+
더 알아보기

명세서 밖의 이야기 셋

같은 칸, 세 모양 — 적힌 글자 · pandas 가 읽은 것 · 고치는 한 줄파일에 적힌 글자pandas 가 읽은 것고치는 한 줄458,000글자 '458,000'thousands=","쉼표 하나에 더하기가 막힌다00100수 100dtype=str앞자리 0 이 사라져 다른 파일과 못 잇는다12.3mm글자 '12.3mm'.str[:-2] → float단위가 붙으면 수가 아니다-글자 '-'na_values=["-"]빈칸을 글자로 적어 둔 파일이 많다
현장

숫자인데 글자로 읽힌다

오늘 만난 어긋남은 날짜가 글자로 읽힌 것 하나였습니다. 공공데이터 파일에는 그런 칸이 더 많습니다. 쉼표 든 숫자(458,000)는 통째로 글자가 되어 더할 수 없고, 앞자리 0이 붙은 번호(00100)는 수로 읽히면서 0이 사라져 다른 파일과 이어지지 않습니다. 단위가 붙은 값(12.3mm)도 글자이고, 빈칸 대신 쓴 기호(-)는 빈칸으로 세어지지도 않습니다.

주민등록 인구 파일처럼 서울특별시 종로구 (1111000000) 하고 이름과 행정구역 코드가 한 칸에 붙어 오기도 합니다. 고치는 방법은 대개 read_csv 의 인자 하나입니다 — thousands="," · dtype=str · na_values=["-"]. 어려운 것은 고치는 법이 아니라 어긋났다는 것을 알아차리는 일이고, 그래서 파일을 받으면 가장 먼저 dtypes 를 봅니다. Ⅱ-11 에서 네 파일을 이을 때 코드가 앞자리 0 때문에 안 붙는 사고를 만나게 됩니다.

도해: 같은 칸이 '파일에 적힌 글자 → pandas 가 읽은 것 → 고치는 한 줄' 세 모양으로 가는 길. 네 갈래는 공공데이터에서 흔한 모양이다.

데이터 사전 한 칸을 펼치면 — 열 하나에 적을 것 여섯열 이름: 일강수량(mm)이름일강수량(mm)단위mm · 0.1mm 에 못 미치면 0.0자료형수(float) · 빈칸이 있다허용 범위0 이상 · 2024년 최대 128.8빈칸의 뜻206일 — 같은 날 강수 계속시간도 비었다출처기상청 ASOS · 지점 108 서울설명서가 오지 않으면 이 여섯 칸을 우리가 재서 채운다— 오늘 만든 신상명세서가 바로 그 일이다.
방법 더 깊이

데이터 사전 — 남이 써 준 명세서

오늘 우리는 파일을 재서 명세서를 만들었습니다. 잘 갖춰진 자료에는 그 명세서가 데이터 사전(data dictionary)이라는 이름으로 함께 옵니다. 열 하나마다 이름 · 단위 · 자료형 · 허용 범위 · 빈칸 규칙 · 출처를 적어 둔 표입니다. 기상자료개방포털도 관측 요소마다 단위와 잰 시간 범위를 설명 페이지에 적어 둡니다.

사전이 있으면 우리가 잰 값과 맞대어 볼 수 있습니다. 허용 범위가 0 이상인데 음수가 나왔다면 사전이 틀렸거나 파일이 상한 것이고, 둘 중 어느 쪽인지를 따지는 일이 곧 데이터 정제의 시작입니다. 반대로 사전이 없거나 낡았을 때는 우리가 잰 값이 임시 사전이 됩니다 — 그때 꼭 적어 둘 것은 언제 재었는지입니다. 파일은 조용히 갱신되고, 어제 잰 명세서가 오늘 파일을 막을 수 있으니까요.

도해: 데이터 사전이 열 하나에 적는 여섯 칸을 일강수량(mm) 열로 채운 것. '빈칸의 뜻' 줄은 포털 설명에서 찾지 못해 우리가 잰 것으로 적었다(같은 날 강수 계속시간도 206/206 비어 있다).

평년값 — 30해를 평균한다, 그리고 10해마다 창이 미끄러진다1961–19901971–20001981–20101991–2020지금 쓰는 평년값2001–2030다음 차례1960198020002020한 해(2024)우리가 오늘 잰 366일한 해의 평균·흩어짐은 우연이 크다 — 그래서 30해로 잰다.
현장

평년값 — 한 해로는 성격을 못 정한다

오늘 우리는 한 해(366일)의 평균과 흩어짐을 쟀습니다. 기상청은 날씨의 '보통'을 말할 때 한 해로 말하지 않습니다. 30해를 평균한 값을 쓰고 그것을 평년값이라고 부르며, 10해마다 창을 한 칸 옮깁니다. 지금 쓰는 평년값은 1991~2020년의 30해입니다.

왜 30해일까요? 오늘 1월과 12월에서 본 것과 같은 이유입니다 — 한 해는 우연이 큽니다. 2024년 1월의 표준편차 4.1°C 는 '1월은 원래 그렇다'가 아니라 '2024년 1월은 그랬다'입니다. 여러 해를 겹쳐야 우연이 씻기고 성격이 남습니다. 뉴스의 “평년보다 ○도 높았다”는 어제와 견준 말이 아니라 30해 평균과 견준 말이고, 창이 옮겨 가면 같은 기온도 다르게 불립니다.

도해: 30해 창이 10해마다 미끄러지는 자리와, 그 아래 우리가 오늘 잰 한 해(2024) 한 칸. 창의 연도는 기상청이 쓰는 30년 단위 규칙을 따른 것이고, 지금 쓰는 창(1991~2020)만 주황이다.