다음을 통해 공유


자습서: 함수 종속성을 통해 데이터 정리

이 자습서에서는 데이터 정리에 함수 종속성을 사용합니다. 함수 종속성은 의미 체계 모델(Power BI 데이터 세트)의 한 열이 다른 열의 함수일 때 존재합니다. 예를 들어 우편 번호 열이 도시 열의 값을 결정할 수 있습니다. 함수 종속성은 DataFrame 내의 두 개 이상의 열에 있는 값 간의 일대다 관계로 나타납니다. 이 자습서에서는 Synthea 데이터 세트를 사용하여 기능적 관계가 데이터 품질 문제를 감지하는 데 어떻게 도움이 되는지 보여 줍니다.

이 자습서에서는 다음을 하는 방법을 알아볼 수 있습니다.

  • 도메인 지식을 적용하여 의미 체계 모델의 함수 종속성에 대한 가설을 공식화합니다.
  • 데이터 품질 분석을 자동화하는 데 도움이 되는 의미 체계 링크의 Python 라이브러리(SemPy) 구성 요소를 알아봅니다. 이러한 구성 요소는 다음과 같습니다.
    • FabricDataFrame - 추가적인 의미 체계 정보를 통해 향상된 Pandas와 유사한 구조입니다.
    • 함수 종속성에 대한 가설의 평가를 자동화하고 의미 체계 모델에서 관계 위반을 식별하는 유용한 함수입니다.

필수 조건

  • Microsoft Fabric 구독을 구매합니다. 또는 무료 Microsoft Fabric 평가판에 등록합니다.

  • Microsoft Fabric에 로그인합니다.

  • 홈페이지 왼쪽의 환경 전환기를 사용하여 Synapse 데이터 과학 환경으로 전환합니다.

    데이터 과학을 선택할 위치를 보여 주는 환경 전환기 메뉴의 스크린샷.

  • 왼쪽 탐색 창에서 작업 영역을 선택하여 내 작업 영역을 찾아 선택합니다. 이 작업 영역은 현재 작업 영역이 됩니다.

Notebook에서 따라 하기

이 자습서에는 data_cleaning_functional_dependencies_tutorial.ipynb Notebook이 함께 제공됩니다.

이 자습서에 함께 제공되는 Notebook을 열려면 데이터 과학 자습서를 위한 시스템 준비의 지침에 따라 Notebook을 작업 영역으로 가져옵니다.

이 페이지에서 코드를 복사하여 붙여 넣으면 새 Notebook을 만들 수 있습니다.

코드 실행을 시작하기 전에 Notebook에 레이크하우스를 연결해야 합니다.

Notebook 설정

이 섹션에서는 필요한 모듈 및 데이터를 통해 Notebook 환경을 설정합니다.

  1. Spark 3.4 이상 버전의 경우 Fabric을 사용할 때 기본 런타임에서 의미 체계 링크를 사용할 수 있으므로 설치할 필요가 없습니다. Spark 3.3 이하 버전을 사용 중이거나 최신 버전의 의미 체계 링크로 업데이트하려는 경우 다음 명령을 실행할 수 있습니다.

python %pip install -U semantic-link  

  1. 나중에 필요한 모듈을 가져옵니다.

    import pandas as pd
    import sempy.fabric as fabric
    from sempy.fabric import FabricDataFrame
    from sempy.dependencies import plot_dependency_metadata
    from sempy.samples import download_synthea
    
  2. 샘플 데이터를 가져옵니다. 이 자습서에서는 합성 의료 기록의 Synthea 데이터 세트(간소하게 사용하기 위한 소규모 버전)를 사용합니다.

    download_synthea(which='small')
    

데이터 탐색

  1. providers.csv 파일의 콘텐츠를 통해 FabricDataFrame을 초기화합니다.

    providers = FabricDataFrame(pd.read_csv("synthea/csv/providers.csv"))
    providers.head()
    
  2. 자동 감지된 함수 종속성의 그래프를 그려 SemPy find_dependencies 함수의 데이터 품질 문제를 확인합니다.

    deps = providers.find_dependencies()
    plot_dependency_metadata(deps)
    

    함수 종속성 그래프를 보여주는 스크린샷.

    함수 종속성의 그래프는 IdNAMEORGANIZATION(단색 화살표로 표시됨)을 결정한다는 것을 보여줍니다. Id가 고유하므로 이는 예상되는 결과입니다.

  3. Id가 고유한지 확인합니다.

    providers.Id.is_unique
    

    코드가 True를 반환하여 Id가 고유한지 확인합니다.

함수 종속성 심층 분석

함수 종속성 그래프는 또한 예상대로 ORGANIZATIONADDRESSZIP를 결정한다는 것을 보여줍니다. 그러나 ZIPCITY도 결정할 것으로 예상할 수 있지만 점선 화살표는 종속성이 대략적인 수준에 불과하다는 것을 나타내며 데이터 품질 문제를 나타냅니다.

그래프에는 다른 특성이 있습니다. 예를 들어 NAMEGENDER, Id, SPECIALITY 또는 ORGANIZATION을 결정하지 않습니다. 이러한 각 특성은 조사할 가치가 있을 수 있습니다.

  1. SemPy의 list_dependency_violations 함수를 사용하여 테이블 형식의 위반 목록을 확인하여 ZIPCITY의 대략적인 관계를 자세히 살펴볼 수 있습니다.

    providers.list_dependency_violations('ZIP', 'CITY')
    
  2. SemPy의 plot_dependency_violations 시각화 함수를 사용하여 그래프를 그릴 수 있습니다. 이 그래프는 위반 횟수가 적은 경우에 유용합니다.

    providers.plot_dependency_violations('ZIP', 'CITY')
    

    종속성 위반 플롯을 보여 주는 스크린샷.

    종속성 위반 플롯의 왼쪽에는 ZIP에 대한 값이, 오른쪽에는 CITY에 대한 값이 표시됩니다. 이 두 값을 포함하는 행이 있는 경우 가장자리는 플롯의 왼쪽에 있는 우편 번호를 오른쪽에 있는 도시와 연결합니다. 가장자리에는 해당 행의 수로 주석이 추가됩니다. 예를 들어 이전 플롯과 다음 코드에 표시된 것처럼 우편 번호가 02747-1242인 행이 두 개 있고, 한 행은 도시가 ‘NORTH DARTHMOUTH’이고, 다른 행은 도시가 ‘DARTHMOUTH’입니다.

  3. 다음 코드를 실행하여 종속성 위반의 플롯으로 수행한 이전 관찰을 확인합니다.

    providers[providers.ZIP == '02747-1242'].CITY.value_counts()
    
  4. 플롯은 또한 CITY가 ‘DARTHMOUTH’인 행 중 9개 행의 ZIP가 02747-1262이고, 1개 행의ZIP가 02747-1242이고, 1개 행의 ZIP가02747-2537임을 보여줍니다. 다음 코드를 사용하여 이러한 관찰을 확인합니다.

    providers[providers.CITY == 'DARTMOUTH'].ZIP.value_counts()
    
  5. ‘DARTHMOUTH’와 연결된 다른 우편 번호가 있지만 이러한 우편 번호는 데이터 품질 문제를 암시하지 않으므로 종속성 위반 그래프에 표시되지 않습니다. 예를 들어 우편 번호 ‘02747-4302’는 ‘DARTHMOUTH’에 고유하게 연결되어 있으며 종속성 위반 그래프에 표시되지 않습니다. 다음 코드을 실행하여 확인합니다.

    providers[providers.ZIP == '02747-4302'].CITY.value_counts()
    

SemPy에서 감지된 데이터 품질 문제 요약

종속성 위반 그래프로 돌아가면 이 의미 체계 모델에 몇 가지 흥미로운 데이터 품질 문제가 있음을 알 수 있습니다.

  • 일부 도시 이름이 모두 대문자입니다. 이 문제는 문자열 메서드를 사용하여 쉽게 해결할 수 있습니다.
  • 일부 도시 이름에는 ‘North’ 및 ‘East’와 같은 한정자(또는 접두사)가 있습니다. 예를 들어 우편 번호 ‘2128’은 ‘EAST BOSTON’에 한 번, ‘BOSTON’에 한 번 매핑됩니다. ‘NORTH DARTHMOUTH’와 ‘DARTHMOUTH’ 사이에도 비슷한 문제가 발생합니다. 이러한 한정자를 삭제하거나 가장 자주 발생하는 도시에 우편 번호를 매핑할 수 있습니다.
  • 일부 도시에는 ‘PITTSFIELD’ vs. ‘PITTSFILED’ 및 ‘NEWBURGPORT’ vs. ‘NEWBURYPORT’와 같은 오타가 있습니다. ‘NEWBURGPORT’의 경우 가장 일반적인 항목을 사용하여 이 오타를 수정할 수 있습니다. ‘PITTSFIELD’의 경우 각 항목이 한 번만 발생하면 외부 지식이나 언어 모델을 사용하지 않고는 자동으로 명확하게 구분하기가 훨씬 더 어려워집니다.
  • 경우에 따라 ‘West’와 같은 접두사는 한 글자 ‘W’로 축약됩니다. ‘W’가 모두 ‘West’를 나타내는 경우 이 문제는 간단한 바꾸기로 해결될 수 있습니다.
  • 우편 번호 ‘02130’은 ‘BOSTON’에 한 번, ‘Jamaica Plain’에 한 번 매핑됩니다. 이 문제는 해결하기 쉽지 않지만, 더 많은 데이터가 있는 경우 가장 일반적인 항목에 매핑하는 것이 잠재적인 해결 방법이 될 수 있습니다.

데이터 정리

  1. 모든 대문자를 대문자 표기로 변경하여 대문자 문제를 해결합니다.

    providers['CITY'] = providers.CITY.str.title()
    
  2. 위반 감지를 다시 실행하여 일부 모호성이 사라졌는지 확인합니다(위반 횟수는 더 적음).

    providers.list_dependency_violations('ZIP', 'CITY')
    

    이 시점에서 데이터를 더 수동으로 세분화할 수 있지만 잠재적인 데이터 정리 작업 중 하나는 SemPy의 drop_dependency_violations 함수를 사용하여 데이터의 열 간에 기능 제약 조건을 위반하는 행을 삭제하는 것입니다.

    결정 변수의 각 값에 대해 drop_dependency_violations은 종속 변수의 가장 일반적인 값을 선택하고 다른 값이 있는 모든 행을 삭제하는 방식으로 작동합니다. 이 통계적 경험적 접근이 데이터에 대한 올바른 결과를 가져올 것이라고 확신하는 경우에만 이 작업을 적용해야 합니다. 그렇지 않으면 필요에 따라 감지된 위반을 처리하기 위한 자체 코드를 작성해야 합니다.

  3. drop_dependency_violationsCITY 열에서 ZIP 함수를 실행합니다.

    providers_clean = providers.drop_dependency_violations('ZIP', 'CITY')
    
  4. ZIPCITY 사이의 종속성 위반을 나열합니다.

    providers_clean.list_dependency_violations('ZIP', 'CITY')
    

    코드는 빈 목록을 반환하여 더 이상 기능 제약 조건인도시 -> 우편 번호를 위반하지 않음을 나타냅니다.

의미 체계 링크/SemPy에 대한 다른 자습서를 확인해 볼 수 있습니다.