/ 학습 / 안내서 / 데이터 처리
L1 입문 · 3분 읽기

지저분한 출동 데이터 깔끔하게 정제하기

데이터팀 2026.05.22 갱신 엑셀 이상의 데이터를 다뤄야 하는 실무자
#데이터처리#전처리#입문

분석 업무의 절반 이상은 데이터를 다듬는 일입니다. 출동 기록처럼 사람이 손으로 입력한 데이터는 빈 칸·중복·표기 흔들림이 섞여 있어, 그대로 집계하면 숫자가 틀립니다. 이 안내서는 지저분한 CSV 한 장을 분석 가능한 깨끗한 표로 만드는 순서를 따라갑니다.

🎯 이 장의 목표
  • 데이터를 만지기 전에 먼저 살펴보는 법
  • 결측·중복·표기 불일치를 다루는 구체적 방법
  • 정제 전후를 검산해 실수를 잡는 습관

먼저, 손대기 전에 살펴본다

정제의 첫 단계는 코드가 아니라 관찰입니다. 무엇이 문제인지 모르고 고칠 수는 없습니다.

PYTHON
import pandas as pd
df = pd.read_csv("dispatch.csv")

df.shape                      # (행, 열) — 전체 규모
df.info()                     # 자료형·결측 개수
df.isna().sum()               # 열별 빈 칸 수
df["관할서"].value_counts()   # 표기 흔들림 발견

value_counts() 는 "강서구 1,203 / 강서 88 / 강서소방서 5"처럼 표기 불일치를 한눈에 드러냅니다.

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

빈 칸을 무조건 채우는 게 아닙니다. 열의 의미로 결정합니다.

PYTHON
df = df.dropna(subset=["출동시각"])        # 핵심 결측 → 행 제거
df["비고"] = df["비고"].fillna("미기재")   # 선택 결측 → 표시
⚠️ 흔한 실수
결측을 평균이나 0으로 무심코 채우면 통계가 왜곡됩니다. "왜 비었는지"를 먼저 생각하세요. 빈 값에는 대개 이유가 있습니다.

중복: 같은 출동이 여러 줄

PYTHON
df = df.drop_duplicates()                                   # 완전 중복
df = df.drop_duplicates(subset=["출동번호"], keep="first")  # 출동번호 기준

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

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

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

규칙이 많아지면 매핑을 코드가 아니라 별도 표(CSV)로 빼두면 유지·검토가 쉽습니다.

마지막은 검산

정제는 반드시 전후를 비교해 의도대로 됐는지 확인합니다. 이 한 줄이 "조용한 실수"를 막습니다.

PYTHON
before = len(pd.read_csv("dispatch.csv"))
print("정제 전:", before, "행")
print("정제 후:", len(df), "행")
print("제거됨:", before - len(df), "행")

줄어든 행 수가 예상과 크게 다르면 규칙을 의심하세요. 멀쩡한 데이터를 지웠을 수 있습니다.

▸ 소방 활용 포인트
정제 규칙(어떤 열을 어떻게 처리했는지)을 주석이나 별도 문서로 남기면, 다음 사람이 같은 데이터를 다시 만질 때 시간을 크게 아끼고 집계 결과의 신뢰도가 올라갑니다.