教學課程:使用功能相依性清理資料
在本教學課程中,您將使用功能相依性清理資料。 當語意模型中的一個資料行 (Power BI 資料集) 是另一個資料行的函數時,就存在功能相依性。 例如,郵遞區編碼資料行可以決定城市資料行中的值。 功能相依性表現為 DataFrame 中兩個或多個資料行中的值之間的一對多關聯性。 本教學課程使用 Synthea 資料集來示範功能關聯性如何協助偵測資料品質問題。
在本教學課程中,您會了解如何:
- 套用領域知識,在語意模型中提出有關功能相依性的假設。
- 熟悉有助自動執行資料品質分析的語意連結 Python 函式庫 (SemPy) 的元件。 這些元件包括:
- FabricDataFrame - 使用其他語意資訊增強的 Pandas 類似結構。
- 實用的函數,可自動評估有關功能相依性的假設,並在您的語意模型中找出違反關聯性的情況。
必要條件
取得 Microsoft Fabric 訂用帳戶。 或註冊免費的 Microsoft Fabric 試用版。
登入 Microsoft Fabric。
使用首頁左側的體驗切換器,切換至 Synapse 資料科學體驗。
- 從左側瀏覽窗格中選取 [工作區],以尋找並選取您的工作區。 此工作區會成為您目前的工作區。
在筆記本中跟著做
data_cleaning_functional_dependencies_tutorial.ipynb 筆記本隨附本教學課程。
若要開啟本教學課程隨附的筆記本,請遵循為資料科學教學課程準備系統中的指示,將筆記本匯入您的工作區。
如果您想要複製並貼上此頁面中的程式碼,則可以建立新的筆記本。
開始執行程式碼之前,請務必將 Lakehouse 連結至筆記本。
設定筆記本
在本章節中,您會使用必要的模組和資料來設定筆記本環境。
- 若是 Spark 3.4 和更新版本,使用 Fabric 時,預設執行階段可使用語意連結,而且不需要安裝。 如果使用的是 Spark 3.3 或以下版本,或者想要更新為最新版本的語意連結,可以執行命令:
python %pip install -U semantic-link
對稍後需要的模組執行必要的匯入:
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
拉取範例資料。 在本教學課程中,您會使用綜合醫療記錄的 Synthea 資料集 (簡單的較小版):
download_synthea(which='small')
探索資料
使用 providers.csv 檔案內容初始化
FabricDataFrame
:providers = FabricDataFrame(pd.read_csv("synthea/csv/providers.csv")) providers.head()
使用 SemPy 的
find_dependencies
函數,透過繪製自動偵測的功能相依性的圖表,檢查資料品質問題:deps = providers.find_dependencies() plot_dependency_metadata(deps)
功能相依性關係圖顯示
Id
決定NAME
和ORGANIZATION
(以實心箭號表示),這符合預期,因為Id
是唯一的:確認
Id
是唯一的:providers.Id.is_unique
程式碼將傳回
True
,確認Id
是唯一的。
深入分析功能相依性
功能相依性關係圖也顯示 ORGANIZATION
會如預期決定 ADDRESS
和 ZIP
。 不過,您可能預期 ZIP
也能決定 CITY
,但虛線箭號表示相依性只是近似值,指向資料品質問題。
關係圖中還有其他特殊之處。 例如,NAME
不決定 GENDER
、Id
、SPECIALITY
或 ORGANIZATION
。 這些特殊之處可能都值得調查。
使用 SemPy 的
list_dependency_violations
函數表格式違規清單,檢視ZIP
與CITY
之間的近似關聯性:providers.list_dependency_violations('ZIP', 'CITY')
使用 SemPy 的
plot_dependency_violations
視覺效果函數繪製關係圖。 如果違規數目很小,此關係圖會很有用:providers.plot_dependency_violations('ZIP', 'CITY')
相依性衝突的繪圖會在左側顯示
ZIP
的值,以及在右側顯示CITY
的值。 如果有資料列包含這兩個值,則會有一個邊緣將繪圖左側的郵遞區號與右側的城市連接起來。 邊緣會加上這類資料列計數的標註。 例如,有兩個資料列的郵遞區號為 02747-1242,一個資料列的城市是「NORTH DARTHMOUTH」,另一個資料列的城市是「DARTHMOUTH」,如上圖所示,並有以下程式碼:執行下列程式碼,確認您先前觀察到的相依性違規繪圖:
providers[providers.ZIP == '02747-1242'].CITY.value_counts()
此繪圖也顯示,在
CITY
為「DARTHMOUTH」的資料列中,有九個資料列的ZIP
為 02747-1262;一個資料列的ZIP
為 02747-1242;一個資料列的ZIP
為 02747-2537。 使用下列程式碼確認這些觀察結果:providers[providers.CITY == 'DARTMOUTH'].ZIP.value_counts()
還有其他與「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」對應到一次。 此問題不容易解決,但如果有更多資料,對應至最常見的版本可能是一個潛在的解決方案。
清理資料
將所有大寫變更為字首大寫來修正大寫問題:
providers['CITY'] = providers.CITY.str.title()
再次執行違規偵測,可以看到一些含糊之處已經消失 (違規數目變少):
providers.list_dependency_violations('ZIP', 'CITY')
此時,您可以更手動地最佳化資料,但有一項潛在的資料清理工作:使用 SemPy 的
drop_dependency_violations
函數刪除資料中資料行之間違反功能限制的資料列。對於行列式變數的每個值,
drop_dependency_violations
的工作原理是挑選應變數的最常見值,並刪除具有其他值的所有資料列。 只有當您確信此統計啟發學習法會產生正確的資料結果時,才應套用此作業。 否則,您應該視需要自行撰寫程式碼,處理偵測到的違規情況。對
ZIP
和CITY
資料行執行drop_dependency_violations
函數:providers_clean = providers.drop_dependency_violations('ZIP', 'CITY')
列出
ZIP
與CITY
之間的任何相依性違規:providers_clean.list_dependency_violations('ZIP', 'CITY')
程式碼會回傳一個空白清單,表示不再有違反功能限制 CITY -> ZIP 的情況。
相關內容
查看語意連結/SemPy 的其他教學課程: