다음을 통해 공유


자습서: 의미 체계 모델에서 함수 종속성 분석

이 자습서에서는 Power BI 분석가가 수행한 이전 작업을 기반으로 하며 의미 체계 모델(Power BI 데이터 세트) 형식으로 저장됩니다. Microsoft Fabric 내의 Synapse 데이터 과학 환경에서 SemPy(프리뷰)를 사용하여 DataFrame 열에 존재하는 함수 종속성을 분석할 수 있습니다. 이 분석은 보다 정확한 인사이트를 얻기 위해 중요하지 않은 데이터 품질 문제를 발견하는 데 도움이 됩니다.

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

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

필수 조건

Notebook에서 따라 하기

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

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

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

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

Notebook 설정

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

  1. Notebook 내의 %pip 인라인 설치 기능을 사용하여 PyPI에서 SemPy를 설치합니다.

    %pip install semantic-link
    
  2. 나중에 필요한 모듈을 가져옵니다.

    import sempy.fabric as fabric
    from sempy.dependencies import plot_dependency_metadata
    

데이터 로드 및 전처리

이 자습서에서는 표준 샘플 의미 체계 모델인 Customer Profitability Sample.pbix를 사용합니다. 의미 체계 모델에 대한 설명은 Power BI에 대한 고객 수익성 샘플을 참조하세요.

  1. SemPy의 read_table 함수를 사용하여 Power BI 데이터를 FabricDataFrames에 로드합니다.

    dataset = "Customer Profitability Sample"
    customer = fabric.read_table(dataset, "Customer")
    customer.head()
    
  2. FabricDataFrame에 State 테이블을 로드합니다.

    state = fabric.read_table(dataset, "State")
    state.head()
    

    이 코드의 출력은 Pandas DataFrame처럼 보이지만, 실제로는 Pandas를 기반으로 몇 가지 유용한 작업을 지원하는 FabricDataFrame이라는 데이터 구조를 초기화했습니다.

  3. customer의 데이터 형식 확인:

    type(customer)
    

    출력이 형식 sempy.fabric._dataframe._fabric_dataframe.FabricDataFramecustomer임을 확인합니다.

  4. customerstate DataFrames 조인:

    customer_state_df = customer.merge(state, left_on="State", right_on="StateCode",  how='left')
    customer_state_df.head()
    

함수 종속성 식별

함수 종속성은 DataFrame 내의 두 개(이상)의 열에 있는 값 간의 일대다 관계로 나타납니다. 이러한 관계를 사용하면 데이터 품질 문제를 자동으로 검색할 수 있습니다.

  1. 병합된 DataFrame에서 SemPy의 find_dependencies 함수를 실행하여 열의 값 간에 기존 함수 종속성을 식별합니다.

    dependencies = customer_state_df.find_dependencies()
    dependencies
    
  2. SemPy의 plot_dependency_metadata 함수를 사용하여 식별된 종속성을 시각화합니다.

    plot_dependency_metadata(dependencies)
    

    종속성 메타데이터의 플롯을 보여 주는 스크린샷.

    예상대로, 함수 종속성 그래프는 Customer 열이 City, Postal Code, Name과 같은 몇몇 열을 결정한다는 것을 보여줍니다.

    놀랍게도 그래프에서 CityPostal Code 사이에는 함수적 종속성이 나타나지 않는데, 아마도 열 간의 관계에 위반이 많기 때문일 겁니다. SemPy의 plot_dependency_violations 함수를 사용하면 특정 열 간의 종속성 위반을 시각화할 수 있습니다.

품질 문제에 대한 데이터 탐색

  1. SemPy의 plot_dependency_violations 시각화 함수를 사용하여 그래프를 그릴 수 있습니다.

    customer_state_df.plot_dependency_violations('Postal Code', 'City')
    

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

    종속성 위반 플롯의 왼쪽에는 Postal Code에 대한 값이, 오른쪽에는 City에 대한 값이 표시됩니다. 이 두 값이 포함된 행이 있는 경우 가장자리는 왼쪽의 Postal Code와 오른쪽의 City를 연결합니다. 가장자리에는 해당 행의 수로 주석이 추가됩니다. 예를 들어 우편 번호가 20004인 두 개의 행이 있는데, 한 행에는 도시가 ‘North Tower’이고 다른 행에는 도시가 ‘Washington’입니다.

    또한 플롯에 몇 가지 위반과 많은 빈 값이 표시됩니다.

  2. Postal Code에 대한 빈 값 수를 확인합니다.

    customer_state_df['Postal Code'].isna().sum()
    

    50개 행에는 우편 번호에 대한 NA가 있습니다.

  3. 빈 값이 있는 행을 삭제합니다. 그런 다음 find_dependencies 함수를 사용하여 종속성을 찾습니다. SemPy의 내부 작업을 엿볼 수 있는 추가 매개 변수 verbose=1을 확인하세요.

    customer_state_df2=customer_state_df.dropna()
    customer_state_df2.find_dependencies(verbose=1)
    

    Postal CodeCity의 조건부 엔트로피는 0.049입니다. 이 값은 함수 종속성 위반이 있음을 나타냅니다. 위반을 수정하기 전에 조건부 엔트로피에 대한 임계값을 기본값인 0.01에서 0.05로 올려 종속성을 확인할 수 있습니다. 임계값이 낮을수록 종속성이 줄어들거나 선택성이 높아집니다.

  4. 조건부 엔트로피의 임계값을 기본값 0.01에서 0.05로 올립니다.

    plot_dependency_metadata(customer_state_df2.find_dependencies(threshold=0.05))
    

    엔트로피에 대한 임계값이 더 높은 종속성 메타데이터의 플롯입니다.

    어떤 엔터티가 다른 엔터티의 값을 결정하는지에 대한 도메인 지식을 적용하면 이 종속성 그래프는 정확한 것처럼 보입니다.

  5. 감지된 많은 데이터 품질 문제를 자세히 살펴봅니다. 예를 들어 대시 화살표가 CityRegion을 연결하는데, 이는 종속성이 대략적인 수준에 불과하다는 것을 나타냅니다. 이 대략적인 관계는 부분적인 함수 종속성이 있음을 암시할 수 있습니다.

    customer_state_df.list_dependency_violations('City', 'Region')
    
  6. Region 값이 비어 있지 않은 경우 위반이 발생하는 각 사례를 자세히 살펴봅니다.

    customer_state_df[customer_state_df.City=='Downers Grove']
    

    결과는 도시 Downers Grove가 Illinois 주와 Nebraska 주에 걸쳐 존재함을 보여줍니다. 그러나 Downer's Grove는 Nebraska 주가 아니라 Illinois 주에 있는 도시입니다.

  7. 도시 Fremont를 살펴봅니다.

    customer_state_df[customer_state_df.City=='Fremont']
    

    California에는 Fremont라는 도시가 있습니다. 그러나 Texas의 경우 검색 엔진이 Fremont가 아니라 Premont를 반환합니다.

  8. 또한 종속성 위반의 원래 그래프(빈 값이 있는 행을 삭제하기 전)에서 점선으로 표시된 대로 NameCountry/Region 사이의 종속성 위반이 보이는 것도 의심스럽습니다.

    customer_state_df.list_dependency_violations('Name', 'Country/Region')
    

    SDI 디자인이라는 한 고객이 United States와 Canada라는 두 지역에 있는 것으로 보입니다. 이 현상은 의미 체계 위반이 아닐 수 있지만 흔하지 않은 경우일 수 있습니다. 그럼에도 불구하고 자세히 살펴볼 가치가 있습니다.

  9. 고객 SDI 디자인을 자세히 살펴봅니다.

    customer_state_df[customer_state_df.Name=='SDI Design']
    

    추가 조사 결과, 실제로 동일한 이름을 가진 서로 다른 두 고객(다른 산업의 고객)이었습니다.

탐색적 데이터 분석은 흥미로운 프로세스이며 데이터 정리도 마찬가지입니다. 데이터를 어떻게 보는지, 무엇을 묻고 싶은지 등에 따라 데이터에 숨겨진 것이 항상 있기 마련입니다. 의미 체계 링크는 데이터를 활용해 더 많은 성과를 달성할 수 있는 새로운 도구를 제공합니다.

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