5P by GN⁺ 19일전 | ★ favorite | 댓글과 토론
  • 현 시점(2025년)의 주요 데이터 검증 도구에 대한 설명 및 상황 별 추천
  • 데이터 검증(유효성 검사) 은 데이터의 품질을 자동 또는 반자동으로 확인하는 과정임
    • 데이터 유형 확인, 누락된 값 수 확인, 비정상적인 값 탐지
  • 데이터프레임의 행뿐만 아니라 API 입력값이나 폼 제출 값도 검증 가능
  • 사용자는 특정 열의 값이 특정 범위에 있어야 한다는 등의 규칙을 설정 가능
  • 검증 실패 시: 오류 발생, 검증 보고서 생성 후 수동 또는 자동 처리 가능

왜 데이터 검증이 중요한가

  • 공공기관의 분석 작업은 다음 두 가지로 나뉨:
    • 애드혹 분석 – 일회성 분석 작업
    • 정기 통계 생성 – 정기적으로 새로운 데이터 수집 및 처리
  • 데이터 오류가 분석 결과에 영향을 주기 전에 검증이 필요함
  • 데이터 검증은 오류 위험을 줄이고 정확도를 높이는 데 효과적임

주요 데이터 검증 도구

1. Great Expectations

  • 생산 등급 수준의 강력한 데이터 검증 도구

  • 오픈 소스 패키지가 있으며, 유료 클라우드 서비스도 제공

  • 고급 기능 제공:

    • 검증 실패 시 Slack 메시지 전송 등 자동화 가능
  • 설정이 복잡하고 데이터 과학 기술이 필요한 경우가 많음

  • 예제 코드:

    import great_expectations as gx  
    import pandas as pd  
    
    context = gx.get_context()  
    df = pd.read_csv("https://raw.githubusercontent.com/great-expectations/gx_tutorials/…;)  
    
    data_source = context.data_sources.add_pandas("pandas")  
    data_asset = data_source.add_dataframe_asset(name="pd dataframe asset")  
    batch_definition = data_asset.add_batch_definition_whole_dataframe("batch definition")  
    batch = batch_definition.get_batch(batch_parameters={"dataframe": df})  
    
    # 값이 1~6 사이인지 검증  
    expectation = gx.expectations.ExpectColumnValuesToBeBetween(column="passenger_count", min_value=1, max_value=6)  
    validation_result = batch.validate(expectation)  
    

    검증 실패 시 Slack 알림 설정 예제:

    from gx.actions import SlackNotificationAction, UpdateDataDocsAction  
    
    action_list = [  
        SlackNotificationAction(  
            name="send_slack_notification_on_failed_expectations",  
            slack_token="${validation_notification_slack_webhook}",  
            slack_channel="${validation_notification_slack_channel}",  
            notify_on="failure",  
            show_failed_expectations=True,  
        ),  
        UpdateDataDocsAction(name="update_all_data_docs"),  
    ]  
    

2. Pointblank

  • 2024년 출시된 최신 Python 데이터 검증 도구 (RStudio → Posit 제작)
  • Great Expectations의 영향을 받았으며 직관적인 문법 제공
  • Polars, Pandas, DuckDB 등 다양한 데이터 소스 지원
  • 예제 코드:
    import pointblank as pb  
    
    validation = (  
        pb.Validate(data=pb.load_dataset(dataset="small_table"))  
        .col_vals_gt(columns="d", value=100)  
        .col_vals_le(columns="c", value=5)  
        .col_exists(columns=["date", "date_time"])  
        .interrogate()  
    )  
    
  • 후속 작업 자동화 기능 부족 → 후속 작업을 수동으로 처리해야 함

3. Pandera

  • Great Expectations와 유사한 API 제공

  • 통계적 가설 검정 기능 지원

  • Polars, Geopandas, Pyspark 등 다양한 데이터 소스 지원

  • 예제 코드:

    import pandas as pd  
    import pandera as pa  
    
    df = pd.DataFrame({  
        "column1": [1, 4, 0, 10, 9],  
        "column2": [-1.3, -1.4, -2.9, -10.1, -20.4],  
        "column3": ["value_1", "value_2", "value_3", "value_2", "value_1"],  
    })  
    
    schema = pa.DataFrameSchema({  
        "column1": pa.Column(int, checks=pa.Check.le(10)),  
        "column2": pa.Column(float, checks=pa.Check.lt(-1.2)),  
        "column3": pa.Column(str, checks=[  
            pa.Check.str_startswith("value_"),  
            pa.Check(lambda s: s.str.split("_", expand=True).shape[1] == 2)  
        ]),  
    })  
    
    validated_df = schema(df)  
    
  • 통계적 가설 검정 예제:

    from scipy import stats  
    
    schema = pa.DataFrameSchema({  
        "height_in_feet": pa.Column(float, [  
            pa.Hypothesis.two_sample_ttest(  
                sample1="M",  
                sample2="F",  
                groupby="sex",  
                relationship="greater_than",  
                alpha=0.05,  
                equal_var=True  
            )  
        ]),  
        "sex": pa.Column(str)  
    })  
    
    schema.validate(df)  
    

4. Pydantic

  • 데이터프레임이 아닌 딕셔너리 기반 검증 도구
  • JSON 및 비정형 데이터 검증에 적합
  • FastAPI와 같은 API 프레임워크와 통합 가능
  • 예제 코드:
    from pydantic import BaseModel, PositiveInt  
    from datetime import datetime  
    
    class User(BaseModel):  
        id: int  
        name: str = 'John Doe'  
        signup_ts: datetime | None  
        tastes: dict[str, PositiveInt]  
    
    external_data = {  
        'id': 123,  
        'signup_ts': '2019-06-01 12:22',  
        'tastes': {'wine': 9, 'cheese': 7, 'cabbage': '1'}  
    }  
    
    user = User(**external_data)  
    

5. Cerberus

  • 딕셔너리 기반 검증 도구
  • 간단한 규칙 기반 설정
  • True/False 값 반환 → 오류를 던지지 않음
  • 예제 코드:
    from cerberus import Validator  
    
    schema = {'name': {'type': 'string'}}  
    v = Validator(schema)  
    document = {'name': 'john doe'}  
    v.validate(document)  
    # True  
    

6. jsonschema

  • JSON 데이터 검증 도구
  • 스키마 기반 정의
  • 예제 코드:
    from jsonschema import validate  
    
    schema = {  
        "type": "object",  
        "properties": {  
            "price": {"type": "number"},  
            "name": {"type": "string"}  
        }  
    }  
    
    validate(instance={"name": "Eggs", "price": 34.99}, schema=schema)  
    

공공 부문에서 어떤 도구를 사용할 것인가

  • 데이터프레임 또는 데이터베이스 검증:
    • 생산 시스템에서 사용 → Great Expectations 추천
    • 간단한 검증 → Pandera 추천
    • 최신 도구 시도 → Pointblank 추천
  • API나 사용자 입력 검증:
    • 비정형 데이터 → Pydantic 추천
  • 단순 JSON 검증:
    • jsonschema 추천
  • 단순 검증이 필요하면:
    • Cerberus 추천