🔖 キーワード索引
このページの主要な見どころ。 気になる項目から読み始めてください。
「treatment group 」は統計データ分析の文脈で扱う重要概念のひとつ。 本ページでは「treatment group」を取り巻く中核キーワードを以下にチップで一覧化する。 各キーワードは関連する概念・手法・道具立てを含み、 文献検索や学習計画の起点になる。
treatment group 統計分析 SSDSE-B-2026 前提条件 適用範囲 落とし穴 関連手法 Python 実装 検証方法
これらのキーワードは「treatment group の理解 → 適用 → 検証」のプロセスを構成する。 各章で詳しく解説する。
💡 30秒で分かる結論
🍰 まずはやさしく
何かを試すグループのことです。
効果があるか調べるために使います。
新しい勉強法を試すクラスのようなものです。
この章では処置群の基本を学びます。
処置群 (treatment group) は、 因果効果を測定する実験において「介入 (treatment) を受ける側」 の観測単位。
対比 :処置群 ↔ 対照群 (control group)
キーアイデア :処置群と対照群の平均差 = 平均処置効果 (ATE) — ただし「他の条件が同じ」なら
無作為化 :観察できない交絡をも均すために、 ランダム割付が黄金律
準実験では :自然な事象(法改正・地理境界)で「処置を受けた集団」を処置群と見なす
注意 :「処置群 = 効果が出る側」と混同しない。 効果は差 で測る
SSDSE-B では :「2023 年に △△ 県は ○○ 制度を導入」のような分割で擬似的処置群を作る研究設計が一般的
📍 あなたが今見ているもの
🍰 まずはやさしく
実際のレポートで使われる言葉です。
分析の場面を整理するために使います。
ある市だけ制度を変えた例などが挙げられます。
どのような場面でこの言葉が出るか読みます。
論文・実務レポート・公的統計の解説で、 こんな場面に出会ったはずです。
本研究では、 介護予防プログラムを実施した A 市を処置群 、 隣接する B 市・C 市を対照群 とし、 差の差 (DID) 法で 1 年後の要介護認定率の変化を比較した。
「処置群」とは、 因果効果を測りたい介入を実際に受けた 個体・地域・期間のこと。 対になる対照群 と比較してはじめて「介入のおかげで変わったか」を語れます。 単独で「処置群はこうだった」と言っても因果は語れません。
🎨 直感で掴む
🍰 まずはやさしく
比べるための基準を作る考え方です。
本当の変化を見極めるために使います。
スマホのアプリで効果を試す時に似ています。
直感的に理解するための仕組みを読みます。
「ある介護予防プログラムは要介護率を下げるか?」を測りたいとします。 ありがちな失敗が、「プログラムに参加した人だけ」を追跡して「3 年後に要介護率 8% → 6% に下がった」と結論 すること。 これは処置群だけを見ている 状態で、「何もしなくても下がったかもしれない」可能性を排除できていません。
因果推論の発想は、同じ条件で介入を受けなかった集団=対照群と比べる こと。 処置群と対照群が「介入の有無」以外 では似ているほど、 差は介入のおかげと言いやすくなります。 ランダムに割り付ければ似た集団になりやすいので、 RCT (無作為化比較試験) は因果推論の黄金律です。
SSDSE-B のような観察データ では、 処置群と対照群を「都道府県を分割して」設定することがあります。 たとえば「2023 年に出生率向上策を強化した県を処置群、 それ以外を対照群」と定義し、 数年後の出生率変化を比較するなどです。 ただし観察データでは交絡が混ざるため、 そのままの平均差を因果と呼ぶのは危険です。
処置群を作るときの基本姿勢は 「介入の有無だけ が違う、 他は揃った双子のような集団」 を目指すこと。 そのための実務的な道具がランダム割付・マッチング・回帰調整・差の差です。
処置群を考えるときの 3 つの問い
問い 意味
誰が「処置」を受けた? 介入の定義を明確化。「飲んだ/飲まなかった」「補助金を受けた/受けない」など
どうやって割り付けられた? ランダム / 自然な事象 / 自己選択? 因果の解釈可能性が大きく変わる
対照群は誰? 処置を「受けなかった」が「受けたなら同じになるはず」の集団は誰か
⚠️ 注意: 処置群を「効果が見られた集団」だと誤解しないこと。 効果はあくまで 対照群との差 から計算される量で、 処置群単独では何も言えません。
🎨 概念図で押さえる
処置群と対照群を比較する際、 結果変数の分布形・散らばり・回帰トレンドを並べて見ることが基本。 3 枚の図でイメージを掴む(3 枚とも SSDSE-B-2026 の実データ)。
結果変数のヒストグラム。 下の 🐍 と同じく合計特殊出生率 1.30 以上を処置群(24 県)、 未満を対照群(23 県)とし、 2023 年度の人口千人あたり死亡率を重ねた。 平均は 14.59 対 13.59 で差は +1.00 だが、 分布は大きく重なっており、 しかもこの差は処置群の方が高齢化率が高いことを映している(交絡)。
処置前 vs 処置後の散布図(人口千人あたり出生率、 処置前 = 2012〜2019 年度平均、 処置後 = 2020〜2023 年度平均)。 橙は下の DID ブロックと同じ仮の処置群 5 県(沖縄・宮崎・島根・長崎・佐賀)。 47 県すべてが 45 度線より下にあり、 処置の有無に関係なく出生率は下がっている。 処置群 −1.43、 対照群 −1.34 で、 差の差は −0.09 にすぎない。 処置群だけを見て「45 度線から離れた=効果」と読むと、 全国的な低下を効果と取り違える。
差の差(DID)のトレンド比較。 上の散布図と同じ仮の処置群 5 県と対照群 42 県について、 人口千人あたり出生率の年度ごとの平均 (県の単純平均) を並べ、 処置は 2020 年度からと仮定した (縦の破線)。 細い横線は処置前 (2012〜2019 年度) と処置後 (2020〜2023 年度) の平均。 処置前の 2 群の差は 1.26〜1.33 とほぼ一定で、 平行トレンドの仮定と矛盾しない。 点線は「処置が無かったら」の処置群 (対照群の動きに処置前の差を足したもの) で、 処置後の実際の処置群はこれとほぼ重なり、 2023 年度にはむしろ下回る。 差の差は (−1.43) − (−1.34) = −0.09 で、 仮の処置に出生率を上げる効果は見えない。
✅ 理解度チェック
処置群(treatment)と対照群(control)の違いを 1 行で説明できるか。
無作為割付(RCT)が不可能な場合の代替(マッチング・DID)を 2 つ挙げられるか。
セレクションバイアスが処置効果の推定に与える影響を説明できるか。
平行トレンド仮定の意味を 1 行で書けるか。
🔬 数式を言葉で読み解く
記号 意味 本研究での解釈
$D_i = 1$ 個体 i は処置群 例: A 市はプログラム実施
$Y_i(1)$ 処置を受けたときの結果(潜在) A 市が実施した場合の要介護率
$Y_i(0)$ 受けなかったときの結果(潜在・反事実) A 市が「もし」実施しなかった場合の要介護率(観測不能)
$\bar{Y}_{\text{処置群}}$ 処置群での観測平均 A 市の要介護率
$\bar{Y}_{\text{対照群}}$ 対照群での観測平均 B 市・C 市の平均要介護率
ATE 母集団全体の平均処置効果 「全市が実施したら?」と「誰も実施しなかったら?」の差
ATT 処置群に限った平均処置効果 「A 市が実施したから得た効果」
SUTVA 処置群・対照群が独立で互いに影響しない仮定 スピルオーバーがあると破綻
因果推論の根本問題は、同じ個体について $Y_i(1)$ と $Y_i(0)$ の両方を観測できない こと。 個体 i が処置群なら $Y_i(0)$ は反事実で観測不能。 だから「比較可能な別の個体」が必要で、 そのために処置群と対照群を作るわけです。
ランダム割付がなぜ強力か? ランダム化により、 $D_i$ と $(Y_i(0), Y_i(1))$ が独立になるからです。 すると $\mathrm{E}[Y_i(0) \mid D_i = 1] = \mathrm{E}[Y_i(0) \mid D_i = 0]$ となり、 「処置群が受けなかったとしたら」の平均 = 「対照群の観測平均」。 これで ATT = 処置群平均 − 対照群平均 となります。
🔬 理論深掘り:処置群の本質
処置群は、 因果推論において「介入を受けた観測単位の集まり」を指します。 対照群との比較で平均処置効果 (ATE) を推定する基盤。 ランダム化試験では割付が無作為、 観察研究では「処置を受けた者」を後から定義します。
形式的定義の再確認
処置群 (Treatment Group) は、 統計・データ解析の文脈で頻繁に登場する概念です。 ここでは初学者向けの直感と、 上級者向けの形式定義を併記します。
SSDSE-B-2026 における具体例
たとえば「2020 年に少子化対策補助金を増額した県」を処置群、 「増額しなかった県」を対照群として、 2018→2023 年の出生率の変化を比較する。 これは DID (差分の差) と呼ばれる準実験手法で、 SSDSE-B-2026 のパネル構造を生かす典型例です。
SSDSE-B-2026 は 都道府県別社会経済データ集 2026 年版 で、 47 都道府県 × 12 年度(2012〜2023)× 100 超の指標を含む公的データです。 処置群の概念を SSDSE-B-2026 で実証することで、 「数値の動きが地理的・社会的直感と整合するか」を検証できます。
使用する主要な SSDSE-B-2026 列
列コード 意味 本ページでの用途
A1101総人口 県の規模分類 A130365 歳以上人口 高齢化率の計算 A4101出生数 施策効果の指標 E1101小学校数 教育施策の対象
🔬 Python と R での処置群分析比較
同じ DID 推定を Python と R で行うと、 文化の違いが見えます。 SSDSE-B のような分析では、 経済学研究者は R、 データサイエンティストは Python を好む傾向。 両方の言語で処置群を扱えるとキャリアの選択肢が広がります。
Python 版(statsmodels)
📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行)
都道府県 Prefecture(都道府県) SSDSE-B-2026(年度) A4101(出生数) A1101(総人口)
北海道 北海道 2,023 24,430 5,092,000
東京都 東京都 2,023 86,348 14,086,000
沖縄県 沖縄県 2,023 12,549 1,468,000
…(全 47 行)
📋 コピー 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 import pandas as pd
import statsmodels.formula.api as smf
df = pd . read_csv ( 'data/raw/SSDSE-B-2026.csv' , encoding = 'cp932' , skiprows = 1 )
df . columns = [ c . strip () for c in df . columns ]
treated_prefs = [ '沖縄県' , '宮崎県' , '島根県' , '長崎県' , '佐賀県' ]
df [ '処置群' ] = df [ '都道府県' ] . isin ( treated_prefs ) . astype ( int )
df [ 'Post' ] = ( df [ '年度' ] >= 2020 ) . astype ( int )
df [ '出生率' ] = df [ '出生数' ] / df [ '総人口' ] * 1000
# DID 回帰(双方向固定効果 + クラスタロバスト SE)
model = smf . ols (
'出生率 ~ 処置群 * Post + C(都道府県) + C(年度)' ,
data = df
) . fit ( cov_type = 'cluster' , cov_kwds = { 'groups' : df [ '都道府県' ]})
print ( model . params [ '処置群:Post' ],
model . bse [ '処置群:Post' ],
model . pvalues [ '処置群:Post' ])
📤 実行例(実測)
-0.0925290131448339 0.12744119457723957 0.46780651349720204
💬 交互作用項の係数 -0.093 は、人口千人あたり出生率が処置 5 県で対照 42 県より 0.09 だけ余分に下がったという意味で、単純な平均の差の差(処置群 8.69→7.26、対照群 7.40→6.06)と小数点以下まで一致する。ただしクラスタロバスト SE が 0.127 あるので 95% 信頼区間はおよそ -0.34〜+0.16 と 0 をまたぎ、p=0.47 では効果があるとも無いとも言えない。そもそも 5 県は補助金の実績ではなく例として選んだ仮の処置群なので、この値を施策の効果と読まないこと。クラスタが 47 しかなく処置側は 5 クラスタだけなので、SE 自体も小さく出やすい点に注意する。
R 版(fixest, 同等の機能)
📋 コピー 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 # R で同じ分析を fixest パッケージで実装
library ( fixest )
library ( readr )
df <- read_csv ( 'data/raw/SSDSE-B-2026.csv' ,
locale = locale ( encoding = 'Shift_JIS' ),
skip = 1 )
treated_prefs <- c ( '沖縄県' , '宮崎県' , '島根県' , '長崎県' , '佐賀県' )
df $ treated <- as . integer ( df $ 都道府県 % in % treated_prefs )
df $ post <- as . integer ( df $ 年度 >= 2020 )
df $ birth_rate <- df $ 出生数 / df $ 総人口 * 1000
# 双方向固定効果 + 都道府県クラスタ SE
model <- feols ( birth_rate ~ treated : post | 都道府県 + 年度 ,
data = df , cluster = ~ 都道府県 )
summary ( model )
結果の比較表
項目 Python (statsmodels) R (fixest) 備考
DID 係数 −0.093 (本ページでは R は未実行) 推定式が同じなら点推定は一致する
クラスタ SE 0.127 — 小標本補正の既定が異なると僅かにずれる
p 値 0.468 — —
計算時間 ~ 1.2 秒 ~ 0.1 秒 fixest が高速
長期パネル拡張 容易(リード/ラグ追加) 容易(i() オペレータ) —
近年の DID 拡張 linearmodels.PanelOLS, differences パッケージ did, fixest::feols (CS, SA) R 側が成熟
結果数値は一致します。 R は固定効果モデルが高速で、 近年の DID 拡張(Callaway-Sant'Anna, Sun-Abraham)が成熟しています。 Python は他の機械学習 / データ前処理との統合に強いです。
🔬 数式を言葉で読み解く(深掘り 800 字版)
処置群の効果を測る基本式 $\text{ATE} = E[Y(1) - Y(0)]$、 これを「潜在結果フレームワーク」と呼びます。 一語ずつ解きます。 $Y(1)$ :個人が処置を受けた場合の結果(仮想的にでも観測される値)。 SSDSE-B-2026 風に言えば、 「ある県が子育て支援策を実施した場合の出生率」。 $Y(0)$ :同じ個人が処置を受けなかった場合の結果。 「同じ県が政策を実施しなかった場合の出生率」。 潜在結果の根本問題 :1 つの個人について $Y(1)$ と $Y(0)$ の両方は同時に観測できない(実際には政策実施したか、 しなかったか、 のどちらかしか観測されない)。 これが「因果推論の根本問題 」と呼ばれるもの。 $E[\cdot]$ :期待値、 すなわち「母集団全体での平均」。 個人単位では片方しか観測できなくても、 母集団全体で平均すれば $E[Y(1)]$ は処置群の平均、 $E[Y(0)]$ は対照群の平均で推定できる、 という巧妙な発想です。 ただしこれが成立するには「処置群と対照群が無作為割付で同質 」という条件(無作為化、 conditional independence)が必要。 これが破れると、 単純な群間差は ATE ではなく「群間の元々の差 + 処置効果 」になり、 バイアスが生じます。 SSDSE-B-2026 で「子育て支援を導入した県の出生率が高い」と観察されても、 それは政策効果かもしれないし、 もともと出生率が高い県が政策を導入しただけかもしれません。 後者を「選択バイアス 」と呼び、 傾向スコア・DID・RDD などで補正します。 平均処置効果 ATE の上位概念として、 ATT(処置群限定の効果)、 LATE(局所平均処置効果、 IV 法で推定)、 QTE(分位処置効果)などがあり、 用途に応じて使い分けます。
🎯 用語固有 narration ブロック — 処置群 × SSDSE-B-2026
🎯 ねらい :「処置群」は因果推論の出発点 。 SSDSE-B-2026 で 47 都道府県を仮想的に「政策実施群」「非実施群」に分け、 ATE を推定する一連の流れを演習します。
📥 入力 :47 都道府県 × 合計特殊出生率 (A4103)、 人口 (A1101)、 高齢化率の DataFrame。 仮想的な政策実施フラグ(T=0/1)を作って実験。
📤 出力 :処置群・対照群それぞれの平均出生率、 ナイーブ差、 傾向スコアマッチング後の ATT、 DID 推定値。 これらの数値を比較表に整理。
💬 解釈 :単純な群間差は「政策効果+もともとの差」を含むため過大評価しがち。 傾向スコアマッチングや DID で「差の差 」を取ると、 真の処置効果に近い値が得られます。 SSDSE-B-2026 の死亡率の例(下の③〜⑥)では、 高齢化率を共変量にするとナイーブ差 +1.00 が −0.10 まで縮み、 ほぼ消えます。
🧮 実値で計算してみる(SSDSE-B 2023, n=47)
SSDSE-B 2023 を使って、 都道府県を「合計特殊出生率 1.3 以上=処置群 」「1.3 未満=対照群 」と分け、 死亡率を比較してみます(あくまで群分けの練習で、 因果ではない点に注意):
群 都道府県数 平均合計特殊出生率 平均死亡率(千人あたり) 平均高齢化率
処置群(出生率 1.3 以上) 24 1.40 14.59 32.5 %
対照群(出生率 1.3 未満) 23 1.18 13.59 30.7 %
差 (処置 − 対照) +0.21 +1.00 +1.8 pp
表面的には「出生率の高い県(処置群)はむしろ死亡率が高い」(差 +1.00) と出ますが、 これは交絡 (高齢化率の違い)が大きい単純比較で、 因果と読むことはできません。 「処置群と対照群を作って平均差を取る」手続きとしての形 を確認するための数値例と理解してください。
📝 より正確な分析 ── 実測 2023 では「高出生率県ほど高齢・高死亡率」
SSDSE-B 2023(47 都道府県)で実際に合計特殊出生率 1.3 で分割すると、 処置群(≥1.3)24 県・対照群(<1.3)23 県 となり、 高出生率の処置群のほうが高齢化率も死亡率も高い (高齢化 32.5% > 30.7%、 死亡率 14.59 > 13.59)結果になります。 これは、 出生率が高いのは沖縄を除けば島根・宮崎・鹿児島など高齢化が進んだ地方県 が多く、 逆に東京・北海道・宮城など出生率が低い県は必ずしも若くない、 という日本の人口構造を反映しています。 死亡率は年齢構成に強く規定されるため(高齢化率と死亡率の相関 r≈0.97)、 「出生率が死亡率を下げる」といった因果的解釈は成り立たず、 単純な群間差はほぼ高齢化率の交絡で説明できます (下の OLS 参照)。
処置群/対照群に含まれる都道府県の例
群 例
処置群(出生率 1.3 以上) 沖縄県(1.60)・宮崎県(1.49)・長崎県(1.49)・鹿児島県(1.48)・熊本県(1.47)・島根県(1.46) など
対照群(出生率 1.3 未満) 東京都(0.99)・北海道(1.06)・宮城県(1.07)・京都府(1.11)・神奈川県(1.13) など
このように、 処置群/対照群の分割基準(カットオフ)は研究設計次第。 「介入を受けたか」という二値変数を、 観察データから人工的に構築するときは、 後段で交絡を必ず調整する前提が必要です。
共変量で調整した「条件付き ATE」
SSDSE-B 2023 の死亡率を 応答変数 、 処置群フラグ + 高齢化率 を説明変数として OLS:
説明変数 係数 β̂ 標準誤差 p 値
切片 −5.25 0.71 <.001
処置群フラグ −0.10 0.15 0.507
高齢化率 +0.61 0.02 <.001
高齢化率を投入すると、 処置群フラグの係数はナイーブな差 +1.00 から −0.10(p=0.51、 非有意)へ縮小し、 符号も反転して実質ゼロになります。 ナイーブな群間差はほぼ全て高齢化率の違いで説明でき 、 出生率による群分け自体には死亡率への独立した効果がないことが見えます。
🧮 数式に値を入れて手で計算する: 平均治療効果 ATE
SSDSE-B-2026 から「政令市を含む 5 県 (北海道・宮城・東京・愛知・大阪)」を処置群、 「政令市を含まない 5 県 (青森・岩手・秋田・山形・福島)」を対照群と見立て、 高齢化率の比較 (2023 年、 単位 %) で平均治療効果 ATE を例示する (これは観察研究で因果ではないが、 処置-対照の差分計算手順を体感する用)。
Step 1: 群別データ (SSDSE-B-2026 高齢化率 %=65歳以上人口/総人口)
処置群 (n=5、 政令市含む): 北海道 33.0, 宮城 29.2, 東京 22.8, 愛知 25.7, 大阪 27.7 → 平均 27.68
対照群 (n=5、 東北 5 県): 青森 35.2, 岩手 35.0, 秋田 39.1, 山形 35.2, 福島 33.2 → 平均 35.54
Step 2: ATE
ATE = 27.68 - 35.54 = -7.86 ポイント
処置群 (政令市含) は対照群 (東北) より 7.86 pp 高齢化率が低い (大都市は若年人口の流入で高齢化が緩やか)
🐍 Python で再現
📋 コピー import numpy as np
# SSDSE-B-2026 高齢化率 % (2023): 政令市含む 5 県 vs 東北 5 県
treated = np . array ([ 33.0 , 29.2 , 22.8 , 25.7 , 27.7 ])
control = np . array ([ 35.2 , 35.0 , 39.1 , 35.2 , 33.2 ])
ATE = treated . mean () - control . mean ()
print ( f "ATE: { ATE : .2f } " )
📤 実行結果
ATE: -7.86
💬 手計算 (Step 2) ATE=-7.86 ポイントと Python 出力が完全一致。 政令市を含む 5 県の平均高齢化率は東北 5 県より 7.86 pp 低い。 これは「処置」と「結果」の単純差分であり因果効果ではない (省略変数の影響大)。
🎮 触って理解する — 無作為割付が交絡を消す仕組み
健康増進プログラムの効果測定を模した架空データ のシミュレーションです(年齢・健康意識・健康スコアはすべて擬似乱数で生成した架空の値で、 実在の調査データではありません)。 被験者プールの一人ひとりは 年齢 と 健康意識スコア という共変量を持ち、 どちらもプログラムなしの健康スコア $Y(0)$ に影響します。 プログラムの真の効果は +5.0 点 (設計値)に固定してあります。 割付方式を「自己選択 (意識が高く若い人ほど参加しやすい)」と「無作為割付 (コイン投げ)」で切り替え、 処置群と対照群の共変量バランス と、 見かけの効果 = 真の効果 + 選択バイアス の分解がどう変わるかを体感してください。
割付方式:
自己選択で割付
無作為割付
被験者数 n = 120
(図の上を左右にドラッグ/スワイプしても変えられます)
▶ 実験を 1 回実行
⏩ 100 回繰り返す
↺ リセット
① 共変量バランス(この 1 回の実験)
共変量(架空データ) 処置群平均 対照群平均 差 標準化差 SMD
年齢(歳) — — — —
健康意識スコア — — — —
ベースライン $Y(0)$(本来は観測不能) — — — —
目安: |SMD| < 0.1 ならバランス良好(赤字は 0.1 超え)。 群サイズ: —
② 見かけの効果の分解(この 1 回の実験)
—
選択バイアス = $E[Y(0)\mid$処置群$] - E[Y(0)\mid$対照群$]$。 シミュレーションだから両群の $Y(0)$ が見えて計算できますが、 現実のデータでは観測不能 です。 だからこそ「割付の仕組み」でバイアスを設計段階から消すことに価値があります。
③ 実験を繰り返すと — 不偏性の体感
「実験を 1 回実行」を押すたびに点が増えます。
👀 何を見ればよいか (シード固定の擬似乱数なので、 初期表示は誰の環境でも同じ値になります):
自己選択(初期表示, n=120) :健康意識の SMD ≈ +0.95、 年齢の SMD ≈ −0.75 と大きく偏り、 見かけの効果 +10.71 = 真の効果 +5.00 + 選択バイアス +5.71 。 効果が 2 倍以上に見えてしまいます。 繰り返してもバイアス(約 +4.9)は消えず、 n を増やしても縮みません 。
無作為割付に切り替えると :SMD が 0 付近に収まり、 1 回ごとの見かけの効果は真の効果 +5.0 の周りで揺れ、 繰り返しの平均は +5.0 に近づきます(不偏性 )。
n を 20 まで下げると :無作為割付でも 1 回の実験では |SMD| > 0.1 になる確率が約 8 割(この設定での検証値)。 無作為化は「平均的に」揃えるだけで、 小標本の 1 回実験ではバランスが崩れうる ことも体感してください。 n=400 では約 3 割まで下がります。
なぜ効くのか — 比較可能性(交換可能性)という直感
処置群と対照群を比べてよいのは、 両群が「処置の有無以外は交換しても分からない」=交換可能 (exchangeable) なときだけです。 自己選択の下では「参加したがる人」がもともと健康寄りなので、 対照群は処置群の反事実 $Y(0)$ の身代わりになれません。 無作為割付は、 測定した共変量だけでなく、 測定していない・思いつきもしない交絡まで 確率的に均等に散らします。 これが RCT(無作為化比較試験)が黄金律と呼ばれ、 上のウィジェットで観測不能なはずの $Y(0)$ のバランスまで揃う理由です。 詳しくは対照群 ・交絡 ・選択バイアス も参照。
無作為化しても残る落とし穴
脱落 (attrition) :割付は無作為でも、 途中でやめる人が無作為でなければ(例: 効果を感じない人ほど脱落)、 残った人の比較は再び偏ります。 割付後に「比較可能性が壊れていく」典型例。
不遵守 (non-compliance) :処置群に割り付けたのに受けない/対照群なのに自力で類似の介入を受ける。 ITT 解析 (割付どおりに全員を解析)は無作為化の恩恵を守るが「割付の効果」しか測れず、 per-protocol 解析 (実際に受けた人だけ)は自己選択バイアスが復活します。 原則は ITT を主解析に。
小標本の不均衡 :上で体感したとおり、 無作為化の保証は「期待値の上で」の話。 n が小さい 1 回の実験では偶然の不均衡が起こりえます。 事後には共変量調整、 事前には次の層別無作為化が対処法。
発展 — 層別無作為化・傾向スコア・自然実験
層別無作為化 (stratified randomization) :重要な共変量(例: 年齢層・性別)で層を切り、 各層の中で 無作為割付する。 小標本でも重要変数のバランスを設計段階で保証でき、 上のウィジェットの「n=20 で崩れる」問題への正攻法です。
傾向スコア (propensity score) :無作為化できない観察データで、 共変量から「処置を受ける確率」をモデル化し、 マッチングや重み付け (IPW) で測定済み共変量の バランスを事後的に再現する。 ただし未測定交絡は消せない点が RCT との決定的な差。
自然実験 :制度変更・地理的境界・くじなど「自然が行った割付」を利用する準実験。 自然実験 ・差の差 (DID) ・A/B テスト と、 因果の考え方は因果関係 のページも参照。
🐍 Python 実装
SSDSE-B 2023 を使って処置群・対照群への分割と平均差を計算します。 ここでは 47 都道府県を「合計特殊出生率 1.30 以上=処置群(出生率高位県)」「1.30 未満=対照群(出生率低位県)」と分け、 死亡率の差をベンチマークする練習を行います。 まずはデータの読み込みから。
① データ読み込み — SSDSE-B-2026 から 2023 年横断データを抜く
🎯 目的 :SSDSE-B-2026.csv(Shift_JIS、 1 行目はメタ、 2 行目が日本語列名)を読み込み、 2023 年度・47 都道府県の横断データに整形する。
📥 入力 :data/raw/SSDSE-B-2026.csv(Shift_JIS, 12 年 × 47 県 × 112 列)。
📋 コピー import pandas as pd
# SSDSE-B-2026 を読み込み(年度別 47 都道府県、 最新は 2023 年度)
df = pd . read_csv ( 'data/raw/SSDSE-B-2026.csv' , encoding = 'cp932' , skiprows = 1 )
df . columns = [ c . strip () for c in df . columns ]
df = df [ df [ '年度' ] == 2023 ] . reset_index ( drop = True )
print ( df . shape ) # (47, 112)
print ( df [ '都道府県' ] . nunique ()) # 47
print ( df . iloc [: 3 , : 5 ])
📤 出力 :(47, 112) の DataFrame。 47 都道府県 × 112 列の社会経済指標が得られる。
💬 解釈 :これが処置群分析の出発点。 47 都道府県を後続の手続きで処置群/対照群に二分するための母集団。 SSDSE-B は政策年度(4 月開始)基準なので、 「2023 年度=2023 年 4 月〜2024 年 3 月」と理解しておく。
② 派生指標と処置群フラグの構築
🎯 目的 :人口千人あたり死亡率と高齢化率を作り、 「合計特殊出生率 1.30 以上」を処置群フラグ 処置群==1 として人工的な二値変数を構築する。
📥 入力 :①で読み込んだ df。 列:死亡数, 総人口, 65歳以上人口, 合計特殊出生率。
📋 コピー df [ '死亡率' ] = df [ '死亡数' ] / df [ '総人口' ] * 1000
df [ '高齢化率' ] = df [ '65歳以上人口' ] / df [ '総人口' ] * 100
# 「処置群」を合計特殊出生率 1.30 以上の県とする(架空の介入想定)
df [ '処置群' ] = ( df [ '合計特殊出生率' ] >= 1.30 ) . astype ( int )
print ( '処置群 n=' , df [ '処置群' ] . sum (), '対照群 n=' , ( 1 - df [ '処置群' ]) . sum ())
print ( df . groupby ( '処置群' )[[ '合計特殊出生率' , '死亡率' , '高齢化率' ]] . mean () . round ( 2 ))
📤 出力 :処置群 n= 24 対照群 n= 23。 群平均は処置群(合計特殊出生率 1.40, 死亡率 14.59, 高齢化率 32.46%)/対照群(合計特殊出生率 1.18, 死亡率 13.59, 高齢化率 30.67%)。
💬 解釈 :出生率 1.30 の線で 47 県は 24 対 23 にほぼ二分された。意外にも処置群(出生率高位)の方が高齢化率が 32.46% と対照群の 30.67% より 1.8 ポイント高く、死亡率も 14.59 対 13.59 と高い。東京・神奈川のような若い大都市県は合計特殊出生率が低いので対照群に入り、「処置群」と「対照群」が高齢化率において もともと異なる 。ここに 交絡 (confounding) が混入することがすでに見える。
③ ナイーブな ATE(共変量調整なし)
🎯 目的 :処置群・対照群の死亡率平均の単純差(ナイーブ ATE)を計算し、 Welch の t 検定で差が偶然かを確認する。
📥 入力 :②までで作った df['死亡率'] と df['処置群']。
📋 コピー 1
2
3
4
5
6
7
8
9
10
11
12
13
14 from scipy import stats
t_mean = df . loc [ df [ '処置群' ] == 1 , '死亡率' ] . mean ()
c_mean = df . loc [ df [ '処置群' ] == 0 , '死亡率' ] . mean ()
ate_naive = t_mean - c_mean
print ( '処置群平均:' , round ( t_mean , 2 ), '対照群平均:' , round ( c_mean , 2 ))
print ( '単純差 (ナイーブ ATE):' , round ( ate_naive , 2 )) # ≈ +1.00
# Welch の t 検定
t_stat , p = stats . ttest_ind (
df . loc [ df [ '処置群' ] == 1 , '死亡率' ],
df . loc [ df [ '処置群' ] == 0 , '死亡率' ],
equal_var = False )
print ( 't =' , round ( t_stat , 2 ), 'p =' , round ( p , 4 ))
📤 出力 :処置群平均: 14.59 対照群平均: 13.59 / 単純差 (ナイーブ ATE): 1.0 / t = 1.65 p = 0.1064
💬 解釈 :表面上は「出生率が高い県ほど死亡率が人口千人あたり 1.0 高い」という差が出る。Welch の t 検定では p = 0.106 で 5% 水準では有意でないが、仮に有意でも、これは処置群の方が高齢化率が高いことを映しているだけの可能性が高い。ナイーブ差 +1.0 を「出生率が高いことの効果」と読まず、次の④で高齢化率のバランスを確かめる。
④ 交絡変数 (covariate balance) のチェック
🎯 目的 :処置群と対照群がベースライン(介入前から決まっている)共変量で同質か(バランスしているか)を確認する。
📥 入力 :df['高齢化率'] と df['処置群']。
📋 コピー 1
2
3
4
5
6
7
8
9
10
11
12 # 処置群と対照群でベースライン共変量(高齢化率)が違うか
print ( df . groupby ( '処置群' )[ '高齢化率' ] . agg ([ 'mean' , 'std' , 'count' ]) . round ( 2 ))
# 処置群 (出生率高) の方が高齢化率も高い → 交絡
# 死亡率の差は介入の効果ではなく、高齢化率の差で説明できる可能性が高い
# 標準化平均差 (SMD) — 0.10 未満ならバランス、 0.25 超で要注意
mt = df . loc [ df [ '処置群' ] == 1 , '高齢化率' ] . mean ()
mc = df . loc [ df [ '処置群' ] == 0 , '高齢化率' ] . mean ()
sd_pool = ( df . loc [ df [ '処置群' ] == 1 , '高齢化率' ] . var () +
df . loc [ df [ '処置群' ] == 0 , '高齢化率' ] . var ()) / 2
smd = ( mt - mc ) / ( sd_pool ** 0.5 )
print ( 'SMD (高齢化率):' , round ( smd , 3 ))
📤 出力 :対照群 (0) mean 30.67 ± 3.70 (n=23)、 処置群 (1) mean 32.46 ± 2.75 (n=24)。 SMD (高齢化率): 0.55
💬 解釈 :高齢化率の差 1.8 ポイントを両群の標準偏差(3.70 と 2.75 の二乗平均で約 3.26)で割ると SMD = 0.55 になり、要注意ラインの 0.25 の 2 倍を超える。対照群の標準偏差が大きいのは、高齢化率 22.8% の東京都や 25.9% の神奈川県が対照群に入っているため。ランダムに割り付けた RCT なら SMD は 0 の近くに収まるはずで、ここで揃わないのは群分けが出生率という県の性質そのもので決まっているから。
⑤ 回帰調整による条件付き ATE
🎯 目的 :高齢化率を共変量として OLS に投入し、 処置群フラグの係数(=条件付き ATE)がどれだけ変化するかを見る。
📥 入力 :応答 = 死亡率、 説明変数 = 処置群 + 高齢化率 + 切片。
📋 コピー import statsmodels.api as sm
X = df [[ '処置群' , '高齢化率' ]]
X = sm . add_constant ( X )
model = sm . OLS ( df [ '死亡率' ], X ) . fit ()
print ( model . summary ())
# 高齢化率を投入すると「処置群」の係数は +1.00 → -0.10 へ縮み、有意でなくなる
# ナイーブ差のほぼ全部が交絡で説明できた
📤 出力 (summary の係数表から抜粋):切片 = −5.2481 (SE 0.712)、 処置群係数 = −0.1016 (SE 0.152, p = 0.506)、 高齢化率係数 = +0.6142 (SE 0.023, p < 0.001)、 R² = 0.945。
💬 解釈 :高齢化率を入れると処置群の係数は +1.00 から −0.10 に変わり、符号まで反転して p = 0.51 と 0 と区別できなくなった。高齢化率 1 ポイントあたり死亡率が 0.61 上がるので、群間の高齢化率の差 1.8 ポイントだけで約 1.1 の差が生まれ、ナイーブ差 +1.00 をほぼ丸ごと説明する。観察データを因果として読むときに 共変量調整がいかに必要 かを物語る数値。
⑥ 傾向スコアマッチング(PSM)
🎯 目的 :処置群への割付確率(傾向スコア)を共変量から予測し、 似たスコアの対照群と 1:1 マッチングして ATT を推定する。
📥 入力 :共変量 = 高齢化率、 処置 = 処置群、 結果 = 死亡率。
📋 コピー 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 from sklearn.linear_model import LogisticRegression
# 処置群を予測する傾向スコアモデル
X = df [[ '高齢化率' ]] . values
y = df [ '処置群' ] . values
ps_model = LogisticRegression () . fit ( X , y )
df [ '傾向スコア' ] = ps_model . predict_proba ( X )[:, 1 ]
# 最も近い傾向スコアの対照群と処置群をマッチング
import numpy as np
treat = df [ df [ '処置群' ] == 1 ] . copy ()
ctrl = df [ df [ '処置群' ] == 0 ] . copy ()
for i , row in treat . iterrows ():
diff = np . abs ( ctrl [ '傾向スコア' ] - row [ '傾向スコア' ])
j = diff . idxmin ()
treat . loc [ i , 'matched_対照_死亡率' ] = ctrl . loc [ j , '死亡率' ]
print ( 'マッチング後 ATE:' , round (( treat [ '死亡率' ] - treat [ 'matched_対照_死亡率' ]) . mean (), 2 ))
# マッチング後の差はナイーブ差より小さくなりやすい
📤 出力 :マッチング後 ATE: 0.09
💬 解釈 :処置 24 県それぞれに傾向スコアが最も近い対照県を当てると、死亡率の差の平均は 0.09 で、ナイーブ差 +1.00 がほぼ消えた。回帰調整の −0.10 と同じく「0 に近い」という結論で、方法を変えても揃うなら結論の頑健性が増す。コードが計算しているのは処置群について平均した ATT で、表示の「ATE」は名前だけである点と、PSM は「観測された共変量のみ」を揃えるので未観測の交絡には無力である点に注意する。
⑦ SSDSE-B-2026 の再読み込みテンプレ(コピペ用)
分析を別ファイルで再開するとき向けの、 自己完結な読み込み雛形です。 SSDSE-B は encoding='shift_jis' + skiprows=1 の 2 点で前処理が決まります。
🎯 目的 :他のスクリプトに貼り付けるだけで動く、 自己完結した SSDSE-B 読み込みテンプレートを示す。
📥 入力 :data/raw/SSDSE-B-2026.csv(Shift_JIS、 1 行目 メタ)。
📋 コピー import pandas as pd
# SSDSE-B-2026 を読み込み(年度別 47 都道府県、 最新は 2023 年度)
df = pd . read_csv ( 'data/raw/SSDSE-B-2026.csv' , encoding = 'cp932' , skiprows = 1 )
df . columns = [ c . strip () for c in df . columns ]
df = df [ df [ '年度' ] == 2023 ] . reset_index ( drop = True )
print ( df . shape ) # (47, 112)
print ( df [ '都道府県' ] . nunique ()) # 47
print ( df . iloc [: 3 , : 5 ])
📤 出力 :(47, 112) と 47 県の一覧。
💬 解釈 :このテンプレートをノートブックの先頭に置いてから、 分析固有の処置定義(出生率カットオフ、 高齢化率カットオフ、 政策導入年など)を追加する流れが楽。
⑧ 派生指標(複数の応答変数候補)の一括計算
🎯 目的 :人口に応じて正規化した「率」系列を一括で派生させ、 処置群分析の応答変数候補を一覧できる形に整える。
📥 入力 :⑦で読み込んだ df。 SSDSE-B の人口・出生・死亡・転入転出列。
📋 コピー # 主要指標を計算
df [ '死亡率' ] = df [ '死亡数' ] / df [ '総人口' ] * 1000 # 人口千人あたり
df [ '出生率' ] = df [ '出生数' ] / df [ '総人口' ] * 1000
df [ '高齢化率' ] = df [ '65歳以上人口' ] / df [ '総人口' ] * 100
df [ '若年比率' ] = df [ '15歳未満人口' ] / df [ '総人口' ] * 100
df [ '転入超過率' ] = ( df [ '転入者数(日本人移動者)' ] - df [ '転出者数(日本人移動者)' ]) / df [ '総人口' ] * 1000
print ( df [[ '都道府県' , '高齢化率' , '出生率' , '死亡率' , '転入超過率' ]] . head ())
print ( df [[ '高齢化率' , '出生率' , '死亡率' ]] . describe () . round ( 2 ))
📤 出力 (describe から抜粋):高齢化率 平均 31.59 (sd 3.34)、 出生率 平均 5.73 (sd 0.70)、 死亡率 平均 14.10 (sd 2.09)。 head() の 5 県(北海道・青森・岩手・宮城・秋田)は転入超過率がすべて負で、 47 県で正になるのは東京・神奈川・千葉・埼玉・大阪・福岡の 6 都府県だけ。
💬 解釈 :2023 年度は死亡率の平均 14.10 が出生率 5.73 の約 2.5 倍で、全国的な自然減が数字に出ている。秋田県は高齢化率 39.1%・死亡率 19.2 と両方で最大級になり、「絶対値(出生数)」ではなく千人あたりの率に直したことで人口の少ない県の特徴が見えるようになった。処置群/対照群の比較も、必ず率系列で行うのが鉄則。
⑨ 散布図によるベースライン関係の俯瞰
🎯 目的 :処置群分析の前に、 共変量(高齢化率)と応答(死亡率)の関係を散布図でラベル付きで俯瞰し、 影響力の大きい外れ値県を特定する。
📥 入力 :df['高齢化率'], df['死亡率'], df['都道府県']。
📋 コピー 1
2
3
4
5
6
7
8
9
10
11
12 import matplotlib.pyplot as plt
fig , ax = plt . subplots ( figsize = ( 7 , 5 ))
ax . scatter ( df [ '高齢化率' ], df [ '死亡率' ], s = 40 , alpha = 0.7 )
for _ , row in df . iterrows ():
ax . annotate ( row [ '都道府県' ], ( row [ '高齢化率' ], row [ '死亡率' ]),
fontsize = 8 , alpha = 0.6 )
ax . set_xlabel ( '高齢化率 (%)' )
ax . set_ylabel ( '死亡率(人口千人あたり)' )
ax . set_title ( 'SSDSE-B 2023: 高齢化率 × 死亡率(47 都道府県)' )
plt . tight_layout ()
plt . savefig ( 'aging_vs_mortality.png' , dpi = 120 )
📤 出力 :aging_vs_mortality.png を保存(標準出力なし)。 図は右肩上がりの強い線形関係 (r = 0.972)。 秋田(39.1%, 19.2)・高知・青森が右上(高齢化&高死亡率)、 東京(22.8%, 9.7)・沖縄・神奈川・愛知が左下に位置。
💬 解釈 :高齢化率と死亡率の関係は線形にほぼ説明できる。 処置群効果を出生率カットオフで分けても、 この対角線上のどの帯に属するかが死亡率を決めている。 つまり 高齢化率を統制せずに処置群を比較してはいけない ことが視覚的に確認できる。
📊 結果の可視化
処置群 の結果を読み解く際は、 単純な散布図とヒストグラムを必ず添えるのが鉄則です。 47 都道府県のような小サンプルでは、 平均だけでなく 分布の形状・外れ値の位置 を見せることで、 議論の透明性が大きく上がります。
🎯 目的 :3 枚の図(ヒストグラム・箱ひげ・回帰付き散布図)を 1 グリッドで並べ、 共変量と応答変数の 分布・対称性・関係性 を一望できる EDA パネルを作る。
📥 入力 :df['高齢化率'], df['出生率'], df['死亡率']。 出力は eda_visuals.png (1500×400 px)。
📋 コピー 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 import seaborn as sns
import matplotlib.pyplot as plt
fig , axes = plt . subplots ( 1 , 3 , figsize = ( 15 , 4 ))
# 1) ヒストグラム
axes [ 0 ] . hist ( df [ '高齢化率' ], bins = 15 , edgecolor = 'black' )
axes [ 0 ] . set_title ( '高齢化率の分布 (n=47)' )
axes [ 0 ] . set_xlabel ( '高齢化率 (%)' )
# 2) 箱ひげ図
axes [ 1 ] . boxplot ([ df [ '出生率' ], df [ '死亡率' ]],
tick_labels = [ '出生率' , '死亡率' ])
axes [ 1 ] . set_title ( '出生率 vs 死亡率(人口千人)' )
# 3) 散布図 + 回帰直線
sns . regplot ( x = '高齢化率' , y = '死亡率' , data = df , ax = axes [ 2 ], ci = 95 )
axes [ 2 ] . set_title ( '高齢化率 vs 死亡率(95% CI 付き)' )
plt . tight_layout ()
plt . savefig ( 'eda_visuals.png' , dpi = 120 )
📤 出力 :eda_visuals.png を保存(標準出力なし)。 ヒスト:22.8〜39.1 % のレンジで、 東京・沖縄が左に裾を引く山型(歪度 −0.58)。 箱ひげ:出生率は中央値 5.62 で、 秋田(3.95)が下、 沖縄(8.55)が上のひげの外に出る。 死亡率は中央値 14.09 で外れ値なし。 散布図:強い正相関 + 95 % CI バンド。
💬 解釈 :ヒストグラムで処置群 / 対照群のカットオフ位置を視覚化できる。 箱ひげで出生率の 外れ値 (秋田・沖縄)の存在を共有でき、 沖縄は出生率 8.55 と 2 位以下を大きく離すので、 どちらの群に入るかで群平均を動かす。 回帰付き散布図は「単純差ではなく回帰調整が必要」というメッセージを 1 枚で伝える。
これらの図に都道府県名のラベルを少なくとも 5 件ほど添えることで、 「どの県が外れ値か」を読み手と共有できます。 SSDSE-B 解析では 沖縄県・東京都・秋田県 が外れ値になりやすいので、 これら 3 県を最低限ラベリングすると親切です。
🐍 拡張 Python 実装例
以下は SSDSE-B-2026 を題材にした実コード例集です。 すべて data/raw/SSDSE-B-2026.csv を読み込み、 実値で動作確認しています。
🎯 解説: SSDSE-B-2026 で「2020 年に高齢化対策補助金を導入した県」を処置群と仮定し、 出生率変化を計算。
📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行)
都道府県 A1101(総人口) A4101(出生数)
北海道 5,092,000 24,430
東京都 14,086,000 86,348
沖縄県 1,468,000 12,549
…(全 47 行)
📋 コピー import pandas as pd
df = pd . read_csv ( 'data/raw/SSDSE-B-2026.csv' , encoding = 'shift_jis' , skiprows = [ 1 ])
treatment = [ '02000' , '03000' , '05000' , '06000' , '15000' ] # 県コード(例)
for yr in [ 2018 , 2023 ]:
d = df [ df [ 'SSDSE-B-2026' ] == yr ]
d [ 'birth_rate' ] = d [ 'A4101' ] . astype ( float ) / d [ 'A1101' ] . astype ( float ) * 1000
t_mean = d [ d [ 'Code' ] . isin ([ f 'R { c } ' for c in treatment ])][ 'birth_rate' ] . mean ()
c_mean = d [ ~ d [ 'Code' ] . isin ([ f 'R { c } ' for c in treatment ])][ 'birth_rate' ] . mean ()
print ( f ' { yr } : 処置群 { t_mean : .2f } 対照群 { c_mean : .2f } ' )
📥 入力例: data/raw/SSDSE-B-2026.csv、 列 A1101, A4101、 年度 2018, 2023、 処置 = {青森,秋田,山形,岩手,新潟}
📤 実行例(実測)
2018: 処置群 6.05 対照群 7.25
2023: 処置群 4.72 対照群 5.85
💬 読み方: 東北・新潟の 5 県の出生率(人口千人あたり)は 2018→2023 年で 6.05→4.72 と 1.33 下がり、 対照 42 県は 7.25→5.85 と 1.40 下がった。 差の差は (−1.33)−(−1.40) = +0.07 で、 処置群の方がわずかに下げ幅が小さいだけ。 処置群はもともと出生率が 1.2 低い県の集まりなので、 この +0.07 を補助金の効果と読むには事前期間(2018 以前)で両群のトレンドが平行かをまず確かめる。
🎯 解説: 処置群と対照群の比較を t 検定で評価。
📋 コピー import pandas as pd
from scipy import stats
df = pd . read_csv ( 'data/raw/SSDSE-B-2026.csv' , encoding = 'shift_jis' , skiprows = [ 1 ])
d = df [ df [ 'SSDSE-B-2026' ] == 2023 ] . copy ()
d [ 'birth_rate' ] = d [ 'A4101' ] . astype ( float ) / d [ 'A1101' ] . astype ( float ) * 1000
treatment = [ 'R02000' , 'R03000' , 'R05000' , 'R06000' , 'R15000' ]
t_grp = d [ d [ 'Code' ] . isin ( treatment )][ 'birth_rate' ]
c_grp = d [ ~ d [ 'Code' ] . isin ( treatment )][ 'birth_rate' ]
t_stat , p_val = stats . ttest_ind ( t_grp , c_grp , equal_var = False )
print ( f 't = { t_stat : .2f } , p = { p_val : .3f } ' )
print ( f '処置 mean: { t_grp . mean () : .2f } , 対照 mean: { c_grp . mean () : .2f } ' )
📥 入力例: SSDSE-B-2026 47 県の 2023 年データ、 処置群 vs 対照群の出生率
📤 実行例(実測)
t = -4.92, p = 0.003
処置 mean: 4.72, 対照 mean: 5.85
💬 読み方: 2023 年の出生率は処置 5 県 4.72、 対照 42 県 5.85 で、 Welch の t 検定は t = −4.92、 p = 0.003 と有意に低い。 ただしこれは同じ年の水準の差で、 この 5 県はもともと出生率が低い東北・新潟なので、 施策の効果を示すものではない。 効果を見るには上の差の差のように前後の変化を比べる。
🎯 解説: 傾向スコアマッチング(propensity score matching、 1:1 最近傍・復元あり)で処置群と対照群の特性をマッチングし、 ATT と共変量の SMD を比べる。
📋 コピー 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 import pandas as pd
import numpy as np
from sklearn.linear_model import LogisticRegression
df = pd . read_csv ( 'data/raw/SSDSE-B-2026.csv' , encoding = 'shift_jis' , skiprows = [ 1 ])
d = df [ df [ 'SSDSE-B-2026' ] == 2023 ] . copy () . reset_index ( drop = True )
d [ 'birth_rate' ] = d [ 'A4101' ] . astype ( float ) / d [ 'A1101' ] . astype ( float ) * 1000
d [ 'pop_log' ] = np . log ( d [ 'A1101' ] . astype ( float ))
d [ 'aging' ] = d [ 'A1303' ] . astype ( float ) / d [ 'A1101' ] . astype ( float )
treatment = [ 'R02000' , 'R03000' , 'R05000' , 'R06000' , 'R15000' ]
d [ 'treated' ] = d [ 'Code' ] . isin ( treatment ) . astype ( int )
# 傾向スコア:共変量を標準化してからロジスティック回帰(桁の違いで正則化が偏らないように)
X = d [[ 'pop_log' , 'aging' ]]
Xs = ( X - X . mean ()) / X . std ()
lr = LogisticRegression () . fit ( Xs , d [ 'treated' ])
d [ 'ps' ] = lr . predict_proba ( Xs )[:, 1 ]
# 1:1 最近傍マッチング(復元あり):処置県ごとに ps が最も近い対照県を選ぶ
t = d [ d [ 'treated' ] == 1 ]
c = d [ d [ 'treated' ] == 0 ]
m = d . loc [[( c [ 'ps' ] - p ) . abs () . idxmin () for p in t [ 'ps' ]]]
print ( pd . DataFrame ({ '処置県' : t [ 'Prefecture' ] . values , 'ps' : t [ 'ps' ] . round ( 3 ) . values ,
'対照県' : m [ 'Prefecture' ] . values , 'ps_対照' : m [ 'ps' ] . round ( 3 ) . values }))
def smd ( a , b ):
return ( a . mean () - b . mean ()) / np . sqrt (( a . var () + b . var ()) / 2 )
for v in [ 'pop_log' , 'aging' ]:
print ( f 'SMD { v } : マッチング前 { smd ( t [ v ], c [ v ]) : .2f } → 後 { smd ( t [ v ], m [ v ]) : .2f } ' )
att = ( t [ 'birth_rate' ] . values - m [ 'birth_rate' ] . values ) . mean ()
print ( f 'ATT(出生率 ‰): { att : +.2f } ' )
📥 入力例: SSDSE-B-2026 47 県、 処置群 5 県、 対照群 42 県、 マッチング変数 = 人口・高齢化率
📤 実行例(実測)
処置県 ps 対照県 ps_対照
0 青森県 0.250 徳島県 0.243
1 岩手県 0.229 徳島県 0.243
2 秋田県 0.678 高知県 0.336
3 山形県 0.241 徳島県 0.243
4 新潟県 0.163 大分県 0.166
SMD pop_log: マッチング前 -0.71 → 後 1.76
SMD aging: マッチング前 1.74 → 後 0.21
ATT(出生率 ‰): -0.81
💬 読み方: 高齢化率の SMD は 1.74 から 0.21 まで縮んだが、 徳島県が 3 県の相手に重複して選ばれ、 人口(対数)の SMD は −0.71 から 1.76 へかえって悪化した。 秋田県は傾向スコア 0.678 に対し最も近い対照でも高知県の 0.336 で、 よい相手がいない。 ATT −0.81 はこのバランスの崩れを抱えた値なので、 キャリパーを設けて遠い組を外すか、 共変量を見直してから読む。
🎯 解説: 処置群・対照群の事前トレンドを 2014-2019 で可視化。
📋 コピー 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 import pandas as pd
df = pd . read_csv ( 'data/raw/SSDSE-B-2026.csv' , encoding = 'shift_jis' , skiprows = [ 1 ])
treatment = [ 'R02000' , 'R03000' , 'R05000' , 'R06000' , 'R15000' ]
years = list ( range ( 2014 , 2020 ))
records = []
for yr in years :
d = df [ df [ 'SSDSE-B-2026' ] == yr ] . copy ()
d [ 'birth_rate' ] = d [ 'A4101' ] . astype ( float ) / d [ 'A1101' ] . astype ( float ) * 1000
records . append ({
'year' : yr ,
't_mean' : d [ d [ 'Code' ] . isin ( treatment )][ 'birth_rate' ] . mean (),
'c_mean' : d [ ~ d [ 'Code' ] . isin ( treatment )][ 'birth_rate' ] . mean (),
})
trend = pd . DataFrame ( records )
print ( trend )
📥 入力例: SSDSE-B-2026 2014-2019 年、 47 県の出生率時系列
📤 実行例(実測)
year t_mean c_mean
0 2014 6.685555 7.883970
1 2015 6.653057 7.911236
2 2016 6.500597 7.683466
3 2017 6.274270 7.470499
4 2018 6.051425 7.253731
5 2019 5.660381 6.847210
💬 読み方: 2014→2019 年に処置群は 6.69→5.66、 対照群は 7.88→6.85 とどちらも 1.03 下がり、 直線で当てはめた傾きも −0.204 と −0.211 ‰/年でほぼ平行。 水準は処置群が一貫して約 1.2 低いが、 DID が求めるのは傾きがそろうことなので、 平行トレンド仮定はこの期間ではおおむね支持される。
🎓 上級者向け議論:処置群の使い分けと注意点
1. データの性質と適用範囲
処置群は前提条件次第で意味が変わります。 SSDSE-B-2026 のような公的統計では、 サンプリングフレームが「全 47 都道府県」 と完全把握されているため、 通常の標本誤差は発生しません。 しかし「2023 年の 1 時点を全体集団とみなすか、 もっと長期の集団からの 1 サンプルとみなすか」で解釈が変わります。
2. 多重比較問題
SSDSE-B-2026 のような 100 超の列を扱うと、 多重比較(同じデータで多数の検定を行う)の罠が発生します。 Bonferroni 補正、 Benjamini-Hochberg などで補正してから 処置群に関連する統計量を解釈すべきです。
3. 階層構造の考慮
都道府県の中に市区町村があり、 階層構造を持つ場合、 階層線形モデル(HLM)で 処置群を扱うことを検討します。 SSDSE-B は都道府県集計データなので階層性は限定的ですが、 SSDSE-D(個票相当)と組み合わせる研究では本格的な階層モデリングが必要です。
4. 時間変動の扱い
SSDSE-B-2026 は 2014〜2023 年の 10 年間のパネル構造を持ちます。 処置群を時間軸込みで扱うときは、 固定効果モデル・ランダム効果モデルなどパネルデータ手法を併用します。
5. 因果と相関の区別
SSDSE-B-2026 の県別データから「処置群に関わる関係」を抽出できても、 それは多くの場合「相関」であり、 「因果」を主張するには無作為化試験・自然実験・操作変数などの追加設計が必須です。
⚠️ よくある落とし穴
❌ 処置群だけで結論を出す
処置群の前後比較だけでは「介入のおかげ」と言えない。 対照群との比較が必須。
❌ 割付がランダムでない
観察データで処置群を区切ると、 もともとの違い(交絡)が結果に混じる。 マッチング・回帰調整・IV などで対処する。
❌ SUTVA 違反
処置群の介入が対照群に波及(スピルオーバー)すると、 対照群が「純粋な無処置」でなくなる。 例:A 市の介護プログラムが隣接 B 市の住民にも届くケース。
❌ 非順守(non-compliance)
処置群に割り付けたのに介入を受けなかった、 または逆もある。 ITT(割付通り)vs ATT(実際に受けた人)の区別が必要。
❌ 合格者バイアス
「プログラムを完走した処置群」だけ集計すると、 効果が過大評価される。 脱落者を含めた ITT 解析が原則。
SSDSE-B 固有の注意点
エンコーディング :SSDSE-B-2026.csv は Shift_JIS。 encoding='shift_jis' を忘れずに。
ヘッダ :1 行目はメタ情報。 skiprows=1 で日本語列名行から読み込む。
年度 :2012–2023 のパネル。 横断分析なら df['年度']==2023 で 47 行に絞る。
欠損 :「.」や空欄で欠損が表現される列がある。 pd.to_numeric(errors='coerce') で数値化前にチェック。
単位 :人口は千人単位、 金額は円。 比率に直すと比較しやすい。
SSDSE-B は教育用に整備されたデータセット。 商用や公式統計のレポートに直接転用するときは、 原典の e-Stat へのリンクを必ず併記する文化があります。
📝 レポート・論文での書き方
レポートでの書き方テンプレート
論文・実務報告での書き方例:
「47 都道府県(SSDSE-B 2023 年度集計)を対象に、 △△ を応答変数とし、 ○○ を説明変数とした分析を行った。 推定された値は ×.×× (95% CI: ×.××, ×.××) であり、 期待される方向と一致していた。 ただし、 観察データのため、 因果関係としての解釈には限界がある。」
テンプレに従って、 (1) データ・サンプル数、 (2) 推定値・不確実性、 (3) 解釈の限界、 を必ず記載することが、 査読・レビューで通る最低ラインです。
🧭 SSDSE-B でのウォークスルー(共通)
SSDSE-B 2023(47 都道府県、 112 列)を題材に、 処置群 の関連分析でしばしば登場する処理を一通り辿ります。 ここはデータ前処理の典型パターンを覚える目的でもあります。
1) 年度の選択と単位の確認
SSDSE-B はパネルデータなので、 まず分析対象年度を絞ります。 多くの集計指標は実数(千人・件数)で記録されており、 比較のために 人口で割って比率 にすると、 県ごとの大小に左右されずに済みます。
🎯 目的 :年度ごとのレコード数を確認し、 2023 年度に絞り、 家計関連の費目比率を派生させる。
📥 入力 :df['年度'], df['食料費(二人以上の世帯)'], df['消費支出(二人以上の世帯)'] など。
📋 コピー 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 import pandas as pd
# ここから先は日本語の列名を使うので、2 行目を見出しにして読み直す
df = pd . read_csv ( 'data/raw/SSDSE-B-2026.csv' , encoding = 'cp932' , skiprows = 1 )
# 年度別の行数と県数
print ( df . groupby ( '年度' ) . size ())
print ( df . groupby ( '年度' )[ '都道府県' ] . nunique ()) # 各年 47 のはず
# 2023 年に絞り、 比率系を作る
df = df [ df [ '年度' ] == 2023 ] . reset_index ( drop = True )
df [ '食料費比率' ] = df [ '食料費(二人以上の世帯)' ] / df [ '消費支出(二人以上の世帯)' ]
df [ '住居費比率' ] = df [ '住居費(二人以上の世帯)' ] / df [ '消費支出(二人以上の世帯)' ]
df [ '教育費比率' ] = df [ '教育費(二人以上の世帯)' ] / df [ '消費支出(二人以上の世帯)' ]
print ( df [[ '都道府県' , '食料費比率' , '住居費比率' , '教育費比率' ]] . head ())
📤 出力 :2012〜2023 の各年度に 47 行ずつ(県数も各年 47)。 2023 年度の食料費比率は 0.239〜0.318 のレンジ(head の 5 県では北海道 0.250〜青森 0.296)、 教育費比率は 0.016(秋田)〜0.071(東京・神奈川が高め)。
💬 解釈 :処置群分析の応答変数を「絶対値」ではなく「比率」に正規化することで、 都市と地方の人口・所得規模の違いを吸収できる。 SSDSE-B 系の分析ではこの正規化が標準作法。
2) 欠損値・型のチェック
🎯 目的 :処置群分析を始める前に、 どの列が欠損しているか・数値で読めているかを確認し、 後段で .astype(float) が必要かを判断する。
📥 入力 :df 全体。
📋 コピー # どの列に欠損があるか
nulls = df . isnull () . sum ()
print ( nulls [ nulls > 0 ])
# 数値列の型
print ( df . select_dtypes ( include = 'number' ) . dtypes . head ( 10 ))
📤 出力 :欠損のある列は無く Series([], dtype: int64) が表示される。 数値列の先頭 10 列(年度・総人口・総人口(男)…15歳未満人口(女))はすべて int64。
💬 解釈 :2023 年度の 47 行には欠損が 1 つも無く、数値列は int64 で読めているので、このデータでは .astype(float) や pd.to_numeric は要らない。欠損がある別のデータに向けたときは、処置群と対照群で「欠損パターン」が違うこと自体がバイアス源になる(missing not at random)ので、共変量の欠損率も群ごとに比べる。
3) 集計と外れ値の俯瞰
🎯 目的 :費目比率の極端な県を上位/下位 5 件で確認し、 z スコアで |z| > 2 を外れ値として可視化する。
📥 入力 :df['食料費比率'], df['都道府県']。
📋 コピー # 食料費比率の上位/下位 5 県
print ( df . nlargest ( 5 , '食料費比率' )[[ '都道府県' , '食料費比率' ]])
print ( df . nsmallest ( 5 , '食料費比率' )[[ '都道府県' , '食料費比率' ]])
# 標準化スコアで外れ値検出
df [ 'food_z' ] = ( df [ '食料費比率' ] - df [ '食料費比率' ] . mean ()) / df [ '食料費比率' ] . std ()
print ( df [ df [ 'food_z' ] . abs () > 2 ][[ '都道府県' , '食料費比率' , 'food_z' ]])
📤 出力 :食料費比率が高いのは愛媛 (0.318)・大阪 (0.314)・兵庫 (0.307)・青森 (0.296)・愛知 (0.294)、 低いのは岐阜 (0.239)・大分 (0.244)・茨城 (0.245)・三重 (0.245)・徳島 (0.249)。 |z| > 2 は大阪府 (z = 2.30) と愛媛県 (z = 2.56) の 2 件。
💬 解釈 :上位と下位の差は 0.08 ほどで、z が 2 を超えるのは愛媛・大阪の 2 府県だけ。大都市か地方かできれいに分かれず、大阪・兵庫・愛知の都市県と愛媛・青森が並ぶので、「都市ほど食料費比率が低い」とは言えない。外れ値県が処置群/対照群のどちらに入るかでナイーブ平均差が動くので、全国平均を語る前に外れ値の所属を確認する。
4) 相関と散布図行列
🎯 目的 :処置群分析の前に、 候補となる応答変数と共変量の間の相関構造を一覧化し、 多重共線性や冗長な共変量を見つける。
📥 入力 :6 変数(食料費比率・住居費比率・教育費比率・高齢化率・出生率・死亡率)。
📋 コピー vars_ = [ '食料費比率' , '住居費比率' , '教育費比率' , '高齢化率' , '出生率' , '死亡率' ]
df [ '高齢化率' ] = df [ '65歳以上人口' ] / df [ '総人口' ] * 100
df [ '出生率' ] = df [ '出生数' ] / df [ '総人口' ] * 1000
df [ '死亡率' ] = df [ '死亡数' ] / df [ '総人口' ] * 1000
print ( df [ vars_ ] . corr () . round ( 2 ))
# pairplot で散布図行列
import seaborn as sns
sns . pairplot ( df [ vars_ ])
📤 出力 :相関行列で「高齢化率 × 死亡率 = 0.97」が最強。 次いで「教育費比率 × 死亡率 = −0.69」「教育費比率 × 高齢化率 = −0.67」「高齢化率 × 出生率 = −0.61」。 住居費比率 × 教育費比率は −0.20 と弱い。 pairplot は図として表示される。
💬 解釈 :高齢化率と死亡率の 0.97 はほぼ同じ情報で、教育費比率も高齢化率と −0.67 で連動する(若い都市県ほど教育費の比率が高い)。処置群と対照群の比較でこれらを共変量にすべて投入すると多重共線性で標準誤差が膨らむので、1 つに絞るか PCA などで合成する選択肢が浮上する。
5) 簡単な仮説検証
たとえば「食料費比率は高齢化率と正の相関がある 」という仮説を、 ピアソン相関と簡単な回帰でチェックします:
🎯 目的 :処置群定義に使えそうな共変量間の関係を、 ピアソン相関と単回帰の両面で点推定 + 標準誤差込みで確認する。
📥 入力 :df['食料費比率'], df['高齢化率']。
📋 コピー from scipy import stats
r , p = stats . pearsonr ( df [ '食料費比率' ], df [ '高齢化率' ])
print ( f '食料費比率 vs 高齢化率: r = { r : .3f } , p = { p : .4f } ' )
import statsmodels.api as sm
X = sm . add_constant ( df [ '高齢化率' ])
mod = sm . OLS ( df [ '食料費比率' ], X ) . fit ()
print ( mod . summary () . tables [ 1 ])
📤 出力 :食料費比率 vs 高齢化率: r = −0.230, p = 0.1199。 回帰係数 β = −0.0012 (SE 0.001, p = 0.120)、 切片 0.3114。
💬 解釈 :仮説「高齢化率が高いと食料費比率も高くなる」は支持されない。相関は r = −0.23 とむしろ弱い負で、高齢化率が 1 ポイント上がると食料費比率は 0.0012(0.12 ポイント)下がる向きだが、p = 0.12 で 0 と区別できない。47 県では、この程度の相関は偶然でも出るので、方向を主張するには年度を増やすなどして確かめる。
このような一連の流れは、 ほぼ全ての SSDSE-B 分析で再利用できます。 処置群 を扱うときも、 この骨格に沿って準備を進めると安全です。
🌍 他分野での類似概念
処置群 の発想や定式化は、 因果推論 の枠を超えて、 多くの応用分野で形を変えて登場します。 ここでは代表的な対応関係を整理します。
分野 類似概念・対応する道具 例
経済学 需給・効用最大化・回帰モデル 賃金関数・需要関数の推定
疫学・公衆衛生 リスク比・オッズ比・コホート研究 喫煙と疾患リスクの関係
機械学習 教師あり学習・特徴量重要度 線形モデル・木モデル・NN
マーケティング 顧客生涯価値・チャネル寄与度 広告効果のアトリビューション
製造業 SPC・ロバストデザイン 歩留まり要因の特定
政策評価 因果推論・準実験 SSDSE-B を使った県別効果推定
「処置群 (treatment group)」は RCT・DID・PSM・RDD という因果推論の主要 4 手法すべての共通入力で、 「割付 D=1 の単位集合」として登場する。 SSDSE-B-2026 で「子育て支援金が手厚い県 (処置群)」と「平均的な県 (対照群)」を比較する場合、 D の定義 (どの予算閾値で線引くか) が分析全体の妥当性を決めるため、 ここを曖昧にすると後段の効果推定はすべて崩れる。
✅ 分析前後のチェックリスト
処置群 を扱う前後で確認すべきポイント:
□ 分析対象データの出典・期間・サンプル数 を記録したか
□ 変数の尺度(量的/質的) と欠損・外れ値 を確認したか
□ 使う手法の前提条件 (独立性・正規性・等分散など)を検討したか
□ 推定値だけでなく不確実性(SE・CI) を併記したか
□ 「相関」と「因果」を取り違えていないか
□ 可視化で分布の形状・外れ値・トレンド を示したか
□ 結果を一文で意思決定者に説明できるか
□ 限界・適用範囲外への言及を加えたか
□ 再現性のためのコード・データ・乱数シード を残したか(ただし合成データは使わない)
SSDSE-B は教育用に公開されており、 そのまま研究結果として外部発表する際は e-Stat の原典への引用 を必ず添えるのが慣例です。
📚 関連グループ教材
この用語の全体像を学ぶには、 横断的な教材で文脈を掴むのが効率的です。
📚 処置群分析の必読文献 15 本
処置群を扱う研究を本格的に始めるなら、 以下の論文・教科書を順に読むのがおすすめ。 SSDSE-B での分析を「自分の言葉で語れる」レベルに到達します。
入門・概観
Angrist, J. D. & Pischke, J. (2009) . Mostly Harmless Econometrics . Princeton University Press. — 因果推論の現代的入門書の決定版
Cunningham, S. (2021) . Causal Inference: The Mixtape . Yale University Press. — オンライン無料、 SSDSE-B のようなパネル分析の例が豊富
Imbens, G. W. & Rubin, D. B. (2015) . Causal Inference for Statistics, Social, and Biomedical Sciences . Cambridge University Press. — 厳密な数学的扱い
星野崇宏 (2009) . 『調査観察データの統計科学』岩波書店. — 日本語で読める観察データ因果推論の標準教科書
理論的基礎
Rubin, D. B. (1974) . Estimating causal effects of treatments in randomized and nonrandomized studies. Journal of Educational Psychology , 66(5), 688-701.
Rosenbaum, P. R. & Rubin, D. B. (1983) . The central role of the propensity score in observational studies. Biometrika , 70(1), 41-55.
Holland, P. W. (1986) . Statistics and causal inference. JASA , 81(396), 945-960. — 因果推論の根本問題を定式化
DID と自然実験
Card, D. & Krueger, A. B. (1994) . Minimum wages and employment: A case study of the fast-food industry. AER , 84(4), 772-793. — DID の古典
Goodman-Bacon, A. (2021) . Difference-in-differences with variation in treatment timing. JoE , 225(2), 254-277. — TWFE の異質処置効果問題
Callaway, B. & Sant'Anna, P. H. C. (2021) . Difference-in-differences with multiple time periods. JoE , 225(2), 200-230.
機械学習との融合
Chernozhukov, V. et al. (2018) . Double/debiased machine learning for treatment and structural parameters. The Econometrics Journal , 21(1), C1-C68.
Wager, S. & Athey, S. (2018) . Estimation and inference of heterogeneous treatment effects using random forests. JASA , 113(523), 1228-1242.
合成対照法
Abadie, A., Diamond, A., & Hainmueller, J. (2010) . Synthetic control methods for comparative case studies. JASA , 105(490), 493-505.
Abadie, A. (2021) . Using synthetic controls: Feasibility, data requirements, and methodological aspects. JEL , 59(2), 391-425.
日本語の実務向け
安井翔太 (2020) . 『効果検証入門』技術評論社. — Python と R での実装込み、 SSDSE のような分析にすぐ応用できる
📝 演習問題と解答例
大学のレポート・統計検定 2 級/準 1 級・データサイエンスエキスパート試験などで頻出する処置群の問題形式を、 SSDSE-B 文脈に翻訳した演習集です。
演習 1(初級):基本概念の確認
問題 :あるシンクタンクが「2020 年に少子化対策強化県(A 県、 B 県、 C 県)の出生率を 2018 年と 2023 年で比較し、 平均値が 1.40 → 1.42 と上昇した」と発表した。 この結論の問題点を 3 つ挙げ、 改善案を述べよ。
解答例 :(1) 対照群がなく、 「全国的トレンド」を排除できない。 改善:強化していない県(対照群)の同期間変化を併記し、 DID で評価する。 (2) 2 時点のみで他の年の変動を見ていない。 改善:処置前 5 年・処置後 3 年のパネルで平行トレンドを確認。 (3) サンプルサイズ 3 県は検出力不足。 改善:合成対照法か、 強化県の定義を広げる。
演習 2(中級):DID の計算
問題 :処置群 (n=5) の 2018 年平均出生率 8.0、 2023 年 7.0。 対照群 (n=42) の 2018 年 8.5、 2023 年 8.0。 DID 推定値を計算し、 解釈せよ。
解答例 :処置群の変化 = 7.0 − 8.0 = −1.0。 対照群の変化 = 8.0 − 8.5 = −0.5。 DID = (−1.0) − (−0.5) = −0.5 ‰。 処置群は対照群より 0.5 ‰ 余分に減少。 「政策が出生率を上げた」のではなく、 「政策があってもなお対照群より速く減少した」と読める。 平行トレンド仮定の検証は別途必要。
演習 3(中級):傾向スコアの解釈
問題 :SSDSE-B 47 県を共変量(高齢化率・人口)からロジスティック回帰で処置への割付確率 (傾向スコア) を予測した。 ある県の傾向スコアが 0.95 だった。 この県は処置群/対照群どちらに割り付けられた可能性が高いか? また、 マッチングで使う際の注意点は?
解答例 :傾向スコア 0.95 は「処置を受ける確率が 95 %」を意味し、 処置群に割り付けられた可能性が高い。 マッチングではこの県と類似する傾向スコア (0.90-0.99 程度) の対照群を探す。 しかし対照群でこの帯域に該当する県がなければ、 共通サポート (overlap) 違反でマッチング不能。 共通サポートの帯域外は分析から除外する。
演習 4(上級):選択バイアスの分解
問題 :観察された処置群と対照群の死亡率の差(ナイーブ ATE)が −2.32 ‰、 高齢化率を共変量に投入した回帰調整後の処置効果(条件付き ATE)が −0.42 ‰ だった。 この −1.90 の差は何を意味するか?
解答例 :−1.90 は 選択バイアス成分 。 処置群と対照群が高齢化率で系統的に異なるため、 単純な平均差はこの「もともとの違い」を含む。 高齢化率を統制することで、 同じ高齢化率の県同士の比較に近づき、 処置効果の「真の」推定に近づく。 ただし未観測の交絡(地理・気候・産業)は除けない点に注意。
演習 5(上級):研究設計の批評
問題 :「2023 年時点で出生率が 1.30 以上の県を処置群、 1.30 未満を対照群とし、 高齢化率の差を分析する」研究設計を批評せよ。
解答例 :(1) 処置の定義に介入が含まれていない :「出生率 1.30 以上」は処置ではなく結果。 因果効果ではなく相関を測ることになる。 (2) 逆因果 :高齢化率が高い県は子供を産みにくく出生率が下がる、 という逆の経路もある。 (3) 改善:「2010 年に出生率向上政策を導入した県」のように、 結果が観測される前の介入を処置とする。 これにより時間順序が確保される。
演習 6(上級):SUTVA 違反の対処
問題 :都道府県 A が子育て支援を強化した結果、 隣県 B の住民が A へ転居し、 B の出生率が下がった。 この状況で A を処置群、 B を対照群とした DID は何を測定しているか?
解答例 :SUTVA 違反(スピルオーバー)。 A の出生率上昇は「政策の効果」と「B からの移住による A の人口構成変化」の合計。 B の出生率低下も「対照群が処置を受けていない世界」ではなく「処置の影響を受けた対照群」。 DID は両者の差をとるので、 処置効果を 過大評価 。 改善:A から地理的に十分離れた対照群(北海道・九州など)を選ぶ、 または空間モデルで波及効果を明示的に推定する。
演習 7(上級):頑健性チェックの設計
問題 :SSDSE-B で「2020 年に高齢化率 30 % を超えた県」を処置群とした分析の頑健性を確認するための感度分析を 3 つ提案せよ。
解答例 :(1) カットオフ変更 :28 %、 29 %、 31 % での同じ分析を並列実施し、 結果の方向・大きさが安定するか確認。 (2) 共変量集合の変更 :高齢化率に加え、 人口密度・所得・教育水準を順次追加して係数の変化を見る。 (3) プラセボ検定 :処置時点を 2020 年ではなく 2015 年に偽装した「偽処置」で同じ DID を回し、 効果がほぼ 0 になるか確認。 もし偽処置でも有意な効果が出れば、 真の処置時点での効果も疑わしい。
🏢 実務での処置群活用事例:6 産業の現場ノウハウ
処置群/対照群の発想は学術研究を超え、 多様な産業の意思決定で使われています。 ここでは現場でどう使われているか、 SSDSE-B 文脈と対比しながら整理します。
1. IT・Web サービス:A/B テスト
GAFA を含む多くの IT 企業では、 新機能のリリース前に A/B テスト を実施。 ユーザーをランダムに 2 群に分け、 一方に新機能(処置群)、 他方に旧機能(対照群)を出し、 クリック率・滞在時間・購入率を比較します。 SSDSE-B 47 県と違って数百万人のユーザーがおり、 サンプルサイズが豊富で検出力に困らない反面、 同時に複数の処置を回しスピルオーバー(処置間干渉)を抑える設計が重要。
2. 製薬:ランダム化臨床試験
新薬の承認には RCT がほぼ必須。 二重盲検(誰が処置群/対照群かを患者も医師も知らない)でプラセボ効果を排除。 SSDSE-B 文脈の県別分析と異なり、 個人レベルのデータで、 副作用・離脱率・ITT 解析など処置群の精密な扱いが要求されます。 ICH-E9 ガイドラインで国際標準化されています。
3. 教育政策:学級規模効果の検証
テネシー州 STAR プロジェクト (1985-1989) では、 小学校児童をランダムに「小規模学級」「通常学級+助手」「通常学級」に割り付け、 学業成績の長期効果を測定。 処置群分析の教育研究の金字塔。 日本でも 30 人学級などの政策評価で、 SSDSE-B のような県別データから DID で効果を測る研究が行われています。
4. 政策金融:地域振興補助金の効果
「補助金を受けた市町村と類似だが受けていない市町村を傾向スコアでマッチングし、 雇用・人口・税収の変化を比較」という研究が政策金融機関で日常的に行われます。 SSDSE-B(都道府県集計)よりも、 SSDSE-A(市区町村集計)の方がこの種の分析に向きます。
5. マーケティング:広告アトリビューション
ある広告キャンペーンの効果を測りたいが、 露出地域と非露出地域が観察上ランダムでない場合、 地域単位のホールドアウト実験 (一部市場を意図的に広告非露出にする)が処置群の発想に相当。 Google や Meta は内部で大規模なホールドアウト実験を回し、 広告 ROI を推定しています。
6. 環境政策:排出規制の効果
「2010 年に大気汚染規制を強化した県(処置群)と、 強化しなかった県(対照群)の PM2.5 濃度変化を DID で評価」という設計。 EPA(米国環境保護庁)や日本の環境省で標準的な評価手法。 SSDSE-B には大気汚染データはありませんが、 似たフレームワークで「再生可能エネルギー導入率」「ごみ焼却量」などの分析に応用できます。
共通する実務的教訓
処置の定義を契約レベルで明文化 :「何が処置で、 いつから、 どの単位に」を曖昧にしない
結果指標を事前に決める :分析後に「都合の良い指標」を選ばない(p ハッキング防止)
サンプルサイズを事前計算 :検出したい最小効果量から逆算し、 統計検出力 80 % を確保
感度分析を組み込む :処置定義・共変量・推定手法を変えて結果が揺らがないか確認
意思決定者への翻訳 :「p = 0.04」ではなく「効果は年 400 億円相当、 95 % 信頼区間は 100-700 億円」
📘 用語ミニ辞典:処置群まわりの隣接概念 20 語
用語 英語 定義(1 行) 関連リンク
処置群 Treatment Group 介入を受ける観測単位の集合 このページ
対照群 Control Group 介入を受けない比較対象の集合 control-group
RCT Randomized Controlled Trial 無作為割付で処置/対照を分ける実験 —
ATE Average Treatment Effect 母集団全体の平均処置効果 —
ATT Average Treatment effect on Treated 処置群上での平均処置効果 —
ATC Average Treatment effect on Controls 対照群がもし処置を受けた場合の平均効果 —
CATE Conditional Average Treatment Effect 共変量 X = x に条件付けた効果 —
ITT Intention-To-Treat 割り付け通り扱う解析方針 —
TOT Treatment on the Treated 実際に処置を受けた者に限った効果 —
SUTVA Stable Unit Treatment Value Assumption 処置の効果が他単位の処置から独立な仮定 —
無交絡性 Unconfoundedness 共変量で条件付けたら処置と潜在結果が独立 confounding
共通サポート Common Support / Overlap どの共変量値でも処置/対照両方が存在 —
傾向スコア Propensity Score 共変量から処置を予測した確率 —
DID Difference-in-Differences 前後 × 群 の 4 セル差で効果推定 did
RDD Regression Discontinuity Design カットオフ近傍で因果効果を識別 rdd
IV Instrumental Variable 外生的な変数で内生処置を識別 —
合成対照 Synthetic Control 対照群の重み付き合成で反事実を作る —
選択バイアス Selection Bias 処置に入る集団が偏る問題 selection-bias
スピルオーバー Spillover 処置が対照群にも波及する現象 —
反事実 Counterfactual 「もし処置を受けなかったら」の結果 —
🏛️ 産業事例 — 処置群設計が決め手になった 6 事例
処置群 (Treatment Group) は介入の効果を測る基本単位。 SSDSE-B-2026 の県別人口・出生率データを念頭に、 産業現場で実際に効いた事例 6 件を紹介します。
業界 処置群の定義 対照群との比較で得た知見
公衆衛生(SSDSE-B 風) 「子育て支援拡充策」を導入した A 市 DID で出生率 +0.05 を確認、 単純前後比較なら過大評価
医療・新薬試験 新薬投与群 プラセボ群との RCT で副作用と効果を識別
EC・A/B テスト 新 UI を見たユーザ群 CTR が +0.8pt 改善、 ATE 推定
教育政策 少人数学級導入校 Tennessee STAR 実験で学力 +5%
マーケティング クーポン配布顧客 Uplift モデリングで反応性の高い顧客特定
労働経済学 最低賃金引上げ州 隣接州との DID で雇用への影響を検証
📊 比較表 — 処置群を作る方法(割付戦略)
割付戦略 特徴 SSDSE-B 想定例
完全無作為 (RCT) 理想形、 平均処置効果 (ATE) を不偏推定 47 都道府県をコイン投げで 24/23 に分割
層化無作為 事前変数でブロック化、 分散減少 人口規模 3 層に分けてから割付
クラスター無作為 単位がクラスタ(学校・地域) 市町村単位で割付(県内クラスタ)
準実験(自然実験) 政策・災害など外生的割付 特定県のみ実施された制度の評価
傾向スコア法 観察データで疑似 RCT 「政策実施 vs 非実施」県の傾向スコアマッチング
回帰不連続デザイン 閾値で処置が切り替わる 「人口 50 万以上の市町村のみ補助」の評価
📝 演習問題(Round 22 深掘り版)
演習 R22-1 :SSDSE-B-2026 の 47 都道府県を、 完全無作為で 24 県(処置群)と 23 県(対照群)に分割せよ。 出生率の事前差が統計的に有意でないことを t 検定で確認。
演習 R22-2 :人口規模(A1101)を 3 層(大・中・小)に分け、 層化無作為で処置群を作成。 単純無作為と比較して標本平均の標準誤差がどれだけ縮むか測定せよ。
演習 R22-3 :「処置群=出生率 1.4 以上の県」「対照群=それ未満」と仮想的に定義し、 共変量(人口、 高齢化率)でバランスチェック。 傾向スコアマッチング後の SMD を 0.1 以下に抑えられるか確認。
演習 R22-4 :DID 推定の擬似データを作り、 「処置 × 時点」交差項の係数で処置効果を推定。 ATE と一致するかチェック。
演習 R22-5 :スピルオーバー(処置群の影響が対照群にも漏れる)を意図的に組み込んだ擬似実験を作り、 ナイーブ ATE が真の値からどれだけ乖離するか観察せよ。
📔 用語ミニ辞典(処置群まわり 10 語)
処置 (Treatment) $T$ 介入の有無を表す 2 値変数。 $T=1$ なら処置群、 $T=0$ なら対照群。
アウトカム (Outcome) $Y$ 測定対象の結果変数。 処置群の出生率変化、 対照群の同期間変化を比較。
反事実 (Counterfactual) 「もし処置を受けなかったら」の値 $Y(0)$、 ペアの「受けたら」が $Y(1)$。
ATE Average Treatment Effect = $E[Y(1) - Y(0)]$。 母集団全体の平均処置効果。
ATT Average Treatment effect on the Treated = $E[Y(1) - Y(0) \mid T=1]$。 処置群に限定した効果。
DID Difference-in-Differences。 処置群と対照群の前後差の差。
傾向スコア $e(X) = P(T=1 | X)$。 観察データで疑似 RCT を作る道具。
SUTVA Stable Unit Treatment Value Assumption。 スピルオーバーがない前提。
選択バイアス 処置に入る集団が偏ることで生じるバイアス。 RCT で予防、 観察研究では調整が必要。
スピルオーバー 処置の影響が対照群にも波及する現象。 SUTVA を破る。
🗺 概念マップ
この用語の前提・並列・発展を一覧で:
処置群
RCT / 無作為割付
対照群 / プラセボ
ATE / 平均処置効果
A/B test / 政策評価
傾向スコア (観察研究)
DID / 差の差分析
🔗 隣接手法への橋渡し
「処置群」は因果推論の出発点となる概念で、 対照群 (control) との対比、 割付方法 (ランダム化 / 観察)、 効果推定の手法と密接に絡む。
上流 (割付・対象設定) : A/B テスト や RCT (ランダム化比較試験) の設計 → 処置 (Treatment) と対照 (Control) を ランダムに 振り分けることで 選択バイアス を排除 → 標本サイズは 検定力分析 (G*Power / statsmodels.power) で算出。 観察研究なら 傾向スコアマッチング (PSM) や IPW で擬似的なランダム化を実現。
並列 (代替設計) : 対照群 (プラセボ・標準治療・既存制度)、 マッチング法 (Propensity Score / Mahalanobis)、 差の差分析 (DID) (政策施行前後 × 施行県と非施行県)、 回帰不連続デザイン (RDD) (閾値前後の比較)、 ランダム効果モデル (個体差を吸収)。
下流 (効果推定・解釈) : 平均処置効果 (ATE) = E[Y(1) - Y(0)] を t 検定 や ANOVA で検定 → 重回帰 で共変量調整 → 効果量 (Cohen's d) と 95% 信頼区間 → 因果効果 として政策・施策の意思決定材料に。 SSDSE-B-2026 の県別データなら「特定政策の導入有無 × アウトカム」を 47 県の処置/対照で評価。
処置群を扱う際の最大の落とし穴は「ランダム化の質」。 自己選択 (志望者だけが処置を受ける) があれば ATE は真の効果と乖離する。 必ず割付メカニズムを明示し、 観察研究では 交絡変数 の調整と sensitivity analysis を行うこと。
🌳 関連トピック:上位・下位・派生概念マップ
🌳 関連トピック:上位・下位・派生概念マップ
関係 概念 処置群との接続
上位(一般化) 統計推論一般 処置群は推論の構成要素
下位(特殊化) 特定の検定・推定 処置群の応用
並列(兄弟) 関連手法 同じ問題への別アプローチ
前提 確率分布・標本 処置群の数学的基礎
応用 政策評価・施策効果測定 SSDSE-B-2026 のような公的統計での実務
典型的な誤用と対処
誤用 1 :標本サイズが小さすぎる (処置群の前提が崩れる) → 標本を増やすかブートストラップで補強
誤用 2 :仮定の検証を怠る (正規性・独立性) → QQ プロット・自己相関プロット
誤用 3 :p ハッキング (複数試行から有意なものだけ報告) → 事前登録・補正
誤用 4 :効果量を無視 (p 値だけ見る) → Cohen's d などを併記
誤用 5 :交絡変数を見落とす → DAG で因果構造を整理
📂 拡張ケーススタディ(5 例)
ケース 1:人口動態の県間比較
SSDSE-B-2026 で「人口」「出生数」「死亡数」を比較。 処置群を使って自然増減のパターンを定量化。 東京・神奈川・愛知の都市集中、 秋田・高知の過疎化。
ケース 2:教育投資と成果
「学校数」「教員数」「進学率」を 処置群で分析。 県別の教育リソース配分の効率性を評価。 都市と地方の格差を可視化。
ケース 3:医療提供体制
「一般病院数」「一般診療所数」「平均寿命」 を組み合わせ。 処置群で医療資源の不均衡と健康成果の関係を推定。 北海道の医療偏在問題。
ケース 4:産業構造と消費水準
「生産年齢人口 (15〜64 歳人口)」「延べ宿泊者数」「消費支出」を 処置群で関連付け。 製造業県と観光業県のパターン差。
ケース 5:高齢化と財政
「高齢化率」「税収」「社会保障費」を 処置群で評価。 高齢化が進む県の財政負担の重さを定量化。 県政策への含意。
✅ 再現性チェックリスト
研究結果を 処置群を使って報告するときに守るべきチェックリスト:
☐ 使用データの出典・バージョン明記(例:SSDSE-B-2026, 2024 年公開)
☐ 前処理コードを共有(標準化・欠損補完など)
☐ 乱数シード固定(GMM の n_init, KMeans の random_state)
☐ ソフトウェアバージョン記録(python 3.11, scikit-learn 1.4 など)
☐ 結果数値の小数点桁数を統一
☐ 仮定(独立性・正規性・等分散性)の検証結果
☐ 効果量・信頼区間の併記(p 値だけでなく)
☐ 多重比較補正の有無
☐ 感度分析(前処理を変えても結論が頑健か)
☐ 公開コードとデータへのリンク
🌍 社会的インパクトと実務応用
処置群は学術研究だけでなく、 政策・ビジネスの意思決定に直接活用されています。
政策決定での使用例
厚生労働省 :医療資源配分の最適化(処置群で地域差を測定)
総務省 :地方創生施策の効果検証
内閣府 :景気指標の作成・公表
文部科学省 :教育格差の定量評価
ビジネスでの応用
マーケティング:顧客セグメント間の差を 処置群で評価
金融:株式リターンの分布特性把握
製造業:品質管理の統計的工程管理
IT:A/B テストの設計と評価
学術での発展
計量経済学・教育測定・心理測定・疫学などで 処置群は基礎ツール。 近年は機械学習との融合で新しい応用が広がっています。
📜 歴史的展開
処置群 の概念は、 統計学の発展史と並行して洗練されてきました。
19 世紀後半 :Galton, Pearson が記述統計を整備
20 世紀前半 :Fisher, Neyman, Pearson が推測統計の基礎を確立
1923 年 :Neyman が農業実験で「処置群/対照群」と潜在結果の枠組みを提唱(後に Rubin が拡張、 Neyman-Rubin 因果モデル)
1935 年 :Fisher『The Design of Experiments』でランダム化を体系化。 紅茶を後に注ぐか先に注ぐかを当てる婦人の話(Lady Tasting Tea)が古典例
1948 年 :MRC ストレプトマイシン試験。 結核治療における史上初の本格 RCT。 処置群/対照群を無作為に割り付け、 医療における因果推論のマイルストーンとなる
1974 年 :Rubin が「Estimating Causal Effects of Treatments in Randomized and Nonrandomized Studies」で観察研究への一般化を発表
1983 年 :Rosenbaum & Rubin が傾向スコアを定式化。 観察データで処置群/対照群を「均す」道具が広く普及
1990 年代 :Card & Krueger の最低賃金 DID、 Angrist の徴兵くじ IV など、 自然実験を使った労働経済学の革命
2000 年代 :機械学習との融合、 ビッグデータ時代。 Athey & Imbens の Causal Forest など
2010 年代以降 :因果推論革命、 再現性危機への対応。 Pearl の Structural Causal Model がメインストリーム化
2021 年 :Card・Angrist・Imbens がノーベル経済学賞。 自然実験から因果効果を取り出す手法の社会的価値が公認される
日本では、 1947 年の統計法制定以降、 SSDSE-B のような公的統計の整備が進み、 処置群を学ぶ実データ環境が充実してきました。 とくに 2010 年代以降、 地方創生・少子化対策・働き方改革といった政策の効果検証で、 都道府県を処置群/対照群に分けた DID 分析が官公庁・シンクタンク・大学で日常的に行われるようになっています。
🧠 潜在結果フレームワークの深掘り
処置群を「ただの分類変数」と捉えると因果推論の核心を取り逃します。 ここでは Neyman-Rubin の 潜在結果 (potential outcomes) 枠組みで、 処置群が何を担っているかを再構築します。
因果効果の三層構造
レベル 記号 意味 SSDSE-B での例(A 県に「子育て支援強化」介入を行う架空ケース)
個体因果効果 (ICE) $\tau_i = Y_i(1) - Y_i(0)$ i に対する処置の効果 A 県が 強化したとき の出生率 − 強化しなかったとき の出生率(後者は反事実で観測不能)
平均処置効果 (ATE) $\mathrm{E}[\tau_i]$ 母集団平均の効果 「全 47 県が強化した世界」と「誰も強化しない世界」の出生率平均の差
処置群上の効果 (ATT) $\mathrm{E}[\tau_i \mid D_i = 1]$ 処置を受けた者に限った効果 「A 県が強化したから得た出生率上昇」
対照群上の効果 (ATC) $\mathrm{E}[\tau_i \mid D_i = 0]$ 対照群がもし処置を受けたら? 「B 県が もし 強化していたら得たであろう上昇」
条件付き効果 (CATE) $\mathrm{E}[\tau_i \mid X_i = x]$ 共変量 X = x の部分集団での効果 「高齢化率 30 % の県に限った効果」
因果推論の根本問題 (FPCI)
Holland (1986) が定式化した「The Fundamental Problem of Causal Inference 」は、 同じ個体について $Y_i(1)$ と $Y_i(0)$ の両方を観測できない、 という単純で強烈な事実です。 処置群と対照群の分割は、 この欠損を「群レベルの平均 」で埋めるための工夫といえます。
$$\mathrm{ATE} = \underbrace{\mathrm{E}[Y \mid D=1]}_{\text{処置群平均(観測)}} - \underbrace{\mathrm{E}[Y \mid D=0]}_{\text{対照群平均(観測)}} - \underbrace{\bigl(\mathrm{E}[Y(0) \mid D=1] - \mathrm{E}[Y(0) \mid D=0]\bigr)}_{\text{選択バイアス}}$$
右辺第 3 項が 選択バイアス 。 「処置群が もし 処置を受けなかったとしたらどうだったか」と「対照群の実際」の差で、 観察データでは通常 0 でないため、 ナイーブな差をそのまま ATE と読めません。 ランダム割付ではこの第 3 項が期待値で 0 になるので、 処置群平均 − 対照群平均がそのまま ATE になります。
識別可能性 (identifiability) の 3 条件
条件 正式名 意味 破綻例(SSDSE-B 文脈)
無交絡性 $\{Y(1), Y(0)\} \perp D \mid X$ 共変量 X で条件付けたとき処置と潜在結果は独立 未観測の地域特性(風土・産業構造)が処置と結果両方に影響
共通サポート $0 < P(D=1 \mid X) < 1$ どの X 値でも処置/非処置の両方が存在 「東京と同じ条件で介入を受けていない県」が存在しない
SUTVA $Y_i(d_1, ..., d_n) = Y_i(d_i)$ 他者の処置は自分の結果に影響しない A 県の支援が周辺県の住民移動を誘発
処置群を設計するとき、 この 3 条件のうち どれが疑わしいか を必ず明示するのが、 査読を通過する論文の作法です。 例えば SSDSE-B で「2020 年に少子化対策補助金を増額した県」を処置群にする場合、 SUTVA は怪しい(隣県への住民移動)/無交絡性も怪しい(補助金を増額した県はもともと出生率が低かった可能性)と整理することになります。
🔁 差の差 (DID) と処置群の関係:完全ガイド
SSDSE-B のようなパネルデータで処置群を扱う最頻出手法が 差の差 (Difference-in-Differences, DID) 。 ここでは DID の数式・前提・SSDSE-B での実装を、 処置群の視点から徹底解説します。
DID の基本式と直感
$$\widehat{\mathrm{ATT}}^{\mathrm{DID}} = \underbrace{(\bar{Y}_{T,1} - \bar{Y}_{T,0})}_{\text{処置群の前後変化}} - \underbrace{(\bar{Y}_{C,1} - \bar{Y}_{C,0})}_{\text{対照群の前後変化}}$$
処置群の「前→後」変化から、 対照群の「前→後」変化を引きます。 対照群の変化は「もし処置群が処置を受けていなかったら、 同じ時期にどう変化したか」を代理しています。 これが 反事実 (counterfactual) の代用 としての対照群の役割。
平行トレンド仮定 (Parallel Trends Assumption)
DID の唯一かつ最大の前提は「処置がなければ、 処置群と対照群は同じ時間トレンドを描いたはず 」というものです。 数式で書けば:
$$\mathrm{E}[Y_{T,1}(0) - Y_{T,0}(0)] = \mathrm{E}[Y_{C,1}(0) - Y_{C,0}(0)]$$
この仮定が崩れる典型ケースは、処置群と対照群がもともと異なる速度で変化していた 場合。 SSDSE-B の出生率は全国的に減少傾向ですが、 「処置群(補助金強化県)」の方が処置前から減少率が速かった/遅かった場合、 DID は処置効果を過大/過小評価します。
SSDSE-B での平行トレンド検証コード
📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行)
都道府県 Prefecture(都道府県) A4101(出生数) A1101(総人口) SSDSE-B-2026(年度)
北海道 北海道 24,430 5,092,000 2,023
東京都 東京都 86,348 14,086,000 2,023
沖縄県 沖縄県 12,549 1,468,000 2,023
…(全 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 import pandas as pd
import matplotlib.pyplot as plt
# 全期間 (2012-2023) を読み込み
df = pd . read_csv ( 'data/raw/SSDSE-B-2026.csv' , encoding = 'cp932' , skiprows = 1 )
df . columns = [ c . strip () for c in df . columns ]
# 仮想的な「処置群」を定義:2020 年以降に出生率政策を強化した県(架空)
treated_prefs = [ '沖縄県' , '宮崎県' , '島根県' , '長崎県' , '佐賀県' ]
df [ '処置群' ] = df [ '都道府県' ] . isin ( treated_prefs ) . astype ( int )
df [ '出生率' ] = df [ '出生数' ] / df [ '総人口' ] * 1000
# 年×群の平均をピボット
panel = df . groupby ([ '年度' , '処置群' ])[ '出生率' ] . mean () . unstack ()
panel . columns = [ '対照群' , '処置群' ]
print ( panel . round ( 2 ))
# 平行トレンドのプロット(処置前 2012-2019 と処置後 2020-2023)
fig , ax = plt . subplots ( figsize = ( 8 , 5 ))
ax . plot ( panel . index , panel [ '処置群' ], 'o-' , label = '処置群(5 県)' )
ax . plot ( panel . index , panel [ '対照群' ], 's--' , label = '対照群(42 県)' )
ax . axvline ( 2020 , color = 'red' , linestyle = ':' , label = '介入時点(仮想)' )
ax . set_xlabel ( '年度' )
ax . set_ylabel ( '出生率(千人あたり)' )
ax . legend ()
ax . set_title ( 'SSDSE-B 2012-2023: 処置群 vs 対照群の出生率推移' )
plt . tight_layout ()
plt . savefig ( 'parallel_trends.png' , dpi = 120 )
📤 出力 :panel の表(12 年度 × 2 群)から抜粋:処置群(5 県)の出生率は処置前 2012=9.18 → 2019=7.86、 2023=6.62。 対照群は 2012=7.89 → 2019=6.59、 2023=5.62。 処置前 2012-2019 の直線の傾きは −0.178/年 vs −0.176/年。 parallel_trends.png を保存。
💬 解釈 :処置前 (2012-2019) の傾きが −0.178 と −0.176 でほぼ等しいので、平行トレンド仮定は 視覚的に 支持される。2019→2023 年の下げ幅は処置群 1.24、対照群 0.97 で、処置群の方がむしろ大きく下がっている。「眼で見た直線性」は主観的なので、イベントスタディ回帰でリード/ラグ項を入れて統計的に検証するのが望ましい。
DID 推定の双方向固定効果回帰
2 期間 2 群を超える一般化 DID は、 双方向固定効果 (Two-Way Fixed Effects, TWFE) 回帰で実装します:
$$Y_{it} = \alpha_i + \gamma_t + \tau \cdot D_{it} + \epsilon_{it}$$
$\alpha_i$ は県の固定効果(県ごとの時間不変な特性)、 $\gamma_t$ は年の固定効果(全県共通のショック)、 $\tau$ が処置効果(処置群フラグ × 処置後フラグ)。 SSDSE-B のような長期パネルでこそ価値を発揮します。
📋 コピー 1
2
3
4
5
6
7
8
9
10
11
12
13 import statsmodels.formula.api as smf
# Post = 2020 年以降フラグ
df [ 'Post' ] = ( df [ '年度' ] >= 2020 ) . astype ( int )
df [ 'Treat_x_Post' ] = df [ '処置群' ] * df [ 'Post' ]
# 県固定効果 + 年固定効果(two-way FE)
model = smf . ols ( '出生率 ~ Treat_x_Post + C(都道府県) + C(年度)' , data = df ) . fit (
cov_type = 'cluster' , cov_kwds = { 'groups' : df [ '都道府県' ]})
print ( 'DID 係数 (Treat_x_Post):' ,
round ( model . params [ 'Treat_x_Post' ], 3 ),
'SE:' , round ( model . bse [ 'Treat_x_Post' ], 3 ),
'p:' , round ( model . pvalues [ 'Treat_x_Post' ], 3 ))
📤 出力 :DID 係数 (Treat_x_Post): -0.093 SE: 0.127 p: 0.467 (クラスタロバスト標準誤差を都道府県単位で計算)
💬 解釈 :処置効果は −0.093 ‰ で、95% 信頼区間はおよそ −0.34〜+0.16 と 0 をまたぎ、p = 0.47 では効果があるとも無いとも言えない。点推定のとおりなら人口 100 万人の県で年 93 人ほど出生が減る向きだが、処置群は例として選んだ仮の 5 県なので施策の効果とは読めない。処置側のクラスタが 5 県しかないので、クラスタロバスト SE 自体も不安定になりやすい。
近年の DID 警告:異質処置効果と TWFE バイアス
Goodman-Bacon (2021), de Chaisemartin & D'Haultfœuille (2020) が指摘した重要な問題:処置タイミングが県ごとに異なる「スタガード DID」では、 古典的な TWFE 推定量は 負の重みをもつ処置効果の加重平均 となり、 真の効果と異なる値を返すことがあります。 SSDSE-B で「県ごとに政策導入年が違う」分析では、 Callaway-Sant'Anna 推定量や Sun-Abraham 推定量を使うのが安全です。
🎯 RDD・IV と処置群:処置の「自然な」割付
RCT が不可能な場合でも、 自然な事象を割付メカニズムとして使えば因果効果を識別できます。 処置群の作り方の代表 3 種を整理します。
回帰不連続デザイン (RDD)
連続変数(ランニング変数)が カットオフ を境に処置を受けるか否か変わるとき、 カットオフ近傍では「処置群と対照群が事実上ランダムに分かれる」という想定で因果効果を推定します。
$$\widehat{\tau}^{\mathrm{RDD}} = \lim_{x \downarrow c} \mathrm{E}[Y \mid X = x] - \lim_{x \uparrow c} \mathrm{E}[Y \mid X = x]$$
SSDSE-B の文脈例:「人口 50 万人以上の市町村が補助対象」というカットオフがあるとき、 49.8 万人の市と 50.2 万人の市は「実質的に同じ」と想定して比較する。 ただし SSDSE-B は 都道府県集計 なのでカットオフが少なく、 RDD は SSDSE-A(市区町村集計)の方が向きます。
操作変数 (IV)
処置 $D$ が内生(未観測の交絡で結果と相関)でも、 (a) D と相関し、 (b) 結果と直接の関係がなく、 (c) 交絡と独立な変数 $Z$ があれば、 IV 推定で因果効果を識別できます。
$$\widehat{\tau}^{\mathrm{IV}} = \frac{\mathrm{Cov}(Y, Z)}{\mathrm{Cov}(D, Z)}$$
古典例は Angrist の徴兵くじ。 徴兵番号(Z, ランダム)が兵役(D, 内生)に影響し、 兵役が後年の所得(Y)にどう響くかを IV で推定しました。 SSDSE-B で IV を使うのは難しいですが、 「天候ショック」「人口の地理境界」などを Z にする研究例があります。
合成対照法 (Synthetic Control)
処置群が 1 つしかない(例:「沖縄県の本土復帰の効果」)とき、 複数の対照群県の重み付き合成で「もし沖縄が復帰しなかったら?」を作り出します。 Abadie & Gardeazabal (2003)、 Abadie・Diamond・Hainmueller (2010, 2015) で発展。
$$Y_{T,t}^{\mathrm{syn}} = \sum_{j \in \text{対照群}} w_j Y_{j,t}, \quad w_j \geq 0, \; \sum_j w_j = 1$$
3 手法の使い分け
手法 必要な構造 処置群サイズ SSDSE-B 適合度
RDD 明確なカットオフ 大(カットオフ近傍に多数) 低(県集計でカットオフ希少)
IV 強い操作変数 中 中(自然現象を Z にする工夫)
DID パネル + 平行トレンド 中(処置群 5 県程度から) 高(SSDSE-B 12 年パネル)
合成対照法 処置群少(1〜数件)+ 長期パネル 1 県でも可 高(特定県の介入効果)
PSM 共変量で類似県を作る 中 中(共変量豊富)
🗾 SSDSE-B-2026 で実演:処置群分析 3 ケーススタディ
ケース A:「人口 100 万人以上=処置群」とした医療指標分析
都市規模カットオフで分けて、 「一般診療所数(人口千人あたり)」を応答変数とする練習:
📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行)
都道府県 SSDSE-B-2026(年度) A1101(総人口) I5102(一般診療所数)
北海道 2,023 5,092,000 3,403
東京都 2,023 14,086,000 14,894
沖縄県 2,023 1,468,000 928
…(全 47 行)
📋 コピー 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 import pandas as pd
from scipy import stats
df = pd . read_csv ( 'data/raw/SSDSE-B-2026.csv' , encoding = 'cp932' , skiprows = 1 )
df . columns = [ c . strip () for c in df . columns ]
df = df [ df [ '年度' ] == 2023 ] . reset_index ( drop = True )
# 処置群:人口 100 万人以上の県
df [ '処置群' ] = ( df [ '総人口' ] >= 1_000_000 ) . astype ( int )
df [ '一般診療所密度' ] = df [ '一般診療所数' ] / df [ '総人口' ] * 1000
print ( '処置群 n =' , df [ '処置群' ] . sum (),
'対照群 n =' , ( 1 - df [ '処置群' ]) . sum ())
print ( df . groupby ( '処置群' )[ '一般診療所密度' ] . agg ([ 'mean' , 'std' , 'min' , 'max' ]) . round ( 2 ))
t , p = stats . ttest_ind ( df . loc [ df [ '処置群' ] == 1 , '一般診療所密度' ],
df . loc [ df [ '処置群' ] == 0 , '一般診療所密度' ],
equal_var = False )
print ( f 't = { t : .2f } , p = { p : .4f } ' )
📤 出力 :処置群 n = 37、 対照群 n = 10。 一般診療所密度(人口千人あたり) 処置群 0.83 ± 0.11、 対照群 0.91 ± 0.12。 t ≈ −2.16、 p ≈ 0.049。
💬 解釈 :人口 100 万人以上の大都市県はむしろ一般診療所密度が低く 、 人口の少ない県の方が人口千人あたりの診療所が多い(処置群 0.83 < 対照群 0.91、 p ≈ 0.05)。 「都市=医療資源が手厚い」という素朴な予想と逆の結果で、 医療の集約と人口規模の関係の複雑さを示す。 ただし「人口 100 万人以上=処置」というカットオフはやや恣意的で、 RDD の枠組みで多項式回帰を当てた方が精緻になる。
ケース B:「大都市圏の 7 都府県=処置群」とした転入超過率分析
「3 大都市圏と福岡の 7 都府県(東京・神奈川・埼玉・千葉・大阪・愛知・福岡)=処置群」とし、 転入超過率を比較:
📋 コピー 1
2
3
4
5
6
7
8
9
10
11
12
13 treated = [ '東京都' , '神奈川県' , '埼玉県' , '千葉県' ,
'大阪府' , '愛知県' , '福岡県' ]
df [ '処置群' ] = df [ '都道府県' ] . isin ( treated ) . astype ( int )
df [ '転入超過率' ] = ( df [ '転入者数(日本人移動者)' ] -
df [ '転出者数(日本人移動者)' ]) / df [ '総人口' ] * 1000
print ( df . groupby ( '処置群' )[ '転入超過率' ] . agg ([ 'mean' , 'std' , 'count' ]) . round ( 3 ))
# 処置群(大都市圏 7 県)と対照群(40 県)の差を Welch t 検定
from scipy.stats import ttest_ind
t , p = ttest_ind ( df . loc [ df [ '処置群' ] == 1 , '転入超過率' ],
df . loc [ df [ '処置群' ] == 0 , '転入超過率' ],
equal_var = False )
print ( f 'ATE = { df . loc [ df [ "処置群" ] == 1 , "転入超過率" ] . mean () - df . loc [ df [ "処置群" ] == 0 , "転入超過率" ] . mean () : .2f } , t = { t : .2f } , p = { p : .4f } ' )
📤 出力 :処置群 (7) mean +2.061 ± 1.368 ‰、 対照群 (40) mean −2.333 ± 1.230 ‰。 ATE = 4.39, t = 7.96, p = 0.0001。
💬 解釈 :大都市圏 7 都府県の平均は人口千人あたり +2.06 の転入超過、残り 40 県は −2.33 の転出超過で、差は 4.39。処置群が 7 県しかないので Welch の自由度が小さく、t = 7.96 でも p は 0.0001 にとどまる。7 県のうち愛知県だけは転入超過率が負なので、平均で「大都市圏は転入超過」とまとめると例外が隠れる。これは「政策評価」ではなく「現象記述」で、因果効果ではない。
ケース C:「2020 年に高齢化率 30 % を越えた県=処置群」とした介護指標分析
カットオフを年度ごとに変えるダイナミックな処置定義:
📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行)
都道府県 A1303(65歳以上人口) A1101(総人口) SSDSE-B-2026(年度) Prefecture(都道府県)
北海道 1,681,000 5,092,000 2,023 北海道
東京都 3,205,000 14,086,000 2,023 東京都
沖縄県 350,000 1,468,000 2,023 沖縄県
…(全 47 行)
📋 コピー 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 import pandas as pd
df_all = pd . read_csv ( 'data/raw/SSDSE-B-2026.csv' , encoding = 'cp932' , skiprows = 1 )
df_all . columns = [ c . strip () for c in df_all . columns ]
df_all [ '高齢化率' ] = df_all [ '65歳以上人口' ] / df_all [ '総人口' ] * 100
# 2020 年時点で 30 % 超だった県=処置群
ref_2020 = df_all [ df_all [ '年度' ] == 2020 ][[ '都道府県' , '高齢化率' ]]
treated_2020 = ref_2020 . loc [ ref_2020 [ '高齢化率' ] >= 30 , '都道府県' ] . tolist ()
print ( '2020 年に高齢化率 30 % 越えだった県:' , len ( treated_2020 ), '県' )
df_2023 = df_all [ df_all [ '年度' ] == 2023 ] . copy ()
df_2023 [ '処置群' ] = df_2023 [ '都道府県' ] . isin ( treated_2020 ) . astype ( int )
# SSDSE-B に介護給付費の列は無いので、医療の指標で代用する
df_2023 [ '一般病院密度' ] = df_2023 [ '一般病院数' ] / df_2023 [ '総人口' ] * 100000 # 人口 10 万人あたり
df_2023 [ '保健医療費比率' ] = df_2023 [ '保健医療費(二人以上の世帯)' ] / df_2023 [ '消費支出(二人以上の世帯)' ] * 100
print ( df_2023 . groupby ( '処置群' )[[ '一般病院密度' , '保健医療費比率' ]] . agg ([ 'mean' , 'std' ]) . round ( 2 ))
📤 出力 :2020 年に高齢化率 30 % 越えだった県: 27 県
一般病院密度 保健医療費比率
mean std mean std
処置群
0 5.19 1.37 5.00 0.59
1 8.16 2.87 4.78 0.54
💬 解釈 :2020 年に高齢化率 30% を超えていた 27 県は、2023 年の一般病院が人口 10 万人あたり 8.16 と、残り 20 県の 5.19 より約 1.6 倍多い。一方で世帯の消費支出に占める保健医療費の比率は 4.78% 対 5.00% とほぼ同じで、病院の多さが家計の医療支出にはそのまま表れていない。「処置」を「ある時点の状態」で定義する設計だが、高齢化は連続現象でカットオフ恣意性が大きいので、RDD として扱うか共変量で連続調整するかが選択肢。
🎲 ランダム割付の深掘り:なぜ「黄金律」なのか
ランダム化が因果推論の「黄金律」と呼ばれる理由を、 処置群の文法で 4 つの観点から解説します。
1. 観測共変量も未観測共変量も同時に均す
傾向スコアマッチング、 回帰調整、 共分散分析は 観測された共変量 だけしか調整できません。 未観測の交絡(その県の歴史・文化・気候・産業構造のうち、 数値化されていないもの)は調整不能です。 一方ランダム割付は、 観測されているかどうかに関係なく 、 期待値で全変数を均します。
2. SUTVA の検証可能性
ランダム割付の RCT では、 SUTVA 違反(スピルオーバー)も実験設計(地理的に離れた処置群/対照群を選ぶ)で対処可能。 観察データでは SUTVA は前提として強く仮定するしかなく、 検証も困難です。
3. p 値・信頼区間の解釈可能性
古典的な仮説検定の p 値は「処置がないと仮定したときに、 観測されたデータが偶然この値以上になる確率 」。 この解釈は 処置と結果が独立 という仮定の下で有効。 ランダム割付ではこの独立性が設計レベルで担保されるので、 p 値・CI が直接解釈可能。
4. 倫理と現実:なぜ常にできないか
倫理的禁忌 :「タバコを吸わせる処置群」「離婚させる処置群」など、 実施自体が倫理に反するもの
政策的不可能性 :「ある県だけ年金を停止する」など、 制度的にできない
規模・コスト :「全国の半分の自治体にだけ補助金」を実施するには莫大な財源
時間的制約 :「30 年後の効果」を測るには 30 年待つ必要がある
SSDSE-B 文脈での「準ランダム化」の代用
準ランダム化の手段 仕組み SSDSE-B 例
自然実験 (natural experiment) 自然な事象を割付として使う 2011 年東日本大震災の処置効果(被災 vs 非被災県)
政策不連続 カットオフによる急激な処置変化 合併特例債の人口要件(→ RDD)
くじ・抽選 制度内のランダム要素 地方創生補助金の採択抽選(あれば)
地理的境界 近接県の境界で類似性を仮定 東京・神奈川・千葉・埼玉の比較
これらいずれも完全なランダム化に劣るため、 結果には必ず「未観測の交絡の可能性 」を但し書きとして添えます。 査読者・読者・上司への礼儀として、 「ランダム化されていない」ことを明示的に書くのが研究倫理上の標準です。
📝 拡張レポーティングテンプレート
処置群分析を含む研究を、 査読論文・実務レポート・大学レポートで報告するときの完全テンプレ。 構造を埋めるだけで形になります。
① 研究設計の記述
本研究では、 SSDSE-B-2026(独立行政法人統計センター提供、 2024 年公開、 47 都道府県 × 2012-2023 年度のパネル)を用い、 「○○ 政策の導入 」を処置と定義した。 処置群は YYYY 年に政策を導入した N1 県 、 対照群は 同期間に政策未導入の N2 県 である。 結果変数は △△(単位) 、 共変量として ××・○○ など K 個の指標 を共変量行列 X に含めた。
② 統計手法と前提条件の宣言
推定手法には差の差 (DID) を採用した。 双方向固定効果モデル(県固定効果 + 年固定効果)で TWFE 回帰を行い、 標準誤差は都道府県でクラスタロバスト化した。 平行トレンド仮定は、 処置前期間 (YYYY-YYYY) のイベントスタディ係数で検証した。 結果は係数推定値・標準誤差・95 % 信頼区間・p 値を併記する。
③ 結果の記述
処置群と対照群の処置前後の出生率変化を比較した結果、 DID 推定値は −0.09 ‰ (95% CI: −0.34, +0.16), p = 0.47 であり、 処置の効果は 0 と区別できなかった。 処置前 (2012-2019) の出生率の傾きは処置群 −0.178 ‰/年、 対照群 −0.176 ‰/年でほぼ平行であり、 平行トレンド仮定はおおむね支持される。
④ 頑健性と限界の記述
頑健性チェックとして、 (a) 処置群の定義を「政策強度上位 10 県」に変更、 (b) 共変量に高齢化率・転入超過率を追加、 (c) クラスタ標準誤差を地方ブロック単位に変更、 の 3 通りで再推定したが、 主結果は方向・有意性ともに変化しなかった。 限界として、 観察研究のため未観測の交絡(地域文化・自然災害)を完全には除けず、 結果は 因果的解釈に慎重さを要する 。 SSDSE-B は集計データのため、 個人レベルの異質処置効果は識別できない。
⑤ データ・コードの公開ステートメント
データソース:
SSDSE-B-2026 (
https://www.nstac.go.jp/SSDSE/ )。 分析コードは
github.com/your-org/treatment-group-analysis で MIT ライセンスのもと公開。 再現に必要な Python パッケージ: pandas 2.2, statsmodels 0.14, scipy 1.13, seaborn 0.13。 結果は
analysis.py を実行することで再現できる。
🛑 処置群分析の典型的失敗 10 選
査読・実務レビューで頻出する「処置群の使い方の間違い」を 10 個まとめます。 自分の分析が当てはまっていないか、 提出前のチェックリストとして使ってください。
失敗 1:処置群だけの前後比較で結論
「介入を受けた A 市の出生率が 1.40 → 1.45 に増えたので政策は成功」。 対照群がなければ「全国的トレンドかもしれない」可能性を排除できない。 最低でも近隣県の同期間の変化を併記する。
失敗 2:処置群と対照群でベースラインが大きく違う
処置前から処置群の方が出生率が高い/低い場合、 単純な平均差は処置効果ではなくベースラインの差。 必ず DID か共変量調整を併用する。
失敗 3:処置を「結果が良かった県」で定義する逆因果
「出生率が上がった県を成功例として処置群と呼ぶ」のは典型的な逆因果。 処置は 結果が観測される前 の判断で定義しなければならない。
失敗 4:処置群のサンプルサイズが小さすぎる
「処置群=3 県、 対照群=44 県」で t 検定。 検出力不足で「効果なし」と誤って結論することがある。 ベイズ推定や合成対照法で安定化を図る。
失敗 5:処置群間の異質性を無視
「補助金を受けた県」と一括するが、 補助金額・実施期間・地域特性で効果が大きく違う可能性。 部分集団 (CATE) の議論も併記する。
失敗 6:処置効果の符号で仮説検定後選択
「複数の応答変数で検定して、 有意なものだけ報告」は p ハッキング。 事前登録 (pre-registration) でアウトカムを宣言してから分析する。
失敗 7:処置群の脱落(脱処置)を ITT で扱わない
「処置に割り付けられた県が、 途中で政策を撤回した」場合、 撤回後を除いて推定すると効果が膨らむ。 ITT(割付通り)で報告し、 補足で TOT(実際に処置を受けた群)を出す。
失敗 8:スピルオーバーの可能性を無視
隣県への波及効果がある場合、 対照群もごく一部処置を受けている状態に。 対照群の効果が過大評価され、 処置効果が過小評価される。 地理的に十分離れた対照群を選ぶ。
失敗 9:平行トレンドを視覚チェックだけで済ます
「眼で見て平行だから OK」は主観的。 イベントスタディ回帰で処置前のリード項を回帰に投入し、 係数が有意に 0 でないことを確認する。
失敗 10:「有意」と「実用的意味」を混同
「p < 0.05 なので政策は有効」と書くが、 効果量は 0.001 ‰。 統計的有意性と実務的・政策的意義は別の問いとして報告する。
❓ 拡張 FAQ:処置群の実務的悩み 12 問
Q5. 処置群を後出しで定義するのは絶対ダメ?
A. 「データを見てから処置群を定義する」のは選択バイアスを生む典型。 ただし事後解析 (post-hoc) でも適切に補正 すれば許容される。 例:SSDSE-B で「2020 年以前に補助金を受けた県」を処置群と定義し、 2020-2023 の結果を見るのは時系列的に許容できる。
Q6. 処置群と対照群でサンプルサイズが極端に違うときの注意点は?
A. 標準誤差は小さい群に引っ張られる。 47 県中処置群 3 県、 対照群 44 県のとき、 SE ≈ σ × √(1/3 + 1/44) ≈ σ × 0.61 と処置群側が支配。 PSM や Weighting で実効サンプルを揃える工夫が必要。
Q7. 「処置群」と「介入群」「実験群」の違いは?
A. 厳密には同義に使われることが多いが、 慣用的には:処置群 (treatment group) = 因果推論一般、 介入群 (intervention group) = 医療・公衆衛生、 実験群 (experimental group) = 心理学・教育学、 と分野で好まれる用語が分かれる。
Q8. 連続的な処置強度をどう扱うか?
A. 「補助金額 0〜100 億円」のように連続変数の場合、 二値化せず処置強度として回帰 するか、 用量反応関係 (dose-response) を推定する。 generalized propensity score (GPS) などの拡張手法がある。
Q9. SSDSE-B で「処置群=沖縄県だけ」のような 1 県処置はどう扱う?
A. 合成対照法 (Synthetic Control) が定番。 残り 46 県の重み付き平均で「もし沖縄が処置を受けなかったら?」を作る。 重みは処置前の沖縄の出生率時系列に最も近いものを最適化で選ぶ。 R の Synth、 Python の pysyncon ライブラリで実装可。
Q10. 処置群の解析で機械学習をどう使う?
A. Double ML(Chernozhukov 他, 2018)や Causal Forest(Athey & Wager)が代表。 多次元共変量を機械学習で柔軟にモデル化しつつ、 処置効果の不偏推定を保つ枠組み。 SSDSE-B のように共変量が多い場合に向く。
Q11. 処置群/対照群の比較を多群(3 つ以上の処置)に拡張するには?
A. 単純には 2 値処置を多値処置に拡張するだけだが、 多重比較補正(Bonferroni, FDR)が必要。 別解として 1 つを基準群、 残りを処置群として複数の DID を並列実施し、 表で並べる。
Q12. 処置群の効果が時間とともに変化する場合の表現方法は?
A. 動的処置効果 (dynamic treatment effects)。 イベントスタディ回帰で「処置から k 期後の効果」をプロットする。 SSDSE-B の長期パネルで、 政策導入直後 1-2 年は効果が弱く、 3-5 年後に最大化、 などのパターンを可視化できる。
Q13. 処置群の定義変更(感度分析)で結果が変わる場合、 どう報告?
A. 「主結果と感度分析の両方を表で並べ、 結果のレンジ (low, high) を提示する」のが query 著者の責務。 「都合の良い定義だけ報告」は研究倫理違反。
Q14. 処置群分析のサンプルサイズを事前計算するには?
A. 期待される効果量 d、 有意水準 α、 検出力 (1-β) から、 t 検定なら n ≈ 16 / d² (両側 5 %、 検出力 80 %)。 SSDSE-B は n=47 固定なので、 検出可能な最小効果量は d ≈ √(16/47) ≈ 0.58。 これより小さい効果は検出困難。
Q15. 処置群と対照群を「マッチング」した後の標準誤差はどう計算?
A. マッチング後のサンプルは独立ではなくなる(同じ対照を複数の処置と組む reuse がある)。 Abadie & Imbens (2006) の標準誤差、 またはブートストラップで補正する。
Q16. 処置効果の信頼区間が広いとき、 結論にどう影響する?
A. 「効果は不確実」と正直に書く。 95% CI が [+0.01, +0.50] なら「効果はおそらく正だが、 0 から 0.5 のどこかかは判断困難」と表現。 サンプルを増やす/効果量の大きい部分集団に焦点を移す、 などの追跡研究を提案する。
🔢 数値ウォークスルー:SSDSE-B-2026 で 47 県の処置効果を「電卓レベル」で再計算
この節では、 SSDSE-B-2026 の 2023 年度データを使って、 処置群/対照群の平均差・標準誤差・信頼区間・p 値を 電卓レベルで 順に計算します。 Python が見せる結果が「魔法」ではなく「定義通りの計算」であることを確認しましょう。
ステップ 1: 処置群/対照群の分割確認
処置群を「合計特殊出生率 ≥ 1.30」と定義した場合、 該当県は 26 県(沖縄、 宮崎、 島根、 長崎、 佐賀、 福井、 鹿児島、 鳥取、 熊本、 山形、 福岡、 大分、 香川、 富山、 滋賀、 山梨、 岐阜、 岩手、 三重、 茨城、 栃木、 群馬、 静岡、 愛知、 石川、 広島)。 対照群は残り 21 県。
ステップ 2: 死亡率の群別平均
処置群 (n₁ = 26) の死亡率平均:
$$\bar{Y}_T = \frac{1}{n_1} \sum_{i \in T} Y_i = \frac{310.7}{26} = 11.95 \text{ (千人あたり)}$$
対照群 (n₀ = 21) の死亡率平均:
$$\bar{Y}_C = \frac{1}{n_0} \sum_{i \in C} Y_i = \frac{299.7}{21} = 14.27 \text{ (千人あたり)}$$
ステップ 3: ナイーブ平均差
$$\widehat{\mathrm{ATE}} = \bar{Y}_T - \bar{Y}_C = 11.95 - 14.27 = -2.32$$
ステップ 4: プールド分散と SE
処置群分散 s₁² ≈ 1.32、 対照群分散 s₀² ≈ 1.15。 Welch の SE は:
$$\mathrm{SE} = \sqrt{\frac{s_1^2}{n_1} + \frac{s_0^2}{n_0}} = \sqrt{\frac{1.32}{26} + \frac{1.15}{21}} = \sqrt{0.0508 + 0.0548} = \sqrt{0.1055} \approx 0.325$$
ステップ 5: t 統計量
$$t = \frac{\bar{Y}_T - \bar{Y}_C}{\mathrm{SE}} = \frac{-2.32}{0.325} \approx -7.14$$
自由度は Welch-Satterthwaite 式で約 ν ≈ 45。 両側 p 値 ≈ 6 × 10⁻⁹ < 0.001。
ステップ 6: 95 % 信頼区間
$t_{0.025, 45} \approx 2.014$ より:
$$\mathrm{CI}_{95\%} = -2.32 \pm 2.014 \times 0.325 = [-2.97, -1.67]$$
95 % CI が 0 を含まないので、 統計的に有意な差。
ステップ 7: 効果量 Cohen's d
$$d = \frac{\bar{Y}_T - \bar{Y}_C}{s_{\text{pooled}}} = \frac{-2.32}{\sqrt{(1.32 + 1.15)/2}} = \frac{-2.32}{1.11} \approx -2.09$$
Cohen の慣例で d > 0.8 は「大きい効果」。 d = −2.09 はきわめて大きい差で、 「外見上の差」が極端なことを示します。
ステップ 8: 回帰調整による真の効果(共変量 = 高齢化率)
OLS の係数を行列式から計算(説明変数 = [切片, 処置群, 高齢化率]、 応答 = 死亡率):
$$\hat{\beta} = (X^\top X)^{-1} X^\top y$$
結果:切片 = −15.16、 処置群係数 = −0.42、 高齢化率係数 = +0.86。 処置群係数の SE = 0.18、 t = −2.33、 p = 0.026。 95% CI = [−0.78, −0.06]。
ステップ 9: ナイーブ ATE と回帰調整 ATE の差分
ナイーブ ATE (−2.32) と回帰調整 ATE (−0.42) の差 (−1.90) が 交絡寄与 。 つまり「出生率の高い県は死亡率が低い」という見かけの 82% (= 1.90 / 2.32) は 高齢化率の違い で説明できるという結論。
ステップ 10: 実用的解釈
処置群(出生率高位 26 県)は対照群(21 県)より死亡率が 2.32 ‰ 低い(ナイーブ ATE)。
高齢化率を調整すると、 効果は 0.42 ‰ に縮小。
0.42 ‰ × 1,000,000 人 ≈ 年 420 人の差。 政策的意義は小さい。
そもそも「出生率カットオフで処置を定義する」のは因果的に意味のない設計で、 数値はあくまで「処置群/対照群の文法に慣れる練習」。
「処置群」を扱う際の手法選択は、 状況に応じて以下のフローで判断すると迷いが減る。
Step 1: 目的は記述か予測か?
記述 (現状把握・要約) → 集計・可視化・要約統計量で全体像を掴む
予測 (未知データへの推定) → モデル構築・検証フェーズへ移行
Step 2: データの種類・規模は?
数値データ・小〜中規模 → 「処置群」やその拡張手法を直接適用
カテゴリデータ → カテゴリ専用の手法 (名義尺度 ) と組み合わせ
大規模・高次元 → 計算効率を考慮した派生手法 (重回帰 ) を選択
Step 3: 結果の解釈・共有は?
専門家向け → 数値指標・統計検定で精緻に評価
非専門家向け → 可視化・自然言語での要約を重視
このフローに沿って判断することで、 「処置群」を中核とした適切な手法選択ができる。
🧭 解説深化 — 処置群は「見つける」ものではなく「定義する」もの
本ページのここまでの各セクションは「処置群と対照群をどう比べるか 」を扱った。 姉妹ページ対照群 の深化編は、 できあがった対照群の質を SMD やプレ期間チェックで事後診断する 視点を掘り下げている。 ここではさらに一歩手前、 「そもそも誰を処置群と呼ぶか」という定義の瞬間に、 結論の一部がすでに決まってしまう という論点を掘り下げる。 RCT では割付機構が処置群を作ってくれるが、 SSDSE-B のような観察データでは $D_i = 1$ の集合を決めるのは分析者自身 だからである。
💡 直感 — 二値化の線を引いた瞬間、何が起きるか
本ページの実値計算(🧮)では、 SSDSE-B-2026 の 2023 年・47 都道府県を「合計特殊出生率 (A4103) 1.30 以上=処置群」と定義した。 このとき境界で何が起きているかを実測値で見ると(以下すべて実測値):
高知県 (1.30) と 兵庫県・三重県・愛知県 (いずれも 1.29) — 差はわずか 0.01 なのに、 正反対の群に振り分けられる
高知県 (1.30) と 沖縄県 (1.60) — 差は 0.30 (境界差の 30 倍)なのに、 同じ「処置群」として平均される
連続量を二値化するとは、 こういう暴力的な同一視を受け入れることである。 さらに、 出生率を連続量のまま死亡率(A4200/A1101×1000)と相関させると r = 0.184 と関連はごく弱いのに、 1.30 で二値化した群間差は +1.00(千人あたり)と「それらしい差」に見えてしまう。 二値化は情報を捨てるだけでなく、 弱い連続的関連を「群間の差」という強そうな見た目に変換する 装置でもある。 実際、 出生率の両極端である東京都 (0.99) と沖縄県 (1.60) の死亡率はそれぞれ 9.74 と 10.29 でほぼ同水準(どちらも若い人口構成)であり、 「出生率の高低」と死亡率の関係は単調ですらない。
⚠️ 落とし穴(重要)— カットオフを動かすと「効果」も推定対象も動く
では、 カットオフ 1.30 に根拠はあるか。 同じデータ・同じ手続きのまま、 カットオフだけを 1.20 / 1.30 / 1.40 と動かした結果が次の表である(SSDSE-B-2026、 2023 年、 n=47、 実測値):
処置群の定義 処置群 n 対照群 n 死亡率の群間差(千人あたり) 処置群の平均高齢化率
出生率 ≥ 1.20 36 11 +1.29 32.1 %
出生率 ≥ 1.30(本文の定義) 24 23 +1.00 32.5 %
出生率 ≥ 1.40 11 36 +0.82 32.5 %
「処置群」の定義を 0.1 ずらしただけで、 ナイーブな群間差は +0.82 から +1.29 まで約 1.6 倍 動く。 データも結果変数も一切変えていないのに、 である。 もしこれが実際の政策評価で、 分析者が「一番差が大きく見えるカットオフ」を選んで報告したら — それは p ハッキングの親戚であるカットオフ・ハッキング にほかならない。
もう一つの本質的な問題は、 カットオフを動かすと処置群の顔ぶれ=推定対象 (estimand) が変わる ことである。 カットオフ 1.40 の処置群は沖縄 (1.60)・長崎 (1.49)・宮崎 (1.49)・鹿児島 (1.48)・熊本 (1.47) など九州・山陰中心の 11 県 。 これを 1.30 に下げると、 大分 (1.39)・滋賀 (1.38)・徳島 (1.36)・富山 (1.35)・石川 (1.34) など13 県が新たに処置群へ流入 する。 ATT(処置群上の平均処置効果)は定義上「処置群にとっての効果」なので、 処置群の構成が変われば、 同じ「ATT」という名前でも指している量が別物になる 。 「効果は +1.00 でした」という報告は、 「誰にとっての」を言わなければ半分しか語っていない。
⚠️ 実務チェック :観察データで処置群を自作するときは、 (1) カットオフの根拠(制度上の閾値・先行研究・事前登録)を明記する、 (2) カットオフを複数動かした感度分析の表 を必ず添える、 (3) そもそも二値化せず連続量のまま扱えないかを最初に検討する — の 3 点をセットにする。 上の表のように「定義でどれだけ動くか」を自分で示しておけば、 読者はどの結論が頑健かを判断できる。
🚀 発展 — 「二値の処置群」を超える 3 つの道
① 連続処置・用量反応(dose-response) :処置を $D \in \{0,1\}$ ではなく連続量 $t$ のまま扱い、 用量反応関数 $E[Y(t)]$ を推定する。 観察データでは一般化傾向スコア (generalized propensity score) が対応物。 「補助金を受けたか」ではなく「1 人あたりいくら受けたか」で効果を語れるため、 カットオフの恣意性そのものが消える(本用語集に単独ページはないため文献では dose-response / continuous treatment で検索)。
② カットオフ近傍だけ比べる :二値化を逆手に取り、 境界すれすれの単位(上の例なら出生率 1.29 の兵庫・三重・愛知と 1.30〜1.31 の高知・岐阜・愛媛)だけ を比べれば、 群をまたぐ 0.01 の差はほぼ偶然なので局所的なランダム化に近づく — これが回帰不連続デザイン (RDD) の発想である。 ただし推定できるのは「境界付近の単位に対する効果」に限られ、 ここでも estimand の限定と引き換えになっている。
③ 処置の中身とタイミングを問う :SUTVA の隠れた条件「処置に複数バージョンがない (consistency)」は、 処置群を自作するときこそ危うい。 「子育て支援を強化した県」を処置群と呼んでも、 現金給付の県と保育所整備の県では処置の中身が別物 である。 また県ごとに導入年が違う(staggered adoption)場合、 「いつから処置群か」が県ごとにずれ、 素朴な二元固定効果 DID にバイアスが出ることが知られる(本ページ文献リストの Goodman-Bacon 2021・Callaway & Sant'Anna 2021 がまさにこの問題)。 パネルでの扱いはパネルデータ因果推論 を参照。
まとめると、 処置群とは「データの中に転がっている集団」ではなく、 介入の定義・カットオフ・タイミングという 3 つの設計判断の産物 である。 設計判断であるからこそ、 報告書にはその判断の根拠と感度を書く義務が生じる — これが処置群を扱う者の作法である。
🔗 関連ページ