共用方式為


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

在本教學課程中,您將使用功能相依性清理資料。 當語意模型中的一個資料行 (Power BI 資料集) 是另一個資料行的函數時,就存在功能相依性。 例如,郵遞區編碼資料行可以決定城市資料行中的值。 功能相依性表現為 DataFrame 中兩個或多個資料行中的值之間的一對多關聯性。 本教學課程使用 Synthea 資料集來示範功能關聯性如何協助偵測資料品質問題。

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

  • 套用領域知識,在語意模型中提出有關功能相依性的假設。
  • 熟悉有助自動執行資料品質分析的語意連結 Python 函式庫 (SemPy) 的元件。 這些元件包括:
    • FabricDataFrame - 使用其他語意資訊增強的 Pandas 類似結構。
    • 實用的函數,可自動評估有關功能相依性的假設,並在您的語意模型中找出違反關聯性的情況。

必要條件

  • 從左側瀏覽窗格中選取 [工作區],以尋找並選取您的工作區。 此工作區會成為您目前的工作區。

在筆記本中跟著做

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

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

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

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

設定筆記本

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

  1. 若是 Spark 3.4 和更新版本,使用 Fabric 時,預設執行階段可使用語意連結,而且不需要安裝。 如果使用的是 Spark 3.3 或以下版本,或者想要更新為最新版本的語意連結,可以執行命令:

python %pip install -U semantic-link  

  1. 對稍後需要的模組執行必要的匯入:

    import pandas as pd
    import sempy.fabric as fabric
    from sempy.fabric import FabricDataFrame
    from sempy.dependencies import plot_dependency_metadata
    from sempy.samples import download_synthea
    
  2. 拉取範例資料。 在本教學課程中,您會使用綜合醫療記錄的 Synthea 資料集 (簡單的較小版):

    download_synthea(which='small')
    

探索資料

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

    providers = FabricDataFrame(pd.read_csv("synthea/csv/providers.csv"))
    providers.head()
    
  2. 使用 SemPy 的 find_dependencies 函數,透過繪製自動偵測的功能相依性的圖表,檢查資料品質問題:

    deps = providers.find_dependencies()
    plot_dependency_metadata(deps)
    

    顯示功能相依性關係圖的螢幕擷取畫面。

    功能相依性關係圖顯示 Id 決定 NAMEORGANIZATION (以實心箭號表示),這符合預期,因為 Id 是唯一的:

  3. 確認 Id 是唯一的:

    providers.Id.is_unique
    

    程式碼將傳回 True,確認 Id 是唯一的。

深入分析功能相依性

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

關係圖中還有其他特殊之處。 例如,NAME 不決定 GENDERIdSPECIALITYORGANIZATION。 這些特殊之處可能都值得調查。

  1. 使用 SemPy 的 list_dependency_violations 函數表格式違規清單,檢視 ZIPCITY 之間的近似關聯性:

    providers.list_dependency_violations('ZIP', 'CITY')
    
  2. 使用 SemPy 的 plot_dependency_violations 視覺效果函數繪製關係圖。 如果違規數目很小,此關係圖會很有用:

    providers.plot_dependency_violations('ZIP', 'CITY')
    

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

    相依性衝突的繪圖會在左側顯示 ZIP 的值,以及在右側顯示 CITY 的值。 如果有資料列包含這兩個值,則會有一個邊緣將繪圖左側的郵遞區號與右側的城市連接起來。 邊緣會加上這類資料列計數的標註。 例如,有兩個資料列的郵遞區號為 02747-1242,一個資料列的城市是「NORTH DARTHMOUTH」,另一個資料列的城市是「DARTHMOUTH」,如上圖所示,並有以下程式碼:

  3. 執行下列程式碼,確認您先前觀察到的相依性違規繪圖:

    providers[providers.ZIP == '02747-1242'].CITY.value_counts()
    
  4. 此繪圖也顯示,在 CITY 為「DARTHMOUTH」的資料列中,有九個資料列的 ZIP 為 02747-1262;一個資料列的 ZIP 為 02747-1242;一個資料列的 ZIP 為 02747-2537。 使用下列程式碼確認這些觀察結果:

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

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

總結使用 SemPy 偵測到的資料品質問題

回到相依性違規圖,您可以看到此語意模型中存在數個有趣的資料品質問題:

  • 有些城市名稱全部為大寫。 使用字串方法很容易修正這個問題。
  • 有些城市名稱有限定符 (或前綴),例如「北」和「東」。 例如,郵遞區號「2128」對應至「EAST BOSTON」一次,對應至「BOSTON」一次。 「NORTH DARTHMOUTH」和「DARTHMOUTH」之間也有類似的問題。 您可以嘗試刪除這些限定詞,或是將郵遞區號對應至最常出現的城市。
  • 有些城市有拼字錯誤,例如「PITTSFIELD」被寫成「PITTSFILED」,以及「NEWBURGPORT」被寫成「NEWBURYPORT」。 對於「NEWBURGPORT」,可以使用最常見的版本來修正此拼字錯誤。 對於「PITTSFIELD」,由於每個字只出現過一次,因此在沒有外部知識或不使用語言模型的情況下,要自動消歧就變得非常困難。
  • 有時候,像「West」這樣的前置詞會簡寫成單一字母「W」。 如果所有的「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 的工作原理是挑選應變數的最常見值,並刪除具有其他值的所有資料列。 只有當您確信此統計啟發學習法會產生正確的資料結果時,才應套用此作業。 否則,您應該視需要自行撰寫程式碼,處理偵測到的違規情況。

  3. ZIPCITY 資料行執行 drop_dependency_violations 函數:

    providers_clean = providers.drop_dependency_violations('ZIP', 'CITY')
    
  4. 列出 ZIPCITY 之間的任何相依性違規:

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

    程式碼會回傳一個空白清單,表示不再有違反功能限制 CITY -> ZIP 的情況。

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