チュートリアル: セマンティック リンクを使用してセマンティック モデル内のリレーションシップを検出する

このチュートリアルでは、Jupyter ノートブックから Power BI を操作し、SemPy ライブラリを使用してテーブル間のリレーションシップを検出する方法について説明します。

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

  • セマンティック リンクの Python ライブラリ (SemPy) を使用して、セマンティック モデル (Power BI データセット) 内のリレーションシップを検出します。
  • Power BI との統合をサポートし、データ品質分析の自動化に役立つ SemPy のコンポーネントを使用します。 コンポーネントには、次が含まれます。
    • FabricDataFrame - 追加のセマンティック情報で強化された pandas のような構造体。
    • Fabric ワークスペースからノートブックにセマンティック モデルをプルする関数。
    • 機能依存関係に関する仮説の評価を自動化し、セマンティック モデル内のリレーションシップの違反を識別する関数。

前提条件

  • 左側のナビゲーション ペインから [ワークスペース] を選択して、お使いのワークスペースを見つけて選択します。 このワークスペースが現在のワークスペースになります。

  • Fabric-samples GitHub リポジトリ から Customer Profitability Sample.pbixCustomer Profitability Sample (auto).pbix セマンティック モデルをダウンロードし、ワークスペースにアップロードします。

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

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

このチュートリアルに付随するノートブックを開くには、「データ サイエンス用にシステムを準備する」チュートリアル の手順に従い、ノートブックをお使いのワークスペースにインポートします。

このページからコードをコピーして貼り付ける場合は、[新しいノートブックを作成する] ことができます。

コードの実行を開始する前に、必ずレイクハウスをノートブックにアタッチしてください。

ノートブックを設定する

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

  1. ノートブック内の %pip インライン インストール機能を使用して PyPI から SemPy をインストールします:

    %pip install semantic-link
    
  2. 後で必要になる SemPy モジュールの必要なインポートを実行します:

    import sempy.fabric as fabric
    
    from sempy.relationships import plot_relationship_metadata
    from sempy.relationships import find_relationships
    from sempy.fabric import list_relationship_violations
    
  3. 出力の書式設定に役立つ構成オプションを適用するために pandas をインポートします:

    import pandas as pd
    pd.set_option('display.max_colwidth', None)
    

セマンティック モデルを探索する

このチュートリアルでは、標準のサンプル セマンティック モデル Customer Profitability Sample.pbix を使用します。 セマンティック モデルの説明については、Power BI のお客様の収益性のサンプルに関する記事を参照してください。

  • SemPy の list_datasets 関数を使用して、現在のワークスペース内のセマンティック モデルを探索します:

    fabric.list_datasets()
    

このノートブックの残りの部分では、2 つのバージョンの Customer Profitability Sample セマンティック モデルを使用します:

  • 顧客の収益性のサンプル: 定義済みのテーブル リレーションシップを持つ Power BI サンプルからのセマンティック モデル
  • 顧客の収益性のサンプル (自動):同じデータですが、リレーションシップは Power BI によって自動検出されるデータに限定されます。

定義済みのセマンティック モデルを使用してサンプル セマンティック モデルを抽出する

  1. SemPy の list_relationships 関数を使用して、顧客収益性サンプル セマンティック モデル内に事前に定義され、格納されているリレーションシップを読み込みます。 この関数は、表形式オブジェクト モデルから一覧表示されます:

    dataset = "Customer Profitability Sample"
    relationships = fabric.list_relationships(dataset)
    relationships
    
  2. SemPy plot_relationship_metadata の関数を relationships 使用して、DataFrame をグラフとして視覚化します:

    plot_relationship_metadata(relationships)
    

    セマンティック モデル内のテーブル間のリレーションシップのプロットを示すスクリーンショット。

このグラフは、このセマンティック モデル内のテーブル間のリレーションシップに関する "グラウンド トゥルース" を示しています。これは、対象分野の専門家によって Power BI でどのように定義されたかを反映しています。

リレーションシップの検出を補完する

Power BI が自動検出したリレーションシップを使い始めた場合は、セットが小さくなります。

  1. セマンティック モデルで Power BI によって自動検出されたリレーションシップを視覚化します:

    dataset = "Customer Profitability Sample (auto)"
    autodetected = fabric.list_relationships(dataset)
    plot_relationship_metadata(autodetected)
    

    セマンティック モデルで Power BI によって自動検出されたリレーションシップを示すスクリーンショット。

    Power BI の自動検出では、多くのリレーションシップが見逃されました。 さらに、自動検出された 2 つのリレーションシップは意味的に正しくありません:

    • Executive[ID] ->Industry[ID]
    • BU[Executive_id] ->Industry[ID]
  2. リレーションシップをテーブルとして出力します:

    autodetected
    

    インデックス 3 と 4 の行に、Industry テーブルとの間の誤ったリレーションシップが表示されます。 これらの行を削除するには、この情報を使用します。

  3. 誤って識別されたリレーションシップを破棄します。

    autodetected.drop(index=[3,4], inplace=True)
    autodetected
    

    これで、正しいが不完全なリレーションシップが作成されました。

  4. plot_relationship_metadata を使用して、これらの不完全なリレーションシップを視覚化します:

    plot_relationship_metadata(autodetected)
    

    正しくないリレーションシップを削除した後のリレーションシップの視覚化を示すスクリーンショット。

  5. SemPy list_tablesread_table 関数を使用して、セマンティック モデルからすべてのテーブルを読み込みます:

    tables = {table: fabric.read_table(dataset, table) for table in fabric.list_tables(dataset)['Name']}
    
    tables.keys()
    
  6. find_relationships を使用してテーブル間のリレーションシップを検索し、ログ出力を確認して、この関数のしくみに関する分析情報を取得します:

    suggested_relationships_all = find_relationships(
        tables,
        name_similarity_threshold=0.7,
        coverage_threshold=0.7,
        verbose=2
    )
    
  7. 新しく検出されたリレーションシップを視覚化する:

    plot_relationship_metadata(suggested_relationships_all)
    

    新しく検出されたリレーションシップの視覚化を示すスクリーンショット。

    SemPy はすべてのリレーションシップを検出できました。

  8. exclude パラメーターを使用して、以前に識別されなかった追加のリレーションシップに検索を制限します:

    additional_relationships = find_relationships(
        tables,
        exclude=autodetected,
        name_similarity_threshold=0.7,
        coverage_threshold=0.7
    )
    
    additional_relationships
    

リレーションシップを検証する

  1. まず、Customer Profitability Sample セマンティック モデルからデータを読み込みます:

    dataset = "Customer Profitability Sample"
    tables = {table: fabric.read_table(dataset, table) for table in fabric.list_tables(dataset)['Name']}
    
    tables.keys()
    
  2. list_relationship_violations 関数を使用して、主キー値と外部キー値の重複を確認します。 list_relationships 関数の出力を list_relationship_violations 入力として指定します:

    list_relationship_violations(tables, fabric.list_relationships(dataset))
    

    リレーションシップ違反は、興味深い分析情報を提供します。 たとえば、Fact[Product Key] の 7 つの値のうち 1 つは Product[Product Key] に存在せず、この不足しているキーは 50 です。

探索的データ分析は刺激的なプロセスであり、データ クリーニングも含まれます。 データの見方や知りたいことによって、データには常に何かが隠れています。 セマンティック リンクには、データを使ってより多くのことを実現するために使用できる新しいツールが用意されています。

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