Devin.KR

질문을 관측 단위로 바꾸기

90분 안팎

학습 목표

지역·날짜별 교통량과 강수 여부의 차이를 질문으로 쓰고 관측 단위를 정합니다.

개념

왜 질문을 먼저 고정하나요?

팀장이 “비가 오면 차가 덜 다니나요?”라고 묻습니다. 바로 그래프를 그리면 빠르게 답한 것처럼 보이지만, 무엇을 차라고 세었는지, 어느 지역과 어느 날짜를 비교했는지는 남지 않습니다. 신입 분석가의 첫 결과물은 멋진 차트보다 다른 사람이 같은 자료로 같은 비교를 할 수 있는 질문입니다. 이 레슨에서는 질문을 대상·기간·관측 단위·비교 조건·측정값으로 나누고, 자료로 답할 수 없는 부분을 한계로 남깁니다.

미션 ZIP의 raw 폴더에는 traffic.csv와 weather.csv가 있습니다. 이 파일은 실제 공개기관 관측값을 추출한 자료가 아니라 작성팀이 만든 교육용 합성 표본입니다. A와 B는 가상 지역 코드입니다. 공개 데이터 프로젝트의 구조와 점검 절차를 배우기 위한 입력이며, 실제 지역의 교통 정책을 판단하는 근거로 사용하지 않습니다. 이후 모듈에서도 같은 파일을 이어 사용해 질문과 처리 규칙이 어떻게 연결되는지 확인합니다.

행 하나가 무엇을 뜻하는지 말합니다

관측 단위는 행 하나가 대표하는 대상과 시간의 묶음입니다. 이번 표에서는 “지역 하나의 날짜 하루”입니다. 교통 표의 region=A, date=2026-09-01, vehicle_count=100은 가상 지역 A의 해당 날짜 통행량 100대를 뜻합니다. 개인 100명이나 고유 차량 100대라는 뜻은 아닙니다. 동일 차량의 반복 통행을 구분할 정보가 없으므로 사람 수나 고유 차량 수로 해석하면 질문이 자료의 범위를 벗어납니다.

날씨 표도 지역·날짜마다 일별 강수량 하나를 갖도록 설계합니다. 지역 코드 체계와 날짜 경계가 같은지 확인한 뒤 두 표를 결합합니다. 이번 합성 표본의 날짜 경계는 Asia/Seoul 현지 시각 00:00 이상 다음 날 00:00 미만입니다. 실제 관측기관의 집계 경계가 같다고 가정하지 않습니다. 시간대가 같아도 일별 집계 마감 시각이 다르면 같은 날짜의 뜻이 달라질 수 있습니다.

행을 구분할 후보 키는 region과 date의 조합입니다. date만 쓰면 같은 날짜의 A와 B를 구분하지 못합니다. region만 쓰면 같은 지역의 여러 날짜를 구분하지 못합니다. 후보 키는 설계상의 기대이며 원본이 이미 이를 만족한다는 증명은 아닙니다. 교통 표에는 A의 9월 2일 행이 반복되므로 원본 행 수와 고유 지역·날짜 수를 나란히 기록합니다. 중복 검사와 안전한 결합은 뒤 모듈에서 확장합니다.

넓은 질문을 비교 가능한 문장으로 바꿉니다

질문 초안은 “2026년 9월 1일부터 3일까지 지역 A·B에서 강수량이 0보다 큰 날과 0인 날의 일별 통행량은 어떻게 다른가요?”로 씁니다. 기간은 양 끝 날짜를 포함합니다. 측정값은 vehicle_count, 강수 여부의 규칙은 rain_mm > 0입니다. 강수량이 정확히 0인 날은 비가 없는 비교군으로 둡니다. 빈칸은 관측이 없는 상태이므로 어느 비교군에도 넣지 않습니다.

규칙을 정할 때 0과 빈칸을 구분합니다. B의 9월 2일 통행량 0은 측정값이 있는 행이므로 유지합니다. A의 9월 3일 통행량 빈칸은 차가 한 대도 없었다는 뜻이 아닙니다. 빈칸을 0으로 바꾸면 비 오는 날의 교통량 차이가 처리자의 선택에 따라 달라질 수 있습니다. 지금은 미관측을 그대로 두고, 이후 정제 모듈에서 삭제와 채우기의 영향을 비교합니다.

중복에 대한 규칙도 질문의 일부입니다. 모든 열의 값이 같은 행이 반복되면 후속 정제본에서는 첫 행 하나만 남기도록 정합니다. 같은 지역·날짜인데 수량이 다른 경우에는 단순 중복으로 지우지 않고 충돌로 표시합니다. 이번 모듈에서는 원본을 수정하지 않습니다. 원본의 반복 행과 빈칸을 포함한 상태를 보존해야 다음 사람이 처리 전후의 수치를 대조할 수 있습니다.

비교에서 빠지는 대상과 한계를 적습니다

교통량 또는 강수량이 빈 지역·날짜는 이번 비교에서 제외할 대상으로 기록합니다. 동일 행의 추가 반복도 제외 규칙에 적습니다. 제외 조건을 “이상한 행 삭제”라고 쓰면 다른 사람이 재현할 수 없습니다. 어느 열의 어떤 상태를 보고, 어느 순서로 제외하는지 씁니다. 두 표를 함께 사용하는 최종 비교 대상은 결합 이후 확인하므로, 각 파일의 비결측 행 수를 최종 표본 수라고 부르지 않습니다.

지역 A와 B는 규모가 다를 수 있으므로 두 지역의 통행량을 한꺼번에 평균 내고 지역 차이가 사라졌다고 해석하지 않습니다. 우선 지역별로 비교하고 각 비교군의 날짜 수를 함께 제시할 계획을 남깁니다. 평일·휴일, 공사, 행사, 측정 장비 상태는 이번 표에 없습니다. 이런 요인을 분리하지 않은 차이는 관찰한 연관성을 설명할 수 있어도 비가 원인이라는 결론을 뒷받침하지 않습니다.

이번 표본은 3일뿐이며 합성값입니다. 짧은 기간의 계산 결과가 정확하다는 것과 현실을 대표한다는 것은 서로 다른 판단입니다. 계산 검증은 입력과 처리 규칙으로 수행하고, 대표성과 해석은 수집 범위와 설계로 검토합니다. 보고서 초안에는 “이 결과는 교육용 표본의 계산 예이며 실제 교통 경향이나 인과효과를 추정하지 않습니다”라는 한계를 함께 적습니다.

질문 계약을 파일로 남깁니다

question.json에는 question, observation_unit, rain_rule, exclusions, limitation을 기록합니다. question에는 기간과 대상과 비교값을 모두 넣습니다. observation_unit은 지역·날짜, rain_rule은 rain_mm > 0으로 고정합니다. exclusions에는 숫자 열 빈칸과 완전히 같은 추가 행을 따로 적습니다. limitation에는 합성 표본과 짧은 기간, 인과 해석의 제한을 연결합니다. JSON 문법은 따라하기의 제공 코드를 사용해 확인할 수 있습니다.

완성한 문장을 동료에게 읽어 주고 “어떤 행을 하나의 관측으로 셀까요?”, “0과 빈칸은 어느 군으로 갈까요?”라고 물어봅니다. 답이 서로 다르면 문장을 더 구체화합니다. 검증기가 통과해도 질문이 유용한지까지 자동으로 판단되지는 않습니다. 목적과 자료의 범위를 맞추는 일은 사람이 검토하며, 기계가 확인하는 구조와 사람이 판단하는 해석을 모두 남깁니다.

흔한 실수는 질문을 쓰기 전에 자료를 눈에 맞게 삭제하거나 “비가 교통량을 줄인다”라는 결론을 질문 대신 적는 것입니다. 질문은 확인할 비교이고 결론은 이후 근거를 보고 쓰는 문장입니다. QUESTION 메시지는 질문 파일의 필드나 관측 단위를 점검하라는 뜻입니다. JSONDecodeError는 분석 결론의 오류가 아니라 쉼표·따옴표 등 파일 문법의 오류이므로 메시지가 가리키는 줄부터 확인합니다.

따라하기

미션 시작본에서 질문 파일 열기

모듈 미션의 data-data-contract 시작 ZIP을 풀고 README가 있는 폴더에서 question.json을 엽니다. 이 모듈에는 앞 모듈이 없습니다. 기간·지역·측정값이 들어간 질문을 편집하고, 원본 두 CSV는 보존합니다.

후보 관측과 원본 행 구분

다음 확인 코드를 question_check.py로 저장하고 python3 question_check.py로 실행합니다. 원본 행을 분석 관측 수라고 부르지 않는 이유를 확인합니다.

rows = [('A','2026-09-01'),('A','2026-09-02'),('A','2026-09-02'),('A','2026-09-03'),('B','2026-09-01'),('B','2026-09-02'),('B','2026-09-03')]
print('원본 행:', len(rows))
print('고유 지역·날짜:', len(set(rows)))

실행 결과

원본 행: 7
고유 지역·날짜: 6

강수 여부와 미관측 구분

rain_rule의 경계를 확인합니다. 아래 코드를 rain_check.py로 저장해 python3 rain_check.py로 실행합니다. 빈 문자열도 별도 군으로 출력됩니다.

values = ['0','12.5','']
for value in values:
    label = '미관측' if value == '' else '비 있음' if float(value) > 0 else '비 없음'
    print(repr(value), label)

실행 결과

'0' 비 없음
'12.5' 비 있음
'' 미관측

question.json 제출 기준 대조

question, observation_unit, rain_rule, exclusions, limitation을 채웁니다. 관측 단위는 지역·날짜, 강수 규칙은 rain_mm > 0입니다. 동료에게 빈칸과 중복 제외가 어떻게 다른지 설명하고, 실제 지역이나 인과효과를 주장하지 않는 한계를 적습니다.

확인 문제

실습

question.json을 작성합니다. 기간·지역·측정값을 갖춘 질문, 지역·날짜 관측 단위, rain_mm > 0 규칙, 빈칸과 완전 중복의 제외 조건, 합성값·3일 표본·인과 해석 한계를 제출합니다. 동료가 0과 빈칸을 서로 다른 상태로 분류할 수 있는지 확인합니다. 모듈 미션 ZIP에 파일이 있습니다.

더 읽기

면접 질문

  • 공개 데이터로 만든 그래프의 신뢰성을 확인하는 방법을 설명해 주시면 됩니다.