データウェアハウスにおけるファクトテーブルとディメンションテーブルの役割

2024-04-02

ファクトテーブルとディメンションテーブルの違い

データ分析において、ファクトテーブルとディメンションテーブルは、データウェアハウスやビジネスインテリジェンスツールでデータを効率的に管理するために使用される2種類の重要なテーブルです。それぞれの役割と構造を理解することは、データ分析の精度と効率を向上させるために不可欠です。

ファクトテーブルは、ビジネスプロセスに関する数値データを記録するテーブルです。具体的には、売上金額、顧客数、製品在庫など、分析対象となる事実に関連する数値データが格納されます。ファクトテーブルは、以下の特徴を持ちます。

  • 主キー: 各レコードを一意に識別する列
  • 度量: 数値データ
  • 日付: 時系列データを格納
  • トランザクション: 個々のビジネスイベントを表すレコード

ディメンションテーブルは、ファクトテーブルのデータを分類し、詳細な情報を提供するテーブルです。具体的には、顧客情報、製品情報、地域情報など、ファクトテーブルのデータを分析するための属性情報が格納されます。ディメンションテーブルは、以下の特徴を持ちます。

  • 属性: テキストデータ
  • 階層関係: 親子の関係を表す列

主な違い

項目ファクトテーブルディメンションテーブル
役割数値データを記録データを分類・詳細情報を提供
構造主キー、度量、日付、トランザクション主キー、属性、階層関係
データ型数値テキスト
更新頻度高頻度低頻度
サイズ大きい比較的小さい

ファクトテーブル

レコードID顧客ID商品ID販売日販売数量販売金額
110011012023-11-1411000
210021022023-11-1522000
310031032023-11-1633000

ディメンションテーブル

レコード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

このサンプルコードでは、以下の処理を行っています。

  1. ファクトテーブルとディメンションテーブルをそれぞれ作成
  2. ディメンションテーブルとファクトテーブルを顧客IDで結合
  3. 結果を表示

このサンプルコードを参考に、実際のデータ分析に活用してください。




ファクトテーブルとディメンションテーブルを結合する他の方法

ここでは、その他の方法を紹介します。

SQL を使用して、ファクトテーブルとディメンションテーブルを結合することができます。

SELECT
    fact_table.販売金額,
    dim_customer.名前
FROM fact_table
INNER JOIN dim_customer ON fact_table.顧客ID = dim_customer.レコードID;

このクエリは、fact_tabledim_customer テーブルを 顧客ID で結合し、販売金額名前 列を返します。

データウェアハウスツール

多くのデータウェアハウスツールには、ファクトテーブルとディメンションテーブルを結合するためのGUI インターフェースが用意されています。

例えば、Tableau や Power BI などのツールでは、ドラッグアンドドロップ操作で簡単にテーブルを結合することができます。

  • Python の numpy.join() 関数
  • R の merge() 関数

これらの方法は、それぞれ異なる利点と欠点があります。使用する方法は、データの規模、複雑性、および使用しているツールによって異なります。

方法を選択する際の考慮事項

  • データの規模
  • データの複雑性
  • 使用しているツール
  • パフォーマンス
  • 使いやすさ

ファクトテーブルとディメンションテーブルを結合するには、さまざまな方法があります。使用する方法は、データの規模、複雑性、および使用しているツールによって異なります。

上記の情報を参考に、最適な方法を選択してください。


database data-warehouse business-intelligence


データベースで効率的にピックリストを活用する方法

データベースにおけるピックリストには、主に2種類あります。固定ピックリスト: あらかじめ定義された値のみを選択できるリストです。動的ピックリスト: 別のテーブルの値に基づいて生成されるリストです。ピックリストの管理方法は、データベースの種類によって異なりますが、一般的には以下の操作が可能です。...


MySQLでブール型フィールドのパフォーマンスを向上させる方法:インデックス、パーティショニング、集計テーブル、マテリアライズドビュー

MySQLデータベースでブール型フィールドにインデックスを作成するかどうかは、パフォーマンスとストレージのトレードオフを伴う複雑な問題です。適切な判断を行うためには、データの特性、クエリのワークロード、およびデータベースサーバーの全体的なパフォーマンスを考慮する必要があります。...


SQL初心者でも迷わない!PostgreSQLクエリに行番号を表示する3つの基本テクニック

ROW_NUMBER() 関数を使用するROW_NUMBER() 関数は、WINDOW 句と組み合わせて使用することで、クエリ結果の各行に固有の行番号を割り当てることができます。 これが最も一般的で汎用性の高い方法です。このクエリは、your_table テーブルのすべての行を返し、各行の先頭に 行番号 という名前の新しい列を追加します。 この列には、1 から始まる連番が入力されます。...


MySQLでユニーク制約はNULL値を無視するのか?

答え: はい、デフォルトではMySQLはユニーク制約でNULL値を無視します。つまり、同じカラムに複数のNULL値を持つレコードが許可されます。詳細:ユニーク制約: テーブル内の各行がユニークであることを保証します。つまり、同じ値を持つ2つの行は存在できません。...


ビュー作成前に確認しておきたい!MySQLビューのパフォーマンスの基礎知識

ビューのパフォーマンスに影響を与える主な要因は以下の通りです。ビューの複雑さ: 複雑な結合や集計を含むビューは、クエリの実行時により多くの処理が必要となるため、パフォーマンスが低下する可能性があります。ベースとなるテーブルのサイズ: 大きいサイズのベーステーブルを持つビューは、クエリの実行時により多くのデータを読み取る必要があり、パフォーマンスが低下する可能性があります。...