← 목록 · 04-2 · 데이터를 구하고, 버린다 · 원문 script.md

04-2: 데이터를 구하고, 버린다

승인(PASS) · 반려 23차(승인 후 소폭 개정) 개정(2026-09-04). 공통 조항 assets/contracts/COMMON.md(화면 지시 조작 태그 필수 개정·§0.16-a notes 전수 재대조·§0.18 후속 차시 제목만 개정 포함), 계약 assets/contracts/04-2.md(시연 사전 16열·중복 절 225그룹/24.8%·삽질 2장면 2.5분·소분류 이름 「가발 소매업」·「입시·교과학원」·인허가 근거 개정 포함), 반려 지시 assets/contracts/04-2-rev1.md~rev23.md(누적 R1~R10·S1~S6·T1~T10·U1~U6·V1·V2·W1~W4·X1~X3·Y1~Y3·Z1~Z5·AA1·AA2·AB1~AB3·AC1·AC2·AD1~AD3·AF1~AF3·AG1~AG5·AH1·AH2·AI1·AI2·AJ1·AJ2·AK1~AK4·AL1·AL2·AM1·AM2·AN1·AN2·AO1~AO5), 소재 assets/market.md, 데이터 assets/data/daejeon/README.md(「정제 실측」 절), 시연 원본 assets/data/daejeon/shops_2026-06_full.csv.

기본 정보

항목 내용
시간 25~30분 (발화 5,000~7,500자 + 시연 조작 시간 합산, §0.4)
유형 시연
카테고리 04 AI 데이터 분석
선수 차시 04-1
상태 rev23(승인)

학습 목표

구성

구간 활동 목적
도입 2 완성된 데이터 사전 한 장 + 버린 행 기록 화면 먼저 보여주기 오늘의 결과물을 먼저 확인
이론 6 정제와 데이터 사전 — 다섯 검사, 다른 예 = 0원 주문을 평균으로 채우는 경우 어디서든 쓰는 일반형을 대전 없이 심는다
시연 15(+조작) 대전 상가업소정보 원본(80,704행×39열)을 연다 → 데이터 사전(검사용 16열) → 다섯 검사 실측 → 버릴 규칙 셋·버린 행 기록 → 13열로 줄이기, 삽질 2장면 2.5분(rev14 개정), 함정 장면, 전공 구간 대전 소재에 실측 숫자로 적용, 계약 순서(rev9) 그대로
정리 2 한 줄 + 다음 차시 갈고리 + 검정 질문 자막 연결

합계 25~30분(rev23 개정, COMMON §0.1 — 4박자 선언 2·6·15·2=25, 시연 상한 18.2 고정 없이 총량 25~30에서 역산). 시연 구간의 무발화 조작 시간은 화면 지시에 단가표 유형(파일열기20·열고르기30·검사실행30·AI응답대기30·표작성20·화면전환8, 초)으로 표기한다(§0.4 rev3 개정).

연결


상세 전개

도입 (2분)

[화면: 완성된 데이터 사전 한 장 — 열 이름·뜻·타입·단위·허용값 표. 그 옆에 버린 행 기록 — 규칙별 건수. 둘 다 화면에 떠 있다(재구성 — 촬영 시 실제 완성본 화면으로 교체). · 조작: 화면전환]

(축자)

"오늘은 이 화면 두 장을 만드는 과정을 봅니다 — 왼쪽은 데이터 사전, 오른쪽은 버린 행 기록입니다."

(요점) 두 화면을 잠깐 짚는다. 데이터 사전은 열마다 이름과 뜻, 타입, 단위, 허용값이 채워진 표라는 것, 버린 행 기록은 규칙 이름과 그 규칙에 걸린 건수가 나열된 표라는 것만 확인시키고 넘어간다. 39개 열 중에 무엇을 남기고 몇 행을 왜 버릴지는 지금부터 만들어 간다는 것으로, 이미 다 됐다고 말하지 않는다.

(축자)

"이번 차시에서 정하는 것은 무엇을 세고 무엇을 버릴지입니다."

(요점) 지난 차시에서 고른 질문은 앞으로 다섯 편 내내 붙들고 갈 질문이다. 그 질문에 답할 데이터를 오늘 처음 연다. 받은 표를 바로 세면 안 되는 이유, 세기 전에 반드시 걸러야 하는 이유를 오늘 두 화면으로 확인한다는 것을 짚고 이론으로 넘어간다.

이론 (6분)

(요점, 도입) 04-1에서 좋은 질문을 골랐다. 질문이 정해지면 다음은 데이터인데, 데이터는 받은 그대로 쓸 수 없다는 것부터 짚는다. 실무에서 받는 표는 빈칸이 있고, 같은 뜻인데 다른 이름으로 적혀 있고, 같은 행이 두 번 들어 있다. 이걸 걸러내는 과정을 정제라고 부른다.

(축자)

"규칙 없이 눈으로 골라내면 결과는 나오지만, 남이 다시 만들 수 없습니다."

(축자, 핵심 정의)

"정제는 다섯 가지를 봅니다. 결측 — 빈칸이 있는가. 이상치 — 말이 안 되는 값이 있는가. 중복 — 같은 행이 두 번 들어 있는가. 타입과 단위 — 숫자여야 할 열에 문자가 섞여 있거나, 단위가 열마다 다른가. 논리 모순 — 두 열을 같이 보면 앞뒤가 안 맞는가."

(요점) 다섯 검사를 하나씩 짧게 풀어준다. 결측은 빈칸 자체가 아니라 빈칸이 왜 생겼는지를 묻는 것이라는 점, 이상치는 값이 크거나 작아서가 아니라 그 열의 정의에서 벗어나서 문제라는 점, 중복은 완전히 같은 행뿐 아니라 키 값만 같아도 걸린다는 점, 타입·단위는 숫자 열에 문자가 섞여 있거나 어떤 행은 다른 단위로 적힌 경우라는 점, 논리 모순은 한 열만 보면 멀쩡한데 다른 열과 맞춰 보면 틀린 경우라는 점을 짚는다.

(요점, 중복 검사 예) 다른 분야에서 하나 더 든다. 어느 설문 응답 표에 같은 사람이 이름과 이메일만 바꿔서 두 번 응답한 행이 섞여 있으면, 행 전체를 비교해서는 중복이 안 잡힌다. 응답자를 식별하는 열 하나를 키로 정하고 그 키가 같은 행을 찾아야 잡힌다. 중복을 잡는 기준은 표 전체 일치가 아니라 무엇을 키로 볼 것인가에 달려 있다는 것을 짚는다.

(요점, 이상치 검사 예) 이상치도 하나 더 짚는다. 어느 배달 서비스의 배달 시간 열에 마이너스 값이 찍혀 있다면, 이건 큰 값도 작은 값도 아니라 그 열의 정의 자체를 어긴 값이다. 시간은 음수가 될 수 없다는 정의를 먼저 세워 두지 않으면, 이 값이 이상치인지조차 판단할 수 없다는 것을 강조한다.

(축자, 다른 예)

"0원 주문을 평균으로 채우면 취소 주문이 매출이 됩니다."

(요점) 이 문장을 풀어 설명한다. 어느 판매 기록에 취소된 주문은 금액이 0원으로 남는다. 이걸 결측으로 착각해서 평균값으로 채워 넣으면, 취소된 주문이 갑자기 평균 금액의 매출로 둔갑한다. 0과 빈칸은 서로 다른 사건이라는 것 — 0은 일어났는데 값이 0이라는 뜻이고, 빈칸은 값을 모른다는 뜻이다 — 이 둘을 같은 방식으로 처리하면 없던 사실이 생긴다는 것을 강조한다.

(축자, 지정)

"0과 빈칸은 다른 뜻입니다."

(요점) 정제가 끝나면 다음이 데이터 사전이라는 것으로 넘어간다. 데이터 사전은 표에 있는 열마다 이름, 뜻, 타입, 단위, 허용값을 적어 둔 문서다. 정제 규칙을 정한 사람과 그 데이터를 나중에 쓰는 사람이 다른 경우가 있기 때문에 필요하다. 사전이 없으면 다음 사람이 같은 결측·이상치 판단을 처음부터 다시 해야 한다.

(요점, 사전 예시 한 줄) 사전 한 줄이 어떻게 생겼는지 다른 분야로 보여준다. "가입일" 열이라면 뜻은 회원이 서비스에 처음 가입한 날짜, 타입은 날짜, 단위는 없음, 허용값은 서비스 개설일 이후부터 오늘까지라고 적는다. 이 한 줄만 있으면 나중에 서비스 개설일보다 앞선 가입일이 나왔을 때 사람이 매번 판단하지 않아도 바로 이상치로 잡을 수 있다는 것을 짚고 시연으로 넘어간다.

시연 (15분 + 조작)

[화면: 대전 상가업소정보 원본 표가 열려 있다. 2026-06 시점, 80,704행 39열(재구성 — 촬영 시 실제 실행 화면으로 교체). · 조작: 파일열기]

(요점) 04-1에서 고른 질문에 답하려면 대전 상가업소정보 원본부터 열어야 한다. 2026년 6월 시점, 80,704행 39열이라는 규모를 화면에서 확인시킨다.

[화면: 데이터 사전 16행이 채워진다 — 열 이름 | 뜻 | 타입 | 단위 | 허용값(재구성 — 촬영 시 실제 실행 화면으로 교체). · 조작: 표작성]

(요점) 검사에 쓸 열 16개를 먼저 사전에 적는다 — 13개는 그대로, 지점명·동정보·호정보 세 개는 「검사 후 삭제 후보」다. 열을 미리 줄이면 이 셋을 검사할 수 없다. 시군구명은 문자열, 허용값은 대전 다섯 개 구. 경도·위도는 실수, 단위는 도(度)다.

(축자)

"허용값은 데이터에서 뽑지 않습니다. 열의 정의에서 옵니다."

(요점) 허용값을 데이터의 최솟값·최댓값으로 채우면, 그 검사는 아무것도 걸러내지 못한다. 그래서 대전시 행정경계가 정의다. 대전의 수리적 위치를 기준으로 근사 외접 사각형을 잡으면 경도 127.24에서 127.56, 위도 36.18에서 36.51이다.

[화면: 다섯 검사가 하나씩 실행되며 결과 숫자가 뜬다(재구성 — 촬영 시 실제 실행 화면으로 교체). · 조작: 검사실행]

(요점, 결측) 결측 검사부터 실행한다. 표준산업분류명 빈칸이 22건 나온다 — 이건 진짜 결측이다, 있어야 할 값이 비어 있다. 그런데 지점명 빈칸은 69,924건, 전체의 86.6퍼센트다. 이건 결측이 아니다.

(축자)

"빈칸이 86.6퍼센트라고 해서 이 열을 버리면 안 됩니다. 지점명이 비어 있다는 건 지점이 없다는 뜻이지, 모른다는 뜻이 아닙니다."

(요점) 22건과 69,924건, 두 빈칸이 왜 다른지가 방금 이론에서 배운 "0과 빈칸은 다른 뜻입니다"의 실물이라는 것을 짚는다. 표준산업분류명은 있어야 하는데 없어서 결측이고, 지점명은 없는 게 정상이라 값이다.

(요점, 중복) 중복 검사로 넘어간다. 상가업소번호로 보면 중복은 0건, 이 번호는 전부 고유하다. 상호명과 지번주소만 합쳐서 보면 그룹 907개, 탐지 1,862행이다. 그중 225그룹, 24.8퍼센트는 소분류가 다르다 — 정육점과 소고기 구이/찜, 가발 소매업과 입시·교과학원이 한 자리에 있다. "두 번 들어간 것"이라 부르면 넷 중 하나가 거짓이 된다.

[화면: 그룹 하나를 연다 — 농부애한우 | 유성구 죽동 599-2 → 소고기 구이/찜 · 정육점(재구성 — 촬영 시 실제 실행 화면으로 교체). · 조작: 화면전환]

(요점) 이 그룹도 마찬가지다 — 소분류가 다르니 같은 가게는 아니다.

(축자)

"무엇이 같은 가게인지 먼저 적지 않으면, 중복의 개수는 정해지지 않습니다."

(요점) 사전에 먼저 적는다 — 같은 가게는 상호·지번주소·소분류가 같은 행이다. 이 키로 다시 세면 그룹 686, 탐지 1,411, 제거 725다. 상호+지번주소만 쓴 955는 키를 바꾸면 이렇게 달라진다는 비교로만 남긴다.

[화면: 경도·위도 열이 숫자 검사를 통과한다 — 걸린 값 0건(재구성 — 촬영 시 실제 실행 화면으로 교체). · 조작: 검사실행]

(축자, 타입/단위)

"경도·위도에 문자가 섞였는지 검사했습니다 — 걸린 값 0건. 이 파일은 39열 중 33열을 따옴표로 감싸고, 경도·위도를 포함한 숫자 6열만 따옴표 없이 적어 두었습니다. 더러운 원천에서는 여기서 걸립니다."

(요점, 이상치) 이상치 검사도 위에서 정한 허용값을 쓴다 — 대전 밖으로 나가는 행은 0건이다. 걸리는 게 없어도 결과는 기록한다.

[화면: 시군구명과 지번주소를 나란히 놓고 비교한다 — 불일치 0건(재구성 — 촬영 시 실제 실행 화면으로 교체). · 조작: 검사실행]

(요점, 논리 모순) 논리 모순 검사도 실행한다. 시군구명과 지번주소의 구 이름이 다른 행을 세면 0건이다.

(축자)

"검사했는데 아무것도 안 걸려도, 검사했다는 사실은 기록합니다."

[화면: 동정보·호정보 두 열이 전부 빈칸으로 표시된다(재구성 — 촬영 시 실제 실행 화면으로 교체). · 조작: 검사실행]

(요점, 결측·열 단위) 동정보와 호정보 두 열은 100퍼센트 빈칸이다. 이건 이상치가 아니라 결측이다 — 정의를 벗어난 게 아니라 값이 아예 없어서다. 행이 아니라 열 전체가 비어 있는 열 단위 결측이라, 버릴 때도 열 자체를 버린다.

[화면: 버릴 규칙 세 줄이 하나씩 뜬다(재구성 — 촬영 시 실제 실행 화면으로 교체). · 조작: 표작성]

(요점) 다섯 검사 결과를 놓고 버릴 규칙 셋을 정한다 — 표준산업분류명 결측, 상호·지번주소·소분류가 같으면 앞을 남기고 뒤를 버리는 중복, 동정보·호정보 열. 숫자는 기록 표에 남긴다.

[화면: 버린 행 기록 표 — 규칙 이름 | 키 | 탐지 | 제거 | 비율. 표 아래 한 줄: 「39열 중 23열 제외, 목록은 notes.md」(재구성 — 촬영 시 실제 실행 화면으로 교체). · 조작: 표작성]

(요점) 다섯 칸(규칙·키·탐지·제거·비율)으로 표를 남긴다. 표준산업분류명 결측은 22행. 중복은 키가 상호·지번주소·소분류, "같으면 앞 행을 남기고 뒤 행을 버린다"는 규칙으로 탐지 1,411행, 제거 725행이다. 동정보·호정보는 비율 칸에 「열 삭제」라고 적는다 — 행 삭제 비율과 섞지 않는다. 22행과 725행을 더하면 747행, 전체의 0.93퍼센트다. 규칙과 건수를 남기면 다음 시점에도 그대로 적용할 수 있다.

[화면: 16개 열 중 3개가 빠지고 13개로 좁혀진다(재구성 — 촬영 시 실제 실행 화면으로 교체). · 조작: 열고르기]

(요점) 검사와 버릴 규칙이 끝났으니 이제 13개로 줄인다. 상가업소번호·상호명·상권업종대분류명·상권업종중분류명·상권업종소분류명·표준산업분류명·시군구명·행정동명·법정동명·지번주소·도로명주소·경도·위도. 지점명·동정보·호정보는 검사에만 쓰고 남기지 않는다.

(축자)

"질문에 쓰지 않는 열은 사전에 올리지 않고 걷어냅니다 — 39열 중 23열. 걷어낸 열 이름은 기록에 남깁니다."

(요점, 삽질 2.5분) 실제로 겪은 두 가지 장면을 순서대로 보여준다.

[화면: 삽질 1 — 업종 분류표 "무인" 검색 0건 → 상호명 검색으로 전환(재구성 — 촬영 시 실제 화면으로 교체). · 조작: 화면전환]

첫째, 업종 분류표에 "무인"이라는 이름의 코드가 아예 없었던 경우다. 소분류 이름을 전부 뒤져도 없어서, 상호명에서 "무인"이 들어간 이름을 대신 찾았다. 서울 탐침 291건 중 20건 표본에서 4건이 오탐이었다 — "무인양품"처럼 브랜드 이름이 우연히 겹친 경우다. 텍스트 검색만으로는 안 되고 눈으로 걸러야 한다는 것을 이때 배웠다. 대전에서는 61건 전수를 같은 기준(무인 매장이 아닌데 글자만 겹침)으로 보니 3건이 오탐, 정제 규칙(중복 1행)까지 적용하면 57건이 남는다.

[화면: 삽질 2 — CSV 다운로드 배지 → 실제로 열린 제공거부 통보서 PDF(재구성 — 촬영 시 실제 화면으로 교체). · 조작: 화면전환]

둘째, 대전 청년통계라는 이름의 파일에 CSV로 받을 수 있다고 표시돼 있었는데, 눌러 보니 CSV가 아니라 공공데이터 제공거부결정 통보서 PDF 두 쪽이 내려왔다. 목록·상세 화면 어디에도 제공 거부라는 사실이 적혀 있지 않았다 — 실제로 눌러 봐야만 알 수 있었다. 화면 표시를 믿지 않고 확인하기 전까지는 확정되지 않는다는 것을 이 장면이 보여준다.

두 장면 모두 화면 그대로만 보여주고, 그때마다 정제 다섯 검사로 돌아가 다시 확인했다.

[화면: AI 에이전트 채팅창. "결측치 처리해 줘"라고 입력하는 장면(재구성 — 촬영 시 실제 실행 화면으로 교체). 응답이 코드블록 텍스트로 뜬다. · 조작: AI응답대기]

(요점, 함정) 방금 만든 표를 놓고 에이전트에게 "결측치 처리해 줘"라고만 시킨다. 에이전트는 지점명 69,924건의 빈칸을 전부 "본점"으로 채우거나, 표준산업분류명 22건을 최빈값 "한식 일반 음식점업" 7,900건으로 채운다.

(재구성 — AI 출력 예시)
지점명 결측 69,924건을 "본점"으로 대체했습니다.
표준산업분류명 결측 22건을 최빈값 "한식 일반 음식점업"으로 대체했습니다.

(축자)

"없던 지점이 6만 9천 개 넘게 생기고, 없던 분류가 스물두 곳에 생깁니다."

(요점) 방금 이론에서 다룬 "0과 빈칸은 다른 뜻입니다"가 실제로 부서지는 장면이다. 에이전트가 틀린 게 아니라 지시가 부족했다 — 빈칸이 무엇을 의미하는지는 사람이 먼저 판단해서 알려줘야 한다.

[화면: 음식 대분류 소분류 중 카페와 빵/도넛 두 항목이 나란히 뜬다(재구성 — 촬영 시 실제 실행 화면으로 교체). · 조작: 화면전환]

(요점, 전공이 드러나는 곳) 업종 소분류에서 인물의 전공이 나온다. 음식 대분류 23,850건 중 백반/한정식 5,111·돼지고기 구이/찜 1,708·김밥/만두/분식 1,409·치킨 1,211, 카페 3,836·빵/도넛 881건이다. 카페는 비알코올, 빵/도넛은 기타 간이로 분류표에서 다른 칸에 있다. 그런데 동네에서는 빵집이 커피를 팔고 카페가 빵을 판다. 인물은 이 둘을 묶지 않는데, 이유는 분류표가 갈라놔서가 아니다.

(축자)

"이 둘을 한 줄로 묶으면 안 됩니다. 인허가가 다르고, 망하는 이유가 다릅니다."

(요점) 갈리는 것은 분류표가 아니라 인허가다 — 카페는 휴게음식점영업, 빵/도넛은 제과점영업으로 신고가 다르다. 원가 구조도, 문을 닫는 이유도 다르다고 본다. 분류표는 다른 중분류에 넣어 놨을 뿐 이유까지 말해 주지 않는다 — 식품영양학과 졸업생만 그 이유를 곧장 안다.

정리 (2분)

[화면: 데이터 사전과 버린 행 기록, 도입에서 봤던 두 화면이 완성된 채로 다시 뜬다(재구성 — 촬영 시 실제 완성본 화면으로 교체). · 조작: 화면전환]

(축자, 지정)

"버린 행을 기록하지 않으면 남이 재현할 수 없습니다."

(요점) 오늘 만든 두 장이 왜 남는지 정리한다. 데이터 사전은 다음 시점 데이터가 들어와도 같은 기준으로 다시 검사할 수 있게 해 주고, 버린 행 기록은 오늘 지운 행을 다른 사람이 똑같이 지울 수 있게 해 준다. 22행과 725행이라는 숫자 자체보다, 그 숫자가 나온 규칙을 남겼다는 것이 오늘의 핵심이라는 것을 한 번 더 짚는다.

(축자, 갈고리)

"이제 셀 수 있습니다. 그런데 그냥 세면 서구가 이깁니다."

(요점) 다음 차시로 넘어가는 긴장을 짧게 건다. 오늘 정한 규칙대로 세면 자치구마다 숫자는 나오지만, 구마다 크기가 다르기 때문에 그냥 늘어놓고 비교하면 가장 큰 구가 항상 이기는 것처럼 보인다는 것만 던지고, 그 기준을 다음 차시에서 다룬다는 것으로 마무리한다.

[자막: 몇 행을 버렸고, 왜 버렸습니까? 그 규칙을 남이 그대로 적용할 수 있습니까?]


근거

이 편의 수치는 신규 웹 조사가 아니라 오케스트레이터가 실측한 assets/data/daejeon/README.md 「정제 실측」 절(원본 assets/data/daejeon/shops_2026-06_full.csv, 80,704행)에서 그대로 인용했다. 집필자가 직접 원본을 quote-aware CSV 파서(perl)로 재파싱해 대조 확인 — 표준산업분류명 결측 22건 · 상호+지번주소만의 중복 탐지 1,862행(907그룹) · 키를 상호+지번주소+소분류로 정의한 중복 탐지 1,411행(686그룹)·제거 725행(반려 6차 W1, 907그룹 중 225그룹은 소분류가 달라 「같은 가게」가 아니었다) · 좌표 범위(경도 127.24~127.56·위도 36.18~36.51) 밖 0건 · 시군구명-지번주소 구 불일치(논리 모순) 0건, 전부 README와 일치(검증자 재확인 대상, 방법은 notes.md).

좌표 허용값 127.24~127.56 / 36.18~36.51(경도/위도)의 출처는 대전광역시청 「대전의 수리적 위치」(동단 동경 127°33'35.1438" · 서단 127°14'47.9555" · 남단 북위 36°10'59.1859" · 북단 36°30'0.8450", 십진도 변환 후 외접 사각형 근사): https://www.daejeon.go.kr/drh/DrhContentsHtmlView.do?menuSeq=2033 (확인일 2026-09-03)

삽질 2장면(rev14 개정, 계약 건 14 — 4장면·4분은 시연 상한과 충돌해 둘로 줄임)의 경위는 author-a/probe/A/LOG.md(무인 코드) · author-b/probe-dj/2b/LOG.md(청년통계, PK 15081597, 제공거부 통보서 PDF)에서 그대로 가져왔다. 「유동인구수→비율」(author-c/probe-dj/3/data/seogu_flow.csv)과 zip 파일명 CP949(author-a/probe-dj/5/LOG.md)는 04-3으로 넘긴다.

L181 「휴게음식점영업」·「제과점영업」의 출처는 식품위생법 시행령 제21조(영업의 종류) — 휴게음식점영업은 "주로 다류·아이스크림류 등을 조리·판매하거나 패스트푸드점·분식점 형태의 영업 등 음식류를 조리·판매하는 영업으로서 음주행위가 허용되지 아니하는 영업", 제과점영업은 "주로 빵, 떡, 과자 등을 제조·판매하는 영업으로서 음주행위가 허용되지 아니하는 영업"으로 정의한다: https://www.law.go.kr/법령/식품위생법시행령/제21조 (확인일 2026-09-04, 국가법령정보센터). 카페=휴게음식점영업·빵/도넛=제과점영업 배정은 이 정의와 시연 데이터(비알코올/기타 간이 중분류)를 근거로 한 매칭이고, 「원가 구조·폐업 이유가 다르다」는 저장소 데이터로 확인되지 않는 인물의 해석이라 script L181에서 "다르다고 본다"로 서술한다(§0.16 미확인 아님 — 데이터 주장이 아니라 의견으로 명시).