본문 바로가기
홈 AI 학습 AI 실무 안내서 출동 데이터의 결측·중복·표기 불일치 정제하기
L1 입문 · 13분 읽기

출동 데이터의 결측·중복·표기 불일치 정제하기

2026.10.26 갱신 엑셀 이상의 데이터를 다뤄야 하는 실무자
#데이터처리#전처리#입문
검토 상태: 전문 검토 전 위험도 미분류

업무에 AI를 쓸 때 확인하면 좋은 방법과 점검 항목을 정리한 참고 자료입니다. 실제 업무에 적용할 때는 소속 기관의 기준과 담당자 검토를 함께 확인합니다.

출동 기록처럼 여러 사람이 손으로 입력한 자료에는 빈 칸, 같은 출동이 두 번 들어간 행, 같은 대상을 다르게 적은 표기가 섞여 있습니다. 그대로 집계하면 건수와 순위가 틀립니다.

요즘은 CSV를 AI에게 주면 정제 코드와 결과가 바로 나옵니다. 그래도 어떤 빈 칸을 빼고 어떤 이름을 하나로 합칠지는 업무 규칙이라서 사람이 정해 줘야 합니다. 이 안내서는 AI나 코드에 정제를 맡길 때 정해 줄 규칙과, 받은 결과를 검산하는 기준을 다룹니다.

🎯 이 장의 목표
  • 결측·중복·표기 불일치를 구분하고 열의 업무 의미에 따라 처리 규칙을 정할 수 있습니다.
  • 출동 CSV를 외부 AI에 넣기 전에 확인하고, 실제 자료 대신 열 이름과 합성 행으로 정제 코드를 받을 수 있습니다.
  • 원본 보존, 빈 칸 채우지 않기, 중복 펼쳐 보기, 매핑표 사용을 프롬프트로 줄 수 있습니다.
  • 단계별 남은 행 수 기록표로 정제 결과를 검산할 수 있습니다.

AI에게 맡기는 프롬프트

출동 CSV 정제를 코드를 실행할 수 있는 AI(파일 분석 기능이나 코딩 에이전트)에 맡길 때 씁니다. 실제 출동 자료에는 신고자 이름이나 주소가 섞일 수 있으므로 먼저 생성형 AI 입력 확인으로 점검합니다. 확인되지 않았으면 AI에게는 열 이름·자료형과 합성 데이터 몇 줄만 주고 코드를 받은 뒤, 그 코드를 기관 PC에서 실제 자료로 실행합니다. 실행 결과를 AI에게 다시 보여 줄 때는 단계별 행 수처럼 값이 없는 결과만 줍니다.

TEXT
[목적] 출동 CSV(dispatch.csv)를 관할서별·월별 보고용 집계에 쓸 수 있게 정제하는 코드를 만들어 주세요.
[자료] 붙임: 열 이름과 자료형 목록, 실제 신고자·환자 정보가 없는 합성 5행, 관할서 매핑표(mapping.csv)
[정제 규칙]
- 출동번호는 문자열로 읽어 앞자리 0을 지켜 주세요.
- 출동시각이 빈 행은 집계 표에서 빼고, 뺀 행은 확인 목록 파일로 따로 저장해 주세요. 비고가 빈 칸은 '미기재'로 표시해 주세요.
- 출동번호가 같은 행은 지우기 전에 모두 펼친 표를 먼저 보여 주세요. 모든 칸이 같은 완전 중복만 지우고, 값이 다른 행은 확인 목록으로 보내 주세요.
- 관할서 표기는 매핑표에 있는 값만 바꾸고, 표에 없는 값은 그대로 두고 목록으로 보여 주세요.
[완성 기준] 단계마다 남은 행 수를 표로 출력해 주세요. 줄어든 행 수의 합이 처음과 끝의 차이와 같은지도 출력해 주세요.
[하지 말 것] 원본 파일을 덮어쓰지 마세요(결과는 dispatch_clean.csv). 빈 칸을 0이나 평균으로 채우지 마세요. 철자가 비슷하다는 이유로 이름을 합치지 마세요.
자료에 없는 값은 [확인 필요]로 남겨 주세요.
확인 기준은 https://119-ai-studio.kr/data-cleaning.html 안내서를 따릅니다.
작업 전에 빠진 정보가 있으면 먼저 질문해 주세요.

결과를 받은 뒤 확인할 것은 다음과 같습니다.

  • 단계별 행 수 표가 출력에 실제로 있고, 줄어든 행 수의 합이 처음과 끝의 차이와 같은지 봅니다.
  • 같은 출동번호의 행을 지우기 전에 펼친 표가 나왔는지, 값이 다른 행이 확인 목록으로 갔는지 봅니다.
  • 정제 전후 관할서 값 목록을 비교해 매핑표에 없는 값이 바뀌지 않았는지 봅니다.

코딩 에이전트를 쓸 때는 실제 자료가 있는 폴더에서 실행하지 않습니다. 에이전트가 읽은 파일과 명령 출력은 모델이 보는 맥락에 들어가므로, 외부 모델을 쓰면 파일 앞부분을 출력한 값도 서비스로 전송됩니다. 도구별 주의점은 Claude Code, Microsoft 365 Copilot, ChatGPT 카드에 있습니다.

배경지식

CSV와 엑셀 표에서 한 행은 출동이나 점검 같은 기록 한 건이고, 한 열은 시각·유형·관할처럼 모든 기록에 공통으로 묻는 항목입니다. pandas에서는 이런 표를 데이터프레임이라고 부릅니다. 같은 열에 날짜와 메모가 섞이면 집계 도구는 무엇을 세어야 할지 판단하지 못합니다.

기록을 서로 구별하는 값은 키입니다. 출동번호처럼 한 건을 가리키는 키가 있으면 중복을 찾을 수 있지만, 이름이나 주소처럼 바뀌거나 겹치는 값만으로는 같은 건인지 확정하기 어렵습니다.

빈 칸인 결측값은 숫자 0과 다릅니다. 0은 측정하거나 기록했고 그 값이 0이라는 기록이고, 빈 칸은 측정하지 않았거나 입력이 빠졌다는 상태일 수 있습니다. 정제는 이 차이를 보존하면서, 같은 뜻의 표기를 한 형태로 맞추는 정규화와 중복 판정을 순서대로 적용하는 일입니다.

열에 담긴 업무 시점도 확인합니다. 화재조사 및 보고규정은 상황실이 신고를 받는 접수와, 출동지령을 받아 소방대가 출발하는 출동을 따로 정의합니다. 출동시각 열이 실제로 어느 시점을 적은 것인지 원자료 담당에게 확인한 뒤 규칙을 정합니다.

가상 상황: 관할서 1위가 뒤바뀐 월말 집계

다음은 학습용 가상 상황입니다(숫자는 예시입니다). 월말에 관할서별 출동 건수를 뽑아 보고해야 하는데, 집계표의 1위가 예상과 다릅니다. 관할서 열의 값별 빈도를 보니 한 관할서 이름이 이렇게 흩어져 있습니다.

TEXT
강서소방서    1,203
강서서           88
강서 소방서       5

세 줄은 모두 같은 관할서입니다. 집계 도구는 글자가 정확히 같은 값끼리만 묶기 때문에 이를 세 곳으로 세어, 1,296건이어야 할 관할서가 1,203건으로 낮게 잡히고 순위가 밀렸습니다. 이런 어긋남은 합계 표에서는 드러나지 않고 값별 빈도표(value_counts())에서 드러납니다.

담당자가 AI에게 "표기를 통일해 줘"라고만 하면 AI가 철자가 비슷한 다른 관할까지 합칠 수 있습니다. 그래서 담당자는 먼저 빈도표를 받아 읽고, 세 표기를 강서소방서로 바꾸는 매핑표를 만들어 승인받은 뒤 정제를 맡깁니다.

가상 사례: 예방 점검 내역의 빈 상태값 분리하기

다음은 실제 시설이나 점검 결과가 아닌 가상 사례입니다. 예방업무 담당자는 두 프로그램에서 내보낸 합성 점검 CSV를 하나로 합쳐 재확인이 필요한 행을 추리려 합니다. 한 파일은 시설 식별자 앞뒤에 공백이 있고, 다른 파일은 점검 상태가 빈 행과 미입력인 행이 섞여 있습니다.

담당자는 원본 두 파일을 보존하고, 각 열의 결측 수와 식별자 빈도를 먼저 확인합니다. 식별자는 앞뒤 공백만 제거하되, 상태가 빈 행을 임의로 정상이나 미점검으로 채우지 않습니다. 빈 상태는 별도의 확인 후보로 분리하고, 합친 뒤에는 원본 행 수와 중복 제거 수를 기록합니다.

공백 정리 전에 합치면 같은 시설이 두 건처럼 보이고, 빈 상태를 임의로 채우면 실제 점검 여부를 단정하게 됩니다. 결과는 처분 명단이 아니라 원자료 재확인 목록이며, 상태는 점검 원장과 대조한 뒤 확정합니다.

정제 전에 받아 볼 표

규칙을 정하기 전에 자료 상태를 표로 먼저 봅니다. AI에게 "정제하기 전에 전체 행·열 수, 열별 자료형과 빈 칸 수, 관할서 열의 값별 빈도를 먼저 보여 주세요"라고 요청하고, 사람이 그 표를 읽고 규칙을 정합니다. 코드로는 다음과 같습니다.

PYTHON
import pandas as pd
df = pd.read_csv("dispatch.csv", dtype={"출동번호": str})  # 앞자리 0 보존

df.shape                      # (행, 열) 전체 규모
df.info()                     # 열별 자료형과 비어 있지 않은 값 수
df.isna().sum()               # 열별 빈 칸 수
df["관할서"].value_counts()   # 표기 흔들림 확인

읽을 때 생기는 문제 두 가지도 함께 확인합니다.

  • 숫자로만 된 출동번호를 그냥 읽으면 앞자리 0이 사라집니다(001이 1이 됨). 위처럼 dtype으로 문자열로 읽게 합니다.
  • 첫 줄부터 읽기 오류가 나면 파일 인코딩이 다를 수 있습니다. read_csv는 기본으로 UTF-8로 읽으므로, 다른 인코딩으로 저장된 파일은 encoding= 인자로 지정합니다.

결측값: 버릴지 채울지 정한다

빈 칸은 열의 업무 의미로 처리합니다.

  • 핵심 항목이 비면 집계에서 뺍니다: 출동시각이 없으면 시간 집계에 쓸 수 없으므로 행을 빼고, 뺀 행은 확인 목록으로 따로 저장합니다.
  • 선택 항목이면 표시합니다: 비고가 비면 "미기재"로 채워 적지 않았다는 사실을 남깁니다.
PYTHON
df = df.dropna(subset=["출동시각"])        # 핵심 결측 → 행 제거
df["비고"] = df["비고"].fillna("미기재")   # 선택 결측 → 표시
⚠️ 흔한 실수
결측을 평균이나 0으로 채우면 없는 값을 있는 값처럼 셉니다. 빈 칸은 왜 비었는지부터 원자료 담당에게 확인합니다.

중복: 같은 출동이 여러 줄

  • 완전 중복: 모든 칸이 같은 줄 → 그대로 제거
  • 부분 중복: 같은 출동인데 일부 칸만 다름 → 키 열(예: 출동번호)로 판정
PYTHON
df = df.drop_duplicates()                                   # 완전 중복
df = df.drop_duplicates(subset=["출동번호"], keep="first")  # 출동번호 기준

두 번째 줄은 충돌을 찾아 주는 코드가 아니라 이미 남길 행을 정했다는 전제에서 한 행만 고르는 코드입니다. 실행 순서는 다음과 같습니다.

  1. 먼저 df[df.duplicated(subset=["출동번호"], keep=False)]로 같은 번호의 모든 행을 펼쳐 값이 다른지 사람이 확인합니다.
  2. 값이 모두 같으면(완전 중복) 위 keep="first" 줄을 실행해 한 행만 남깁니다.
  3. 값이 다르면(부분 중복) 이 줄을 실행하지 않고, 최신 시각·승인 상태 같은 기관 기준과 원자료를 사람이 대조한 뒤 병합·보존·제외를 직접 결정합니다.

AI가 낸 코드에 1번 없이 keep="first" 줄만 있으면, 값이 다른 행 가운데 어느 것이 남았는지 알 수 없습니다.

표기 통일: 하나의 이름으로

같은 대상을 다르게 적은 것을 합칩니다. 공백 제거가 먼저, 그다음 매핑입니다.

PYTHON
df["관할서"] = df["관할서"].str.strip()            # 앞뒤 공백 제거
매핑 = {"강서서": "강서소방서", "강서 소방서": "강서소방서"}
df["관할서"] = df["관할서"].replace(매핑)

앞 가상 상황의 세 줄이 강서소방서 1,296 한 줄로 합쳐집니다. strip()은 앞뒤 공백만 지우므로 강서 소방서처럼 가운데에 공백이 있는 표기는 매핑표로 다룹니다. 매핑은 코드 안에 두기보다 별도 표(CSV)로 두고, 담당 부서가 승인한 값만 씁니다. 표에 없는 값은 바꾸지 않고 확인 목록으로 남깁니다.

검산: 단계별 남은 행 수

정제 코드는 오류 메시지 없이 행을 지울 수 있습니다. 그래서 처음과 끝의 행 수만 비교하지 않고 단계마다 남은 행 수를 기록합니다. 어느 규칙이 행을 줄였는지 알아야 그 규칙이 맞는지 판단할 수 있습니다. 아래 숫자는 예시입니다.

단계남은 행줄어든 행
읽은 행1,500-
출동시각 결측 제외(확인 목록으로 저장)1,4973
완전 중복 제거1,4907
부분 중복을 확인 목록으로 보냄1,4864
최종 행1,486-

줄어든 행의 합(3+7+4=14)은 처음과 끝의 차이(1,500−1,486=14)와 같아야 합니다. 다르면 기록하지 않은 단계에서 행이 빠진 것입니다. 줄어든 행 수가 예상과 크게 다르면 그 단계의 규칙부터 다시 봅니다.

AI 결과에서 확인할 것

AI가 낸 정제 코드에서 아래 꼴이 보이면 그대로 쓰지 않고 고쳐 달라고 합니다.

흔한 실수무엇이 문제인가대신
fillna(0)이나 평균으로 일괄 채움없는 값을 있는 값으로 셈열의 의미로 제외·표시·확인 목록을 정함
펼쳐 보기 없이 drop_duplicates()나 keep="first" 실행값이 다른 행 가운데 무엇이 남았는지 모름같은 출동번호 행을 펼쳐 본 뒤 완전 중복만 제거
철자가 비슷한 이름을 자동으로 합침다른 관할이 하나로 합쳐질 수 있음승인된 매핑표에 있는 값만 바꿈
df["비고"].fillna("미기재", inplace=True)pandas 판에 따라 원본 표가 바뀌지 않음df["비고"] = df["비고"].fillna("미기재")처럼 다시 대입
원본과 같은 파일명으로 저장규칙이 틀렸을 때 되돌릴 수 없음dispatch_clean.csv처럼 새 이름으로 저장
단계별 행 수 보고 없음어느 규칙이 행을 지웠는지 모름단계별 남은 행 수 표를 함께 받음

정제가 끝나면

정제한 표와 함께 정제 규칙(어떤 열을 어떻게 처리했는지), 매핑표, 단계별 행 수 기록, 확인 목록을 남깁니다. 다음 사람이 같은 자료를 다시 정제하거나 보고 숫자를 설명할 때 이 기록이 필요합니다.

공개 기록으로 같은 순서를 연습하려면 학습 데이터셋의 화재·출동 기록 묶음을 봅니다. ICS-209-PLUS는 입력이 고르지 않던 미국 재난 상황보고 원본을 정리한 영문 자료입니다. pandas 함수는 pandas 코스의 결측치 처리 장과 텍스트 데이터 장에서 더 익힙니다.

▸ 소방 활용 포인트
정제 규칙, 관할서 매핑표, 단계별 행 수 기록을 파일로 남겨 두면 다음 달 같은 집계에서 프롬프트에 그대로 붙여 쓸 수 있습니다. 매핑표는 담당 부서가 승인한 판을 한 곳에 두고 고칠 때마다 날짜를 적습니다.

용어 한 줄 사전

용어한 줄 설명
행표에서 출동·점검 같은 기록 한 건을 나타내는 가로줄입니다.
열모든 기록에 공통으로 저장하는 시각·유형 같은 항목입니다.
키각 기록을 구별하거나 다른 표와 연결하는 기준값입니다.
결측값값이 0인 것이 아니라 기록되지 않았거나 알 수 없는 상태입니다.
중복같은 업무 사건이 둘 이상의 행으로 들어간 상태입니다.
정규화같은 뜻의 표기와 형식을 비교 가능한 한 형태로 맞추는 작업입니다.
매핑표여러 표기를 어떤 표준값으로 바꿀지 적고 담당 부서가 승인한 표입니다.

자주 묻는 질문

Q. 출동 CSV를 AI에 올려 정제를 맡겨도 되나요?

먼저 생성형 AI 입력 확인으로 자료와 쓰려는 도구를 점검합니다. 확인되지 않았으면 열 이름·자료형과 합성 몇 줄로 정제 코드를 받고, 그 코드를 기관 PC에서 실제 자료로 실행합니다. AI에게 다시 보여 줄 결과는 단계별 행 수처럼 값이 없는 것만 줍니다.

Q. 빈 칸은 모두 지워도 되나요?

아닙니다. 핵심 키가 비어 분석할 수 없는 행과, 비고처럼 비어 있음 자체가 정보인 열은 다르게 다뤄야 합니다. 열의 업무 의미를 먼저 적고 처리 규칙을 정합니다.

Q. 중복은 첫 행만 남기면 되나요?

두 행 가운데 어느 것이 최신·정확한지 모르면 자동으로 첫 행을 고르면 안 됩니다. 완전 중복만 제거하고, 값이 다른 부분 중복은 원자료와 담당 기록을 확인합니다.

Q. 표기가 비슷하면 자동으로 합쳐도 되나요?

철자가 비슷하다는 이유만으로 같은 대상이라고 단정할 수 없습니다. 승인된 매핑표나 고유 키가 있을 때 합치고, 나머지는 사람이 확인할 후보로 남깁니다.

핵심 정리

  • 빈 칸·중복·표기 불일치는 열의 업무 의미와 승인된 키·매핑표로 처리하고, AI가 임의로 정하게 두지 않습니다.
  • 출동 CSV는 외부 AI에 넣기 전에 점검하고, 확인되지 않았으면 열 이름과 합성 행으로 코드를 받아 기관 PC에서 실행합니다.
  • 빈 칸은 채우지 않고, 같은 출동번호는 펼쳐 본 뒤 완전 중복만 지우며, 원본은 새 파일명으로 보존합니다.
  • 단계별 남은 행 수를 기록해 줄어든 행의 합이 처음과 끝의 차이와 같은지 검산합니다.

다음 단계