共用方式為


教學課程:分析語意模型中的功能相依性

在本教學課程中,您會在 Power BI 分析員先前完成之工作的基礎上進行組建,並以語意模型的形式儲存 (Power BI 資料集)。 藉由在 Microsoft Fabric 內的 Synapse 資料科學體驗中使用 SemPy (預覽),您可以分析 DataFrame 資料行中存在的功能相依性。 此分析有助於探索重要的資料品質問題,以取得更精確的深入解析。

在本教學課程中,您會了解如何:

  • 套用領域知識,在語意模型中提出有關功能相依性的假設。
  • 熟悉語意連結之 Python 庫 (SemPy) 的元件,其可支援與 Power BI 整合,並協助自動化資料品質分析。 這些元件包括:
    • FabricDataFrame - 使用其他語意資訊增強的 Pandas 類似結構。
    • 將語意模型從 Fabric 工作區提取至筆記本的實用函數。
    • 實用的函數,可自動評估有關功能相依性的假設,並在您的語意模型中找出違反關聯性的情況。

必要條件

在筆記本中跟著做

本教學課程隨附 powerbi_dependencies_tutorial.ipynb 筆記本。

若要開啟本教學課程隨附的筆記本,請遵循為資料科學教學課程準備系統中的指示,將筆記本匯入您的工作區。

如果您想要複製並貼上此頁面中的程式碼,則可以建立新的筆記本

開始執行程式碼之前,請務必將 Lakehouse 連結至筆記本

設定筆記本

在本章節中,您會使用必要的模組和資料來設定筆記本環境。

  1. 使用筆記本內的 %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. State 資料表載入 FabricDataFrame:

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

    雖然此程式碼的輸出看起來像 Pandas DataFrame,但您實際上已初始化稱為 FabricDataFrame 的資料結構,其支援 Pandas 之上的一些實用作業。

  3. 查看 customer 的資料類型:

    type(customer)
    

    輸出會確認 customer 為類型 sempy.fabric._dataframe._fabric_dataframe.FabricDataFrame。'

  4. 聯結 customerstate DataFrame:

    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 資料行會決定某些資料行,例如 CityPostal CodeName

    令人驚訝的是,關係圖不會顯示 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 函數尋找相依性。 請注意額外參數 verbose=1,以簡要了解 SemPy 的內部運作:

    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 出現在伊利諾伊州和內布拉斯加州。 然而,Downers Grove 是伊利諾伊州的一個城市,而不是內布拉斯加州。

  7. 看看 Fremont 市:

    customer_state_df[customer_state_df.City=='Fremont']
    

    加州有一個叫 Fremont 的城市。 然而,對於德克薩斯州來說,搜尋引擎會傳回 Premont,而不是 Fremont。

  8. 查看 NameCountry/Region 之間的相依性衝突也是值得懷疑的,正如原始相依性衝突關係圖中的虛線所表示 (在卸除具有空白值的資料列之前)。

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

    似乎有一位客戶 SDI Design 存在於兩個區域 - 美國和加拿大。 此事件可能不是語意衝突,但可能只是一種不常見的情況。 但仍值得仔細看看:

  9. 進一步了解客戶 SDI Design

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

    進一步檢查顯示,這實際上是兩位不同的客戶 (來自不同行業) 有相同的名稱。

探勘資料分析是一項令人興奮的程序,資料清理也是如此。 資料總會隱藏一些東西,取決於您查看資料的方式、您想要詢問的內容等等。 語意連結為您提供可用來取得更多資料的新工具。

查看語意連結/SemPy 的其他教學課程: