🏅

Microsoft Fabricのタスクフローに沿ってメダリオンアーキテクチャを試す(シルバー→ゴールド)

2024/09/03に公開

やりたいこと

前回の記事の続きで、シルバー層のデータからゴールド層をMicrosoft Fabricのタスクフローに沿って試してみます。
https://zenn.dev/headwaters/articles/f1c2ea1e2ee3f4

シルバーからゴールドデータ作成

Fabricのメダリオンアーキテクチャのゴールド層は通常はスタースキーマにするとあり、dimentionとfactテーブルに分割する処理になるかと思いますが、今回は目的が犯罪数とパトロール指導の相関があるかみたいだけなので、表示したらそのままわかる状態のテーブルを作成します。

データ生成処理


今回もノートブックを選択しました。

データ変換

シルバーの犯罪数とパトロール指導数テーブルから、犯罪数が年単位だったので、年ごとの犯罪数と指導数を一つのテーブルにしたいと思います。

from pyspark.sql import SparkSession
import pandas as pd

# Sparkセッションの作成
spark = SparkSession.builder.getOrCreate()

# レイクハウスのパスを指定してDeltaテーブルを読み込む
table_path = "Tables/silver_hanzai_num"

# Deltaテーブルの読み込み
df_spark = spark.read.format("delta").load(table_path)

# PySpark DataFrameをpandas DataFrameに変換
df = df_spark.toPandas()
table_path = "Tables/silver_patrol"
df_spark = spark.read.format("delta").load(table_path)
df_p = df_spark.toPandas()
df_h_num = df.groupby('データ年')['刑法犯数'].sum().reset_index()
# 日付から年を抽出する
df_p['年'] = pd.to_datetime(df_p['日付']).dt.year
df_p_y = df_p.groupby('年')['人数又は台数'].sum().reset_index()
df_p_y.head(10)
人数又は台数
2023 32528.0
2024 4215.0

それぞれのテーブルデータを年ごとに集計すると、パトロール指導が2023年分しかなかったので、比較できないなーと。

そこで、データソースでそれっぽいのがないかSHIBUYA OPEN DATAに探しに行くと、「分煙対策 指導と過料処分の活動実績」というデータが2020年くらいからありそうだったので、データ取得→シルバーにデータ保管をしました。

table_path = "Tables/smoke_shidou"
df_spark = spark.read.format("delta").load(table_path)
df_s = df_spark.toPandas()

df_s_num = df_s.groupby('年度')['値'].sum().reset_index()

df_m = pd.merge(df_h_num, df_s_num, left_on='データ年', right_on='年度', how='left')

df_m = df_m[df_m["データ年"] != 2019]
df_m = df_m.drop(columns=["値", "年度"])
df_m.head()
import numpy as np
import matplotlib.pyplot as plt

df = df_m
# 散布図の作成
plt.figure(figsize=(8, 6))
plt.scatter(df['刑法犯数'], df['路上喫煙指導数'], color='b', marker='o')
plt.title('hanzai_num and smoke_shidou_num')
plt.xlabel('hanzai_num')
plt.ylabel('smoke_shidou_num')

# 回帰線を描画
m, b = np.polyfit(df['刑法犯数'], df['路上喫煙指導数'], 1)
plt.plot(df['刑法犯数'], m * df['刑法犯数'] + b, color='r', linestyle='--')

plt.grid(True)
plt.show()

# ピアソンの相関係数の計算
correlation = df['刑法犯数'].corr(df['路上喫煙指導数'])
print(f'ピアソンの相関係数: {correlation:.2f}')

一応弱い負の相関でてますが、路上喫煙指導が増えたから犯罪数が減ったって言えなくもないかも。。

データ年 刑法犯数 路上喫煙指導数
2020 3471 52755.0
2021 5707 51275.0
2022 3024 63112.0
2023 3388 46701.0

ゴールド層にデータ保管

ゴールドにもシルバーと同様にレイクハウスを作成しました。

データ登録

シルバーとゴールドの間のノートブックで、ブロンズ→シルバーと同様にレイクハウスにテーブル作成します。


パスを取得

# 先ほどのテーブルをsparkのデータフレームに
df_spark = spark.createDataFrame(df_m)

# 取得したゴールド層のレイクハウスのパス
gold_layer_table_path = "abfss://xxxx@onelake.dfs.fabric.microsoft.com/xxxx/Tables/gold_hanzai_corr"

df_spark.write.format("delta").mode("append").save(gold_layer_table_path)

ゴールドにテーブルが作成できました。

セマンティックモデルに追加

https://learn.microsoft.com/ja-jp/fabric/data-engineering/tutorial-lakehouse-build-report

この記事の手順のようにレイクハウスからSQL分析エンドポイントにタブを切り替えて、作成したテーブルをセマンティックモデルに追加します。

レポート作成

表示したいテーブルをセマンティックモデルに追加したので、レポートを選択します。

PowerBIのUIでセマンティックモデルが選べるので、適当にレポートを作成します。

まとめ

Microsoft Fabricのメダリオンのタスクフローに合わせてデータ作成してみました。

Fabricに沿ってデータを入れたりすればそれっぽいデータ分析できそうだなと思いつつ、
Copilotがプラン的に使えないのに表示されてるのが辛かったです。たまに押しちゃう。

ヘッドウォータース

Discussion