월말·분기말이면 점검 대상과 실제 점검 기록을 맞춰 봐야 합니다. 손으로 대조하면 빠뜨리기 쉽습니다. 이 안내서는 두 목록을 대조해 미점검 대상·재점검 임박 대상·불량 분류를 찾는 로컬 스크립트입니다. 우선순위를 자동으로 정하지 않고, 담당자가 확인할 후보를 찾아 줍니다.
이 안내서를 끝내면 점검 대상과 기록을 대조해 누락을 자동으로 찾고, 결과를 그대로 처분에 쓰지 않고 사람이 확인할 목록으로 다루는 법을 알게 됩니다.
입력 두 가지
facility_register.csv—facility_id, facility_type, district, public_label, statusinspection_log.csv—facility_id, inspected_at, items_checked, items_failed, violation_category, result, reinspection_due등
무엇을 찾는가
세 가지를 만듭니다. 판정 규칙도 단순합니다.
- 미점검 (
not_inspected.csv) —status가 active인 대상 중 점검 기록이 없는 것 - 재점검 확인 대상 (
reinspection_due.csv) —reinspection_due날짜가 기준일로부터 30일 이내인 기록 - 불량 분류 집계 (
violation_summary.csv) —items_failed가 0보다 큰 행을 분류별로 합산
대조는 코드로 — 핵심 로직
손 대조의 실수를 없애는 핵심은 세 가지 연산입니다. 표준 pandas만 씁니다.
PYTHON
import pandas as pd reg = pd.read_csv("facility_register.csv") log = pd.read_csv("inspection_log.csv") asof = pd.Timestamp("2025-08-01") # ① 미점검: active 대상 중 점검 기록에 없는 것 (anti-join) active = reg[reg["status"] == "active"] not_inspected = active[~active["facility_id"].isin(set(log["facility_id"]))] # ② 재점검 임박: reinspection_due 가 기준일로부터 0~30일 이내 log["reinspection_due"] = pd.to_datetime(log["reinspection_due"], errors="coerce") due_soon = log[(log["reinspection_due"] - asof).dt.days.between(0, 30)] # ③ 불량 분류 집계 violations = log[log["items_failed"] > 0].groupby("violation_category").size()
핵심은 ①의 ~...isin(...)(anti-join)입니다. "대상 − 점검"을 빼기로 셈하면 ID 표기 차이로 조용히 틀리지만, 집합 포함 여부로 대조하면 빠진 대상만 정확히 남습니다. ②의 errors="coerce"는 형식이 깨진 날짜를 NaT로 만들어 검산에서 걸러 줍니다.
실행과 결과
BASH
python script.py --as-of 2025-08-01
TEXT
[입력] 점검 대상 10개, 점검 기록 8건, 기준일 2025-08-01 [검산] 미점검 2개, 재점검 확인 대상 3개, 불량 분류 4종 [주의] 재점검 대상은 담당자 원자료 확인 후 확정합니다. [OK] 저장: output/not_inspected.csv [OK] 저장: output/reinspection_due.csv [OK] 저장: output/violation_summary.csv
검산 — 먼저 기대값을 정해두기
동봉된 합성 데이터로 먼저 돌려, 기대값이 그대로 나오는지 확인합니다. 하나라도 다르면 결과를 업무에 쓰지 않습니다.
- active 대상 10개, 점검 기록 보유 8개
- 미점검 후보 2개, 재점검 확인 후보 3개
- 불량 분류 4종 (소화설비·피난구조설비·소화활동설비·경보설비)
대상 수는 status=active 행 수와 맞아야 하고, 미점검은 점검 기록이 없는 active 대상만, 재점검은 날짜 형식이 올바른 기록만 집계됩니다.
▸ 소방 활용 포인트
월말·분기말 점검 누락을 빠르게 찾되, 미점검이 곧 처분 대상은 아닙니다. 재점검 우선순위는 담당자가 원자료로 확정하고, 결과에는 실제 시설명·상세주소·취약점을 넣지 않고 집계 수준만 공유합니다.결과를 공유하기 전
다음 중 하나라도 보이면 공유하지 않고 원자료 확인으로 되돌립니다.
- 실제 시설명·상세주소가 출력에 남음 → 출력 컬럼을 줄이고 합성 ID만
- 대상 목록과 점검 기록의 ID 체계가 다름 → 매핑표로 샘플 5행 대조
reinspection_due날짜 형식이 섞임 → 변환 실패 행을 별도 CSV로- 결과로 바로 조치 문안을 만들려 함 → 담당자 검토 질문 목록으로만 전환
TEXT
- [ ] 실제 시설명, 상세주소, 취약점 설명을 공개 예시에 넣지 않았습니다. - [ ] 점검 우선순위나 위험도 최종 판단을 AI 또는 스크립트가 단정하지 않습니다. - [ ] reinspection_due.csv는 담당자 원자료 확인 후 확정합니다. - [ ] 미점검 대상은 점검 제외, 폐업, 관할 변경 같은 업무 규칙을 확인합니다. - [ ] 공개 문서에는 집계 수준의 결과만 사용합니다.
⚠️ 흔한 실수
이 레시피는 누락 후보를 찾는 도구이며 행정처분·위험도·우선순위를 자동 결정하지 않습니다. 점검 제외·폐업·관할 변경 같은 업무 규칙은 담당자가 원자료로 확인하세요.