共用方式為


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

在本教學課程中,您會以儲存為語意模型 (Power BI 資料集) 的 Power BI 分析師所執行的工作為基礎。 藉由在 Microsoft Fabric 的 Synapse 資料科學體驗中使用 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 在筆記本中安裝 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. 將表格FabricDataFrame載入 State .

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

    雖然輸出看起來像 pandas DataFrame,但這段程式碼會初始化名為 a FabricDataFrame 的資料結構,該結構會在 pandas 之上新增作業。

  3. 檢查 的資料類型 customer

    type(customer)
    

    輸出顯示 customersempy.fabric._dataframe._fabric_dataframe.FabricDataFrame是 。

  4. 聯結 和 customerstateDataFrame 物件。

    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直欄決定了 、 Postal CodeNameCity直欄。

    圖表未顯示 和 Postal Code之間的City功能相依性,可能是因為資料行之間的關係中有許多違規。 使用 SemPy 的功能 plot_dependency_violations 可視化特定列之間的依賴違規。

探索品質問題的資料

  1. 使用 SemPy 的 plot_dependency_violations 視覺效果函數繪製關係圖。

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

    顯示相依性違規的繪圖螢幕擷取畫面。

    相依關係違規的圖形在左側顯示 的值,在右側顯示 的Postal CodeCity值。 如果有包含這兩個值的資料列,則邊緣會連線左側的 Postal Code 與右側的 City。 邊緣會加上這類資料列計數的標註。 例如,有兩個資料列有郵遞區號 20004,一個是城市 "North Tower",另一個是城市 "Washington"。

    該圖還顯示了一些違規行為和許多空值。

  2. 確認 Postal Code 的空白值數目:

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

    50 行的 NA 表示 Postal Code

  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']
    

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

  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 的其他教程: