共用方式為


教學課程:使用功能相依性清除資料

使用功能相依性來清理資料。 當語意模型 (Power BI 資料集) 中的一個資料行相依於另一個資料行時,就會存在功能相依性。 例如,直 ZIP code 欄可以決定直欄中的 city 值。 功能相依關係會顯示為 中兩個或多個資料行 DataFrame中值之間的一對多關係。 本教學課程使用 Synthea 資料集來示範功能相依性如何協助偵測資料品質問題。

在本教學課程中,您將瞭解如何:

  • 應用領域知識在語義模型中形成有關功能依賴關係的假設。
  • 熟悉語意連結 Python 程式庫 (SemPy) 的元件,以自動化資料品質分析。 這些元件包括:
    • FabricDataFrame——一種類似熊貓的結構,具有額外的語義信息。
    • 自動評估有關功能相依性的假設並識別語意模型中的違規的函數。

先決條件

  • 在導覽窗格中選取 [工作區] ,然後選取您的工作區以將其設定為目前的工作區。

在筆記本中跟隨

使用 data_cleaning_functional_dependencies_tutorial.ipynb 筆記本來遵循本教學課程。

設定筆記本

在本節中,您會設定筆記本環境。

  1. 檢查您的 Spark 版本。 如果您在 Microsoft Fabric 中使用 Spark 3.4 或更新版本,預設會包含語意連結,因此您不需要安裝它。 如果您使用 Spark 3.3 或更早版本,或想要更新至最新的語意連結,請執行下列命令。

    %pip install -U semantic-link
    
  2. 匯入您在此筆記本中使用的模組。

    import pandas as pd
    import sempy.fabric as fabric
    from sempy.fabric import FabricDataFrame
    from sempy.dependencies import plot_dependency_metadata
    
  3. 下載範例資料。 在本教學課程中,使用合成醫療記錄的 Synthea 資料集 (為了簡單起見,小版本)。

    download_synthea(which='small')
    

探索數據

  1. 使用 providers.csv 檔案的內容初始化 aFabricDataFrame

    providers = FabricDataFrame(pd.read_csv("synthea/csv/providers.csv"))
    providers.head()
    
  2. 通過繪製自動檢測到的功能依賴關係的圖表來檢查 Sempy 函數 find_dependencies 的數據質量問題。

    deps = providers.find_dependencies()
    plot_dependency_metadata(deps)
    

    顯示 Id 的功能相依性圖表的螢幕擷取畫面會決定 NAME 和 ORGANIZATION。

    該圖顯示決定 IdNAMEORGANIZATION。 這個結果是預期的,因為 Id 是唯一的。

  3. 確認這是 Id 唯一的。

    providers.Id.is_unique
    

    程式代碼會傳回 True,以確認 Id 是唯一的。

深入分析功能相依性

功能相依性圖表也會顯示 ORGANIZATION 會如預期決定 ADDRESSZIP。 不過,您可能預期 ZIP 也會判斷 CITY,但虛線箭號表示相依性只是近似值,指向數據質量問題。

圖表中有其他特殊之處。 例如,NAME 不會判斷 GENDERIdSPECIALITYORGANIZATION。 這些特點可能值得調查。

  1. 透過使用 SemPy 的list_dependency_violations函數列出違規行為,更深入地了解 和 CITY 之間的ZIP近似關係:
providers.list_dependency_violations('ZIP', 'CITY')
  1. 使用 SemPy 的 plot_dependency_violations 視覺效果函式繪製圖表。 如果違規數目很小,此圖表會很有説明:
providers.plot_dependency_violations('ZIP', 'CITY')

依賴違規情節截圖。

相依關係違規的圖形在左側顯示 的值,在右側顯示 的 ZIPCITY 。 如果有包含這兩個值的數據列,邊緣會將繪圖左側的郵遞區編碼與右側的城市連接起來。 邊緣會以此類列的計數進行註釋。 例如,有兩個資料列的郵遞區號為02747-1242,一個資料列所屬城市為 "NORTH DARTHMOUTH",另一個資料列的城市為 "DARTHMOUTH",如前面的圖示及以下的程式碼所顯示。

  1. 通過運行以下代碼來確認圖中的觀察結果:
providers[providers.ZIP == '02747-1242'].CITY.value_counts()
  1. 該圖還顯示,在具有“DARTHMOUTH”的行 CITY 中,有九行的 a ZIP 為 02747-1262。 一行的 a ZIP 是 02747-1242。 一行的 a ZIP 是 02747-2537。 使用以下程式碼確認這些觀察結果:

    providers[providers.CITY == 'DARTHMOUTH'].ZIP.value_counts()
    
  2. 還有其他與「DARTMOUTH」相關的郵遞區號,但這些郵遞區號不會顯示在依賴違規圖表中,因為它們不會暗示資料品質問題。 例如,郵遞區號「02747-4302」與「DARTMOUTH」唯一相關聯,不會顯示在相依性違規圖表中。 執行下列程式代碼來確認:

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

摘要說明使用 SemPy 偵測到的數據質量問題

相依性違規圖表顯示此語意模型中的數個資料品質問題:

  • 有些城市名稱是大寫的。 使用字串方法來修正此問題。
  • 某些城市名稱有限定符(或前置詞),例如 “North” 和 “East”。 例如,郵遞區號 “2128” 對應到 “EAST BOSTON” 一次,對應到 “BOSTON” 一次。 「北達特茅斯」和「達特茅斯」之間也出現了類似的問題。 刪除這些限定詞或將郵遞區號映射到最常見的城市。
  • 一些城市名稱存在拼字錯誤,例如“PITTSFIELD”與“PITTSFILED”以及“NEWBURGPORT”與“NEWBURYPORT”。對於“NEWBURGPORT”,使用最常見的情況來修復此拼寫錯誤。 對於“PITTSFIELD”,每個只有一次出現,如果沒有外部知識或語言模型,自動消歧義要困難得多。
  • 有時,像“West”這樣的前綴縮寫為單個字母“W”。如果所有出現的“W”都代表“West”,請將“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 挑選應變數的最常見值,並捨棄具有其他值的所有列。 只有在您確信此統計啟發式方法會導致資料的正確結果時,才套用此作業。 否則,請撰寫您自己的程式碼來處理偵測到的違規行為。

  1. 在 和 CITY 資料行上ZIP執行drop_dependency_violations函式。

    providers_clean = providers.drop_dependency_violations('ZIP', 'CITY')
    
  2. 列出 和 CITY之間的ZIP任何相依性違規。

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

程式碼會傳回一個空清單,以指出不再有違反功能約束 ZIP -> CITY的行為。

請參閱語義連結或 Sempy 的其他教學課程: