티스토리 뷰

반응형

데이터 품질이란? 

  • 일반적인 문제 
    • Raw Data를 항상 신뢰할 수는 없다.
    • 데이터 소스마다 품질 수준이 상이 하다.
    • 대부분  데이터 레이크 설계시에 수집 데이터의 통제 수준을 결정하지 않기 때문에 위 문제가 발생 가능 하다. 
  • 문제로 인해 발생 가능한 이슈 
    • 누락된 값으로 인해 프로덕션 시스템에서 널이 아닌 값을 필요로 하는 오류(NullPointerException)가 발생할 수 있습니다.
    • 데이터 분포의 변화로 인해 머신 러닝 모델에서 예기치 않은 출력이 발생할 수 있습니다. 
    • 잘못된 데이터의 집계는 잘못된 비즈니스 의사 결정으로 이어질 수 있습니다.
  • 위 문제를 해결하기 위해 데이터 처리 파이프라인의 단계 중 하나로, 필요한 품질 검사를 구현해야 한다. 
구분 내용
공통 품질 검사 항목
  1. 특정 컬럼에 대한 값의 길이는 사전 정의된 범위 내에 있어야 한다. 
  2. 숫자 값은 적절한 범위 내에 있어야 한다.
  3. 특정 컬럼에는 반드시 값이 들어 있어야 한다. 
  4. 값은 특정 패턴을 따라야 한다. (예: 이메일 포맷) 
데이터 품질 흐름에
기타 고려 사항
  1. 중요도 확인 
    1. 데이터 사용자 관점에서 모든 데이터 품질 이슈의 중요도가 동일하지는 않다. 
    2. username 컬럼이 비어 있는 경우 : 비즈니스 프로세스는 이상 없지만, 데이터 사용자에게는 필요한 정보일 수 있다. 
    3. 급여 컬럼 : 음수 값이 들어올 경우 보고서 생성에 문제가 발생 가능하다. 
    4. 즉, 각 데이터의 성격에 따라 중요도를 파악하고 정책을 정해야 한다. 
  2. 데이터 품질 이슈에 대한 경보 알림 
    1. 데이터 품질 이슈의 경우 데이터 엔지니어 팀이나 데이터 소비자에게 경보를 보낼 수 있어야 한다. 
  3. 잘못된 행 제거 또는 전체 배치 실패
    1. 품질 검사 실패시, 전체 배치를 실패로 처리하고 실패 디렉토리로 데이터를 보낼 수 있다. 
    2. 잘못된 행 제거시에는 도메인 지식을 고려하여, 제거해도 무방한지 여부를 확인해야 할 필요성이 있다. 
      1. 잘못된 처리는 더 좋지 않은 결과를 만들 수도 있다. 

Deequ 기술 조사 

  • Amazon에서 내부적으로 개발한 오픈 소스 데이터 품질 라이브러리인 Deequ 
  • Deequ는 Amazon에서 내부적으로 많은 대규모 프로덕션 데이터 세트의 품질을 검증하는 데 사용되고 있습니다. 데이터 세트 생산자는 데이터 품질 제약 조건을 추가하고 편집할 수 있습니다. 시스템은 정기적으로(데이터 세트의 새 버전이 나올 때마다) 데이터 품질 메트릭을 계산하고, 데이터 세트 생산자가 정의한 제약 조건을 검증하며, 성공할 경우 소비자에게 데이터 세트를 게시합니다. 오류가 발생하면 데이터 세트 게시를 중지하고 생산자에게 알림을 보내 조치를 취하도록 할 수 있습니다. 데이터 품질 문제가 소비자 데이터 파이프라인으로 전파되지 않으므로 그 파급 반경이 줄어듭니다. 

Deequ 세부 지원 기능

<메트릭 계산> 

  • Deequ는 데이터 품질 메트릭, 즉 완전성, 최대값 또는 상관관계와 같은 통계를 계산합니다.
  • Deequ는 Spark를 사용해 Amazon S3와 같은 소스에서 읽고, 최적화된 집계 쿼리 세트를 통해 메트릭 계산합니다.
  • 데이터에서 계산된 원시 메트릭에 직접 액세스할 수 있습니다.

{Analysers}

Metric Description Usage Example
ApproxCountDistinct Approximate number of distinct value, computed with HyperLogLogPlusPlus sketches. ApproxCountDistinct("review_id")
ApproxQuantile Approximate quantile of a distribution. ApproxQuantile("star_rating", quantile = 0.5)
ApproxQuantiles Approximate quantiles of a distribution. ApproxQuantiles("star_rating", quantiles = Seq(0.1, 0.5, 0.9))
Completeness Fraction of non-null values in a column. Completeness("review_id")
Compliance Fraction of rows that comply with the given column constraint. Compliance("top star_rating", "star_rating >= 4.0")
Correlation Pearson correlation coefficient, measures the linear correlation between two columns. The result is in the range [-1, 1], where 1 means positive linear correlation, -1 means negative linear correlation, and 0 means no correlation. Correlation("total_votes", "star_rating")
CountDistinct Number of distinct values. CountDistinct("review_id")
DataType Distribution of data types such as Boolean, Fractional, Integral, and String. The resulting histogram allows filtering by relative or absolute fractions. DataType("year")
Distinctness Fraction of distinct values of a column over the number of all values of a column. Distinct values occur at least once. Example: [a, a, b] contains two distinct values a and b, so distinctness is 2/3. Distinctness("review_id")
Entropy Entropy is a measure of the level of information contained in an event (value in a column) when considering all possible events (values in a column). It is measured in nats (natural units of information). Entropy is estimated using observed value counts as the negative sum of (value_count/total_count) * log(value_count/total_count). Example: [a, b, b, c, c] has three distinct values with counts [1, 2, 2]. Entropy is then (-1/5*log(1/5)-2/5*log(2/5)-2/5*log(2/5)) = 1.055. Entropy("star_rating")
Maximum Maximum value. Maximum("star_rating")
Mean Mean value; null values are excluded. Mean("star_rating")
Minimum Minimum value. Minimum("star_rating")
MutualInformation Mutual information describes how much information about one column (one random variable) can be inferred from another column (another random variable). If the two columns are independent, mutual information is zero. If one column is a function of the other column, mutual information is the entropy of the column. Mutual information is symmetric and nonnegative. MutualInformation(Seq("total_votes", "star_rating"))
PatternMatch Fraction of rows that comply with a given regular experssion. PatternMatch("marketplace", pattern = raw"\w{2}".r)
Size Number of rows in a DataFrame. Size()
Sum Sum of all values of a column. Sum("total_votes")
UniqueValueRatio Fraction of unique values over the number of all distinct values of a column. Unique values occur exactly once; distinct values occur at least once. Example: [a, a, b] contains one unique value b, and two distinct values a and b, so the unique value ratio is 1/2. UniqueValueRatio("star_rating")
Uniqueness Fraction of unique values over the number of all values of a column. Unique values occur exactly once. Example: [a, a, b] contains one unique value b, so uniqueness is 1/3. Uniqueness("star_rating")
from pydeequ.analyzers import *

analysisResult = AnalysisRunner(spark) \
                    .onData(df) \
                    .addAnalyzer(Size()) \
                    .addAnalyzer(Completeness("b")) \
                    .run()

analysisResult_df = AnalyzerContext.successMetricsAsDataFrame(spark, analysisResult)
analysisResult_df.show()

{Profile}

  • 객체 : ColumnProfilerRunner
    • 각 열별 분석 (열에 있는 널이 아닌 값의 비율, DataType, Type별 개수(Boolean : 0개, String : n개  etc..))
from pydeequ.profiles import *

result = ColumnProfilerRunner(spark) \
    .onData(df) \
    .run()

for col, profile in result.profiles.items():
    print(profile)

<제약 조건 검증>

  • 사용자는 검증할 데이터 품질 제약 조건 집합을 정의하는 데 집중할 수 있습니다.
  • Deequ는 데이터에서 계산해야 할 필수 메트릭 집합을 도출하는 작업을 처리합니다.
  • Deequ는 제약 조건 검증 결과가 포함된 데이터 품질 보고서를 생성합니다.

{Constraint Verification}

  • 객체 : VerificationSuite
    • 제약 조건에 부합하는지 여부를 DataFrame을 대상으로 검증하는 단계

 

제약 매개변수 시맨틱
차원 완전성
isComplete 열에 누락된 값 확인
hasCompleteness 열, udf 열에서 누락된 값의 사용자 지정 유효성 검사
차원 일관성
isUnique 열 중복 확인
hasUniqueness 열, udf 열의 고유 값 비율에 대한 사용자 지정 유효성 검사
hasDistinctness 열, udf 열의 고유 행 비율에 대한 사용자 지정 유효성 검사
isInRange 열, 값 범위 유효한 범위에 있는 값의 일부에 대한 유효성 검사
hasConsistentType 유형이 동일한 값의 가장 큰 부분에 대한 유효성 검사
isNonNegative 숫자 열의 모든 값 음수 여부 확인
isLessThan 첫 번째 열의 모든 값이 항상 두 번째 열보다 작은지의 여부 확인
satisfies 제약조건 모든 행이 제약 조건과 일치하는지 여부 유효성 검증
satisfiesIf 제약조건 첫 번째 술어와 일치하는 모든 행이 두 번째 술어와 일치하는지 여부 유효성 검증
hasPredictability 열, 열, udf 열 예측 가능성에 대한 사용자 정의 유효성 검사
통계 (차원 일관성을 확인하는 데 사용할 수 있음)
hasSize udf 레코드 수의 사용자 지정 유효성 검사
hasTypeConsistency 열, udf 동일한 데이터 유형 값의 최대 부분에 대한 사용자 지정 유효성 검사
hastCountDistinct 열에 있는 고유한 Null이 아닌 값의 수에 대한 사용자 지정 유효성 검사
hasApproxCountDistinct 열, udf 고유한 null이 아닌 값의 대략적인 수에 대한 사용자 지정 유효성 검사
hasMin 열, udf 열의 최소값에 대한 사용자 지정 유효성 검사
hasMax 열, udf 열의 최대 값에 대한 사용자 지정 유효성 검사
hasMean 열, udf 열의 평균값에 대한 사용자 지정 유효성 검사
hasStandardDeviation 열, udf 열의 표준 편차 값에 대한 사용자 지정 유효성 검사
hasApproxQuantile 열, 분위수, udf 열의 특정 분위 수에 대한 사용자 지정 유효성 검사 (근사치)
hasEntropy 열, udf 열 엔트로피의 사용자 지정 유효성 검사
hasMutualInformation 열 쌍, udf 열 쌍의 상호 정보에 대한 사용자 지정 유효성 검사
hasHistogramValues 열, udf 열 히스토그램의 사용자 지정 유효성 검사
hasCorrelation 열 쌍, udf 열 쌍의 상관 관계에 대한 사용자 지정 유효성 검사
from pydeequ.checks import *
from pydeequ.verification import *

check = Check(spark, CheckLevel.Warning, "Review Check")

checkResult = VerificationSuite(spark) \
    .onData(df) \
    .addCheck(
        check.hasSize(lambda x: x >= 3) \
        .hasMin("b", lambda x: x == 0) \
        .isComplete("c")  \
        .isUnique("a")  \
        .isContainedIn("a", ["foo", "bar", "baz"]) \
        .isNonNegative("b")) \
    .run()

checkResult_df = VerificationResult.checkResultsAsDataFrame(spark, checkResult)
checkResult_df.show()

<제약 조건 제안>

  • 사용자 지정 데이터 품질 제약 조건을 직접 정의하거나 데이터를 프로파일링하여 유용한 제약 조건을 추론하는 자동화된 제약 조건 제안 방법을 사용할 수 있습니다.

{Constraint Suggestions}

from pydeequ.suggestions import *

suggestionResult = ConstraintSuggestionRunner(spark) \
             .onData(df) \
             .addConstraintRule(DEFAULT()) \
             .run()

# Constraint Suggestions in JSON format
print(suggestionResult)
  • Deequ는 Apache Spark를 기반으로 구현되며, 일반적으로 분산 파일 시스템이나 데이터 웨어하우스에 있는 대규모 데이터 세트(수십억 개의 행)에 맞게 확장할 수 있도록 설계되었음
  • Deequ 제안 작업은 세 가지 주요 차원을 기반으로 제약 조건 생성
    • 완전성 – null 값의 존재를 측정 (예 : isComplete(“gender”)또는isComplete(“name”)
    • 일관성 – 데이터 유형 및 값 범위의 일관성 예 .isUnique(“id”)또는 isContainedIn(“gender”, Array(“female”,”male”))
    • 통계 – 데이터의 일 변량 측정 기준 (예 : .hasMax(“Salary”, “90000”)또는.hasSize(_>=10)

Glue Data Quality 기술 조사 

  • Glue에 평가판으로 제공중인 서비스(아래 리전만 제공) 
    • 미국 동부(오하이오)
    • 미국 동부(버지니아 북부)
    • 미국 서부(오레건)
    • 아시아 태평양(도쿄)
    • 유럽(아일랜드)
    • 남아메리카(상파울루)
  • 오픈 소스 Deequ 프레임워크 기반으로 구축됨 
  • 데이터 품질을 평가하고 모니터링하는 데 도움이 되는 관리형 서버리스 환경을 제공

동작 방식 

구분 내용
권장 데이터 품질 규칙 시작
  • AWS Glue 데이터 품질은 데이터에 대한 통계를 계산한 다음 데이터 품질 규칙 세트를 권장하므로 빠르게 시작할 수 있습니다. (자동으로 가이드 되는 기능)
  • 데이터 정확성, 최신성, 무결성과 같은 데이터 품질 차원을 확인합니다.
  • 권장 규칙을 조정하거나 직접 작성할 수 있습니다.
데이터 품질 작업 실행
  • 데이터 품질 작업을 실행하여 데이터 품질 문제를 분석, 식별 및 조치합니다.
  • 데이터 품질 작업에서는 데이터를 기준으로 규칙을 평가합니다.
  • ETL 작업에서 데이터 품질 규칙을 평가할 수도 있습니다.
데이터 품질 결과 모니터링 및 검토
  • AWS Glue 데이터 품질을 사용하여 데이터 품질 작업의 결과를 볼 수 있습니다. 
  • 데이터 품질 작업을 실행하면 AWS Glue 데이터 품질에서 데이터 품질 점수를 계산합니다. 이 점수를 사용하여 조치를 취하거나 데이터 세트가 사용하기에 적합한지 여부를 결정할 수 있습니다.
  • AWS Glue 또한 데이터 품질을 사용하면 Amazon CloudWatch에 데이터 품질 지표를 게시할 수 있습니다.
품질 규칙 정의 방법
  • DQDL로 정의하여 사용 : 데이터 품질 정의 언어

DQDL

Rules = [
   IsComplete "order-id",
   IsUnique "order-id"
]

고려 사항

  • 현재 평가판만 지원중 
  • AWS Glue Data Catalog용 AWS Glue 데이터 품질은 현재 Amazon S3 소스에서 작동 (현재 S3만 지원중)
  • AWS Glue Data Quality는 ETL 작업에 대해 AWS Glue 3.0에서 작동(다른 버전 지원 안됨)
  • Glue Data Quality는 Glue에서만 사용 가능함

참고 자료 

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함