회계사무실마다 다른 엑셀 양식, 알아서 똑똑하게 통합하기
A회사는 "전표일자", B회사는 "일자", C회사는 "거래일"... 사람이 눈으로 보면 똑같은 의미지만 파이썬에게는 치명적인 에러 원인입니다.
이 장벽을 극복해야 진정한 "어떤 엑셀이든 넣으면 분석해 주는 자동화 프로그램"이 완성됩니다.
실무 자동화의 최대 장벽: 제각각인 데이터
지금까지 배운 파이썬 코드는 df["거래일자"] 라는 컬럼이 있다는 전제하에 동작했습니다. 하지만 실무에서 고객이 던져주는 엑셀은 그렇지 않습니다.
| 우리가 원하는 표준 | A 회계법인 양식 | B 회사 전표 양식 | C 프로그램 다운로드 엑셀 |
|---|---|---|---|
| 거래일자 | 일자 | 전표일자 | 거래일 |
| 거래처 | 상호 | 거래처명 | 공급받는자 |
| 거래유형 | 구분 | 매출매입 | 차변대변 |
| 금액 | 거래금액 | 공급가액 | 합계금액 |
이들을 우리가 정의한 "표준 컬럼" 4가지로 강제 변환하는 것이 18단계 전처리의 핵심입니다.
컬럼 자동 인식 딕셔너리(Dictionary) 만들기
파이썬의 딕셔너리 구조를 활용해, 예상되는 모든 경우의 수를 매핑 테이블로 구축합니다.
# 표준 컬럼명 : [가능성 있는 동의어 리스트] COLUMN_MAPPING = { "거래일자": ["거래일", "일자", "전표일자", "거래일자", "날짜"], "거래처": ["상호", "거래처", "거래처명", "상호명", "공급받는자"], "거래유형": ["구분", "거래유형", "매출매입", "차변대변"], "금액": ["금액", "거래금액", "공급가액", "합계금액"] } def standardize_columns(df): # 1. 컬럼명의 공백 띄어쓰기 제거 (예: '거래처 명' -> '거래처명') df.columns = [str(c).replace(" ", "") for c in df.columns] rename_map = {} # 2. 매핑 테이블을 돌면서 원본 컬럼명 찾기 for standard_name, candidates in COLUMN_MAPPING.items(): for col in df.columns: if col in candidates: rename_map[col] = standard_name break # 3. 엑셀의 헤더를 표준 이름으로 강제 치환 return df.rename(columns=rename_map)
만약 df.columns를 다 뒤졌는데도 "금액"에 해당하는 컬럼을 못 찾았다면? 즉시 분석을 중단시키고 사용자에게 "필수 컬럼이 누락되었습니다."라는 에러 알림을 띄워 시스템 붕괴를 막아야 합니다.
값(Value)의 형식(Format) 통일하기
컬럼명뿐만 아니라 안에 들어있는 데이터 자체의 생김새도 통일해야 합니다.
# 1. 금액 정제: "₩10,000,000원" -> 10000000 (순수 숫자) def clean_amounts(df): df["금액"] = df["금액"].astype(str).str.replace(",", "").str.replace("₩", "").str.replace("원", "") df["금액"] = pd.to_numeric(df["금액"], errors="coerce") # 에러나는 놈은 NaN(결측치) 처리 return df # 2. 날짜 정제: "2026.01.01" 또는 "26/01/01" -> 통일된 DateTime 포맷 def clean_dates(df): df["거래일자"] = pd.to_datetime(df["거래일자"], errors="coerce") return df # 3. 거래처명 공백 제거: "ABC 상사" -> "ABC상사" def clean_customers(df): df["거래처"] = df["거래처"].astype(str).str.strip().str.replace(" ", "") return df
예외 상황: 딕셔너리에 없는 컬럼을 AI로 매핑하기
만약 고객이 생전 처음 보는 [영업점 발생가] 라는 컬럼을 썼다면 파이썬 딕셔너리가 찾지 못합니다. 이럴 때 최후의 수단으로 AI에게 컬럼명 텍스트들을 넘겨주고 유추하라고 지시합니다.
처음부터 무조건 AI에게 모든 걸 맡기면 API 비용이 폭발하고 속도가 매우 느려집니다. 반드시 파이썬 하드코딩 딕셔너리 규칙을 1차로 돌리고, 매칭에 실패한 미아 컬럼들만 모아서 AI에게 2차로 유추해 달라고 물어보는 구조를 짜야 실무에서 성공합니다.
데이터 품질 점수 산정 (QA)
엑셀 파일이 완벽한지 등급을 매겨주면 고객과 커뮤니케이션하기 매우 편합니다.
def calculate_quality(df): total = len(df) date_errors = df["거래일자"].isna().sum() amount_errors = df["금액"].isna().sum() # 결측치(오류) 비율만큼 100점에서 깎음 errors = date_errors + amount_errors score = (1 - errors / total) * 100 if score >= 99: grade = "A등급 (매우 우수)" elif score >= 95: grade = "B등급 (양호)" else: grade = "C등급 (주의요망)" return score, grade
최종: 파이썬 전처리 자동화 파이프라인 마스터
이제 어떤 엑셀 파일을 던져주더라도 끄떡없이 돌아가는 궁극의 함수를 완성했습니다.
def process_accounting_file(file): # 1. 파일 로드 df = pd.read_excel(file) # 2. 컬럼명 표준화 (일자->거래일자, 상호->거래처) df = standardize_columns(df) # 3. 필수 컬럼 방어막 검사 REQUIRED = ["거래일자", "거래처", "금액"] missing = [c for c in REQUIRED if c not in df.columns] if missing: raise ValueError(f"필수 컬럼을 찾을 수 없습니다. ({missing})") # 4. 데이터 값 형식 정제 및 통일 df = clean_dates(df) df = clean_amounts(df) df = clean_customers(df) # 5. 데이터 품질 산출 score, grade = calculate_quality(df) # 6. 결측치(오류 데이터)가 포함된 행을 따로 분류 (버리지 않고 보존) error_df = df[ df["거래일자"].isna() | df["금액"].isna() ] clean_df = df.dropna(subset=["거래일자", "금액"]) return clean_df, error_df, grade
18단계까지 오면서 엑셀 데이터 분석은 마스터했습니다! 하지만 진짜 실무는 엑셀 밖에도 있습니다. 계약서, 세금계산서 PDF, 영수증 이미지 등 수많은 비정형 데이터들이 회계사를 괴롭힙니다.
19단계부터는 파이썬으로 PDF 텍스트를 추출하고 OCR 기술을 결합하여, 엑셀 장부와 실제 증빙 서류의 금액이 일치하는지 자동으로 대조(Cross-check)하는 강력한 문서 분석 기술로 넘어갑니다.