파이썬(Python) pandas 활용 데이터 품질 지표(DQI) 자동 측정 실무: 1부. 완전성(Completeness) 검증과 결측치 방어 아키텍처

데이터 거버넌스를 구축할 때 많은 기업이 ‘데이터 품질 지표(DQI)’라는 개념을 도입하지만, 이를 실제 현장의 파이프라인에 코드로 녹여내는 기업은 극소수에 불과합니다. DQI는 엑셀에 수동으로 기록하는 보고서가 아니라, 데이터가 유입되는 즉시 시스템이 스스로 측정하고 경고를 울려야 하는 ‘살아있는 방어막’이어야 합니다.

본 문서에서는 실제 공공입찰(G2B, LH) 데이터를 파이썬으로 수집하며 겪었던 치명적인 결측치(Null) 사태를 바탕으로, pandas 라이브러리를 활용해 DQI의 제1원칙인 ‘완전성(Completeness)’을 자동 측정하는 실무 파이프라인 코드를 공개합니다.

1. 보이지 않는 결측치의 공포와 파이프라인의 붕괴

과거 나라장터(G2B)와 LH 웹 크롤링 봇을 처음 띄우고 수만 건의 공고 데이터를 적재했을 때, 수집 성공률 99%라는 로그만 믿고 안심한 적이 있습니다. 하지만 경영진이 요구한 ‘지역별 기초금액 총합’ 통계를 돌리자 즉각 치명적인 에러가 뿜어져 나왔습니다.

  • 비어있는 원시 데이터: 일부 수의계약이나 긴급 공고의 경우 ‘기초금액’이나 ‘입찰참가자격’ 란이 아예 비어있는 상태로 수집되었습니다.
  • 시스템 뻗음 현상: 데이터베이스는 이 구멍 난 데이터(결측치)를 끌어안고 연산을 시도하다 장렬하게 뻗어버렸습니다.
  • 이때 수집된 데이터가 온전하게 채워져 있는지 측정하는 ‘완전성(Completeness) DQI’ 자동화가 파이프라인의 생명줄임을 뼈저리게 느꼈습니다.

2. 다중 컬럼 완전성 DQI 산출 스크립트 (하이엔드 실무용)

단일 컬럼이 아닌, 수집 파이프라인 전체의 건전성을 모니터링하기 위해 pandas를 활용하여 필수 컬럼들의 결측률을 한 번에 스캔하고 일일 로그(Log)로 남기는 심화 코드입니다.

Python

import pandas as pd
import numpy as np
from datetime import datetime

def calculate_completeness_dqi(file_path, required_columns):
    # 1. 원시 데이터(Raw Data) 로드
    df = pd.read_csv(file_path)
    total_rows = len(df)
    
    # 2. [트러블슈팅 노하우] 가짜 공백(" ", "")을 실제 결측치(NaN)로 완벽 치환
    df.replace(r'^\s*$', np.nan, regex=True, inplace=True)
    
    dqi_results = []
    
    # 3. 필수 컬럼별 완전성 순회 검증
    for col in required_columns:
        missing_count = df[col].isnull().sum()
        completeness_score = ((total_rows - missing_count) / total_rows) * 100
        
        dqi_results.append({
            '검증_컬럼': col,
            '전체_건수': total_rows,
            '결측_건수': missing_count,
            '완전성_DQI_점수': round(completeness_score, 2)
        })
        
    # 4. 검증 결과를 데이터프레임으로 변환 및 로그 저장
    dqi_report = pd.DataFrame(dqi_results)
    dqi_report.to_csv(f'DQI_Report_{datetime.now().strftime("%Y%m%d")}.csv', index=False)
    
    return dqi_report

# G2B 입찰 데이터 필수 검증 컬럼 리스트 지정
target_columns = ['공고명', '발주처', '기초금액', '입찰마감일시']
final_report = calculate_completeness_dqi('g2b_raw_data.csv', target_columns)
print(final_report)

3. 실무 엔지니어링의 핵심: ‘가짜 공백’ 정제와 자동화 리포팅

현업에서 초보 분석가들이 가장 많이 하는 실수는 isnull().sum() 함수만 믿고 결측치가 없다고 착각하는 것입니다.

  • 가짜 공백의 함정: 웹 크롤링 데이터는 완벽한 비어있음(Null)이 아니라 스페이스바 한 칸(" ")과 같은 ‘가짜 공백’으로 수집되는 경우가 허다합니다.
  • 정규표현식 강제 치환: 코드의 2번 과정처럼 정규표현식(regex=True)을 적용해 이를 진짜 결측치(np.nan)로 강제 치환하는 전처리 로직이 없다면 DQI 점수는 100% 왜곡됩니다.
  • 스냅샷 로깅: 측정된 점수를 단순히 화면에 출력하는 것에 그치지 않고 to_csv를 통해 매일 DQI 리포트를 파일로 스냅샷(Snapshot) 남겨야 진정한 자동화 체계가 완성됩니다.

4. 결론: 95%의 함정과 다음 과제

완전성 DQI가 95% 미만으로 떨어졌다면 해당 데이터셋은 절대 분석 모델에 투입해서는 안 됩니다.

하지만 빈칸이 꽉 채워져 있다고 해서(완전성 100%) 그 데이터가 정답은 아닙니다. 금액 란에 ‘일천만 원’이라는 문자가 섞여 있으면 연산이 불가능하기 때문입니다. 다음 2부에서는 정규표현식을 활용해 데이터 포맷의 불량률을 색출하는 ‘정확성(Accuracy) DQI 검증 실무’를 심층적으로 다루겠습니다.

댓글 남기기