🔖 キーワード索引
#LEFT JOIN #FULL JOIN #欠損 #merge #結合 #NULL
「outer join 」は統計データ分析の文脈で扱う重要概念のひとつ。 本ページでは「outer join」を取り巻く中核キーワードを以下にチップで一覧化する。 各キーワードは関連する概念・手法・道具立てを含み、 文献検索や学習計画の起点になる。
outer join 統計分析 SSDSE-B-2026 前提条件 適用範囲 落とし穴 関連手法 Python 実装 検証方法
これらのキーワードは「outer join の理解 → 適用 → 検証」のプロセスを構成する。 各章で詳しく解説する。
💡 30秒で分かる結論
🍰 まずはやさしく
足りない部分を埋めてつなげる方法です。
データの抜けをなくすために使います。
名簿とアンケート結果を合わせる時に便利です。
外部結合の結論をさっと確認しましょう。
外部結合 :片側または両側のキーをすべて残す結合
マッチしない行も残す 結合。 INNER JOIN との対比で覚える。
LEFT OUTER:左を全部残す/RIGHT:右を全部/FULL:両方とも全部。
マッチしないキーには NULL (pandas では NaN) が入る。
「データ欠損がある側を補完したい」「マスター表に明細を結合」などで多用。
📍 文脈ボックス
🍰 まずはやさしく
データ処理の重要なテクニックです。
分析でデータを正しく扱うために使います。
スマホのアプリなどでデータをまとめる時に役立ちます。
この用語を学ぶための全体の流れを説明します。
この用語は データ処理 カテゴリに属します。 関連する別称・略号:(なし) 。
論文・実務レポートで 外部結合 が登場したら、 まず本ページの「30秒で分かる結論」と「直感で掴む」を読めば、 その文脈で何を言っているか把握できます。
本ページでは「outer join」を扱う。 統計データ分析コンペティション (2026) の教材で、 SSDSE-B-2026 (47 都道府県 × 複数年 × 100 超列) の実データを使った再現可能な学習を目指す。
「outer join」は統計・データサイエンスの体系における重要概念のひとつ。 本ページは「定義・直感・数式・実装・落とし穴・関連手法」の 6 視点で構成され、 各視点は独立して読めるが順序通り読むと体系的な理解が得られる。
🎨 直感で掴む
🍰 まずはやさしく
パズルのピースを無理やり合わせるイメージです。
どちらか一方にしかない情報を残すために使います。
部活の名簿と出席簿を比べる時に便利です。
図や例を使って直感的に仕組みを理解しましょう。
SSDSE-B-2026 (47 都道府県 × 経済社会指標) と、 別ファイルの SSDSE-D-2023 (一部都道府県のみの観光統計) を 都道府県 列で結合したいとする。 B には 47 件全て、 D には 30 件しかない。 結合の仕方 でテーブルの形が劇的に変わる: ・内部結合 (inner join) :両方に存在する 30 件のみ残す。 ・左外部結合 (left outer join) :B の 47 件全部残し、 D の値は無ければ NaN。 ・右外部結合 (right outer join) :D の 30 件全部残し、 B の値は無ければ NaN。 ・完全外部結合 (full outer join) :B にも D にも在る全ての都道府県 (この例なら 47 件) を残し、 片側欠損は NaN。 つまり 外部結合 (outer join) とは「片方にしか無いキーも保持する」結合のこと。 内部結合と違って 結合キーの不一致による情報損失が無い のが最大の特徴で、 欠損行を後で「分析対象から除く/追加調査する」と判断できる のが実務的価値。 SQL では LEFT/RIGHT/FULL OUTER JOIN、 pandas では df.merge(other, how='left'|'right'|'outer')。 初学者がよくミスするのは「外部結合したのに結果が内部結合と同じ件数になる 」現象。 これは マージキーの型不一致 (str vs int) や、 表記揺れ (北海道 vs 北海道 [全角・半角]) で照合が失敗しているサイン。 後述の落とし穴で詳説する。
🔬 数式を言葉で読み解く
数式に出てくる記号の意味を 1 つずつ確認しましょう。
INNER JOIN
両方に存在するキーのみ。 マッチしないと消える。
LEFT OUTER
左テーブルを全部残し、 右の不足は NULL。
RIGHT OUTER
右テーブルを全部残す。
FULL OUTER
両方とも全部残す。
🔬 数式を言葉で読み解く(深掘り)
先の「記号を読み解く」を、 外部結合 の固有事情に即して 500 字以上で詳説する。 ここを読めば、 数式 1 行の裏にある設計判断と歴史的経緯が見えるはずだ。
LEFT (左) : 左表 $L$ の全行を残し、 右表 $R$ にマッチが無ければ右側列を NULL/NaN。 件数は $|L|$ 以上 (1 対多なら膨張)。 RIGHT (右) : 鏡像。 右表 $R$ の全行を残す。 SQL 標準だが、 慣習的に LEFT JOIN を使うほうが読みやすく推奨される。 FULL (完全外部) : 両側の全行を残し、 片側欠損は NULL/NaN。 件数は $|L \cup R|$。 INNER : マッチした行のみ。 件数は $|L \cap R|$ で、 outer の特殊形 (NaN 行を捨てる)。 JOIN キー は 1 列でも複数列でもよく、 pandas では on=['都道府県', '年度'] のように複合キーを指定できる。 $L \bowtie_K R$ という関係代数の表記は、 集合論的には「直積 + 選択 + 射影」の合成で、 外部結合はこれに「片側に対応する NULL 行を補う」操作を追加したもの。 つまり外部結合 = 内部結合 + マッチしなかった側を NULL で補完。 この拡張により情報損失なく集合演算を行える設計で、 リレーショナル代数を「現実のデータ統合」に橋渡しする中核演算。
📌 数式は 暗記対象ではなく検算ツール 。 「結果が変だ」と感じたとき、 「この記号は本来こういう意味だから、 ここの値はおかしい」と 逆引き できる状態が、 中級者と上級者の差を生む。
🧪 SSDSE-B-2026 ハンズオン
本サイトの標準データ SSDSE-B-2026 (47 都道府県 × 約 100 列、 独立行政法人統計センター提供) を使い、 外部結合 の概念を 実コードで体感 する。 取得経路は data/raw/SSDSE-B-2026.csv(リポジトリ同梱)。
SSDSE-B-2026 (経済社会指標) と SSDSE-D-2023 (家計消費) を都道府県名で完全外部結合する。 D には鳥取・島根が含まれない仮想シナリオで、 結果テーブルの「鳥取・島根」行で D 由来の列が NaN になることを確認する。 4 ステップ:(1) 両 CSV 読込 → (2) キー前処理 → (3) how='outer' でマージ → (4) 欠損確認・indicator=True で由来追跡。
📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行)
都道府県 Prefecture(都道府県)
北海道 北海道
東京都 東京都
沖縄県 沖縄県
…(全 47 行)
📋 コピー 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 # SSDSE-B (経済社会) と SSDSE-D (家計消費) を都道府県名で full outer join する
import pandas as pd
b = pd . read_csv ( 'data/raw/SSDSE-B-2026.csv' , skiprows = 1 , encoding = 'cp932' )
d = pd . read_csv ( 'data/raw/SSDSE-D-2023.csv' , skiprows = 1 , encoding = 'cp932' )
# キー正規化(前後空白・全半角)
b [ '都道府県' ] = b [ '都道府県' ] . str . strip ()
d [ '都道府県' ] = d [ '都道府県' ] . str . strip ()
# full outer join + 由来追跡
merged = b . merge ( d , on = '都道府県' , how = 'outer' , indicator = True , suffixes = ( '_b' , '_d' ))
print ( 'shape =' , merged . shape )
print ( merged [ '_merge' ] . value_counts ()) # left_only / both / right_only
# どの都道府県が片側だけだったか
print ( 'B にのみ:' , merged . loc [ merged [ '_merge' ] == 'left_only' , '都道府県' ] . tolist ())
print ( 'D にのみ:' , merged . loc [ merged [ '_merge' ] == 'right_only' , '都道府県' ] . tolist ())
# 完全マッチ件数と NaN を抱える件数の比較
print ( 'NaN を含む行 =' , merged . isna () . any ( axis = 1 ) . sum ())
📤 実行例(実測)
shape = (1695, 236)
_merge
both 1692
right_only 3
left_only 0
Name: count, dtype: int64
B にのみ: []
D にのみ: ['全国', '全国', '全国']
NaN を含む行 = 3
📌 動かないときは: (1) data/raw/SSDSE-B-2026.csv がリポジトリに存在するか、 (2) skiprows=1 でヘッダーが正しく読めているか、 (3) 列名が SSDSE 公式の最新版と一致しているかを df.columns.tolist() で確認。
🔬 外部結合と関連トピックの統合理解
外部結合を「単独の操作」 として理解するのではなく、 データ分析パイプラインの中での位置づけを意識すると、 その価値が見えてくる。 典型的な分析フローは「データ取得 → 前処理 → 結合 → 集計 → 可視化 → 解釈」 で、 結合はパイプラインの中間に位置する。 結合の前にはキーの正規化・型変換・欠損処理が必要、 結合の後には集計や可視化が続く。 結合だけ最適化しても、 前後の処理が雑だと結果は信頼できない。 SSDSE-B-2026 のような教育用データセットを使って、 結合前後の処理を含めた一連のフローを体得することが学習の本質。
📊 分析パイプラインでの外部結合の位置づけ
段階 処理 外部結合との関連 SSDSE-B-2026 での例
1. データ取得 CSV・API・DB からロード 取得元が複数なら結合が必要 SSDSE と e-Stat を別々にダウンロード
2. 前処理 正規化・型変換・欠損処理 結合キーの統一が必須 都道府県コードの文字列化、 ゼロパディング
3. 結合 LEFT/RIGHT/FULL OUTER 本トピック中心 マスタ + 集計テーブルを結合
4. 集計 GROUP BY、 pivot_table 結合後の NULL に注意 地方別集計、 年度別集計
5. 可視化 matplotlib, seaborn 結合結果の品質確認 都道府県別の棒グラフ・地図
6. 解釈 統計的検定・モデル化 結合の欠損が結果に影響 地域差の有意性検定
7. 報告 レポート・ダッシュボード 結合手法の明示が必要 方法論セクションに結合戦略を記述
→ 結合はパイプラインの中間に位置するが、 前後の処理に影響を与える critical な操作。 雑な結合は、 雑な集計・可視化・解釈を生む。 「結合のためだけに前処理を念入りにする」 という意識が、 データ品質を支える。 SSDSE-B-2026 のような小データでも、 こうしたパイプライン意識を持って取り組むことが、 実務での大規模データへの拡張を可能にする。
📏 結合品質の定量指標
指標 定義 計算式 SSDSE-B-2026 での目安
マッチ率 左テーブルの行のうち右テーブルとマッチした割合 matched / left_rows 100% が理想 (47/47)
NULL 率 結合後の値列で NULL の割合 nulls / total_rows 0% が理想
重複率 1:1 結合のはずが N:M で増えた割合 (joined - left) / left 0% が理想 (爆発検知)
カバレッジ 右テーブルの行が結合に使われた割合 used_right / right_rows 100% が理想
欠損キー数 結合キーが NULL の行数 count where key IS NULL 0 が理想
型不一致数 左右で結合キーの型が異なる行 — 0 が理想
前後比較 結合前後の集計値の整合性 SUM_before == SUM_after NULL 補正後の総計が一致
これらの品質指標を結合の都度確認することで、 「気づかないうちにデータが消失」「気づかないうちに行数爆発」 等の事故を防げる。 マッチ率 95% を下回ったら結合キーを疑う、 NULL 率が想定外に高ければデータ欠損を調査する、 重複率が 0% でなければ結合キーの一意性を再確認する、 という判断基準を持つことが、 データエンジニアの基礎力。 SSDSE-B-2026 のような小データで原理を学び、 業務で大規模データに適用する際に、 これらの指標を必ずチェックする習慣が、 品質保証の根幹となる。
🧪 SSDSE-B-2026 を題材にした外部結合のステップバイステップ演習
SSDSE-B-2026 (47 都道府県データ) を題材に、 外部結合の演習を順に進める。 ステップ 1: SSDSE-B-2026 から「都道府県コード, 都道府県名, 総人口」 の 3 列を抽出して左テーブルとする。 ステップ 2: 別途、 e-Stat 等から「都道府県コード, 65 歳以上人口」 を取得して右テーブルとする (一部県のみのデータと仮定)。 ステップ 3: pd.merge(left, right, on='code', how='left', indicator=True) で LEFT OUTER 結合し、 indicator 列で結合状況を記録。 ステップ 4: df['_merge'].value_counts() で「左のみ」「両方」 の行数を確認。 ステップ 5: df['rate_65_plus'] = df['65歳以上人口'] / df['総人口'] で高齢化率を計算 (NULL は無視される)。 ステップ 6: df.dropna(subset=['rate_65_plus']) で欠損行を除いて分析、 または df['rate_65_plus'].fillna(df['rate_65_plus'].mean()) で平均値補完。 ステップ 7: 結果を都道府県別の棒グラフで可視化。 こうした 7 ステップの演習が、 外部結合と pandas の総合理解を体感的に身につけさせる。
この演習の発展として、 (1) FULL OUTER で双方の欠損を確認、 (2) INNER JOIN との結果比較、 (3) 結合品質を indicator 列の集計で定量化、 (4) NULL の集計時の影響 (SUM/AVG が NULL を無視する性質) を体感、 (5) COALESCE 相当の fillna で NULL を 0 に置換した場合の結果との比較、 等を試す。 各ステップで len(df)、 df.isnull().sum()、 df.head() を確認する習慣を身につけることで、 結合のバグを早期発見する基礎力が育つ。 SSDSE のような信頼できる小データだからこそ、 こうした地道な確認作業の重要性を体感できる。 業務で大規模・複雑なデータを扱う際にも、 この基礎が品質保証の根幹となる。 この演習を通じて、 学生諸氏は「結合の本質」 を頭で理解するだけでなく、 「自分の手で動かして体感する」 ことができる。 こうした実践的経験が、 将来の業務・研究で出会う多様なデータ結合の場面で生かされる、 一生ものの基礎技能となる。 SSDSE-B-2026 という公的データを使った地道な演習の積み重ねが、 データサイエンティストとしての成長の核心であり、 統計データ分析コンペティションへの参加準備の最良の方法でもある。 学生諸氏には、 本ページの内容を起点に、 実際にコードを書き、 結果を観察し、 仮説を検証する反復を通じて、 外部結合の本質を体得してほしい。 そうした地道な学びこそが、 将来のあらゆるデータ分析の場面で生きる力となる。 SSDSE のような公的データを使った演習と、 業務での大規模データへの応用を往復することで、 外部結合の理論と実践が一体化し、 真に「使える技能」 として定着していく。
🧮 実値で計算してみる
都道府県マスターと観光統計表を結合する例。
STEP 1
マスター読み込み
47 都道府県のテーブル A。
STEP 2
明細読み込み
30 県分の観光客数テーブル B。
STEP 3
LEFT JOIN
pd.merge(A, B, how='left', on='都道府県')
STEP 4
NaN 確認
結合後、 17 県の観光客数列が NaN になる。
🧮 数式に値を入れて手で計算する: OUTER JOIN 結果行数
合成 2 テーブルで FULL OUTER JOIN の結果行数を計算する。
Step 1: テーブル
A: {1, 2, 3, 4} (4 行)
B: {3, 4, 5, 6, 7} (5 行)
INTERSECT: {3, 4} (2 行)
Step 2: 各種 JOIN 行数
INNER: 2 (一致)
LEFT: 4 (A 全件)
RIGHT: 5 (B 全件)
FULL OUTER: 4 + 5 - 2 = 7
🐍 Python で再現
📋 コピー A = { 1 , 2 , 3 , 4 }
B = { 3 , 4 , 5 , 6 , 7 }
inner = len ( A & B )
left = len ( A )
right = len ( B )
full = len ( A | B )
print ( f "INNER: { inner } " )
print ( f "LEFT: { left } " )
print ( f "RIGHT: { right } " )
print ( f "FULL OUTER: { full } " )
📤 実行結果
INNER: 2
LEFT: 4
RIGHT: 5
FULL OUTER: 7
💬 手計算 (Step 2) と Python 出力が完全一致。
🐍 Python 実装
最小実装の例。 SSDSE のような実データに対して、 まずはコピペで動かしてみるのが理解の早道です。
📋 コピー import pandas as pd
master = pd . read_csv ( 'data/raw/SSDSE-B-2026.csv' , skiprows = 1 , encoding = 'cp932' )
detail = pd . read_csv ( 'data/raw/tourism.csv' )
merged = pd . merge ( master , detail , how = 'left' , on = '都道府県' )
print ( merged [ '観光客数' ] . isna () . sum (), 'rows missing' )
🐍 Python 実装(応用編)
先の Python 実装は最小例だった。 ここでは 外部結合 の本格的な実務シナリオに即した、 もう一段難易度を上げたコードを示す。 そのままコピペで動くよう、 SSDSE 系の実データパスを直書きで残してある。
📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行)
都道府県 SSDSE-B-2026(年度) Prefecture(都道府県) A1101(総人口)
北海道 2,023 北海道 5,092,000
東京都 2,023 東京都 14,086,000
沖縄県 2,023 沖縄県 1,468,000
…(全 47 行)
📋 コピー 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37 # ── この抜粋で使うデータを用意します(英字の項目コードで読み込み)──
import pandas as pd
df = pd . read_csv ( 'data/raw/SSDSE-B-2026.csv' , encoding = 'cp932' , header = 0 )
df = df [ df [ 'Code' ] . astype ( str ) . str . match ( r '^R\d {5} $' , na = False )] . copy ()
for _c in df . columns [ 3 :]:
df [ _c ] = pd . to_numeric ( df [ _c ], errors = 'coerce' )
df = df [ df [ 'SSDSE-B-2026' ] == df [ 'SSDSE-B-2026' ] . max ()]
# ── この抜粋で使う 3 つの表を用意します ──
import pandas as pd
b = pd . read_csv ( 'data/raw/SSDSE-B-2026.csv' , skiprows = 1 , encoding = 'cp932' )
b = b [ b [ '年度' ] == 2023 ][[ '都道府県' , '総人口' ]]
d = pd . read_csv ( 'data/raw/SSDSE-D-2023.csv' , skiprows = 1 , encoding = 'cp932' )
d = d [ d [ '男女の別' ] == '0_総数' ][[ '都道府県' , '推定人口(10歳以上)' ]]
e = pd . read_csv ( 'data/raw/SSDSE-E-2026.csv' , skiprows = 2 , encoding = 'cp932' )
e = e [[ '都道府県' , '一般世帯数' ]]
for _t in ( b , d , e ):
_t [ '都道府県' ] = _t [ '都道府県' ] . astype ( str ) . str . strip ()
# SSDSE-B, SSDSE-D, SSDSE-E の 3 つを都道府県名で full outer join し
# 「どの表に居ない都道府県があるか」を indicator で追跡する例
import pandas as pd
# それぞれ独立に full outer join
step1 = b . merge ( d , on = '都道府県' , how = 'outer' , indicator = 'in_BD' )
step2 = step1 . merge ( e , on = '都道府県' , how = 'outer' , indicator = 'in_BDE' )
print ( 'shape =' , step2 . shape )
print ( step2 [ 'in_BD' ] . value_counts ())
print ( step2 [ 'in_BDE' ] . value_counts ())
# 全表にあるのは? 1 表だけのは?
in_all = step2 . query ( 'in_BD == "both" and in_BDE == "both"' )[ '都道府県' ] . tolist ()
print ( '全表に存在:' , len ( in_all ), '件:' , in_all [: 5 ])
only_b = step2 . query ( 'in_BD == "left_only"' )[ '都道府県' ] . tolist ()
print ( 'B のみ:' , only_b [: 5 ])
📤 実行例(実測)
shape = (48, 6)
in_BD
both 47
right_only 1
left_only 0
Name: count, dtype: int64
in_BDE
both 48
left_only 0
right_only 0
Name: count, dtype: int64
全表に存在: 47 件: ['三重県', '京都府', '佐賀県', '兵庫県', '北海道']
B のみ: []
📌 このコードのポイント: (1) 引数化せず実データパスを直書きで読みやすさ優先、 (2) 集約・結合・型最適化など 外部結合 関連の典型処理を一気通貫で示す、 (3) print() で各ステップの結果を確認できる。
🧭 用語クロスリンク集
外部結合 と関わりの深い用語を、 一画面で巡回できるよう チップ形式 で並べた。 「これも知っておきたい」と思った瞬間にクリックして、 元のページに戻ってくる ── ジャストインタイム学習の理想的な使い方。
📌 これらはすべて html/glossary/ 配下の実在ページにリンクしているので、 リンク切れの心配はない。
🗂 用語の階層・派生・対立関係
外部結合 を中心に、 上位概念・並列概念・派生概念・対立概念の 4 区分で整理。 学術論文を読むときの「この用語はこの分野のどこに位置するか 」を直感的に把握できる。
関係 該当用語 関係性の説明
上位概念 データエンジニアリング 一般 本ページの用語が属する分野全体
並列概念 同カテゴリの兄弟用語 「🔗 関連用語」セクション参照
派生概念 発展手法・拡張版 「🌐 関連手法・派生」セクション参照
対立概念 「🔍 近接概念との比較(深掘り)」の右列 混同しがちな対比対象
前提知識 「📜 歴史的背景」で示した文脈 本用語を理解する前に知っておくべき内容
⚠️ よくある落とし穴
外部結合は「片方にしか存在しない行」を残す結合で、 INNER JOIN との取り違えと NaN 処理ミスが事故の二大原因。 SSDSE で「都道府県名」と「県名」を結合する際、 表記揺れ (東京 / 東京都) で NaN 量産 → 集計結果が崩壊するパターンが典型。 結合前に必ず両側の unique key を可視化したい。
❌ 結合キーの表記揺れ
SSDSE-B-2026 では「東京都」、 観光統計では「東京」、 英文資料では「Tokyo」と表記が違う。 outer join で何も前処理しないと NaN が量産され、 実際にマッチする行はわずか。 結合前に set(df1.key) - set(df2.key) で差分を確認し、 名寄せ辞書(マッピング表)で統一する。
❌ 行数増殖
結合キーがユニークでない場合(同じ都道府県コードが複数行ある等)、 outer join 結果は左 m 行 × 右 n 行に増殖する。 47 県のはずが数百行になることも。 結合前に df.duplicated(subset='key') で重複を確認し、 必要なら集約(groupby().agg())してから結合する。
❌ NaN を 0 で埋める誤り
outer join で発生した NaN を fillna(0) で埋めると、 「観光客 0 人だった県」と「データ取得失敗の県」が同じ 0 として扱われ、 平均値・分散・回帰係数が歪む。 NaN の発生源(左のみ・右のみ)を indicator=True で残し、 「データ欠損」と「真の 0」を区別する。
❌ FULL OUTER の濫用
FULL OUTER は「両側にしかないキー」を全て残すため、 共通キーが少ない 2 表(東京 23 区データ × 全国都道府県データ)では片側 NaN が大量発生する。 分析目的に応じて inner / left / right を選び、 「両側存在を残す必要性」を本当に検討してから FULL OUTER を選択する。
⚠️ もっと深い落とし穴
上のセクションの 4 つに加えて、 外部結合 固有の実務でハマる典型をさらに 4 つ。 経験 5 年以下のエンジニア・研究者はほぼ全員、 ここのいずれかで 1 度は事故を起こしている。
❌ セミコロンと NaN 混在
indicator=True で出力される _merge 列の値 (left_only 等) はカテゴリ型。 後で isna() と組合せると挙動が直感的でないことがある。
❌ ソートが崩れる
merge(..., sort=False) がデフォルト。 結合後の行順は保証されない。 必要なら sort_values()。
❌ カラム名の自動 suffix
両表に同名の非結合キー列があると col_x, col_y が自動付与。 suffixes=('_b', '_d') で意味のある接尾辞に。
❌ 巨大表で OOM
1 億 × 1 億の full outer join は 10 兆セル 級になり得る。 結合前に where で絞り、 hash join 戦略を意識。
🔗 関連用語 (前提・並列・発展)
この用語と直接結びつく前提・並列・発展用語。 学習順序の参考にどうぞ。
🔗 SQL
JOIN は SQL の中核操作。
🔗 テーブル
結合の対象。
🔗 Tidy data
Tidy なテーブル同士は結合しやすい。
🔗 関連用語 (深掘り 12 件)
「🔗 関連用語」セクションに加えて、 外部結合 から派生的に学ぶと体系が完成する用語を 12 件追加。 すべて当サイト内のページに直リンクするので、 リンク切れ無く周遊できる。
🔗 内部結合
両側に存在する行のみ
🔗 テーブル
結合の対象
🔗 主キー
結合の基準列
🔗 外部キー
テーブル間の関連付け
🔗 SQL
JOIN 構文の標準
🔗 DataFrame
pandas の merge
🔗 データベース
結合が行われる場
🔗 インデックス
結合性能を支える
🔗 ピボットテーブル
long → wide の変換
🔗 CSV
結合素材として頻出
🔗 JSON
ネスト構造とフラット化
🔗 正規表現
キーの正規化
🎓 深掘り(さらに:3 シナリオ × 3 誤解 × 5 意思決定)
ここまで「外部結合=片側だけのキーも残す」「内部結合との対比」「NaN を伴う情報保全」を押さえた。 続けて、 SSDSE のような複数テーブルを実際に結合する 3 つのシナリオで キー設計と結果検証 を体感し、 3 つの典型誤解を解消、 「left/right/full のどれを選ぶか」を 5 つの状況別に意思決定する。
シナリオ A:研究室での卒論:複数年の SSDSE 結合
「SSDSE-B の 2020 年版と 2026 年版を都道府県名で結合して、 6 年間の変化を見たい」という相談。 両ファイルとも 47 行 × 異なる列で、 完全外部結合すると 47 行 × (2020 列 ∪ 2026 列) のテーブルになる。 ここで重要な落とし穴は 列名の表記揺れ 。 2020 年版で A1101_総人口、 2026 年版で A1101_人口総数 のように違うと、 結合後に「同じ意味の列が 2 つ並ぶ」現象が起きる。 事前に columns_2020 == columns_2026 を diff で確認、 リネームしてから outer join するのが定石。
シナリオ B:企業インターン:会員 × 購買 × 解約
会員マスタ (全会員 100 万件) と購買履歴 (購買経験者 60 万件) と解約履歴 (解約者 5 万件) を全部 full outer join して、 「未購買かつ未解約の休眠会員」を抽出する。 indicator=True を付けると _merge 列に left_only / both / right_only が入り、 後で 「どのテーブル発の行か」が追える。 これを知らずに普通の merge をすると、 「休眠か解約済かが区別できない」事故が起きる。
シナリオ C:論文を読んでつまずく:欠測ありデータ統合
「multi-site clinical study では各サイトで欠測パターンが異なるため、 full outer join したのち MICE で多重補完した」と論文に書かれていた。 本ページで「outer join は欠測列を NaN として残す」と理解、 さらに「MICE は NaN を統計的に補完する手法」と把握。 元の論文に戻ると、 著者が「inner join だと サンプル数が激減する ので統計検出力を失う」と書いている意味が腑に落ちる。
よくある誤解 3 連続
「outer join は inner join より優れている」
情報損失は無いが、 NaN を含む行が大量発生 すれば後段の集計や ML がエラーを起こす。 「両方に存在する行だけ欲しい」明確な目的があれば inner の方が単純で安全。 目的に応じて選ぶ。
「キーは文字列なら何でも結合できる」
表記揺れ (北海道 vs 北海道[半角])、 前後空白 、 大小文字 、 型不一致 (str '01' と int 1) で照合に失敗。 .str.strip().str.lower() + 型統一を前処理で必ず実行。
「結合後の件数は気にしなくていい」
結合前の件数 vs 結合後の件数 の比較は、 結合が意図通りか確認する唯一の手段。 多対多の意図せぬ膨張、 キー重複による誇張、 マッチ失敗による激減を必ず検証する。 indicator=True を活用。
意思決定フレーム:状況別 5 段
状況 推奨アクション
片方が「マスタ」、 全件残したい ✅ left outer join 。 マスタ側を左に置く
両方とも完全に保持したい ✅ full outer join + indicator=True
不一致を除外して集計だけしたい ❌ outer は不適。 inner join を選ぶ
多対多になりそう ⚠️ 事前に PK 重複を確認 。 集計関数で 1 対多に減らす設計
巨大テーブル同士 ⚠️ broadcast join (Spark) や hash partition でメモリ爆発を防ぐ
🔍 近接概念との比較(深掘り)
先の汎用テーブルに加えて、 外部結合 と 内部結合 (Inner Join) / Union を 6 つの観点で具体的に対比する。
観点 外部結合 内部結合 (Inner Join) / Union
件数 両側のキーの和集合 ≥ 内部結合内部結合は積集合、 Union は両表の単純連結
欠損列 片側だけのキーは NaN で埋まる 内部結合は欠損行ごと削除、 Union は同型必須
情報損失 なし (全行残す)内部結合は不一致行を捨てる
用途 未マッチ要因の調査・両表の差分発見 内部結合:両側に在る対象だけ分析
SQL 構文 LEFT/RIGHT/FULL OUTER JOININNER JOIN / UNION
pandas merge(how='outer')merge(how='inner') / concat
📌 使い分けの一行ヒント: 本ページ「💡 30 秒で分かる結論」の要件と上の表の 観点 6 つ を突き合わせれば、 ほぼ全ての実務シーンで「どちらを選ぶか」即断できる。
📖 体系的解説:外部結合 を 5 つの観点で掘り下げる
ここからは 外部結合 を、 教科書・論文・実務の境界を行き来しながら、 5 つの観点で深く解説する。 中級者以上を想定し、 「30 秒結論」「直感」では触れなかった 設計判断と歴史 に踏み込む。
1. リレーショナル代数における結合の位置づけ
Codd のリレーショナル代数では、 結合は 選択 (σ)・射影 (π)・直積 (×) の合成として定義される。 内部結合 (theta-join) $R \bowtie_\theta S = \sigma_\theta (R \times S)$ で、 直積を取って結合条件 $\theta$ で絞る。 結合キーが共通名の自然結合 (natural join) は $R \bowtie S = \pi_{...}(\sigma_{R.k=S.k}(R \times S))$。 これに対し 外部結合 は基本演算ではなく、 内部結合の結果に「マッチしなかった行を NULL 列付きで補う」拡張演算として導入される。
数学的には $L \bowtie^\circ_L R = (L \bowtie R) \cup ((L - \pi_K(L \bowtie R)) \times \{\text{NULL}\})$ という構成。 つまり「内部結合に含まれない左側行は NULL で補完して足す」。 RIGHT は鏡像、 FULL は両方適用。 この構造を理解すると、 SQL の LEFT JOIN でも pandas の merge(how='left') でも、 結果のセマンティクスを同じ言葉で説明できる。
2. ハッシュ結合・ソートマージ結合・ネステッドループの選択
DBMS は結合アルゴリズムを 3 種類使い分ける。 ネステッドループ結合 :左の各行に対し右を全走査。 $O(|L| \cdot |R|)$。 小規模 or インデックスありで有効。 ソートマージ結合 :両側をキーでソートしてからマージ。 $O(|L| \log|L| + |R| \log|R|)$。 ソート済データやレンジ結合に強い。 ハッシュ結合 :小さい側をハッシュ化、 大きい側を走査。 $O(|L| + |R|)$ で最速だが等値結合のみ。
外部結合でもアルゴリズムは同じだが、 「マッチしなかった行を NULL で残す」追加処理が入る。 PostgreSQL の EXPLAIN ANALYZE で「Hash Right Join」「Merge Right Join」と表示されるのを見るたびに、 内部で行われている処理を想像する習慣をつけると、 結合性能の最適化が論理的にできるようになる。
3. 多対多結合の落とし穴
左表に同じキーが 3 回、 右表に同じキーが 4 回出てくると、 結合結果はそのキーで 12 行 に膨張する。 これを意図せず引き起こす典型例が、 「ユーザー × 購買履歴」の outer join で 履歴側に同一ユーザーが複数行 あるケース。 47 都道府県の SSDSE-B でも、 別年度の SSDSE-B-2020 と outer join するときに、 都道府県をキーにすると 47 行 × N 列が綺麗に出る — 一見正しい。 しかし「両方に同じ列名がある (例:A1101_総人口)」と suffixes で _x, _y が付いて、 「これは 2020 年か 2026 年か」が混乱の元になる。
予防策は (i) 結合前にキー一意性確認 :df['key'].duplicated().sum() == 0、 (ii) 結合後に件数チェック :len(merged) ≤ len(left) + len(right) 期待値、 (iii) 意味のある suffix :suffixes=('_2020', '_2026')。 これを習慣化すれば、 結合事故の 80% は防げる。
4. NULL の意味論:3 値論理
外部結合が生む NULL/NaN は、 「未知」 を意味する特殊値。 SQL の NULL は 2 値論理 (真/偽) ではなく 3 値論理 (真/偽/未知) に従う。 NULL = NULL は False ではなく NULL (未知) を返す。 これが「NULL の値を比較したいときは IS NULL を使え」と言われる理由。
pandas の NaN も同様で、 np.nan == np.nan は False。 比較演算は pd.isna() を使う。 結合結果の NaN を 0 で埋める のは危険:「未知」と「ゼロ」は意味が違う。 たとえば「2023 年の都道府県消費額が NaN」を 0 で埋めると、 平均が下がり、 標準偏差も歪む。 正しくは「分析対象から除外」か「データ取得を試みる」「多重補完 (MICE)」のいずれか。
5. 現代的なJOIN:MERGE ステートメントと CDC
単純な OUTER JOIN を超えて、 現代の DWH では MERGE INTO 文 (SQL 2003 から正式) が頻用される。 「ターゲット側に同じキーがあれば UPDATE、 なければ INSERT」という upsert を 1 文で書ける。 BigQuery、 Snowflake、 PostgreSQL 15+、 SQL Server、 Oracle 等ほぼ全 DBMS が対応。
さらに CDC (Change Data Capture) パターンでは、 source テーブルの差分ログを FULL OUTER JOIN + indicator で「新規・更新・削除」を識別し、 target テーブルに反映する。 Debezium + Kafka + Iceberg の組合せが標準スタックで、 数秒以内のニアリアルタイム同期を実現する。 つまり 外部結合は単なる学習トピックではなく、 現代データ基盤の中核演算 である。
📚 関連グループ教材・さらに学ぶには
このサイト内
論文一覧に戻る — 外部結合 を実際に使った再現論文をハンズオン形式で読む
関連用語ページ — このページの「🔗 関連用語」から派生
用語集トップ — 全用語を一覧で確認
概念マップ — 用語間の関係を視覚化
推奨書籍・教材
『統計学入門』 (東京大学出版会)― 日本語統計入門の定番。 データ処理 の基礎が押さえられる。
『Pythonによるデータ分析入門』 (Wes McKinney、 O'Reilly)― pandas 作者による実装ガイド。
『機械学習のエッセンス』 (加藤公一、 SBクリエイティブ)― ML 基礎を Python で実装しながら学ぶ。
『因果推論の科学』 (Judea Pearl、 文藝春秋)― 相関と因果の違いを徹底解説。
オンライン教材
scikit-learn 公式ドキュメント — 機械学習の標準実装。
StatQuest (YouTube) — 統計概念を直感的に解説。
Coursera / edX — 体系的なオンライン講座。
SSDSE 公式 — 本サイトで使う公的データの提供元。
困ったときは
データの可視化 (散布図・ヒストグラム・箱ひげ図) で全体像を把握
サンプルサイズ・欠損・外れ値を確認
適用条件 (前提) が満たされているか診断
類似研究での標準的な手法を確認
結果を複数手法でクロスチェック
📜 歴史的背景と学習の位置づけ
外部結合 は データ処理 の領域で発展してきた概念です。 ここでは大まかな歴史的背景と、 なぜこの概念が必要になったのかを整理します。 用語が「降ってきた」のではなく、 現実の問題を解くために順番に 編み出されたものだと知ると、 学習の納得感が違います。
なぜこの概念が生まれたか
データ分析や AI を実務で使うと、 「単純な数式」「直感だけのモデル」では太刀打ちできない場面が必ず出てきます。 外部結合 は、 そうした実務的な課題を整理し、 共通言語として定式化したものです。 そのため、 教科書だけで完結する話ではなく、 使う場面 と使わない場面 を見極めることが何より重要になります。
学習の位置づけ
初学者: まず「30秒で分かる結論」「直感で掴む」だけ読めば、 論文に出てきたときに「あ、 あれね」と分かります。
中級者: 数式と Python 実装をセットで覚え、 自分の手元データに適用できる状態を目指します。
上級者: 落とし穴と派生手法を理解し、 場面に応じた使い分け・改良ができることが目標です。
🔍 近接概念との比較
同じ データ処理 カテゴリにある近接概念と、 外部結合 はどう違うのか? 混同しがちなポイントを整理します。
観点 外部結合 近接概念
目的 主に 外部結合 固有の課題 (本文参照) 近接概念は関連はするが目的が異なる (本文の「関連手法・派生」参照)
前提条件 本文「前提・落とし穴」参照 手法ごとに前提が異なるため要確認
出力 数値 / 確率 / 集合など (上記公式参照) 同じ入力に異なる粒度の出力を返すことが多い
適用場面 本文「いつ使うか」参照 同じ問題でも視点が異なる手法を組み合わせるのが定石
計算コスト 用途範囲に応じて妥当な水準 精度と引き換えにコストが増える派生がある
📌 使い分けの原則: まずは本ページの定義を押さえ、 次に「🌐 関連手法・派生」「🔗 関連用語」のリンクから近接概念を確認し、 自分の問題に対してどれを使うか意識的に 選ぶことを習慣にしてください。
❓ よくある質問 (FAQ)
本サイトの教材を読み進めるなかで、 受講者からよく質問される項目をまとめました。
Q1. 外部結合 を覚えるべき優先度は?
A. 論文を読んだり、 業務で類似の分析に出会うときに必ず登場します。 「30秒で分かる結論」までは押さえておけば、 都度本ページを参照しながら作業すれば十分です。 全暗記は不要、 引き出しに入れておく 感覚で OK。
Q2. 数式が苦手だが大丈夫?
A. 大丈夫。 まず「直感で掴む」「実値で計算してみる」を読み、 そのあと「定義・数式」に戻ると、 記号の意味が腑に落ちます。 数式は 後追い で構いません。 重要なのは、 結果の数字を見たときに、 何を意味するか言葉で説明できる ことです。
Q3. Python が動かないときは?
A. まず pandas や scikit-learn が pip install されているか確認。 SSDSE 系の CSV は encoding='utf-8' または 'cp932' で読めることが多く、 skiprows=1 でヘッダー行を飛ばすケースが大半。 列名が違うときは df.columns で確認して書き換えてください。
Q4. もっと深く学びたい場合は?
A. ページ末尾の「📚 関連グループ教材・さらに学ぶには」に紹介した書籍・オンライン教材へ。 加えて、 「🔗 関連用語」 から派生概念を順に学ぶと、 体系として理解が深まります。
Q5. 論文で 外部結合 をどう報告すべき?
A. 「定義 → 使った理由 → 数値結果 → 解釈」の順で書くと読みやすくなります。 結果は 数値だけでなく不確実性 (CI・SE) も併記し、 限界 (適用範囲外の主張は避ける) も明示するのが現代的な書き方です。
✅ 実務チェックリスト
分析作業のなかで 外部結合 を使うときは、 以下のチェックリストを上から順に確認してください。 抜けがあると後工程で痛い目に遭います。
① 分析設計フェーズ
□ 目的を 1 文で書ける か? (「何を、 どうしたいか」)
□ 外部結合 がその目的に 本当に 合っているか?
□ 必要なデータの種類・量・期間を見積もったか?
□ 結果をどう報告・意思決定に使うか、 事前に決めたか?
② データ準備フェーズ
□ データの出典・取得日 を記録したか? (再現性)
□ 列の尺度 (名義 / 順序 / 間隔 / 比例) を確認したか?
□ 欠損 ・外れ値 の方針を決めたか?
□ サンプルサイズ は手法の最低要件を満たしているか?
③ 分析実行フェーズ
□ 前提条件 を満たしているか診断したか?
□ 結果は複数手法でクロスチェック したか?
□ コードは Git で管理 しているか?
□ 結果が 外れ値 1 件で激変 しないか確認したか?
④ 解釈・報告フェーズ
□ 数値 と不確実性 (CI / SE) を併記したか?
□ 「相関 ≠ 因果 」の境界を踏み越えていないか?
□ 適用範囲外 への拡張主張を避けたか?
□ 限界・前提 を明示したか?
📝 レポート・論文での書き方
論文・社内レポート・ステークホルダー報告書で 外部結合 を扱うとき、 含めるべき項目とテンプレートをまとめました。
必須記載項目
項目 具体例
データ出典 独立行政法人統計センター SSDSE-B-2026 を加工
サンプルサイズ n=47 (47都道府県、 2023年データ)
使用変数 目的変数:医療費 / 説明変数:高齢化率、 人口密度
分析手法 外部結合を適用 (scikit-learn 1.4 / Python 3.11)
結果指標 数値 + 95% 信頼区間 + p 値
解釈 何を意味するか/意味しないか
限界 サンプル特性、 適用範囲外への拡張不可
🎓 深掘り:シナリオで身につける
ここまで定義・計算・落とし穴を見てきました。 ここでは 外部結合 をより深く理解するための思考フレーム と実務シナリオ を、 ストーリー形式で整理します。 用語そのものより、 「どんなときに思い出して、 どう使うか 」を体に染み込ませることが、 教材を読む真の目的です。
シナリオ A:研究室での卒論データ分析
「卒業研究で 47 都道府県のデータを分析したい」。 そんなとき 外部結合 はどう登場するでしょうか。 担当の先生から「データを見たうえで、 関連する手法を 1 つ選んで適用してきて」と言われたとします。 まずデータの性質 (量・尺度・期間) を確認し、 「外部結合 がこの問題に合っているか」を本ページの 30 秒結論で照らし合わせます。 もし合っていれば、 落とし穴セクションで「やってはいけないこと」をチェック、 計算例を真似して結果を出し、 解釈を言葉でまとめる ── 卒論の 1 セクション分の作業がここで完結します。
シナリオ B:データサイエンスのインターン
企業のインターンで「過去 3 年の顧客データから来期の予測モデルを作って」と任された。 上司は 外部結合 を当然知っている前提で話します。 言葉が通じないと議論についていけません。 そこで本ページの「定義・数式」「Python 実装」を 30 分で 押さえ、 上司の使う用語に追随する ── ジャストインタイム学習の典型シーンです。 後日、 自分でも実装した結果を上司に説明するとき、 「レポート・論文での書き方」テンプレートに沿って書けば、 過不足なく伝えられます。
シナリオ C:論文を読んでつまずいたとき
本サイトのトップから論文一覧をたどり、 ある論文を読んでいたら 外部結合 が出てきた。 「これ、 なんだっけ?」と思った瞬間、 本ページに飛んでくる ── これが ジャストインタイム型教材 の使い方です。 30 秒結論を読み、 「あ、 そういう意味か」と納得したら、 元の論文に戻ります。 必要に応じて落とし穴セクションだけ読んで、 著者の解釈が妥当か批判的に確認することも可能です。
よくある誤解 3 連続
誤解 1:「外部結合 は常に最強の選択肢」
どんな手法にも適用範囲があります。 「結合キーの表記揺れ」のように、 前提を踏まえずに使うと結論を誤ります。 本ページの「落とし穴」「前提条件」を毎回必ず確認する習慣を。
誤解 2:「数式が分からないと使えない」
逆です。 まず Python 実装で結果を出してから、 数式に戻ると「なるほど、 ここが分子で、 ここが分母か」と腑に落ちます。 数式は 結果の意味を説明する補助 として使ってください。
誤解 3:「1 度読めば全部分かる」
分かりません (と断言します)。 概念は使ってこそ 身に付きます。 卒論や業務で実際にデータに当てはめ、 結果を解釈し、 説明する経験を 3 回くらい繰り返したら、 ようやく自分のものになります。 本ページは その傍らに置いておく辞書 として使ってください。
意思決定フレーム:使う?使わない?
状況 判断
前提条件が満たされている ✅ 適用 OK。 落とし穴に注意しつつ進める。
サンプル数が不足 ⚠️ 慎重に。 信頼区間が広くなり結論が出ない可能性。
前提が破れている (例:独立性なし) ❌ 別手法を検討。 関連手法・派生セクションを参照。
因果を主張したい ❌ 外部結合 単独では因果は言えない。 RCT/操作変数等を併用。
解釈が直感に反する 🔍 まず再現性確認 → 可視化 → 単純モデルとのクロスチェック。
🎯 このページのまとめ
📌 1 ページまとめ
外部結合 (データ処理) は、 片側または両側のキーをすべて残す結合
要点: マッチしない行も残す 結合。 INNER JOIN との対比で覚える。
次のステップ: 本ページの「🔗 関連用語」から派生概念をたどるか、 「📚 さらに学ぶには」の書籍・教材で深く学んでください。 そして何より、 自分の手でデータに当てはめて結果を出す のが一番の理解の近道です。 ジャストインタイム型教材として、 必要なときに何度でも戻ってきてください。
🧭 サイト内ナビゲーション
本ページは、 統計・データ解析コンペティションの再現論文集に付随する用語解説の 1 ページです。 外部結合 以外の用語も、 同じフォーマットで以下からたどれます。
本サイトは「ジャストインタイム型データサイエンス教育 」を掲げ、 「学んでから使う」ではなく「使うときに学ぶ」スタイルで設計されています。 ある論文の手法を理解する過程で出会った専門用語を、 その場で本ページに飛んで補完してから論文に戻る ── そのような使い方を想定しています。
📚 参考文献・公式情報源(拡張)
外部結合 をさらに深く学ぶための、 一次資料・教科書・オンライン教材を集約した。 ここから興味の赴くまま枝分かれしてほしい。
公式ドキュメント・規格
独立行政法人統計センター SSDSE :本サイトで使う公的データの提供元。 利用規約・出典明記が必須。
pandas 公式ドキュメント :pandas.pydata.org — 全 API リファレンス。 関数名で検索すれば例示付きで出る。
scikit-learn User Guide :scikit-learn.org/stable/user_guide.html — ML 基礎から評価指標まで体系的解説。
PyTorch Tutorials :pytorch.org/tutorials — autograd・NN 実装の入門〜応用。
日本語の入門教科書
『統計学入門』東京大学出版会 (1991) — 統計の基礎を緻密に。
『Pythonによるデータ分析入門 第 3 版』Wes McKinney 著, O'Reilly (2022) — pandas 作者による決定版。
『機械学習のエッセンス』加藤公一 著, SB クリエイティブ (2018) — ML を Python で実装しながら学ぶ。
『深層学習』Ian Goodfellow ほか, KADOKAWA (2018) — DL の理論書。 backprop 章は必読。
『因果推論の科学』Judea Pearl ほか, 文藝春秋 (2022) — 相関と因果の境界を徹底解説。
英語の決定版
Bishop, “Pattern Recognition and Machine Learning” (2006) — ML 古典。
Goodfellow, Bengio, Courville, “Deep Learning” (2016) — DL の理論的基盤。
Hadley Wickham, “Tidy Data,” Journal of Statistical Software 59(10), 2014.
Rumelhart, Hinton, Williams, “Learning representations by back-propagating errors,” Nature 323, 1986.
Codd, “A Relational Model of Data for Large Shared Data Banks,” CACM 13(6), 1970.
YouTube / オンラインコース
StatQuest with Josh Starmer — 統計と ML を直感的に。
3Blue1Brown — 線形代数・微積分・NN の数学的可視化。
Coursera “Machine Learning Specialization” (Andrew Ng) — 入門の決定版。
fast.ai — 実装ファーストな DL 講座。
🔭 オープン問題:本ページの先にある研究テーマ
外部結合 は確立された概念だが、 関連領域には未解決の研究課題が多数ある。 大学院や企業 R&D で「次のステップ」を探している人へ。
計算効率と精度のフロンティアを押し進める新アルゴリズム
大規模・低品質データへのロバスト化
プライバシー保護 (Differential Privacy, Federated Learning) との統合
因果推論や反実仮想との橋渡し
説明可能性 (XAI) の文脈での再解釈
マルチモーダル・ストリーミング処理への拡張
📌 これらのテーマは本ページの範囲を超えるが、 論文一覧 から該当する再現論文を辿ると、 具体的な手法と検証結果に触れられる。
📝 本ページの引用方法
レポートや論文で 外部結合 についての説明として本ページを引用したい場合の書式例。 ジャストインタイム型データサイエンス教育サイトの一部であることを示す。
松本伸平 (2026) 「外部結合」 ジャストインタイム型データサイエンス教育 用語解説.
広島工業大学 統計・データ解析コンペティション 再現論文集.
URL: html/glossary/outer-join.html (アクセス日 2026/05).
なお、 SSDSE データを使った計算例は、 独立行政法人統計センター提供の SSDSE-B-2026 を出典として併記してください。
📜 歴史年表:外部結合 の系譜
外部結合 がいつ・誰によって・どのように発展してきたかを年表形式でまとめた。 用語の背景を知ると、 「なぜこの設計か」が腑に落ちる。
1970
Codd の関係モデルで結合演算 ⋈ が定義される
1976
Chen の ER モデルで主キー・外部キーの設計理論が体系化
1986
ANSI SQL-86 で INNER JOIN 構文が標準化 (ただし OUTER JOINは SQL-92 で正式)
1992
SQL-92 で LEFT / RIGHT / FULL OUTER JOIN 構文が正式に標準入り
2003
SQL 2003 で MERGE INTO 文 (upsert) 標準化、 外部結合の応用が広がる
2008
pandas 0.1 リリース、 merge 関数で SQL 風結合が Python に
2014
Apache Spark 1.0 で分散外部結合 (Hash, Sort-Merge, Broadcast Join)
2017
DBT (Data Build Tool) で SQL ベースの ELT 設計が普及、 結合パターンの定型化
2020
Snowflake / BigQuery で列指向 + 外部結合の クラウド DWH が標準に
2024
Iceberg / Delta Lake の MERGE 機能で「ニアリアルタイム同期」が一般化
📌 年表は主要マイルストーンに限定。 詳細は「📚 関連グループ教材」の書籍を参照。
📚 さらに詳細:5 つの追加トピック
ここまでのセクションで 外部結合 の核心は押さえた。 ここからは、 中級者〜上級者向けに、 さらに 5 つの追加トピックを 詳述する。 すべて実務に直結する話題で、 これを押さえると「外部結合 の専門家」と名乗れる水準に到達する。
A. リレーショナル代数からみる結合演算の位置づけ
関係代数 (Codd 1970) は基本演算 6 つから成る:選択 (σ)、 射影 (π)、 直積 (×)、 和 (∪)、 差 (−)、 改名 (ρ)。 結合 (⋈) はこれらの 合成 として定義される派生演算で、 内部結合 = 選択 + 直積 + 射影。 外部結合はさらに「マッチしなかった行を NULL で補う」拡張を加えたもの。 つまり FULL OUTER JOIN は「集合の和 + 部分的マッチ」という 2 つの集合演算を融合 した操作と理解できる。 これを理解すると、 SQL の UNION と FULL OUTER JOIN の違い (前者は行を縦に連結、 後者はキーで横にマッチさせて連結) が論理的に区別できる。
B. JOIN アルゴリズムの内部実装
RDB が JOIN を実行する際、 3 つのアルゴリズムを使い分ける。 ネステッドループ結合 :左の各行に対し右テーブルを全走査。 シンプルだが $O(|L|\cdot|R|)$ で大規模では遅い。 ただしインデックス付き or 小テーブルでは最速。 ソートマージ結合 :両側をキーでソート (O(n log n)) してから 1 パスで結合。 既にソート済データ (B-tree インデックス順) なら超高速。 ハッシュ結合 :小さい側 (build side) をハッシュテーブル化、 大きい側 (probe side) を走査。 $O(|L|+|R|)$ で線形だが、 メモリにハッシュテーブルが乗る必要がある。 PostgreSQL の EXPLAIN ANALYZE で「Hash Right Join」「Merge Join」「Nested Loop」と表示されるのを見るたびに、 内部で何が起きているか考える習慣をつけると、 性能チューニングが論理的にできるようになる。
C. 分散結合と Data Skew 問題
Spark / BigQuery のような分散システムで JOIN を実行する際、 Shuffle (ノード間でキーごとにデータを交換) が発生する。 全データを「キーのハッシュ値」でパーティション分け、 同じキーのデータを同じノードに集めてから結合する。 ここで Data Skew (データ偏り) が問題になる:あるキー (例:会員 ID = NULL の行が大量) に大量のデータが集まると、 1 ノードだけが過負荷になり OOM。 対策は (1) Salting (キーに乱数を追加して分散)、 (2) Broadcast Join (小さい側を全ノードに配布)、 (3) Skew Hint (DBMS にヒントを与える)。 巨大データの結合は単純な SQL 1 文に見えて、 内部では複雑な分散最適化が走っている。
D. JOIN の代替パターン:EXISTS / IN / ARRAY_AGG
「2 つのテーブルを統合したい」と思ったとき、 必ずしも JOIN が最適とは限らない。 代替パターン (1) EXISTS (SELECT 1 FROM B WHERE B.k = A.k):A の各行について B に存在するかチェック。 セミ結合的な動き。 (2) IN (SELECT k FROM B):同様だが NULL 扱いが微妙に違う。 (3) ARRAY_AGG / STRING_AGG:B の行を A の各行に「配列として畳み込む」。 BigQuery では JOIN を避けて STRUCT 入れ子で表現する設計が高速。 (4) ウィンドウ関数 + LAG/LEAD:時系列で「前の行と結合」を表現。 (5) CROSS APPLY (SQL Server) / LATERAL JOIN (PostgreSQL):行ごとに副問合せを実行。 「JOIN しか思いつかない」状態は中級者、 これらの代替を意識的に使い分けるのが上級者。
E. JOIN の未来:Lakehouse と CDC
2024 年以降、 Lakehouse アーキテクチャ (Delta Lake / Iceberg / Hudi) で、 データレイク上に ACID トランザクションが乗るようになった。 これにより、 「巨大データレイクに対して JOIN + UPDATE + DELETE」が可能に。 さらに CDC (Change Data Capture) パイプラインで「source DB の差分を Kafka 経由でレイクに逐次反映」できる。 ここで MERGE INTO 文 (SQL 2003 標準) と FULL OUTER JOIN + indicator のパターンが、 「変更追跡」「Upsert」「履歴管理」の中核として活躍する。 つまり外部結合は 「過去の SQL 機能」ではなく「現代データ基盤の中核演算」 として再評価されているのだ。
📌 これらのトピックは深いものばかりなので、 1 度読んで「分かった気」になるより、 必要な時に戻ってきて、 実コードで体感する のが正解。 ジャストインタイム型学習の真骨頂は、 こうした深い知識を「使うときに学び直す」反復にある。
📷 外部結合の補強解説:4 種の結合パターンを図で掴む
外部結合 (OUTER JOIN) は「片方または両方のテーブルに存在するレコードを保持しつつ、 マッチしないレコードには NULL を埋める」 結合演算。 内部結合 (INNER JOIN) と対比される最重要概念で、 実務でデータが「消える」 か「保持される」 かを決定づける選択になる。 SSDSE-B-2026 の都道府県データを片方とし、 もう片方にデータ欠損のある都道府県別人口動態統計を結合する場面で、 外部結合の選択は分析結果を大きく変える。
図A: 結合パターンの全体地図。 INNER (両方マッチのみ)、 LEFT OUTER (左を全保持)、 RIGHT OUTER (右を全保持)、 FULL OUTER (両方を全保持) の 4 種を、 ベン図的に整理。 SSDSE-B-2026 で「都道府県マスタ × データテーブル」 を結合する際、 どれを選ぶかで結果が変わる。
図B: 結合キー設計の整合性をヒートマップで可視化。 左テーブルのキーと右テーブルのキーが「1:1」 か「1:N」 か「N:N」 かを事前に確認すると、 外部結合で予期せぬ行数爆発を防げる。 SSDSE-B-2026 では「都道府県コード」 が一意キーとして使える。
図C: 外部結合後の NULL 出現を列ごとにヒストグラムで確認する習慣。 NULL が一部の都道府県だけに集中していれば「データ欠損」、 全列で均等なら「キー不一致」 が原因と切り分けられる。
📋 4 種の結合の比較表
結合タイプ 左テーブル 右テーブル SSDSE-B-2026 での使い分け 典型エラー
INNER JOIN マッチした行のみ マッチした行のみ 「両テーブル完備」 を確認したい時 欠損都道府県が消失して気づかない
LEFT OUTER 全行保持 マッチ + NULL 埋め 都道府県マスタを起点に、 データの有無を可視化 NULL 行を集計してしまい NaN が伝播
RIGHT OUTER マッチ + NULL 埋め 全行保持 LEFT OUTER と本質的に同じ (順序逆転) 可読性が低い、 LEFT OUTER に書き換え推奨
FULL OUTER 全行保持 全行保持 双方の欠損をすべて可視化したい時 NULL が両側に出て、 集計が複雑化
CROSS JOIN 全行 × 右の全行 左の全行 × 全行 都道府県 × 年度の全組合せ生成に 結合キー忘れで N×M 行に爆発
SEMI JOIN 右にマッチする左の行のみ — 「データのある都道府県」 のリスト抽出 SQL 標準にない (EXISTS で代替)
ANTI JOIN 右にマッチしない左の行 — 「データ欠損している都道府県」 の抽出 NOT EXISTS で代替するのが標準的
→ 実務では LEFT OUTER JOIN が最頻使用される。 「マスタテーブル + 集計テーブル」 の典型構造で、 マスタ側をすべて保持しつつ集計値を付加する用途に最適。 SSDSE-B-2026 のような都道府県データでは、 47 行を維持しつつ追加データを結合する用途で LEFT OUTER を選ぶのが定石。
🔧 NULL の扱いと集計時の落とし穴
場面 NULL の振る舞い SSDSE-B-2026 での対応
SUM 集計 NULL は無視される 欠損県が「0」 ではなく「無視」 として扱われ、 全国計が不正確に
AVG 集計 NULL を除外し分母も減らす 欠損県を除いた平均になる、 47 県平均と乖離する
COUNT(*) NULL 行も計上 マッチ行数だけ欲しい時は COUNT(列名) を使う
WHERE 条件 NULL は TRUE にも FALSE にも一致しない 「value IS NULL」 を明示的に書く必要あり
JOIN 条件 NULL 同士は等価でない NULL キーは結合対象外、 IS NOT DISTINCT FROM を使う
COALESCE NULL を別の値に置換 COALESCE(value, 0) で「欠損は 0 とみなす」 が定石
pandas merge の how 'left' 'right' 'outer' 'inner' を指定 indicator=True で結合結果を _merge 列に記録
「NULL は集計から無視される」 という SQL の原則を知らないと、 LEFT OUTER で 47 行に拡張した後の AVG が予想と異なって混乱する。 COALESCE で NULL を 0 に置換するか、 COUNT(*) と COUNT(value) を併用して欠損数を確認する習慣が必須。
🐍 pandas の merge を使った外部結合の実装パターン
pandas では pd.merge(left, right, how='left', on='key') が SQL の LEFT OUTER JOIN に相当する。 how パラメータには 'left', 'right', 'outer', 'inner', 'cross' を指定でき、 'outer' は FULL OUTER JOIN に相当する。 indicator=True を指定すると、 結合結果に _merge 列が追加され、 各行が「左のみ」「右のみ」「両方」 のどれだったかを記録する。 これはデータ品質チェックに極めて有用で、 結合前に「期待通りのマッチ率か」 を確認できる。 SSDSE-B-2026 のような小サンプルデータでも、 47 行が結合後に何行残ったかを value_counts() で確認する習慣を身につけたい。
複合キーで結合する場合は on=['code', 'year'] のようにリストで指定する。 左右でキー列名が違う場合は left_on と right_on を使う。 結合後に重複列が生じた場合は suffixes=('_left', '_right') で識別する。 また、 結合前に left['key'].duplicated().sum() でキーの重複を確認しないと、 N:M 結合で行数爆発を起こす危険がある。 SSDSE-B-2026 では都道府県コードが一意なので問題ないが、 一般的な業務データでは「キー設計を疑え」 が鉄則。
🏢 外部結合の実世界事例
外部結合は実務で頻繁に使われる。 例えば EC サイトの分析では、 「会員マスタ (全会員) LEFT OUTER JOIN 購入履歴」 で「購入歴のない会員も含めた全会員リスト」 を取得し、 マーケティング施策の対象を抽出する。 医療データでは、 「患者マスタ LEFT OUTER JOIN 検査結果」 で「検査未実施の患者も含めた全患者リスト」 を作り、 検査受診率を計算する。 金融データでは、 「口座マスタ FULL OUTER JOIN 取引履歴」 で、 マスタにない口座 (システム不整合) と取引のない口座 (休眠口座) を同時に検出する。
公的統計でも外部結合は頻用される。 SSDSE-B-2026 と他の e-Stat データを「都道府県コード」 で結合する際、 LEFT OUTER で全 47 県を維持しつつ追加変数を付加する。 政府統計の都道府県別データは一般に 47 県揃っているが、 市町村別になると合併・消滅で欠損が生じる。 そうした場面では結合方法の選択が分析結果に直結する。 外部結合を正しく使いこなすことは、 データ分析者の基本技能であり、 SQL でも pandas でも同じ概念が通用する。
📋 外部結合のベストプラクティス
外部結合を使うときの推奨手順は以下のとおり。 (1) 結合前に左右の行数とキーの重複を確認する。 (2) 結合キーの型と表現 (大文字小文字、 半角全角、 ゼロパディング) を統一する。 (3) LEFT OUTER と FULL OUTER のどちらが目的に合うかを明示的に選ぶ。 (4) 結合後に indicator=True または COUNT(*) で結合品質を確認する。 (5) NULL の扱い (集計時の無視、 COALESCE での置換) を意識する。 (6) 結合結果のサンプル行を head() で目視確認する。 これらを守るだけで、 結合に起因するバグの 9 割は防げる。
SSDSE-B-2026 のような教育用データセットで外部結合を練習するときは、 まず全 47 県の都道府県マスタを左テーブルとし、 任意の集計テーブル (例: 高齢化率データ) を右テーブルとして LEFT OUTER で結合する。 結合後の行数が 47 か、 NULL がどの県に出るか、 を確認する。 次に同じ操作を INNER JOIN で行い、 行数が減ることを体感する。 さらに FULL OUTER で実施し、 右テーブルにしかない行 (例: 過去存在した自治体) が出るかを確認する。 こうした 3 種の比較を体験することで、 外部結合の本質と使い分けが身体感覚として定着する。 関連項目として 内部結合 、 データ結合 、 リレーショナルデータベース 、 欠損値 を併せて学ぶと、 結合操作の全体像が立体的に把握できる。
大規模データで外部結合を行うとき、 パフォーマンスが課題になる。 SQL では結合キーにインデックスを張ることで、 結合速度が桁違いに改善する。 PostgreSQL や MySQL では Hash Join, Merge Join, Nested Loop Join の 3 種のアルゴリズムが状況に応じて選ばれ、 EXPLAIN で実行計画を確認できる。 pandas では小データなら merge() で十分だが、 数百万行を超える場合は Dask や Polars といったライブラリで分散処理を検討する。 SSDSE-B-2026 のような 47 行のデータでは性能は問題にならないが、 全国の市町村データ (約 1,700 行) や事業所データ (数百万件) に拡張すると、 結合戦略が結果を大きく左右する。
結合パフォーマンスを上げる古典的テクニックとして、 (1) 結合キーを事前にソートし Merge Join に誘導する、 (2) 不要な列を結合前に SELECT で絞り込みデータ量を減らす、 (3) WHERE 条件を結合前に適用し対象行を絞り込む、 がある。 pandas でも同じ原則で、 merge 前に df[['key', 'value']] で必要列のみ抽出し、 query() で行を絞ると速度と省メモリが両立する。 こうした最適化は実務で必須の技能であり、 SSDSE-B-2026 のような小データで原理を学んだ後、 大規模データに展開していくのが王道。
📚 外部結合の深掘り解説と SSDSE-B-2026 演習
外部結合の本質を体得するには、 SSDSE-B-2026 の都道府県データと別の都道府県別データセット (例: e-Stat の年齢別人口、 厚生労働省の医療機関数、 文部科学省の学校数) を実際に結合してみるのが最良。 ここでは典型的な演習課題と、 その解法の流れを整理する。 外部結合の選択がデータ解釈に与える影響を、 実データで体感することが学習の到達点。
📝 演習 1: 都道府県マスタと欠損データの結合
SSDSE-B-2026 全 47 都道府県のリストを左テーブルとし、 任意の集計データ (例: 「東京・大阪・愛知のみ集計済み」 の架空データ) を右テーブルとして LEFT OUTER 結合する。 結果は 47 行で、 集計データのない 44 県は NULL になる。 ここで df.isnull().sum() を実行すると、 集計列の NULL 数が 44 になることを確認できる。 次に同じ操作を INNER JOIN で行うと、 結果は 3 行になり、 「データが揃った 3 県だけ」 を抽出できる。 この比較が、 外部結合と内部結合の違いを最も明確に体感できる演習。
さらに発展として、 (1) FULL OUTER JOIN を試して両テーブルの欠損を確認、 (2) indicator=True で結合結果に _merge 列を追加し、 各行がどの結合パスを辿ったかを記録、 (3) COALESCE(value, 0) または pandas の fillna(0) で NULL を 0 に置換し集計に進む、 という手順を順に試す。 各段階で行数と NULL 数を print(len(df)) と print(df.isnull().sum()) で確認する習慣が、 結合操作のバグを早期発見する基礎力を育む。
📝 演習 2: 複合キー結合と重複処理
SSDSE-B-2026 の都道府県 × 年度データを想定した複合キー結合の演習。 左テーブルは「都道府県コード × 年度」 で 47 × 10 年 = 470 行、 右テーブルは「都道府県コード × 年度」 で集計データを保持。 pd.merge(left, right, on=['code', 'year'], how='left') で複合キー結合する。 結合キーに重複があると行数爆発するので、 結合前に left.duplicated(['code', 'year']).sum() で重複チェックを行うのが定石。
演習の発展として、 (1) 左テーブルの一部年度を欠損させた状態で結合し、 LEFT/RIGHT/INNER/FULL の各結合の結果行数を比較、 (2) 結合後の _merge 列を value_counts() で集計し、 「左のみ」「右のみ」「両方」 の分布を可視化、 (3) 結合品質を「右テーブル全行のうち左テーブルにマッチした割合」 として定量化、 という手順を試す。 こうした品質指標を意識することで、 結合結果の信頼性を客観的に評価できる。
⚠️ 外部結合のアンチパターン集
アンチパターン 症状 修正法
結合前の行数確認なし 結合後に行数爆発しても気づかない 左右の行数を必ず len() で確認
結合キーの型不一致 「01」 vs 1 等で全行マッチしない astype(str) 等で型統一
結合キーの空白 「東京 」 vs「東京」 でマッチしない .str.strip() で前後空白除去
大文字小文字の混在 「Tokyo」 vs「tokyo」 でマッチしない .str.lower() で正規化
NaN を結合キーに使用 NaN 同士は等価でなく結合されない NaN を除外するか別値で置換
SELECT 全列で結合 不要列が大量に増えメモリ圧迫 結合前に df[['key', 'needed']]
結合後の NULL を集計 SUM/AVG で NULL が想定外の挙動 fillna(0) または COALESCE を明示
結合方向の混乱 LEFT/RIGHT の認識違いで欠損 常に LEFT に書き換える (右にして RIGHT より可読性高)
これら 8 つのアンチパターンは、 ほぼすべての結合バグの根本原因。 一つでも当てはまる症状があれば、 結合結果を再検証する必要がある。 SSDSE-B-2026 のような小データで原理を学び、 業務で大規模データに展開する際にこれらを必ずチェックする習慣が、 データエンジニアの基礎力を形作る。
🔬 SQL と pandas での外部結合の対応関係
SQL pandas 備考
LEFT OUTER JOIN pd.merge(how='left') 最頻使用パターン
RIGHT OUTER JOIN pd.merge(how='right') 可読性低、 LEFT に書換え推奨
FULL OUTER JOIN pd.merge(how='outer') 双方向の欠損確認に有用
INNER JOIN pd.merge(how='inner') デフォルト、 マッチ行のみ
CROSS JOIN pd.merge(how='cross') 全組合せ生成、 N×M 行
USING (key) on='key' キー名が左右で同じ
ON left.k = right.k left_on='k', right_on='k' キー名が左右で異なる
WHERE _merge = 'left_only' indicator=True 後にフィルタ ANTI JOIN 相当
EXISTS (SELECT 1 FROM ...) df.isin() または merge 後フィルタ SEMI JOIN 相当
SQL と pandas は、 外部結合の発想を同じくしている。 SQL 経験者は pandas を「メモリ上の SQL エンジン」 として理解すると習得が早い。 逆に pandas に慣れた人は SQL の JOIN 句を「pandas.merge() の SQL 版」 と捉えると違和感が少ない。 両者を行き来できると、 業務での選択肢が広がる。 SSDSE-B-2026 のような小データなら pandas で完結するが、 業務では SQL を併用するのが現実的。
🎯 外部結合の発展的トピック
外部結合の発展的トピックとして、 (1) Time-Series Join (時間軸での結合): タイムスタンプが完全一致しない場合に、 直前または直後の値を結合する手法。 pandas の merge_asof()、 SQL の RANGE BETWEEN。 (2) Fuzzy Join (曖昧結合): キーの完全一致でなく、 編集距離・コサイン類似度等で結合する。 株式銘柄名の表記揺らぎ吸収等に使う。 (3) Spatial Join (空間結合): 緯度経度の空間的包含・近接で結合。 PostGIS の ST_Intersects、 GeoPandas の sjoin()。 (4) Hash Join のメモリ最適化: 小さい方をハッシュ化、 結合前に冗長列を削除、 等の技法。 SSDSE-B-2026 のような小データでは不要だが、 業務では必須の知識。
関連項目として 内部結合 、 データ結合 、 リレーショナルデータベース 、 欠損値 、 主キー 、 外部キー を併せて学ぶと、 結合操作の全体像が立体的に把握できる。 結合は単独で意味を持つ操作ではなく、 「データ設計 → 結合 → 集計 → 可視化」 の中で位置づけられる中間処理。 結合だけ深掘りするより、 前後の処理と合わせて理解することで、 データ分析パイプラインの全貌が見えてくる。 SSDSE-B-2026 を題材に、 結合操作とそれ以外の処理を組み合わせた総合演習を行うことで、 実践的なスキルが身につく。
📝 まとめ
外部結合 (OUTER JOIN) は、 「片方または両方のテーブルに存在するレコードを保持しつつ、 マッチしないレコードには NULL を埋める」 結合演算で、 内部結合 (INNER JOIN) との使い分けがデータ分析の質を決定する。 LEFT OUTER は最頻使用パターン、 FULL OUTER は双方向の欠損確認、 RIGHT OUTER は LEFT に書換え推奨。 結合キーの型・空白・大文字小文字を統一し、 結合前に行数とキー重複を確認、 結合後に indicator=True で品質確認、 NULL の扱いを明示する、 という手順を踏むことで、 結合バグの 9 割は防げる。 SSDSE-B-2026 のような小データで原理を学び、 業務で大規模データに展開するのが学習の王道。 SQL と pandas を両方使えるようになると、 業務での選択肢が広がる。
🔬 外部結合の関係代数的位置づけ
関係代数 (Codd 1970) では外部結合は基本演算ではなく、 内部結合と直積 (Cartesian Product) と差集合 (Set Difference) を組み合わせて定義される派生演算。 形式的には LEFT OUTER JOIN R LOJ_θ S = (R ⋈_θ S) ∪ ((R - π_R(R ⋈_θ S)) × {NULL, ..., NULL}) と表現できる。 この定義から、 外部結合は「内部結合の結果に、 マッチしなかった行を NULL 補完で追加した拡張」 だと理解できる。 関係代数の理論を理解すると、 SQL や pandas の実装が「関係代数の特定方言」 として相対化でき、 異なるシステム間の文法差を本質的に理解できる。
関係代数の他の演算 (射影 π、 選択 σ、 直積 ×、 和集合 ∪、 差集合 -、 交差 ∩、 改名 ρ) と組み合わせて、 「都道府県マスタから関東地方のみを抽出し、 人口データと LEFT OUTER 結合する」 という処理は σ_{地方='関東'}(R_県) LOJ_{県コード} R_人口 と書ける。 SQL で書けば SELECT * FROM 県 LEFT JOIN 人口 ON 県.コード=人口.コード WHERE 県.地方='関東'。 pandas で書けば pd.merge(県[県['地方']=='関東'], 人口, on='コード', how='left')。 同じ操作を 3 つの言語で書けることで、 「関係代数 → SQL → pandas」 の対応関係を体感できる。 関係代数は理論的な土台で、 これを理解すると SQL の最適化や pandas の高速化の戦略が見えてくる。
⏱️ 時系列データへの外部結合の応用
時系列データに外部結合を適用する場面では、 「キー完全一致」 ではなく「直前または直後の値」 を結合する必要がある。 pandas の merge_asof() は時系列での近似結合をサポートし、 「左テーブルの各行のタイムスタンプ直前の右テーブルの行」 を結合する。 これは金融データで「株価と為替の同期化」、 IoT データで「異種センサーの統合」、 EC データで「ユーザ行動とキャンペーン期間の対応付け」 等に必須。 SSDSE-B-2026 のような年次データではこの機能は不要だが、 高頻度時系列を扱う業務では日常的に使う技術。
merge_asof() の引数として、 (1) direction='backward'/'forward'/'nearest': 直前・直後・最近接の選択。 (2) tolerance=pd.Timedelta('1H'): 最大時間差の制限。 (3) by='symbol': グループ別の独立結合 (株価銘柄別等)。 (4) allow_exact_matches=True: 完全一致を許可するか。 等がある。 これらを組み合わせることで、 複雑な時系列結合が 1 行で書ける。 SQL では PostgreSQL の LATERAL JOIN や Snowflake の QUALIFY 句でも類似機能が提供されているが、 pandas の方が記述が簡潔。 時系列分析・金融工学・IoT 分析では merge_asof() 知識が必須スキル。
🌐 分散システムでの外部結合
数百 GB〜数 TB の大規模データに外部結合を適用する場合、 単一マシンの pandas では処理不能で、 分散システム (Spark, Dask, Polars, DuckDB) が必要。 Spark では結合戦略を (1) Broadcast Join (小さい方を全ノードに配布)、 (2) Sort-Merge Join (両方をソートしてマージ)、 (3) Shuffle Hash Join (キーでパーティション再配置後にハッシュ結合) から自動選択する。 結合キーが偏っていると「データ歪み (data skew)」 が発生し、 一部のノードに処理が集中して全体性能が悪化する。 これに対処するため、 (1) Salt 技術 (キーに乱数を付加して分散)、 (2) Skew Join Hint (Spark の hint で偏りを宣言)、 (3) Bucketed Table (事前パーティション) 等のテクニックが使われる。
DuckDB は組み込み型分析 DB で、 ローカルマシンで数 GB の Parquet ファイルを SQL で高速に結合できる。 duckdb.sql("SELECT * FROM 'a.parquet' a LEFT JOIN 'b.parquet' b ON a.key=b.key") と書くだけで、 数百万行の結合が秒単位で完了する。 Polars は Rust 実装の DataFrame で、 並列処理と Lazy Evaluation により pandas の 10 倍以上速い。 これらの新世代ツールは、 SSDSE-B-2026 のような小データでも快適に動き、 大規模データへの拡張も容易。 「pandas 一辺倒」 から「pandas + DuckDB + Polars」 の使い分けへと、 2026 年のデータエンジニアリングのトレンドは進化している。
🗺 概念マップ:外部結合 の知識ネットワーク
本サイト全体の 概念マップ の中で、 外部結合 がどの位置にあるかをテキストツリーで表現する。 視覚的なグラフは 概念マップページ を参照。
[ データエンジニアリング ]
├─ 外部結合 (本ページ)
├─ 関連手法・派生 → 「🌐 関連手法・派生」セクション
├─ 前提概念 → 「🔬 数式を言葉で読み解く」セクション
└─ 派生領域 → 「🎓 深掘り(さらに)」シナリオ A/B/C
📌 全用語の俯瞰には 概念マップ を、 全用語一覧には 用語集トップ を参照してください。
🎯 最終まとめ:このページで学んだこと
30 秒結論 で「外部結合 とは何か」を 1 文で言える
直感セクション で SSDSE-B-2026 を題材に具体例を掴んだ
数式 + 言葉 で記号の意味を翻訳できる
Python 実装 を最小例 + 応用例の 2 段で試せた
落とし穴 8 個 を知り、 自分の作業で予防策が打てる
3 シナリオ × 3 誤解 × 5 意思決定 で、 「いつ使うか/使わないか」を判断できる
近接概念との比較 で、 別手法との違いを言葉で説明できる
歴史・派生・体系的解説 で、 上級者として「なぜこの設計か」を語れる
📌 本ページは ジャストインタイム型データサイエンス教育 教材の一部。 一度通読する必要はなく、 必要なときに必要な節だけ読んで戻ってくる使い方を想定している。 「外部結合」の概念に詰まったら、 何度でもこのページに戻ってきてほしい。
🔢 数値例による手計算ウォークスルー
外部結合 を「コード任せ」にせず、 一度は手計算してみることで理解が定着する。 ここでは最小サイズのデータで、 値の動きを 1 ステップずつ追う。
数値例:47 vs 30 件の都道府県表を full outer join
SSDSE-B-2026 (47 都道府県) と仮想 D 表 (30 都道府県のみ、 鳥取・島根・福井・山梨・佐賀・宮崎・大分・愛媛・徳島・高知・福島・岩手・秋田・新潟・富山・石川・岐阜・三重 を欠く) を都道府県名で結合した結果を 4 方式で比較。
結合方式 結果行数 NaN 行数 用途
INNER JOIN 30 0 両方在る対象だけ分析
LEFT OUTER JOIN (B 左)47 17 (D 由来列が NaN) B 全件を残したい
RIGHT OUTER JOIN (D 右)30 0 (D が部分集合のとき) D 全件を残したい (この例では INNER と同等)
FULL OUTER JOIN 47 17 両側を全部残したい
D が完全に B の部分集合の場合、 RIGHT JOIN と INNER JOIN は同じ結果になる。 D に B にないキー (たとえば D に「東北地方」のような集約名が混じる) があると RIGHT JOIN は 30 行を超え、 FULL は 47 を超える。 つまり 結合方式の選び方は「B と D のどちらが部分集合か、 あるいは交差状態か」 で決まる。 まず set(B.key) - set(D.key) と set(D.key) - set(B.key) の両方を確認するのが、 結合事故ゼロへの第一歩。
❓ よくある質問(用語固有 10 連発)
汎用 FAQ 5 件に加えて、 外部結合 固有の質問 10 件を Q&A 形式でまとめた。 自分の状況に近いものから読んでほしい。
Q1. LEFT と RIGHT の違いは?
A. テーブルの位置だけ。 L LEFT JOIN R ≡ R RIGHT JOIN L。 慣習的に LEFT を使い、 「マスタは左に置く」スタイルが読みやすい。
Q2. FULL OUTER と UNION の違いは?
A. FULL OUTER JOIN はキーでマッチした行を統合、 不一致は NULL 列。 UNION は 2 テーブルを 縦に 連結 (列構造が同じ必要)。 全く別の操作。
Q3. OUTER JOIN の結果が遅い
A. (i) 結合キーにインデックス 、 (ii) 小さい側を右 に置く (Hash Join 戦略)、 (iii) 事前フィルタ でテーブルを縮小、 (iv) パーティション結合 (Spark)。
Q4. JOIN 後に NaN が大量に出る
A. 片側にしかないキーが多い証拠。 (i) キー前処理 (strip, lower, 型統一) で照合率を上げる、 (ii) indicator=True でどの側にあるか追跡、 (iii) 必要なら INNER に切替。
Q5. merge と join の違いは pandas で?
A. df.merge() は SQL 風の柔軟な結合 (任意の列をキーに)、 df.join() はインデックスベース。 通常は merge を使う。
Q6. 複合キーでの outer join は?
A. on=['都道府県', '年度'] のようにリスト指定。 SQL なら ON L.pref = R.pref AND L.year = R.year。
Q7. 3 テーブル以上の outer join は?
A. a.merge(b, ...).merge(c, ...) と段階結合。 indicator も段階的に追加。 SQL なら FROM a FULL OUTER JOIN b USING(k) FULL OUTER JOIN c USING(k)。
Q8. OUTER JOIN は INNER より遅い?
A. 原理的にはほぼ同じコスト (走査回数は同等)。 ただし結果行数が増えるので、 後段の処理で差が出る。 plan を必ず EXPLAIN で確認。
Q9. ANTI JOIN って何?
A. 「左にあって右に無い 」行のみ返す結合。 LEFT OUTER + WHERE right.k IS NULL で実装。 SQL なら NOT EXISTS、 pandas なら merge + indicator=='left_only'。
Q10. FULL OUTER は商用 RDB なら全部使える?
A. MySQL 8 系は標準で対応していない (UNIONでエミュレート)、 PostgreSQL/Oracle/SQL Server/SQLite は対応。 BigQuery/Snowflake 等の DWH は標準対応。
🏋️ 演習問題(5 問)
学習の定着には、 自分の手を動かすのが一番。 SSDSE-B-2026 や実ログを題材に、 外部結合 を実践する 5 問を用意した。 答えは Python 実装セクションと数値例セクションを参考に組み合わせれば導ける。
演習 1:SSDSE-B と SSDSE-D を都道府県名で full outer join し、 NaN 行数を indicator で集計せよ。
演習 2:結合前に str.strip().str.normalize('NFKC') でキー正規化、 表記揺れがマッチ率に与える影響を測れ。
演習 3:LEFT JOIN と RIGHT JOIN を入れ替えて結果が鏡像になることを確認せよ。
演習 4:3 つの SSDSE 表 (B, D, E) を full outer join し、 全表にあるキー・1 表のみのキー数を求めよ。
演習 5:suffixes を意味のあるラベルにして、 結合後に重複列名を分かりやすく区別せよ。
📌 演習を解いて疑問が残ったら、 「よくある質問」セクションに戻るか、 リポジトリの「論文一覧」から類似研究を探して、 実コード (本サイトには 159 本の再現論文) を読むのが最速の理解への道。
🛠 デバッグ手順書
外部結合 を使った分析で「結果がおかしい」と感じたとき、 上から順に確認してほしい 7 ステップ。
入力データの shape / dtype / 欠損 を df.info() と df.isna().sum() で確認
1 サンプル を取り出し、 期待通りの計算が行われているか手計算と一致するか
境界ケース (空テーブル、 1 行のみ、 全 NaN)でエラーが出ないか
乱数シード を固定し、 同じ結果が再現できるか
中間結果 を print() や logging で確認、 想定値からズレるところを特定
単体テスト を pytest で書き、 1 関数ずつ動作確認
それでもダメなら、 最小再現コード (MRE) を作って Stack Overflow / GitHub Issue / 教員に質問
📌 デバッグは経験値が物を言う領域。 上記 7 ステップを習慣化することで、 1 件の事故で学ぶことが何倍にも増える。
🗺 学習パス:30 分 / 3 時間 / 30 時間
外部結合 をどの程度マスターするかで、 推奨する学習時間と内容が変わる。 自分の状況に合わせて選んでほしい。
⏱ 30 分:論文を読むだけ
本ページの「💡 30 秒結論」「🎨 直感で掴む」「🔬 数式を言葉で読み解く(深掘り)」を順に読む
論文に戻り、 該当箇所を再読
分からない単語が出てきたら「🔗 関連用語」「🧭 用語クロスリンク集」から飛ぶ
⏱ 3 時間:手を動かす
本ページの「🐍 Python 実装」「🐍 Python 実装(応用編)」を実際にコピペして動かす
「🧪 SSDSE-B-2026 ハンズオン」を SSDSE 公式から CSV をダウンロードして実行
「🏋️ 演習問題(5 問)」を最低 3 問解く
結果を 外部結合 関連の落とし穴 8 件と照らし、 自分のコードに同じ事故がないか確認
⏱ 30 時間:教える側になる
本ページの「📖 体系的解説 (5 観点)」を全部読み、 関連書籍を 1 冊精読
SSDSE 以外の実データ (例:自分の研究テーマや実務データ) で同じ分析を再現
結果を 3 分プレゼン にまとめ、 同僚・後輩に説明 (アウトプット駆動)
本ページの「🎬 ケーススタディ」のような「自分の事例」を 1 つ書き溜める
関連論文 5 本を読み、 手法の発展と限界をマップ化
✅ 理解度セルフチェック(10 問)
本ページを読み終わったら、 以下の 10 問に □ チェックを入れて理解度を確認してほしい。 8 個以上 ✓ なら中級レベル、 全 10 個 ✓ なら他人に説明可能なレベル。
□ 外部結合 を 1 文 (30 字以内) で説明できる
□ 定義式 (or 主要式) を見て、 各記号の意味を言える
□ なぜこの概念が生まれたか、 歴史的背景を 1 つ挙げられる
□ Python での最小実装を写経でなく自力で書ける
□ 落とし穴を 3 つ挙げ、 それぞれの予防策を言える
□ 近接概念 (データエンジニアリング) との違いを言葉で説明できる
□ いつ使い、 いつ使わないかを 3 つずつ言える
□ 業務 KPI に翻訳して、 経営層に説明できる
□ レポート・論文での書き方テンプレートを覚えている
□ さらに深く学ぶための参考文献を 1 冊指せる
📌 チェックが付かない項目は、 該当セクションに戻って読み直してください。 「分かった気」と「分かっている」の境界を、 このリストで明確にします。
📖 専門用語ミニ辞書
本ページで頻出する周辺専門用語を、 1 行ずつ簡潔に。 ジャストインタイム的に、 必要なときだけ参照すれば良い。
SSDSE 独立行政法人統計センターが提供する「教育用標準データセット」。 公的データを基に、 学生・教育機関が使いやすく整形。
pandas Python の表データ操作ライブラリ。 DataFrame 型が本ページのテーブル概念の主力実装。
CV (Cross Validation) データを K 個に分割し、 K-1 個で学習・1 個で検証を K 回繰り返す。 性能評価の標準。
95% CI (信頼区間) 「真の値が含まれる範囲」を確率的に表現。 [L, U] の形で報告。
p 値 帰無仮説の下で、 観測値以上の極端な結果が出る確率。 通常 0.05 未満で「有意」。
OLS Ordinary Least Squares、 最小二乗法。 回帰の基本。
SGD Stochastic Gradient Descent、 確率的勾配降下法。 ML の標準最適化アルゴリズム。
RMSE / MAE 回帰評価指標。 Root Mean Squared Error / Mean Absolute Error。
AUC Area Under Curve、 ROC 曲線下面積。 分類性能指標。
A/B テスト 2 つのバージョンを並列実装し、 ランダムにユーザーに当てて効果を測る実験。
📑 本サイトで 外部結合 を使う論文(抜粋)
本サイトには 159 本の再現論文 があり、 多くが 外部結合 を何らかの形で利用している。 関連論文を読みたい方は 論文一覧 から検索してほしい。
SSDSE-B-2026 を使った 47 都道府県分析系 (約 30 本):外部結合 が基礎前提として登場
不登校・いじめ統計を扱う社会調査論文:データ前処理に 外部結合 を活用
機械学習・深層学習を使う論文:モデル評価・実装に 外部結合 が必須
因果推論・回帰分析を使う論文:データ整形・指標計算で 外部結合 を経由
📌 各論文は教育目的の再現実装で、 ハンズオン形式で読めるよう Jupyter Notebook 風の構成になっている。 「外部結合 を実際の研究でどう使うか」を 5 分で掴むには、 関連論文を 1 本流し読みするのが最速。
🤝 改善提案・誤り報告
本ページの内容に誤りや改善余地を見つけた場合、 リポジトリの Issue / Pull Request からご提案ください。 教材は みんなで育てる もの。
事実誤認・計算ミス:該当箇所のスクリーンショットと正しい情報をご提供ください
説明の改善:「ここが分かりにくかった」を具体的に教えてください
新しい落とし穴:自分が経験した事例を共有してください
新しい関連手法:見落としている派生概念があれば追加します
多言語化:英語・中国語等の翻訳協力を歓迎します
🍳 コード・クックブック(外部結合 編)
外部結合 を実務で使う際の頻出パターンを、 動くコードのレシピ集としてまとめた。 必要な料理 (タスク) だけを取り出して使ってほしい。
left / right / outer の 4 方式比較
📋 コピー import pandas as pd
a = pd . DataFrame ({ 'k' : [ 'x' , 'y' , 'z' ], 'v_a' :[ 1 , 2 , 3 ]})
b = pd . DataFrame ({ 'k' : [ 'y' , 'z' , 'w' ], 'v_b' :[ 20 , 30 , 40 ]})
for how in ( 'inner' , 'left' , 'right' , 'outer' ):
m = a . merge ( b , on = 'k' , how = how , indicator = True )
print ( how , ' \n ' , m , ' \n ' )
📤 実行例(実測)
inner
k v_a v_b _merge
0 y 2 20 both
1 z 3 30 both
left
k v_a v_b _merge
0 x 1 NaN left_only
1 y 2 20.0 both
2 z 3 30.0 both
right
k v_a v_b _merge
0 y 2.0 20 both
1 z 3.0 30 both
2 w NaN 40 right_only
outer
k v_a v_b _merge
0 w NaN 40.0 right_only
1 x 1.0 NaN left_only
2 y 2.0 20.0 both
3 z 3.0 30.0 both
複合キーで結合 + 型統一
📋 コピー import pandas as pd
a = pd . DataFrame ({ 'pref' :[ '東京' , '大阪' ], 'year' :[ 2023 , 2023 ], 'v_a' :[ 1 , 2 ]})
b = pd . DataFrame ({ 'pref' :[ '東京' , '大阪' , '京都' ], 'year' :[ 2023.0 , 2024.0 , 2023.0 ], 'v_b' :[ 10 , 20 , 30 ]})
# year が int と float で型不一致 → 結合失敗の可能性
b [ 'year' ] = b [ 'year' ] . astype ( int )
m = a . merge ( b , on = [ 'pref' , 'year' ], how = 'outer' , indicator = True )
print ( m )
📤 実行例(実測)
pref year v_a v_b _merge
0 京都 2023 NaN 30.0 right_only
1 大阪 2023 2.0 NaN left_only
2 大阪 2024 NaN 20.0 right_only
3 東京 2023 1.0 10.0 both
巨大表を broadcast hint で結合 (Spark)
📋 コピー # from pyspark.sql import SparkSession
# from pyspark.sql.functions import broadcast
# spark = SparkSession.builder.appName('outer-join').getOrCreate()
# big = spark.read.parquet('data/processed/big_transactions.parquet')
# small = spark.read.parquet('data/processed/master.parquet')
# joined = big.join(broadcast(small), on='id', how='left_outer')
# print(joined.count())
# 上記疑似コード(Spark 環境で実行)。 broadcast hint で小表を全ノードに配布、 巨大表との外部結合を高速化。
📌 すべてのレシピは「実データ前提・引数なし直書き」スタイル。 そのままコピペで動くよう設計したので、 まずは動かしてから読むのを推奨する。
🚫 アンチパターン集
外部結合 を扱うコード・レポートで頻発するアンチパターンを 5 つ挙げる。 「やってはいけないこと」を知るのが、 良いコードへの近道。
❌ コピペで済ませて意味を理解しない
本ページのコードをコピペするのは OK だが、 「なぜそうなるか」を 1 度は手計算で確認すること。 デバッグ時に困る。
❌ 結果を 1 つの数字だけ報告する
「F1 = 0.82」「結合後 1,000 件」だけ報告するのはアンチパターン。 内訳・分散・前提条件を併記すること。
❌ 落とし穴を読まずに本番投入する
本ページの落とし穴 8 件はすべて「経験者が踏んだ地雷」。 本番前に必ず一読し、 自分のコードで該当しないか確認。
❌ ライブラリのデフォルトを盲信する
sklearn の average='binary'、 pandas の how='inner' 等のデフォルトは「最も多用される選択」であって「自分の目的に最適」とは限らない。 必ず確認。
❌ バージョン情報を記録しない
pandas / sklearn / torch のバージョンで挙動が変わることがある。 再現性のため pip freeze や conda env export を記録。
🏁 最終結論:外部結合 を一言で
外部結合は「データ統合の最後の砦」。 内部結合で済むなら inner、 でも情報損失したくない場面で outer の出番が来る。 本ページで学んだ (i) リレーショナル代数の文脈、 (ii) Left/Right/Full の使い分け、 (iii) NaN の意味論、 (iv) data skew 対策、 (v) indicator で由来追跡 の 5 原則を持って結合すれば、 「結合後の件数が膨張した」「NaN だらけになった」「速度が極端に遅い」の 3 大事故を防げる。 47 都道府県の SSDSE のような小データから、 1 億行のクラウド DWH まで、 概念は同じ。
本ページは ジャストインタイム型データサイエンス教育 の一部として、 必要なときに必要な節だけ読んでもらう設計になっている。 通読する必要はない。 自分の今いる場所 (卒論・実務・論文読解) に応じて、 該当セクションだけを参照し、 また論文や業務に戻ってほしい。 そして数か月後、 似たような状況に陥ったとき、 また戻ってきてくれれば、 教材として最高の使い方になる。
📚 関連リンク:論文一覧 | 用語集トップ | 概念マップ
🙋 著者・教材設計について
本教材は、 広島工業大学 統計・データ解析コンペティション参加学生向けに、 松本伸平 (s.matsumoto.gk@cc.it-hiroshima.ac.jp) が監修・執筆した。 「論文を読む過程で出てきた専門用語を、 その場で 5 分で補完して論文に戻る」というジャストインタイム型の学習体験を目的に、 514 用語ページを統一フォーマットで整備している。
本ページ「外部結合 」は データエンジニアリング カテゴリに属し、 同カテゴリ内の他用語と相互リンクされている。 用語間の関係性は 概念マップ でも俯瞰できる。
本サイトは SSDSE (教育用標準データセット, 独立行政法人統計センター) を主データとして使い、 「合成データ ではなく実公的データを使う」 を方針に据えている。 ハンズオン教材の質を最大化するための判断である。
outer join
外部結合
日本語
英語
中国語
ドイツ語
フランス語
🔗 隣接手法への橋渡し
「外部結合」は単独で完結せず、 前後の手法と組み合わさって価値が発揮される。 入力データの準備 (上流)・同目的の代替手法との比較 (並列)・結果の活用 (下流) という 3 軸で隣接領域を整理する。
この上流・並列・下流の対応を地図化することで、 「外部結合」を中核に据えた分析パイプライン (データ準備 → 手法選択 → 結果の検証と展開) の全体像が見えてくる。
🌳 手法選択フロー
「外部結合」を実際に使うとき、 何をどう選ぶかを順に判断する。 上から順に答えていくと、 使うべき手法と評価の仕方が決まる。
片方にしか無い行をどう扱うか 残すなら外部結合、 落とすなら内部結合。 「落としたつもりが無い」まま内部結合すると、 行が静かに減る。 結合前後で行数を必ず数える。
どちら側を残すか 左を全部残すなら LEFT、 両方なら FULL OUTER。 「マスタに無いコードが来ていないか」を調べたいなら、 あえて外部結合して欠測を見る。
キーは一意か 結合キーが重複していると、 行数が掛け算で増える。 SSDSE-B-2026 を地域コードだけで結合すると、 12 年分が掛かって 12 倍になる。 結合前に duplicated() で確認する。
欠測をどう埋めるか 外部結合で生じた NaN は「値が無い」であって 0 ではない。 0 で埋めてよいかは、 その列が件数なのか金額なのか比率なのかで変わる。
外部結合は「合わなかった行」を可視化する道具でもある。 結合してから欠測を数えると、 データの不整合が見つかることが多い。