データウェアハウスにおけるファクトテーブルとディメンションテーブルの役割
ファクトテーブルとディメンションテーブルの違い
データ分析において、ファクトテーブルとディメンションテーブルは、データウェアハウスやビジネスインテリジェンスツールでデータを効率的に管理するために使用される2種類の重要なテーブルです。それぞれの役割と構造を理解することは、データ分析の精度と効率を向上させるために不可欠です。
ファクトテーブルは、ビジネスプロセスに関する数値データを記録するテーブルです。具体的には、売上金額、顧客数、製品在庫など、分析対象となる事実に関連する数値データが格納されます。ファクトテーブルは、以下の特徴を持ちます。
- 主キー: 各レコードを一意に識別する列
- 度量: 数値データ
- 日付: 時系列データを格納
- トランザクション: 個々のビジネスイベントを表すレコード
ディメンションテーブルは、ファクトテーブルのデータを分類し、詳細な情報を提供するテーブルです。具体的には、顧客情報、製品情報、地域情報など、ファクトテーブルのデータを分析するための属性情報が格納されます。ディメンションテーブルは、以下の特徴を持ちます。
- 属性: テキストデータ
- 階層関係: 親子の関係を表す列
主な違い
項目 | ファクトテーブル | ディメンションテーブル |
---|---|---|
役割 | 数値データを記録 | データを分類・詳細情報を提供 |
構造 | 主キー、度量、日付、トランザクション | 主キー、属性、階層関係 |
データ型 | 数値 | テキスト |
更新頻度 | 高頻度 | 低頻度 |
サイズ | 大きい | 比較的小さい |
例
ファクトテーブル
レコードID | 顧客ID | 商品ID | 販売日 | 販売数量 | 販売金額 |
---|---|---|---|---|---|
1 | 1001 | 101 | 2023-11-14 | 1 | 1000 |
2 | 1002 | 102 | 2023-11-15 | 2 | 2000 |
3 | 1003 | 103 | 2023-11-16 | 3 | 3000 |
ディメンションテーブル
レコードID | 顧客ID | 名前 | 性別 | 年齢 | 住所 |
---|---|---|---|---|---|
1001 | 山田太郎 | 男性 | 30 | 東京都 | |
1002 | 佐藤花子 | 女性 | 25 | 大阪府 | |
1003 | 田中一郎 | 男性 | 40 | 福岡県 |
データ分析における活用
ファクトテーブルとディメンションテーブルを組み合わせることで、多角的なデータ分析が可能になります。例えば、以下の分析が可能です。
- 顧客別、商品別、地域別の売上分析
- 時系列による売上推移分析
- 顧客属性別購買傾向分析
ファクトテーブルとディメンションテーブルは、データ分析において重要な役割を果たす2種類のテーブルです。それぞれの役割と構造を理解し、適切に活用することで、データ分析の精度と効率を向上させることができます。
Python
import pandas as pd
# ファクトテーブル
fact_table = pd.DataFrame({
"レコードID": [1, 2, 3],
"顧客ID": [1001, 1002, 1003],
"商品ID": [101, 102, 103],
"販売日": pd.to_datetime(["2023-11-14", "2023-11-15", "2023-11-16"]),
"販売数量": [1, 2, 3],
"販売金額": [1000, 2000, 3000]
})
# ディメンションテーブル
dim_customer = pd.DataFrame({
"レコードID": [1001, 1002, 1003],
"名前": ["山田太郎", "佐藤花子", "田中一郎"],
"性別": ["男性", "女性", "男性"],
"年齢": [30, 25, 40],
"住所": ["東京都", "大阪府", "福岡県"]
})
# ディメンションテーブルと結合
joined_table = fact_table.merge(dim_customer, on="顧客ID")
# 顧客別売上分析
customer_sales = joined_table.groupby("名前")["販売金額"].sum()
# 商品別売上分析
product_sales = joined_table.groupby("商品ID")["販売金額"].sum()
# 時系列売上分析
time_series_sales = joined_table.groupby("販売日")["販売金額"].sum()
# 結果表示
print(customer_sales)
print(product_sales)
print(time_series_sales)
出力結果
名前
山田太郎 1000
佐藤花子 2000
田中一郎 3000
商品ID
101 1000
102 2000
103 3000
販売日
2023-11-14 1000
2023-11-15 2000
2023-11-16 3000
このサンプルコードでは、以下の処理を行っています。
- ファクトテーブルとディメンションテーブルをそれぞれ作成
- ディメンションテーブルとファクトテーブルを顧客IDで結合
- 結果を表示
このサンプルコードを参考に、実際のデータ分析に活用してください。
ファクトテーブルとディメンションテーブルを結合する他の方法
ここでは、その他の方法を紹介します。
SQL を使用して、ファクトテーブルとディメンションテーブルを結合することができます。
SELECT
fact_table.販売金額,
dim_customer.名前
FROM fact_table
INNER JOIN dim_customer ON fact_table.顧客ID = dim_customer.レコードID;
このクエリは、fact_table
と dim_customer
テーブルを 顧客ID
で結合し、販売金額
と 名前
列を返します。
データウェアハウスツール
多くのデータウェアハウスツールには、ファクトテーブルとディメンションテーブルを結合するためのGUI インターフェースが用意されています。
例えば、Tableau や Power BI などのツールでは、ドラッグアンドドロップ操作で簡単にテーブルを結合することができます。
- Python の
numpy.join()
関数 - R の
merge()
関数
これらの方法は、それぞれ異なる利点と欠点があります。使用する方法は、データの規模、複雑性、および使用しているツールによって異なります。
方法を選択する際の考慮事項
- データの規模
- データの複雑性
- 使用しているツール
- パフォーマンス
- 使いやすさ
ファクトテーブルとディメンションテーブルを結合するには、さまざまな方法があります。使用する方法は、データの規模、複雑性、および使用しているツールによって異なります。
上記の情報を参考に、最適な方法を選択してください。
database data-warehouse business-intelligence