회계장부, 계약서, 은행내역 삼각 대조망 구축하기
세금계산서는 1억원 발행되었는데, 은행 통장에는 9500만원만 여러 번에 걸쳐 분할 입금되었다면?
이런 "부분 입금", "미수금 누락" 등은 장부 하나만 봐서는 절대 알 수 없습니다. 서로 다른 모든 데이터 소스를 하나의 거래 ID로 묶어 거미줄처럼 대조하는 궁극의 시스템을 만들어 봅니다.
왜 Cross-Check 인가?
19단계에서는 "계약서 1개 vs 엑셀 1행" 을 비교했습니다. 하지만 실무에서는 [엑셀 거래장부 10만 줄] + [은행 입금내역 엑셀 20만 줄] + [세금계산서 PDF 수천 개]가 뒤죽박죽 섞여서 주어집니다.
T20260315-001
⚠️ 500만원 부족
이들을 "같은 거래처", "같은 날짜" 기준으로 묶어내는 작업을 데이터 엔지니어링에서는 조인(Join) 또는 머지(Merge)라고 부릅니다.
가장 큰 장벽: 거래처명 표준화 (Entity Resolution)
계약서에는 ABC 상사, 엑셀 장부에는 (주)에이비씨, 입금내역에는 ABC상사주식회사 라고 적혀있으면 파이썬은 이 셋을 전혀 다른 회사로 취급합니다.
이들을 동일 사업자로 묶어주기 위해 "사업자등록번호"를 최우선 연결 키(Key)로 사용해야 합니다.
# 사업자번호에서 특수문자(-)를 모두 날리고 순수 숫자만 남김 df["사업자번호"] = df["사업자번호"].astype(str).str.replace(r"\D", "", regex=True) # 거래 고유 ID 부여 (예: T + 20260315 + 0001) df["거래ID"] = "T" + df["거래일자"].dt.strftime("%Y%m%d") + df.index.astype(str).str.zfill(4)
Pandas GroupBy & Merge (분할 입금 합산하기)
1억 원어치를 팔았는데 돈이 3000만 원, 4000만 원, 3000만 원 3번에 걸쳐 입금되었다면, 입금내역 엑셀에 3줄이 찍혀있을 겁니다. 이를 하나로 합친 뒤(GroupBy) 장부(Merge)와 비교해야 합니다.
# 1. 입금내역 엑셀에서 '거래ID'가 같은 입금액들을 모두 합산(sum) payment_sum = payments.groupby("거래ID")["입금액"].sum().reset_index() # 2. 합산된 입금액 데이터를 메인 회계장부(transactions) 옆에 갖다 붙임 (Left Join) transactions = transactions.merge(payment_sum, on="거래ID", how="left") # 아직 입금내역이 없어서 NaN이 뜬 곳은 0원으로 강제 치환 transactions["입금액"] = transactions["입금액"].fillna(0)
미수금, 부분 입금, 초과 입금 검증하기
장부 금액과 합산된 입금액이 나란히 한 표(행)에 놓이게 되었으므로, 이제 간단한 파이썬 사칙연산만으로 불일치 내역을 모조리 뽑아낼 수 있습니다.
# 장부 금액과 실제 입금액의 차이 계산 transactions["입금차액"] = transactions["입금액"] - transactions["금액"] # 돈이 덜 들어온 미수금(또는 미입금) 거래 추출 unpaid = transactions[ transactions["입금차액"] < 0 ] # 돈이 오히려 더 들어온 초과입금 거래 추출 overpaid = transactions[ transactions["입금차액"] > 0 ]
차액이 발생했다고 무조건 횡령이나 허위 매출이 아닙니다. 상계처리, 선수금, 환불, 어음 수령 등 정상적인 사유가 수백 가지입니다. 시스템은 이것을 "⚠️ 검토 대상"으로만 분류하고, 최종 원인 파악 및 판단은 회계사(인간)가 하도록 설계해야 책임을 피할 수 있습니다.
불일치 원인을 유추하는 AI 코멘트 생성
파이썬이 찾아낸 이 "⚠️ 검토 대상" 내역들을 다시 AI에게 던져주어, 회계사에게 보고할 예쁜 설명글을 작성하게 합니다.
prompt = f""" 다음 거래의 장부 금액과 입금액이 일치하지 않습니다. 장부(계약) 금액 : {amt} 실제 입금액 : {paid} 차액 : {diff} 이 상황에 대해 발생할 수 있는 회계적 사유(상계, 분할입금, 수수료 공제 등) 3가지를 제시하고 검토 의견을 부드럽게 작성하세요. "부정", "위법" 같은 단정적인 단어는 절대 사용하지 마세요. """
최종: 다중 데이터 융합 검증 파이프라인
장부 엑셀, 입금내역 엑셀, 세금계산서 JSON 3개의 거대한 테이블을 하나로 합치고, 각 항목마다 20점씩 부여하여 "검증점수(100점 만점)"를 산출하는 궁극의 시스템을 조립합니다.
def cross_check_pipeline(trans_df, payment_df, invoice_df): # 1. 분할 입금 합산 및 장부에 결합 (Merge) pay_sum = payment_df.groupby("거래ID")["입금액"].sum().reset_index() master = trans_df.merge(pay_sum, on="거래ID", how="left").fillna({'입금액': 0}) # 2. 세금계산서 금액 결합 inv_sum = invoice_df.groupby("거래ID")["공급가액"].sum().reset_index() master = master.merge(inv_sum, on="거래ID", how="left").fillna({'공급가액': 0}) # 3. 신뢰도 채점 로직 (각 33.3점 만점) def scoring(row): score = 0 # 장부 금액과 입금액이 완벽히 일치하면 34점 추가 if row['금액'] == row['입금액']: score += 34 # 장부 금액과 세금계산서 공급가액이 완벽히 일치하면 33점 추가 if row['금액'] == row['공급가액']: score += 33 # 입금액과 세금계산서 공급가액이 완벽히 일치하면 33점 추가 if row['입금액'] == row['공급가액']: score += 33 return score master['검증점수'] = master.apply(scoring, axis=1) # 4. 검토 대상 선별 review_targets = master[ master['검증점수'] < 100 ] return master, review_targets
지금까지 배운 18단계(표준화), 19단계(문서 분석), 20단계(다중 데이터 융합)의 코드들을 우리가 전부 하나하나 실행해야 했습니다.
대망의 21단계에서는 사용자가 "ABC상사 거래 검토해줘" 라고 자연어로 한마디만 치면, 18/19/20단계의 파이썬 코드들을 AI가 스스로 조합(Tool Calling/Planning)하여 자율적으로 실행하고 보고서를 생성하는 궁극의 'AI 회계 비서(Agent)'를 탄생시킵니다.