チュートリアル: セマンティック リンクを使用してセマンティック モデル内のリレーションシップを検出する
このチュートリアルでは、Jupyter ノートブックから Power BI を操作し、SemPy ライブラリを使用してテーブル間のリレーションシップを検出する方法について説明します。
このチュートリアルでは、次の作業を行う方法について説明します。
- セマンティック リンクの Python ライブラリ (SemPy) を使用して、セマンティック モデル (Power BI データセット) 内のリレーションシップを検出します。
- Power BI との統合をサポートし、データ品質分析の自動化に役立つ SemPy のコンポーネントを使用します。 コンポーネントには、次が含まれます。
- FabricDataFrame - 追加のセマンティック情報で強化された pandas のような構造体。
- Fabric ワークスペースからノートブックにセマンティック モデルをプルする関数。
- 機能依存関係に関する仮説の評価を自動化し、セマンティック モデル内のリレーションシップの違反を識別する関数。
前提条件
Microsoft Fabric サブスクリプションを取得します。 または、無料の Microsoft Fabric 試用版にサインアップします。
Microsoft Fabric にサインインします。
ホーム ページの左側にある環境スイッチャーを使って、Synapse Data Science 環境に切り替えます。
左側のナビゲーション ペインから [ワークスペース] を選択して、お使いのワークスペースを見つけて選択します。 このワークスペースが現在のワークスペースになります。
Fabric-samples GitHub リポジトリ から Customer Profitability Sample.pbix と Customer Profitability Sample (auto).pbix セマンティック モデルをダウンロードし、ワークスペースにアップロードします。
ノートブックで作業を進める
このチュートリアルには、powerbi_relationships_tutorial.ipynb ノートブックが付属しています。
このチュートリアルに付随するノートブックを開くには、「データ サイエンス用にシステムを準備する」チュートリアル の手順に従い、ノートブックをお使いのワークスペースにインポートします。
このページからコードをコピーして貼り付ける場合は、[新しいノートブックを作成する] ことができます。
コードの実行を開始する前に、必ずレイクハウスをノートブックにアタッチしてください。
ノートブックを設定する
このセクションでは、必要なモジュールとデータを含むノートブック環境を設定します。
ノートブック内の
%pip
インライン インストール機能を使用して PyPI からSemPy
をインストールします:%pip install semantic-link
後で必要になる 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
出力の書式設定に役立つ構成オプションを適用するために 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 によって自動検出されるデータに限定されます。
定義済みのセマンティック モデルを使用してサンプル セマンティック モデルを抽出する
SemPy の
list_relationships
関数を使用して、顧客収益性サンプル セマンティック モデル内に事前に定義され、格納されているリレーションシップを読み込みます。 この関数は、表形式オブジェクト モデルから一覧表示されます:dataset = "Customer Profitability Sample" relationships = fabric.list_relationships(dataset) relationships
SemPy
plot_relationship_metadata
の関数をrelationships
使用して、DataFrame をグラフとして視覚化します:plot_relationship_metadata(relationships)
このグラフは、このセマンティック モデル内のテーブル間のリレーションシップに関する "グラウンド トゥルース" を示しています。これは、対象分野の専門家によって Power BI でどのように定義されたかを反映しています。
リレーションシップの検出を補完する
Power BI が自動検出したリレーションシップを使い始めた場合は、セットが小さくなります。
セマンティック モデルで Power BI によって自動検出されたリレーションシップを視覚化します:
dataset = "Customer Profitability Sample (auto)" autodetected = fabric.list_relationships(dataset) plot_relationship_metadata(autodetected)
Power BI の自動検出では、多くのリレーションシップが見逃されました。 さらに、自動検出された 2 つのリレーションシップは意味的に正しくありません:
Executive[ID]
->Industry[ID]
BU[Executive_id]
->Industry[ID]
リレーションシップをテーブルとして出力します:
autodetected
インデックス 3 と 4 の行に、
Industry
テーブルとの間の誤ったリレーションシップが表示されます。 これらの行を削除するには、この情報を使用します。誤って識別されたリレーションシップを破棄します。
autodetected.drop(index=[3,4], inplace=True) autodetected
これで、正しいが不完全なリレーションシップが作成されました。
plot_relationship_metadata
を使用して、これらの不完全なリレーションシップを視覚化します:plot_relationship_metadata(autodetected)
SemPy
list_tables
とread_table
関数を使用して、セマンティック モデルからすべてのテーブルを読み込みます:tables = {table: fabric.read_table(dataset, table) for table in fabric.list_tables(dataset)['Name']} tables.keys()
find_relationships
を使用してテーブル間のリレーションシップを検索し、ログ出力を確認して、この関数のしくみに関する分析情報を取得します:suggested_relationships_all = find_relationships( tables, name_similarity_threshold=0.7, coverage_threshold=0.7, verbose=2 )
新しく検出されたリレーションシップを視覚化する:
plot_relationship_metadata(suggested_relationships_all)
SemPy はすべてのリレーションシップを検出できました。
exclude
パラメーターを使用して、以前に識別されなかった追加のリレーションシップに検索を制限します:additional_relationships = find_relationships( tables, exclude=autodetected, name_similarity_threshold=0.7, coverage_threshold=0.7 ) additional_relationships
リレーションシップを検証する
まず、Customer Profitability Sample セマンティック モデルからデータを読み込みます:
dataset = "Customer Profitability Sample" tables = {table: fabric.read_table(dataset, table) for table in fabric.list_tables(dataset)['Name']} tables.keys()
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 については、他のチュートリアルを確認してください。