共用方式為


教學課程:使用功能相依性清除數據

在本教學課程中,您會使用功能相依性來清除數據。 當語意模型中的一個數據行是另一個數據行的函式時,就會有功能相依性。 例如,郵遞區編碼數據行可能會決定城市數據行中的值。 功能相依性會將本身顯示為 DataFrame 內兩個或多個數據行中值之間的一對多關聯性。 本教學課程使用 Synthea 數據集來示範功能關聯性如何協助偵測數據質量問題。

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

  • 套用領域知識,以制定語意模型中功能相依性的假設。
  • 熟悉語意連結的 Python 連結庫 (SemPy) 元件,以協助自動化數據品質分析。 這些元件包括:
    • FabricDataFrame - 使用其他語意信息增強的 pandas 類似結構。
    • 實用的函式,可自動評估有關功能相依性的假設,以及識別語意模型中關聯性的違規。

必要條件

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

在筆記本中跟著

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

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

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

開始執行程序代碼之前,請務必將 Lakehouse 附加至筆記本

設定筆記本

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

  1. 針對 Spark 3.4 和更新版本,使用 Fabric 時,預設運行時間提供語意連結,而且不需要加以安裝。 如果您使用 Spark 3.3 或更新版本,或想要更新為最新版本的 Semantic Link,您可以執行 命令:

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. FabricDataFrame使用providers.csv檔案的內容初始化 :

    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式檢視與CITY之間的ZIP近似關聯性,以查看違規表格式清單:

    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. 此繪圖也顯示,在具有 「DARTHMOUTH」 的數據列中,有 9 個數據列的 CITY 值為 ZIP 02747-1262;一個數據列的值為 02747-1242,而一個數據列 ZIPZIP 值為 02747-2537。 使用下列程式代碼確認這些觀察:

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

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

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

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

  • 某些城市名稱全都大寫。 此問題很容易使用字串方法來修正。
  • 某些城市名稱有限定符(或前置詞),例如 “North” 和 “East”。 例如,郵遞區編碼 「2128」 對應至 「EAST BOSTON」 一次,並對應至 「BOSTON」 一次。 “NORTH DARTHMOUTH” 和 “DARTHMOUTH” 之間發生類似的問題。 您可以嘗試卸除這些限定符,或將郵遞區編碼對應到最常見的城市。
  • 某些城市有錯字,例如 「PITTSFIELD」 與 「PITTSFILED」 和 「NEWBURGPORT 與 NEWBURYPORT」。 對於 「NEWBURGPORT」,可以使用最常見的發生次數來修正此錯字。 針對 「PITTSFIELD」,每個專案只有一個,因此不需要外部知識或使用語言模型,自動消除混淆會更加困難。
  • 有時候,如 “West” 的前置詞會縮寫為單一字母 “W”。 如果所有出現的 「W」 代表 「West」 則此問題可能會以簡單的取代來修正。
  • 郵遞區編碼 “02130” 對應到 “BOSTON” 一次, “牙買加平原” 一次。 此問題並不容易修正,但如果有更多數據,則對應至最常見的問題可能是潛在的解決方案。

清理資料

  1. 將所有大寫變更為標題大小寫來修正大寫問題:

    providers['CITY'] = providers.CITY.str.title()
    
  2. 再次執行違規偵測,以查看某些模棱兩可已消失(違規次數較小):

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

    此時,您可以更手動地精簡數據,但其中一個潛在的數據清除工作是使用 SemPy 的 drop_dependency_violations 函式,卸除數據中的數據行之間違反功能限制的數據列。

    對於行列式變數的每個值, drop_dependency_violations 可藉由挑選相依變數的最常見值,並卸載具有其他值的所有數據列,來運作。 只有當您確信此統計啟發學習法會導致數據的正確結果時,才應該套用此作業。 否則,您應該撰寫自己的程式代碼,視需要處理偵測到的違規。

  3. 在與 CITY 資料列上ZIP執行 函drop_dependency_violations式:

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

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

    程式代碼會傳回空白清單,指出沒有更多違反功能條件約束 CITY -> ZIP

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