⚖️ AI 규제/윤리

데이터 품질 관리

Data Quality Management

AI 학습 데이터의 정확성, 완전성, 적시성을 보장하는 프로세스. EU AI Act 고위험 AI의 핵심 요건.

상세 설명

데이터 품질 관리(Data Quality Management, DQM)는 데이터 품질을 정의, 측정, 모니터링, 개선하는 체계적인 프로세스입니다. EU AI Act 제10조 제2항은 고위험 AI의 학습 데이터에 대해 "적절한 데이터 거버넌스 및 관리 관행"을 의무화하며, 여기에 품질 관리가 핵심적으로 포함됩니다.

DQM 프로세스는 6단계로 구성됩니다: 품질 요구사항 정의, 품질 측정(프로파일링), 품질 평가(임계치 대비), 근본 원인 분석, 품질 개선 조치, 지속적 모니터링. AI 프로젝트에서는 학습 데이터 전처리 파이프라인에 이 단계들이 내장되어야 합니다.

EU AI Act는 고위험 AI에 대해 학습 데이터의 "관련성, 대표성, 오류 없음, 완전성" 요건을 명시합니다(제10조 제3항). 이를 충족하려면 데이터 품질 측정 결과와 개선 이력을 문서화해야 하며, 시장 감시 당국의 요청 시 제출할 수 있어야 합니다.

실무에서는 데이터 품질 대시보드를 구축하여 실시간 품질 지표를 모니터링합니다. 품질 저하 시 자동 알림을 발송하고, 파이프라인을 중단하는 circuit breaker 패턴이 권장됩니다. 품질 점수 임계치 미달 데이터는 모델 학습에서 자동 제외해야 합니다.

코드 예제

# 데이터 품질 관리 파이프라인 예제
from great_expectations.core import ExpectationSuite
from great_expectations.dataset import PandasDataset
import pandas as pd
from datetime import datetime
from typing import Dict, List
import json

class AIDataQualityManager:
    """EU AI Act 준수를 위한 데이터 품질 관리 시스템"""

    def __init__(self, quality_threshold: float = 0.8):
        self.quality_threshold = quality_threshold
        self.quality_history: List[Dict] = []

    def create_ai_act_expectations(self) -> ExpectationSuite:
        """EU AI Act 제10조 요구사항 기반 품질 규칙 생성"""
        suite = ExpectationSuite("ai_act_compliance")

        # 완전성 (Completeness) - 결측치 제한
        suite.add_expectation({
            "expectation_type": "expect_column_values_to_not_be_null",
            "kwargs": {"column": "*", "mostly": 0.95}
        })

        # 고유성 (Uniqueness) - 중복 제한
        suite.add_expectation({
            "expectation_type": "expect_compound_columns_to_be_unique",
            "kwargs": {"column_list": ["record_id"]}
        })

        # 유효성 (Validity) - 데이터 타입 및 범위
        suite.add_expectation({
            "expectation_type": "expect_column_values_to_be_between",
            "kwargs": {"column": "age", "min_value": 0, "max_value": 120}
        })

        return suite

    def validate_dataset(self, df: pd.DataFrame,
                          dataset_name: str) -> Dict:
        """데이터셋 품질 검증"""
        ge_df = PandasDataset(df)

        # 품질 차원별 측정
        quality_scores = {
            "completeness": 1 - df.isnull().sum().sum() / df.size,
            "uniqueness": 1 - df.duplicated().sum() / len(df),
            "validity": self._check_validity(df),
            "timeliness": 0.95,  # 실제로는 수집 시점 기반 계산
        }

        # 대표성 검사 (AI 특화)
        if "protected_attribute" in df.columns:
            quality_scores["representativeness"] = self._check_representativeness(df)

        # 종합 점수
        overall = sum(quality_scores.values()) / len(quality_scores)

        result = {
            "dataset_name": dataset_name,
            "timestamp": datetime.now().isoformat(),
            "record_count": len(df),
            "quality_scores": quality_scores,
            "overall_score": round(overall, 3),
            "ai_act_compliant": overall >= self.quality_threshold,
            "threshold": self.quality_threshold
        }

        self.quality_history.append(result)
        return result

    def _check_validity(self, df: pd.DataFrame) -> float:
        """유효성 검사 (커스텀 규칙 기반)"""
        valid_count = 0
        total_checks = 0

        for col in df.select_dtypes(include=['number']).columns:
            # 이상치 검사 (IQR 기반)
            Q1 = df[col].quantile(0.25)
            Q3 = df[col].quantile(0.75)
            IQR = Q3 - Q1
            outliers = ((df[col] < Q1 - 1.5*IQR) | (df[col] > Q3 + 1.5*IQR)).sum()
            valid_count += len(df) - outliers
            total_checks += len(df)

        return valid_count / total_checks if total_checks > 0 else 1.0

    def _check_representativeness(self, df: pd.DataFrame) -> float:
        """대표성 검사 (보호 속성 분포)"""
        # 이상적 분포와 실제 분포 비교
        ideal_dist = {"M": 0.5, "F": 0.5}
        actual_dist = df["protected_attribute"].value_counts(normalize=True)

        divergence = sum(
            abs(actual_dist.get(k, 0) - v)
            for k, v in ideal_dist.items()
        ) / 2

        return 1 - divergence

    def generate_compliance_report(self) -> str:
        """EU AI Act 감사용 컴플라이언스 보고서"""
        report = {
            "report_type": "EU_AI_Act_Article_10_Compliance",
            "generated_at": datetime.now().isoformat(),
            "quality_threshold": self.quality_threshold,
            "validation_history": self.quality_history,
            "overall_compliance_rate": sum(
                1 for h in self.quality_history if h["ai_act_compliant"]
            ) / len(self.quality_history) if self.quality_history else 0
        }
        return json.dumps(report, indent=2, ensure_ascii=False)

    def should_proceed_with_training(self, validation_result: Dict) -> bool:
        """학습 진행 여부 결정 (Circuit Breaker)"""
        if not validation_result["ai_act_compliant"]:
            print(f"[품질 차단] 품질 점수 {validation_result['overall_score']} < "
                  f"임계치 {self.quality_threshold}. 학습이 차단되었습니다.")
            return False
        print(f"[품질 통과] 학습을 진행합니다.")
        return True

# 사용 예시
dqm = AIDataQualityManager(quality_threshold=0.8)

df = pd.DataFrame({
    "record_id": [1, 2, 3, 4, 5],
    "age": [25, 30, 35, 40, 45],
    "income": [50000, None, 55000, 60000, 65000],
    "protected_attribute": ["M", "F", "M", "F", "M"]
})

result = dqm.validate_dataset(df, "training_data_v1")
print(f"품질 점수: {result['quality_scores']}")

if dqm.should_proceed_with_training(result):
    # model.fit(df)  # 학습 진행
    pass

실무 대화

CTO: EU AI Act 시행 전에 데이터 품질 관리 체계를 구축해야 합니다. 현재 상태는요?

DBA: 기본적인 결측치 검사만 하고 있습니다. 품질 점수화나 이력 관리는 안 되고 있어요.

시니어: Great Expectations 도입을 제안합니다. 품질 임계치 기반 자동 차단, 감사 로그 생성이 가능하고, MLOps 파이프라인에 통합하기 좋습니다.

면접관: AI 프로젝트에서 데이터 품질 관리를 어떻게 구현했나요?

지원자: 6단계 DQM 프로세스를 적용했습니다. 먼저 도메인 전문가와 품질 요구사항을 정의하고, Great Expectations로 자동화된 품질 측정을 구현했습니다. 임계치 80% 미달 시 Airflow DAG가 자동 중단되고, Slack 알림이 발송됩니다. 모든 품질 측정 결과는 MLflow에 메트릭으로 기록해서 버전별 추적이 가능하고, EU AI Act 감사용 보고서도 자동 생성됩니다.

시니어: 품질 검증 로직이 학습 코드에 섞여 있네요. 분리가 필요해요.

주니어: 어디에 배치하는 게 좋을까요?

시니어: 데이터 로딩 직후, 전처리 전에 검증하세요. 품질 미달 시 예외를 던지거나 False를 반환해서 후속 단계가 실행되지 않도록요. 그리고 검증 결과를 반드시 로깅하세요.

주의사항

더 배우기