チュートリアル: セマンティック モデルの機能依存関係を分析する
このチュートリアルでは、以前に Power BI アナリストによって行われ、セマンティック モデル (Power BI データセット) の形式で保存された作業を基にして作業を行います。 Microsoft Fabric 内の Synapse Data Science エクスペリエンスで SemPy (プレビュー) を使用して、DataFrame の列に存在する機能依存関係を分析します。 この分析は、より正確な分析情報を得るための重大なデータ品質の問題を検出するのに役立ちます。
このチュートリアルでは、次の作業を行う方法について説明します。
- ドメインの知識を応用して、セマンティック モデル内の機能依存関係に関する仮説を立てます。
- Power BI との統合をサポートし、データ品質分析の自動化に役立つセマンティック リンクの Python ライブラリ (SemPy) のコンポーネントに関する理解を深めます。 コンポーネントには、次が含まれます。
- FabricDataFrame - 追加のセマンティック情報で強化された pandas のような構造体。
- Fabric ワークスペースからノートブックにセマンティック モデルをプルするための便利な関数。
- 機能依存関係に関する仮説の評価を自動化し、セマンティック モデル内のリレーションシップの違反を識別するための便利な関数。
前提条件
Microsoft Fabric サブスクリプションを取得します。 または、無料の Microsoft Fabric 試用版にサインアップします。
Microsoft Fabric にサインインします。
ホーム ページの左側にある環境スイッチャーを使って、Synapse Data Science 環境に切り替えます。
左側のナビゲーション ペインから [ワークスペース] を選択して、お使いのワークスペースを見つけて選択します。 このワークスペースが現在のワークスペースになります。
Fabric-samples GitHub リポジトリ から Customer Profitability Sample.pbix セマンティック モデルをダウンロードし、それをワークスペースにアップロードします。
ノートブックで作業を進める
このチュートリアルには、powerbi_dependencies_tutorial.ipynb ノートブックが付属しています。
このチュートリアルに付随するノートブックを開くには、「データ サイエンス用にシステムを準備する」チュートリアル の手順に従い、ノートブックをお使いのワークスペースにインポートします。
このページからコードをコピーして貼り付ける場合は、[新しいノートブックを作成する] ことができます。
コードの実行を開始する前に、必ずレイクハウスをノートブックにアタッチしてください。
ノートブックを設定する
このセクションでは、必要なモジュールとデータを含むノートブック環境を設定します。
ノートブック内の
%pip
インライン インストール機能を使用して PyPI からSemPy
をインストールします。%pip install semantic-link
後で必要になるモジュールの必要なインポートを実行します。
import sempy.fabric as fabric from sempy.dependencies import plot_dependency_metadata
データを読み込んで事前処理する
このチュートリアルでは、標準のサンプル セマンティック モデル Customer Profitability Sample.pbix を使用します。 セマンティック モデルの説明については、Power BI のお客様の収益性のサンプルに関する記事を参照してください。
SemPy の
read_table
関数を使用して、Power BI データを FabricDataFrame に読み込みます。dataset = "Customer Profitability Sample" customer = fabric.read_table(dataset, "Customer") customer.head()
State
テーブルを FabricDataFrame に読み込みます。state = fabric.read_table(dataset, "State") state.head()
このコードの出力は pandas DataFrame に似ていますが、実際には pandas 上でいくつかの便利な操作をサポートする
FabricDataFrame
と呼ばれるデータ構造を初期化しています。customer
のデータ型を確認します。type(customer)
出力により、
customer
がsempy.fabric._dataframe._fabric_dataframe.FabricDataFrame
型であることを確認できます。customer
およびstate
DataFrame を結合します。customer_state_df = customer.merge(state, left_on="State", right_on="StateCode", how='left') customer_state_df.head()
機能依存関係を特定する
機能依存関係は、DataFrame 内の 2 つ (またはそれ以上) の列の値間の一対多のリレーションシップとして現れます。 これらのリレーションシップを使用して、自動的にデータ品質の問題を検出できます。
マージされた DataFrame で SemPy の
find_dependencies
関数を実行して、列内の値間の既存の機能依存関係を特定します。dependencies = customer_state_df.find_dependencies() dependencies
SemPy の
plot_dependency_metadata
関数を使用して、特定された依存関係を視覚化します。plot_dependency_metadata(dependencies)
予想どおり、機能依存関係グラフには、
Customer
列によってCity
、Postal Code
、Name
などのいくつかの列が決まることが示されています。驚くべきことに、このグラフには
City
とPostal Code
の間の機能依存関係は表示されません。これはおそらく、列間のリレーションシップに多くの違反があるためです。 SemPy のplot_dependency_violations
関数を使用して、特定の列間の依存関係の違反を視覚化できます。
品質の問題についてデータを調べる
SemPy の
plot_dependency_violations
視覚化関数を使用してグラフを描画します。customer_state_df.plot_dependency_violations('Postal Code', 'City')
依存関係違反のプロットには、左側に
Postal Code
の値、右側にCity
の値が示されています。 この 2 つの値を含む行がある場合、エッジは左側のPostal Code
と右側のCity
を接続します。 エッジには、そのような行の数を示す注釈が付けられています。 たとえば、郵便番号が 20004 の行が 2 つあり、そのうちの 1 つの市が "North Tower" で、もう 1 つの市が "Washington" です。さらに、プロットには、いくつかの違反と多くの空値が示されています。
Postal Code
の空値の数を確認します。customer_state_df['Postal Code'].isna().sum()
50 の行で、郵便番号が NA になっています。
空値を持つ行を削除します。 次に、
find_dependencies
関数を使用して依存関係を確認します。 追加のパラメーターverbose=1
に注目してください。これを使用すると、SemPy の内部動作を見ることができます。customer_state_df2=customer_state_df.dropna() customer_state_df2.find_dependencies(verbose=1)
Postal Code
とCity
の条件付きエントロピは 0.049 です。 この値は、機能依存関係の違反があることを示します。 違反を修正する前に、依存関係を確認するために、条件付きエントロピのしきい値を既定値の0.01
から0.05
に引き上げます。 しきい値を小さくすると、依存関係が少なくなります (つまり、選択度が高くなります)。条件付きエントロピのしきい値を既定値の
0.01
から0.05
に上げます。plot_dependency_metadata(customer_state_df2.find_dependencies(threshold=0.05))
どのエンティティが他のエンティティの値を決定するかについてのドメイン知識を応用すると、この依存関係グラフは正確に見えます。
検出されたデータ品質の問題をさらに詳しく調べます。 たとえば、
City
とRegion
を結合している破線の矢印は、依存関係が近似的であることを示します。 この近似的なリレーションシップは、部分的な機能依存関係があることを意味する可能性があります。customer_state_df.list_dependency_violations('City', 'Region')
空でない
Region
値が違反の原因となる各ケースを詳しく見てみましょう。customer_state_df[customer_state_df.City=='Downers Grove']
この結果では、Downers Grove 市が Illinois 州と Nebraska 州にあることが示されます。 しかし、Downers Grove は、Nebraska 州ではなくIllinois 州の都市です。
Fremont 市を見てみましょう。
customer_state_df[customer_state_df.City=='Fremont']
California 州に Fremont という市があります。 ただし、Texas 州の場合、検索エンジンは Fremont ではなく Premont を返します。
また、依存関係違反の元のグラフの点線で示されているように (空の値を持つ行を削除する前)、
Name
とCountry/Region
の間に見られる依存関係の違反も疑わしいです。customer_state_df.list_dependency_violations('Name', 'Country/Region')
SDI Design という 1 つの顧客は、2 つのリージョン (米国とカナダ) に存在しているようです。 この現象は意味的な違反ではないかもしれませんが、まれなケースかもしれません。 それでも、詳しく見る価値があります。
SDI Design という顧客について詳しく見てみましょう。
customer_state_df[customer_state_df.Name=='SDI Design']
さらに詳しく検査すると、実際には同じ名前の 2 つの異なる顧客 (異なる業界) が存在することがわかります。
探索的データ分析は刺激的なプロセスであり、データ クリーニングも含まれます。 データの見方や知りたいことによって、データには常に何かが隠れています。 セマンティック リンクには、データを使ってより多くのことを実現するために使用できる新しいツールが用意されています。
関連するコンテンツ
セマンティック リンク や SemPy については、他のチュートリアルを確認してください。