次の方法で共有


チュートリアル: 機能依存関係を使用してデータをクリーンアップする

機能依存関係を使用してデータをクリーンアップします。 機能依存関係は、セマンティック モデル (Power BI データセット) 内の 1 つの列が別の列に依存している場合に存在します。 たとえば、 ZIP code 列は、 city 列の値を決定できます。 機能依存関係は、 DataFrame内の 2 つ以上の列の値間の一対多リレーションシップとして表示されます。 このチュートリアルでは、Synthea データセットを使用して、機能依存関係がデータ品質の問題の検出にどのように役立つかを示します。

このチュートリアルでは、次の方法について説明します。

  • ドメイン知識を適用して、セマンティック モデルの機能依存関係に関する仮説を形成します。
  • データ品質分析を自動化するセマンティック リンク Python ライブラリ (SemPy) のコンポーネントについて理解します。 これらのコンポーネントは次のとおりです。
    • FabricDataFrame—追加のセマンティック情報を持つ pandas に似た構造。
    • 関数の依存関係に関する仮説の評価を自動化し、セマンティック モデルの違反を識別する関数。

前提 条件

  • Microsoft Fabric サブスクリプションを取得します。 または、無料のMicrosoft Fabric試用版にサインアップします。

  • Microsoft Fabric にサインインします。

  • ホーム ページの左下にあるエクスペリエンス スイッチャーを使用して Fabric に切り替えます。

    エクスペリエンス スイッチャー メニューでの Fabric の選択を示すスクリーンショット。

  • ナビゲーション ウィンドウで [ワークスペース] を選択し、ワークスペースを選択して現在のワークスペースとして設定します。

ノートブックで作業を進める

このチュートリアルに従うには 、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ファイルの内容を使用して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 が名前と組織を決定したことを示す機能依存関係グラフのスクリーンショット。

    グラフは、 IdNAMEORGANIZATIONを決定することを示しています。 Idが一意であるため、この結果が予想されます。

  3. Idが一意であることを確認します。

    providers.Id.is_unique
    

    コードは True を返して、Id が一意であることを確認します。

機能依存関係を詳細に分析する

また、機能依存関係グラフは、ORGANIZATIONADDRESSZIPを想定どおりに決定することも示しています。 ただし、ZIPCITYも決定することが予想される場合がありますが、破線の矢印は、依存関係が近似であり、データ品質の問題を指していることを示します。

グラフには他にも特殊性があります。 たとえば、NAME は、GENDERIdSPECIALITY、または ORGANIZATIONを決定しません。 これらの特殊性のそれぞれは、調査する価値があるかもしれません.

  1. SemPy のZIP関数を使用して違反を一覧表示することで、CITYlist_dependency_violationsの間のおおよその関係を詳しく見てみましょう。
providers.list_dependency_violations('ZIP', 'CITY')
  1. SemPy の plot_dependency_violations 視覚化関数を使用してグラフを描画します。 このグラフは、違反の数が少ない場合に役立ちます。
providers.plot_dependency_violations('ZIP', 'CITY')

依存関係違反のプロットのスクリーンショット。

依存関係違反のプロットには、左側の ZIP の値と右側の CITY の値が表示されます。 この 2 つの値を含む行がある場合、エッジはプロットの左側の郵便番号を右側の市区町村に接続します。 エッジには、そのような行の数で注釈が付けられます。 たとえば、郵便番号が02747-1242の行が2行あり、1行は市"NORTH DARTHMOUTH"で、もう1行は市"DARTHMOUTH"です。それらは前のプロットと次のコードに示されています。

  1. 次のコードを実行して、プロットからの観測値を確認します。
providers[providers.ZIP == '02747-1242'].CITY.value_counts()
  1. プロットは、"DARTHMOUTH" と CITY 行のうち、9 行の ZIP が 02747-1262 であることを示しています。 1 行の ZIP は 02747-1242 です。 1 行の 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" に 1 回、"BOSTON" に 1 回マップされます。 "NORTH DARTMOUTH" と "DARTMOUTH" の間でも同様の問題が発生します。 これらの修飾子を削除するか、最も一般的に発生する市区町村に郵便番号をマップします。
  • 一部の都市名には、"PITTSFIELD" と "PITTSFILED" や "NEWBURGPORT" と "NEWBURYPORT" の間に入力ミスがあります。"NEWBURGPORT" の場合は、最も一般的な状況を使用してこの入力ミスを修正します。 "PITTSFIELD" の場合、それぞれが 1 回だけ発生する場合、外部の知識や言語モデルがないと、自動のあいまいさがはるかに困難になります。
  • "West" のようなプレフィックスが 1 文字の "W" に省略される場合があります。"W" のすべての出現箇所が "West" の場合は、"W" を "West" に置き換えます。
  • 郵便番号 "02130" は "BOSTON" に 1 回マップされ、"ジャマイカ プレーン" に 1 回マップされます。 この問題を修正するのは簡単ではありません。 データが多い場合は、最も一般的な状況にマップします。

データをクリーンアップする

  1. 値をタイトル ケースに変更して大文字と小文字を修正します。

    providers['CITY'] = providers.CITY.str.title()
    
  2. 違反検出をもう一度実行して、あいまいさが少ないほど確認します。

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

SemPy の drop_dependency_violations 関数を使用して、データを手動で調整するか、列間の機能制約に違反する行を削除します。

決定変数の値ごとに、 drop_dependency_violations 依存変数の最も一般的な値を選択し、他の値を持つすべての行を削除します。 この統計ヒューリスティックがデータの正しい結果につながると確信できる場合にのみ、この操作を適用します。 それ以外の場合は、検出された違反を処理する独自のコードを記述します。

  1. drop_dependency_violations列とZIP列でCITY関数を実行します。

    providers_clean = providers.drop_dependency_violations('ZIP', 'CITY')
    
  2. ZIPCITYの間の依存関係違反を一覧表示します。

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

このコードは、機能制約 ZIP -> CITYの違反がないことを示す空のリストを返します。

セマンティック リンクまたは SemPy については、他のチュートリアルを参照してください。