次の方法で共有


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

このチュートリアルでは、データクリーニングに機能依存関係を使用します。 機能依存関係は、セマンティック モデル (Power BI データセット) の 1 つの列が別の列の関数である場合に存在します。 たとえば、郵便番号 列によって、市区町村 列の値が決まります。 関数型依存関係は、DataFrame 内の 2 つ以上の列の値間の一対多リレーションシップとして現れます。 このチュートリアルでは、Synthea データセットを使用して、機能関係がデータ品質の問題の検出にどのように役立つかを示します。

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

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

前提 条件

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

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

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

    データ サイエンスを選択する場所を示すエクスペリエンス スイッチャー メニューのスクリーンショット。

  • 左側のナビゲーション ウィンドウから ワークスペース を選択して、ワークスペースを検索して選択します。 このワークスペースが現在のワークスペースになります。

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

このチュートリアルには、data_cleaning_functional_dependencies_tutorial.ipynb ノートブックが付属しています。

ノートブックを設定する

このセクションでは、必要なモジュールとデータを含むノートブック環境を設定します。

  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)
    

    機能依存関係のグラフを示すスクリーンショット。

    機能依存関係のグラフは、IdNAMEORGANIZATION (実線の矢印で示されます) を決定することを示しています。これは、Id が一意であるためです。

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

    providers.Id.is_unique
    

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

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

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

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

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

  3. 次のコードを実行して、依存関係違反のプロットで行った前の観察を確認します。

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

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

  1. すべてが大文字化されているのをタイトル ケース (先頭文字を大文字) に変更して、大文字の問題を修正します。

    providers['CITY'] = providers.CITY.str.title()
    
  2. 違反検出をもう一度実行して、あいまいさの一部が失われる (違反の数が少ない) ことを確認します。

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

    この時点で、データをより手動で絞り込むことができますが、1 つの潜在的なデータ クリーンアップ タスクは、SemPy の drop_dependency_violations 関数を使用して、データ内の列間の機能上の制約に違反する行を削除することです。

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

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

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

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

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

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