論文一覧に戻る 📚 用語集トップ 🗺 概念マップ
📚 用語解説
📚 用語解説
ER図
Entity-Relationship Diagram
データエンジニアリング

💡 30秒で分かる結論

エンティティと関係を表す設計図

🎨 直感で掴む

データを「分析・モデリングに使える形に整える」工程。 分析の質はここで 8 割決まります。

本ページでは ER図 を、 定義・前提条件・使い方・落とし穴の順に整理して解説します。 厳密な定義より、 まず何を、 いつ、 どう使うかを理解することを優先してください。

📐 定義

エンティティと関係を表す設計図

英語名 Entity-Relationship Diagram

🎯 いつ・どこで使うか

📋 前提条件・適用範囲

この用語を理解・使用するときは、 次のような前提を意識してください:

⚠️ よくある落とし穴

❌ テスト時の未知カテゴリ
OneHotEncoder(handle_unknown="ignore") 等で対応。
❌ リーク防止
前処理は CV の各 fold 内で fit。 Pipeline を使う。
❌ 文字コード
日本語 CSV は utf-8 / cp932 を試す。

🐍 Python での扱い

SSDSE-B-2026 のような公的統計データを Python で扱う際の基本パターン:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
import pandas as pd
import numpy as np

# データ読み込み
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='utf-8', skiprows=1)
print(df.shape)
print(df.dtypes)
print(df.describe())

# 「ER図」の文脈で扱う場合の例:
# 分野: データエンジニアリング
# 関連手法は同カテゴリの他用語を参照してください。

具体的なコードは データエンジニアリング を参照してください。

📝 レポートでの報告

分析結果を報告するときに含めるべき情報:

✅ チェックリスト

🧮 SSDSE-B-2026 を ER 図でモデル化する

SSDSE-B-2026 は都道府県×年度の長形式パネルデータ。 これを ER 図化すると次のような構造:

[Prefecture]                [Year]
   PK: code        ←──→     PK: year
   prefecture_jp
        │
        │  1:N
        ↓
[Statistics]
   FK: code (Prefecture.code)
   FK: year (Year.year)
   PK: (code, year)
   total_population
   aged_population
   births
   deaths
   migration_in
   ...
   consumption_total

「都道府県マスタ」「年度マスタ」「統計値ファクトテーブル」の 3 テーブル構成にすると、 後で都道府県名の表記揺れ(旧字体・略称)に対応しやすい。

テーブル主キー関連典型ロウ数
Prefecturecode (R01000等)1:N → Statistics47
Yearyear (2018-2023)1:N → Statistics12
Statistics(code, year) 複合N:1 → Pref/Year564

SSDSE-B-2026 は1NF(第一正規形)でほぼ平坦だが、 都道府県名と年度は冗長。 3NF 化するとリレーショナルDB として保守性が上がる。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# SSDSE-B-2026 を 3NF に分解する
import pandas as pd
import sqlite3

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=1)
pref = df[['地域コード','都道府県']].drop_duplicates().rename(
    columns={'地域コード':'code','都道府県':'name'})
year = pd.DataFrame({'year': sorted(df['年度'].unique())})
stat = df[['年度','地域コード','総人口','65歳以上人口','出生数','死亡数']].rename(
    columns={'年度':'year','地域コード':'code'})

con = sqlite3.connect(':memory:')
pref.to_sql('Prefecture', con, index=False)
year.to_sql('Year',       con, index=False)
stat.to_sql('Statistics', con, index=False)

# 結合クエリ(ER関係に沿った JOIN)
q = '''SELECT p.name, s.year, s.総人口, s.65歳以上人口
       FROM Statistics s
       JOIN Prefecture p ON s.code=p.code
       WHERE s.year=2023 ORDER BY s.総人口 DESC LIMIT 5'''
print(pd.read_sql(q, con))

🔬 ER 図の表記法と最適化

3 つの主要記法

記法カーディナリティ表現代表ツール採用領域
Chen 記法菱形+数字 (1:N)原典の論文学術・教科書
IE 記法 (Crow's foot)鳥足記号ERwin, MySQL Workbench業務系・公的
UML クラス図クラス+関連線Lucidchart, draw.ioオブジェクト指向統合

正規化の段階

SSDSE-B-2026 を 3NF 化すると、 47 都道府県 × 12 年 = 564 行のファクトテーブルになり、 集計クエリの保守が圧倒的に楽になる。

スター・スキーマ vs スノーフレーク

分析用 DWH では、 3NF まで正規化せずスター・スキーマ(ファクト+ディメンション)が一般的。 SSDSE-B-2026 を BI 連携するなら、 1 ファクトテーブル+ 都道府県/年度/指標カテゴリの 3 ディメンションで構成すると BigQuery/Snowflake で高速。

⚠️ ER 設計の落とし穴

❌ 1. 主キーを業務キーに頼る
「メールアドレス」「電話番号」など現実で変わるものを主キーにすると、 後で全テーブルを書き換える羽目に。 サロゲートキー(連番ID)が無難。
❌ 2. NULL 許容で関係を曖昧化
「外部キー NULL OK」が増えると、 ER 上の 1:N は実質 0..1:N。 結合の SEMANTICS が崩れ、 集計値がズレる。
❌ 3. 多対多をテーブル無しで表現
中間テーブル(連関テーブル)を作らないと、 多対多は配列カラムやカンマ区切りで実装され、 SQL で扱えなくなる。
❌ 4. 履歴管理を考慮しない
「都道府県の人口」のような時系列データを、 主キー (code) のみで持つと履歴が消える。 (code, year) 複合キーや SCD 設計が必要。