파일을 내려받으면 가장 먼저 “분석해줘”라고 말하고 싶어진다. 하지만 그 요청은 조금 미뤄두는 편이 좋다. 데이터 파일을 처음 만났을 때 가장 위험한 것은 계산을 못하는 일이 아니다. 파일을 잘못 이해한 채 계산을 시작하는 일이다.
열 이름이 비슷해도 의미가 다를 수 있다. 숫자 0은 실제 0이 아닐 수 있다. 시군구 이름이 같아 보여도 행정구역이 바뀌었을 수 있다. 최신 파일이라고 생각했는데 데이터 자체의 기준일은 몇 달 전일 수 있다. AI는 이런 문제를 발견하는 데도 쓸 수 있다.
단, 처음부터 답을 요구하지 않아야 한다.
첫 요청은 ‘구조 진단’이다
4장에서 고른 국세청 사업자현황_100대 생활업종의 공식 컬럼은 여섯 개다.[주1]
- 업종
- 시도
- 시군구
- 당월
- 전월
- 전년동월
보기에는 단순하다. 그러나 이 여섯 열만으로도 확인할 것이 많다.
당월·전월·전년동월의 단위는 무엇인가.
한 행은 업종 하나와 지역 하나의 조합인가.
같은 업종·시도·시군구 조합이 중복되는가.
시군구가 비어 있는 행은 있는가.
숫자 열에 문자나 쉼표가 섞여 있는가.
0은 정말 0인가.
따라서 파일을 올리고 첫 요청을 이렇게 한다.
이 파일을 아직 분석하지 마.
먼저 구조 진단표만 만들어줘.
1) 행 수와 열 수
2) 열 이름과 자료형
3) 각 열의 예시값 3개
4) 결측치 개수
5) 중복 가능성이 있는 행
6) 숫자 열의 최솟값·최댓값
7) 업종·시도·시군구의 고유값 개수
8) 이 파일의 한 행이 무엇을 뜻하는지 추정하되, 공식 설명과 구분해서 표시
아직 순위·증감률·추천을 계산하지 마.
이 프롬프트에는 멋진 분석 용어가 없다. 대신 멈추라는 지시가 있다. 첫 파일에서는 오히려 그 조건이 더 중요하다.
책의 실습용 파일은 일부러 작게 만든다
실제 국세청 파일은 전국 시군구와 여러 생활업종이 들어 있는 원자료다. 독자가 구조를 이해하기 전에 수만 행짜리 파일을 그대로 보면 숫자가 너무 많아 판단 과정이 잘 보이지 않을 수 있다.
그래서 5~6장에서는 공식 컬럼 구조를 그대로 따른 12행짜리 설명용 합성 파일을 먼저 사용한다.
sample_100_living_industry.csv
내용의 일부는 다음과 같다.
| 업종 | 지역 | 당월 | 전년동월 |
|---|---|---|---|
| 편의점 | 가온도 가람구 | 540 | 500 |
| 편의점 | 가온도 누리구 | 190 | 160 |
| 편의점 | 다온도 다온구 | 83 | 70 |
| 편의점 | 다온도 새봄군 | 7 | 0 |
| 커피음료점 | 가온도 가람구 | 415 | 380 |
| 미용실 | 다온도 새봄군 | 0 | 0 |
지면 관계로 전월 열은 뺐다. 실제 파일에는 여섯 열이 모두 들어 있다. 지역명과 숫자는 모두 설명을 위해 만든 가상값이다. 실제 데이터인 척하지 않는다. 대신 공식 파일에서 만나게 될 여섯 열과 0의 해석 문제를 재현할 수 있게 설계했다.
이 작은 파일로 구조를 이해한 뒤 실제 원문파일에서도 같은 질문을 반복한다.
열 이름만 읽지 말고 ‘한 행’을 읽는다
표를 이해하려면 열보다 행 하나를 문장으로 바꿔보는 것이 좋다.
합성 파일의 첫 행을 읽어보자.
편의점 / 가온도 / 가람구 / 당월 540 / 전월 533 / 전년동월 500
이 행을 자연어로 바꾸면 다음과 비슷하다.
가온도 가람구의 편의점 업종 가동사업자 수가 당월 540, 전월 533, 전년 같은 달 500으로 기록되어 있다.
중요한 단어는 가동사업자다. 이 값은 점포의 주소 목록이 아니다. 신규 사업자 수만을 뜻하지도 않는다. 매출도 아니다. 4장에서 공식 설명을 읽지 않았다면 AI가 이 숫자를 ‘편의점 점포 수’라고 자연스럽게 바꿔 부를 수 있다. 실제로 사업자등록 단위와 물리적 점포가 언제나 완전히 같은 개념이라고 가정해서는 안 된다.
그래서 구조 진단표에는 열 설명뿐 아니라 행의 의미를 적는다.
한 행의 분석 단위 후보:
업종 × 시도 × 시군구의 가동사업자 현황
그리고 실제 파일에서 이 조합이 유일한지 검사한다.
고유키를 먼저 찾는다
파일을 합치지 않더라도 고유키를 찾는 습관은 중요하다.
이번 파일에서 후보는 다음 세 열의 조합이다.
업종 + 시도 + 시군구
AI에게 묻는다.
업종 + 시도 + 시군구조합이 모든 행에서 유일한지 확인해줘.같은 조합이 두 번 이상 나타나면 그 행만 별도 표로 보여줘.
중복이 있다고 해서 임의로 하나를 삭제하지 마.
왜 이런 검사를 할까. 같은 지역과 업종이 여러 행 존재한다면 우리가 모르는 다른 구분 기준이 있을 수 있기 때문이다. 월이 행으로 반복되는 파일이라면 날짜 열이 키에 들어가야 한다. 사업자 유형이 따로 있다면 그 열이 빠졌을 수 있다.
“중복 제거”는 데이터 정리의 만능 주문이 아니다.
왜 중복되었는지 모르면 삭제할 권한도 없다.
0은 숫자가 아니라 상태일 수 있다
이 파일에서 가장 중요한 구조 정보는 열 이름보다 유의사항에 있다. 국세청은 셀 크기가 3 미만인 경우 0으로 변환한다고 밝힌다.[주2]
이 말은 다음 두 상황이 파일에서는 똑같이 0으로 보일 수 있다는 뜻이다.
- 실제 값이 0
- 실제 값이 1 또는 2라서 0으로 변환됨
따라서 AI에게 이런 지시를 추가한다.
숫자 0을 ‘사업자가 없음’으로 해석하지 마.
이 데이터는 3 미만 값을 0으로 변환할 수 있으므로
0은
실제 0 또는 1~2가 마스킹된 값으로 취급해줘.0을 분모로 사용하는 증감률 계산은 자동으로 하지 말고
계산 보류로 표시해줘.
이 한 문장은 6장의 결과를 바꾼다. 합성 파일에서 새봄군 편의점은 당월 7, 전년동월 0이다.
일반적인 계산식에 넣으면 다음 문제가 생긴다.
(7 - 0) ÷ 0
0으로 나눌 수 없다. 더 큰 문제는 전년동월의 실제 값 자체가 정말 0인지 알 수 없다는 것이다. 1이나 2가 보호를 위해 0으로 바뀌었을 수도 있다. 그러므로 “0에서 7로 무한대 성장했다”는 식의 표현은 금지한다. 이것은 데이터가 부족해서 분석을 못하는 것이 아니다.
데이터가 알려준 한계를 지키는 것이다.
결측치와 0을 분리한다
초보자가 가장 자주 섞는 두 상태가 있다.
비어 있음과 0.
결측치는 값이 없거나 제공되지 않은 상태다. 0은 숫자 값이다. 그런데 이번 데이터에서는 0에 마스킹이라는 세 번째 의미가 들어온다.
그래서 구조 진단표에서 상태를 세 개로 나눈다.
| 상태 | 뜻 | 기본 처리 |
|---|---|---|
| 빈칸/결측 | 값 미제공 또는 누락 | 원인 확인 후 제외·보완 결정 |
| 0 | 실제 0일 수 있음 | 데이터 정의 확인 |
| 보호된 0 | 3 미만 값이 0으로 변환되었을 가능성 | ‘없음’으로 단정하지 않고 분모 계산 보류 |
AI가 단순히 fillna(0) 같은 처리를 제안하면 이 표를 다시 보여준다.
결측치를 0으로 채우는 순간 원래 데이터의 의미가 바뀔 수 있기 때문이다.
숫자 열은 ‘숫자로 읽혔다’고 끝내지 않는다
당월, 전월, 전년동월이 숫자형으로 읽혔다고 해서 검사가 끝난 것은 아니다.
범위를 본다.
음수가 있는가.
소수점이 있는가.
문자 -나 N/A가 섞여 있는가.
쉼표가 들어간 문자열이 숫자로 변환되면서 누락된 행은 없는가. 사업자 수라면 원칙적으로 음수는 이상하다. 소수점 사업자 수도 일반적으로 기대하기 어렵다.
이때는 범위 검사부터 시킨다.
당월·전월·전년동월 세 열에 대해
자료형, 최솟값, 최댓값, 음수 개수, 0 개수, 정수가 아닌 값 개수를 보여줘.
이상값이 있어도 수정하지 말고 원본 행을 같이 보여줘.
이 검사는 ‘정답 범위’를 미리 정하는 것이 아니다. 상식과 데이터 정의가 충돌하는 행을 찾는 장치다.
최댓값이 매우 크다고 해서 오류는 아니다. 서울의 큰 자치구와 작은 군 지역은 규모가 다를 수 있다. 이상해 보인다는 이유만으로 자동 삭제하지 않는다.
범주형 열에는 공백 하나도 데이터다
지역명과 업종명도 점검한다.
편의점과 편의점 은 눈으로 보면 거의 같다. 뒤에 공백이 하나 붙으면 필터 결과에서는 다른 값이 될 수 있다.
서울특별시와 서울도 같은 지역을 가리키는 것처럼 보이지만 원자료에서 임의로 합치기 전에 표준 명칭을 확인해야 한다.
그래서 다음 표를 만든다.
| 검사 | 확인할 것 |
|---|---|
| 업종 | 앞뒤 공백, 철자 변형, 유사 업종 |
| 시도 | 공식 명칭의 일관성 |
| 시군구 | 공백·결측·행정구역 변경 |
| 숫자 열 | 음수·소수·마스킹 0 |
먼저 정규화 후보만 보여달라고 한다.
문자열 앞뒤 공백처럼 명백한 형식 차이와, 실제 명칭 차이를 구분해줘.
값 변경은 하지 말고
원값 / 정리 후보 / 정리 근거로 보여줘.
데이터 정리는 분석자의 편의를 위해 원문을 바꾸는 일이 아니다.
같은 값을 같은 것으로 비교해도 되는지 근거를 만드는 일이다.
구조 진단 결과를 한 장에 남긴다
실제 파일을 사용할 때는 다음 정도의 프로파일 표를 보관하면 충분하다.
파일: 국세청_사업자현황_100대 생활업종_20260630 형식: CSV 기준: 2026-06-30 열: 업종 / 시도 / 시군구 / 당월 / 전월 / 전년동월 행의 의미: 업종×지역의 가동사업자 현황 고유키 후보: 업종+시도+시군구 중요 예외: 3 미만 셀 0 변환 확정성: 월별 잠정치 지역변동: 2026 화성시 분구 주의
이 표는 보고서용 장식이 아니다.
6장에서 계산이 이상할 때 되돌아오는 파일의 사용설명서다.

CSV에서 한 행의 의미와 고유키, 마스킹 0, 기준일을 확인하는 구조 진단
도판 F04. CSV 구조 진단의 핵심. 한 행의 의미, 고유키, 마스킹된 0, 기준시점과 행정구역 변경을 확인한 뒤에야 계산을 시작한다.
최신 파일인데 숫자가 나중에 바뀔 수 있다
공식 유의사항에는 또 하나의 중요한 문장이 있다. 월별 공개는 신속한 정보 제공을 위해 잠정치로 공개되며 추후 확정치와 다를 수 있다는 내용이다.[주2] 이 말은 ‘최신 파일’과 ‘확정값’이 같은 말이 아니라는 뜻이다. 실무에서는 두 선택이 가능하다.
빠른 현황 파악이 목적이면 최신 잠정치를 사용한다. 정산이나 확정 통계를 요구하는 보고서라면 확정 통계가 필요한지 다시 확인한다.
결과에는 다음처럼 적는다.
2026년 6월 말 기준 월별 공개자료를 사용했다. 월별 값은 잠정치이며 추후 확정치와 차이가 생길 수 있다.
이 문장이 있으면 나중에 숫자가 달라져도 분석이 부정확했던 것과 데이터가 갱신된 것을 구분할 수 있다.
지역명은 영원하지 않다
2026년 데이터의 유의사항에는 경기도 화성시 분구가 반영되어 있다는 설명이 들어 있다. 화성시가 만세구·효행구·병점구·동탄구로 분구된 행정구역 변동이다.[주2] 이런 변화는 시계열 분석을 흔든다. 예를 들어 2025년의 화성시 한 행과 2026년의 네 구를 단순히 이름으로 비교하면 어떻게 될까. AI는 “화성시 데이터가 사라졌다”고 판단할 수 있다.
또는 네 구 가운데 하나를 과거 화성시와 직접 비교해 큰 감소가 발생했다고 계산할 수 있다. 둘 다 잘못된 해석일 수 있다. 지역 경계가 바뀌었기 때문이다.
따라서 지역별 시계열에서 큰 변화가 보이면 다음 질문을 추가한다.
이 지역의 행정구역 명칭·경계가 비교 기간 사이에 바뀌었는지 확인해줘.
바뀌었다면 단순 증감률을 계산하지 말고 비교 가능성부터 판정해줘.
숫자가 급변하면 사건이 있었을 수도 있다. 하지만 행정구역 코드가 바뀌었을 수도 있다.
데이터 탐정은 흥미로운 결론보다 먼저 지도 경계를 확인한다.
파일명과 데이터 기준일도 따로 본다
2026년 9월 9일 확인한 최신 공식 메타데이터의 파일명에는 20260630이 들어 있다.[주3] 이 숫자를 기록해둔다. 다만 파일명만 믿지 않고 실제 파일을 연 뒤 열 안에 별도의 기준일이 있는지도 확인한다. 이번 데이터는 당월·전월·전년동월의 숫자를 한 행에 제공하므로 날짜 열이 별도로 없을 수 있다. 그렇다면 파일 자체의 기준일이 분석 시점의 핵심 메타데이터가 된다.
기준일 확인은 이렇게 맡긴다.
이 파일 내부에 기준연월을 나타내는 별도 열이 있는지 확인해줘.
없다면 파일명과 공식 상세페이지의 기준일을 분석 메타데이터로 기록해줘.
파일 등록일과 데이터 기준일을 같은 것으로 쓰지 마.
데이터 페이지가 수정된 날짜와 숫자가 측정된 날짜는 다를 수 있다.
두 날짜를 분리하는 습관은 이후 모든 장에 그대로 적용된다.
파일 구조 점검 프롬프트 — 기본형
이제 반복해서 사용할 기본 프롬프트를 만들 수 있다.
파일 구조 점검 프롬프트
이 파일을 아직 분석하거나 결론 내리지 마.
먼저 아래를 점검해줘.
1. 행 수와 열 수
2. 열 이름·자료형·예시값
3. 한 행이 의미하는 분석 단위
4. 기간 또는 기준시점을 나타내는 정보
5. 지역·업종·식별코드 같은 범주형 열의 고유값 수
6. 결측치와 0의 개수
7. 고유키 후보와 중복 여부
8. 숫자 열의 최솟값·최댓값과 이상값 후보
9. 파일 안에서 알 수 없는 정의
10. 공식 데이터 설명이나 유의사항에서 추가 확인해야 할 항목
모르는 값은 추정하지 말고
확인 필요라고 표시해줘.이 단계에서는 순위, 추천, 원인 분석을 하지 마.
이 프롬프트는 어떤 CSV에도 완벽하게 맞지는 않는다. 그럴 필요도 없다.
첫 진단의 목적은 파일을 ‘깨끗하게 만드는 것’이 아니라 우리가 모르는 것을 드러내는 것이기 때문이다.
AI가 틀리는 순간: 너무 친절한 자동 정리
AI는 종종 도움을 주기 위해 파일을 자동으로 정리한다.
숫자처럼 보이는 문자열을 숫자로 바꾼다.
빈칸을 0으로 채운다.
중복 행을 삭제한다.
이름이 비슷한 지역을 합친다. 일반적인 데이터 정리에서는 유용할 수 있다. 그러나 이번 파일에서 ‘0’은 보호 처리된 작은 값일 수 있다. 행정구역 이름 차이는 실제 경계 변경일 수 있다. 중복은 숨은 구분 열이 있다는 신호일 수 있다.
그래서 첫 단계에서는 이렇게 말한다.
정리나 수정이 필요해 보이는 항목이 있어도 자동 수정하지 말고
문제 후보 / 수정하면 생길 수 있는 영향 / 권장 확인세 열로 먼저 보여줘.
AI가 더 천천히 움직이게 만드는 지시다.
데이터 분석에서는 빠른 자동정리보다 되돌릴 수 있는 판단이 더 중요하다.
구조를 확인했으면 질문을 다시 읽는다
파일 진단이 끝났다고 하자.
4장에서 정한 질문에 필요한 열은 네 개면 충분하다.
- 업종
- 시군구
- 당월
- 전년동월
시도는 같은 이름의 시군구를 구분하거나 결과를 표시하는 데 함께 둔다. 전월은 이번 핵심 질문에는 필수는 아니지만 월간 변화가 궁금할 때 보조로 쓸 수 있다.
이렇게 필요 열을 정하면 6장의 분석 순서도 짧아진다.
1. 편의점만 필터
2. 당월과 전년동월 차이 계산
3. 전년동월이 0인 행은 증가율 계산 보류
4. 나머지 행의 증감 수와 증감률 계산
5. 두 순위가 어떻게 다른지 비교
6. 원자료 한 행을 다시 계산
시각화는 그다음이다.
분석 순서는 도구의 메뉴가 아니라 질문이 정한다.
한 줄 판정
CSV를 받았을 때 첫 작업은 정리가 아니라 구조 진단이다. 한 행의 의미, 0과 결측, 고유키, 기준시점이 확인되지 않으면 아직 계산할 준비가 끝난 것이 아니다.
주
1. 국세청 사업자현황_100대 생활업종 공식 컬럼 정의: 업종, 시도, 시군구, 당월, 전월, 전년동월.
2. 공식 유의사항에는 3 미만 셀의 0 변환, 월별 잠정치, 2026년 화성시 분구 반영 등이 명시되어 있다.
3. 2026년 9월 9일 확인한 최신 공식 메타데이터의 파일 기준명은 국세청_사업자현황_100대 생활업종_20260630.


