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

在本教學課程中,您會以儲存為語意模型 (Power BI 資料集) 的 Power BI 分析師所執行的工作為基礎。 透過在 Fabric Data Science 工作負載中使用 SemPy(預覽),你可以分析 DataFrame 欄位中的功能相依關係。 此分析可協助您發現細微的資料品質問題,以獲得更準確的見解。

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

  • 套用領域知識,在語意模型中提出有關功能相依性的假設。
  • 熟悉 Semantic Link 的 Python 程式庫 (SemPy) 元件,這些元件可與 Power BI 整合,並協助自動化資料品質分析。 這些元件包括:
    • FabricDataFrame — 類似 pandas 的結構,透過額外的語意資訊增強
    • 將 Fabric 工作區中的語意模型擷取到您的筆記本中的函式
    • 評估功能相依性假設並識別語意模型中關係違規的函數

必要條件

  1. 從導覽窗格中選取 [工作區] ,以尋找並選取您的工作區。 此工作區會成為您目前的工作區。

  2. 從 fabric-samples GitHub 存放庫下載 Customer Profitability Sample.pbix 檔案。

  3. 在工作區中,選取 [從這部計算機匯入>報表或編頁報表>], 將 Customer Profitability Sample.pbix 檔案上傳至工作區。

在筆記本中跟著做

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

設定筆記型電腦

設定包含您所需模組和資料的筆記本環境。

  1. 使用 %pip 在 Notebook 中從 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. 使用 fabric.read_table 函數將 Power BI 資料載入至FabricDataFrame。

    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,但這段程式碼會初始化名為 a FabricDataFrame 的資料結構,該結構會在 pandas 之上新增作業。

  3. 檢查 customer 的資料類型。

    type(customer)
    

    輸出結果顯示 customer 是 sempy.fabric._dataframe._fabric_dataframe.FabricDataFrame。

  4. 連接 customer 和 stateDataFrame 物件。

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

識別功能相依性

功能相依性是指在 DataFrame 中,兩個或多個資料行中的值之間的一對多關係。 使用這些關係來自動偵測資料品質問題。

  1. 在合併find_dependencies上執行 Sempy 的DataFrame函數,以識別列值之間的功能依賴關係。

    dependencies = customer_state_df.find_dependencies()
    dependencies
    
  2. 使用 Sempy 的 plot_dependency_metadata 函數可視化依賴關係。

    plot_dependency_metadata(dependencies)
    

    相依性中繼資料圖的螢幕擷取畫面。

    函數相依圖顯示,Customer 資料行決定了像 City、Postal Code 和 Name 這類資料行。

    圖形未顯示 City 與 Postal 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 列的 Postal Code 為 NA。

  3. 卸除具有空白值的資料列。 然後,使用 find_dependencies 函數尋找相依性。 請注意額外參數 verbose=1,以簡要了解 SemPy 的內部運作:

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

    Postal Code 和 City 的條件熵為 0.049。 此值表示有功能相依性衝突。 修正衝突之前,請將條件熵的閾值從 0.01 的預設值提高為 0.05,以查看相依性。 較低的閾值會產生較少的相依性 (或更高的選取性)。

  4. 將條件熵的閾值從預設值 0.01 提高為 0.05:

    plot_dependency_metadata(customer_state_df2.find_dependencies(threshold=0.05))
    

    具有較高熵閾值的相依性中繼資料圖的螢幕擷取畫面。

    如果您套用網域知識,瞭解哪個實體決定其他實體的值,則此相依性圖表似乎很準確。

  5. 探索偵測到的更多資料品質問題。 例如,虛線箭頭聯結 City 和 Region,表示相依性只是近似值。 此近似關聯性可能表示存在部分功能相依性。

    customer_state_df.list_dependency_violations('City', 'Region')
    
  6. 仔細看看每一種非空 Region 值導致違規的情況:

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

    結果顯示了伊利諾伊州和內布拉斯加州的唐納斯格羅夫市。 然而,唐納斯格羅夫是 伊利諾伊州的一座城市,而不是內布拉斯加州。

  7. 看看 Fremont 市:

    customer_state_df[customer_state_df.City=='Fremont']
    

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

  8. 看到 Name 和 Country/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 的其他教程: