분석 업무의 절반 이상은 데이터를 다듬는 일입니다. 출동 기록처럼 사람이 손으로 입력한 데이터는 빈 칸·중복·표기 흔들림이 섞여 있어, 그대로 집계하면 숫자가 틀립니다. 이 안내서는 지저분한 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), "행")
줄어든 행 수가 예상과 크게 다르면 규칙을 의심하세요. 멀쩡한 데이터를 지웠을 수 있습니다.
▸ 소방 활용 포인트
정제 규칙(어떤 열을 어떻게 처리했는지)을 주석이나 별도 문서로 남기면, 다음 사람이 같은 데이터를 다시 만질 때 시간을 크게 아끼고 집계 결과의 신뢰도가 올라갑니다.