파이썬(Python) pandas 활용 데이터 품질 지표(DQI) 자동 측정 실무: 2부. 정확성(Accuracy) 검증과 정규표현식(Regex) 아키텍처

이전 포스팅에서 우리는 데이터의 빈칸을 찾아내는 ‘완전성(Completeness) DQI’ 자동화 파이프라인을 구축했습니다. 하지만 데이터가 100% 꽉 채워져 있다고 해서 안심할 수 있을까요? 칸은 채워져 있지만 그 안에 시스템이 읽을 수 없는 ‘쓰레기 값’이 들어있다면 파이프라인은 여전히 붕괴합니다.

본 문서에서는 실제 G2B 및 LH 공공입찰 데이터를 다루며 겪었던 포맷 불량 사태를 바탕으로, 파이썬(Python) pandas와 정규표현식(Regex)을 융합하여 데이터의 ‘정확성(Accuracy)’을 검증하는 하이엔드 DQI 실무 코드를 공개합니다.

1. [실무 경험] 꽉 채워진 쓰레기 데이터의 배신

1부에서 결측치 방어 로직을 세팅한 후, 며칠간 완전성 DQI 점수가 100%를 기록하며 평화로운 나날이 이어졌습니다. 하지만 또다시 경영진의 대시보드에서 ‘하남시 도로공사’의 기초금액 합계가 0원으로 집계되는 대형 사고가 터졌습니다.

데이터베이스를 뜯어보니 원인은 황당했습니다. 발주처 담당자가 금액 란에 숫자 10000000 대신, 한글과 기호가 섞인 1,000만 원 혹은 일천만원(VAT포함)이라고 제멋대로 입력해 둔 것입니다. 데이터베이스의 숫자형(Integer) 컬럼은 이 문자열을 인식하지 못하고 전부 에러(NaN) 처리해 버렸습니다. ‘값’이 존재하는지(완전성)를 넘어, 그 값이 우리가 지정한 ‘형식(Format)’에 정확히 들어맞는지 검증하는 ‘정확성(Accuracy) DQI’가 필수적인 이유입니다.

2. 정규표현식(Regex) 기반 정확성 DQI 산출 스크립트

정확성 DQI는 단순한 내장 함수로는 측정할 수 없습니다. 컬럼별로 허용되는 ‘패턴’을 정의하고, 이를 파이썬 re 모듈이나 pandasstr.match() 함수로 검사해야 합니다.

Python

import pandas as pd
import re
from datetime import datetime

def calculate_accuracy_dqi(file_path):
    df = pd.read_csv(file_path)
    total_rows = len(df)
    
    # 1. 컬럼별 정확성 검증 패턴 (정규표현식) 정의
    # 기초금액: 오직 숫자만 허용 (콤마나 한글 불가)
    numeric_pattern = r'^\d+$'
    # 사업자등록번호: 000-00-00000 형식
    biz_no_pattern = r'^\d{3}-\d{2}-\d{5}$'
    
    dqi_results = []
    
    # 2. 기초금액 정확성 검증
    # astype(str)로 변환 후 정규식 패턴과 일치하는지(True/False) 검사
    valid_amount_mask = df['기초금액'].astype(str).str.match(numeric_pattern, na=False)
    valid_amount_count = valid_amount_mask.sum()
    amount_accuracy = (valid_amount_count / total_rows) * 100
    
    dqi_results.append({
        '검증_컬럼': '기초금액',
        '검증_규칙': '순수 숫자',
        '불량_건수': total_rows - valid_amount_count,
        '정확성_DQI_점수': round(amount_accuracy, 2)
    })
    
    # 3. 사업자등록번호 정확성 검증
    valid_biz_mask = df['사업자등록번호'].astype(str).str.match(biz_no_pattern, na=False)
    valid_biz_count = valid_biz_mask.sum()
    biz_accuracy = (valid_biz_count / total_rows) * 100
    
    dqi_results.append({
        '검증_컬럼': '사업자등록번호',
        '검증_규칙': '000-00-00000 포맷',
        '불량_건수': total_rows - valid_biz_count,
        '정확성_DQI_점수': round(biz_accuracy, 2)
    })
    
    # 4. 검증 리포트 출력 및 저장
    dqi_report = pd.DataFrame(dqi_results)
    dqi_report.to_csv(f'Accuracy_DQI_Report_{datetime.now().strftime("%Y%m%d")}.csv', index=False)
    
    return dqi_report

final_report = calculate_accuracy_dqi('g2b_raw_data.csv')
print(final_report)

3. 실무 엔지니어링의 핵심: 커스텀 패턴 매칭

위 코드의 핵심은 데이터 엔지니어가 비즈니스 규칙을 이해하고 정규표현식(Regular Expression)으로 완벽하게 번역해 냈다는 점입니다.

사업자등록번호 컬럼에 1234567890처럼 하이픈(-)이 빠진 데이터가 들어오면 시스템 간 연동(API) 시 100% 장애가 발생합니다. 코드 내 ^\d{3}-\d{2}-\d{5}$ 패턴은 이 미세한 포맷 불량을 귀신같이 찾아내어 ‘불량 건수’로 카운트합니다. 이 코드를 Airflow 같은 스케줄러에 물려두면, 매일 아침 어떤 발주처의 데이터가 가장 포맷을 안 지키는지 한눈에 파악할 수 있는 강력한 거버넌스 대시보드가 완성됩니다.

4. 거버넌스의 완성: 완전성과 정확성의 결합

완전성(Completeness)이 데이터 파이프라인의 ‘외벽’이라면, 정확성(Accuracy)은 그 내부를 지키는 ‘보안 검색대’입니다. 이 두 가지 지표를 모두 95% 이상으로 통과한 데이터만이 진정한 마스터 데이터(Master Data)로서 AI 학습 모델이나 경영진의 통계 자료로 쓰일 자격이 있습니다.

이로써 파이썬을 활용한 DQI 자동화 측정 2부작을 마칩니다. 엑셀 수작업에서 벗어나 코드로 데이터 품질을 통제하는 이 실무 아키텍처가, 엔터프라이즈 데이터 거버넌스를 고민하는 실무자들에게 강력한 돌파구가 되기를 바랍니다.

댓글 남기기