0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

因果推論 Day 8/全30回 マッチング、LaLondeデータで「似た人」を探す

0
Last updated at Posted at 2026-08-18

この記事は、職業訓練を受けると年収が上がるのかを、観察データで確かめる回です。訓練を受けた 185 人と、無関係な調査から集めた一般の働く人とでは、訓練の前から年齢も収入も違うので、そのまま比べられません。受けた 1 人ひとりに似た相手を探して比べるマッチングを、実験の答えが分かっている LaLonde の職業訓練データで組み立てます。

登場人物

遠藤顧問: データ分析の社外顧問。答えを言わずに問いで返す/さくら: データアナリスト 1 年目。数字を出すのは速いが、相関を因果と読み違える

依頼の会話: 顧問が職業訓練を受けた 185 人のデータを説明し、さくらに「訓練で本当に年収は上がるのか」の分析を頼む。さくらの「全米調査の一般の人と年収の平均を比べる」案に、顧問が「受けたのは仕事に就きにくい人たち」という観点を添える

冒頭の会話: さくら「受けた 185 人は、一般の人より年収が 8,498 ドル低いです! 訓練は逆効果です!」顧問「いいね。で、比べた相手は誰?」さくら「全米調査の 15,992 人。年齢も訓練前の年収もだいぶ違う人たちで……」顧問「その差は訓練の差か、人の差か。比べるなら、似た人を探さないとね」

冒頭の会話(3 日後): 実験データでは、くじ引きで比べた答えが +1,794 ドルで符号が逆だと驚くさくらに、顧問が「訓練の中身は同じ。変わったのは何?」。変わったのは比べた相手だけ。相手を取り違えると効果は符号ごと崩れる。今日は似た相手を探す道具

1. 1 文で言うと

1 文で言うと

マッチングは、処置を受けた 1 人ひとりに、共変量(実務では傾向スコア)がそっくりな対照を 1 人探してペアを組み、ペアの差の平均で ATT(処置群の平均処置効果)を出す方法です。うまくいったかは効果の数字ではなく、アウトカムを見る前の共変量のバランス(SMD)で判定します。

  • 今日の数字: マッチング後の ATT は +2,202ドル で、実験の答え +1,794ドルの近くまで戻りました。

2. 今日の問い

今日の問い

職業訓練が年収を上げるか。実験の答えは +1,794ドル と分かっている。
手元にあるのが「訓練を受けた185人」と「無関係な調査から集めた15,992人」だけだったとしても、この答えに辿り着けるか?

読み終えたら、似た相手を探してペアを組み ATT を出す手順と、うまくいったかをバランスで判定する方法を説明できます。

Day 7 の IPW は、全員を残して重みで集団を「ならす」方法でした。今日はもう1つの道、処置を受けた一人ひとりに似た比較相手を「探す」マッチングをコードにします。そして観察データの推定を、実験の答えにぶつけて採点します。3.1 で式を読み、3.2 でバランスの物差し SMD を押さえ、4 で実データに当てて実験の答えと照らします。前の回から使うのは次の 2 つです。

  • Day 7(傾向スコアとIPW): 傾向スコア e(x) は、共変量から処置の受けやすさを 1 つの数にまとめたもの。今日はその近さで相手を探す
  • Day 6(割付メカニズムと非交絡性): 非交絡性とオーバーラップ。この 2 つが成り立つ前提で、似た人を比べる

3. 概念

先に、手元の道具との違いを置きます。A/B テストなら、無作為に分けた 2 群を比べれば、引き算がそのまま効果になります。回帰なら、年齢や訓練前の年収を説明変数に入れて係数を読みたくなります。今日の場面は、訓練を受けた 185 人と、年齢も訓練前の年収も分布のずれた一般の 15,992 人で、くじ引きで分けたデータではありません。回帰は、分布が重ならないところまで直線を延ばして補ってしまいます。マッチングは、似た相手がいる範囲だけで比べ、似ていない人は使いません。

3.1 マッチング:重みで「ならす」か、ペアで「探す」か

この小節が今日の主役です。前半で式を読み、後半でペアの相手の選び方(ATT・復元あり・前提)を押さえます。

顧問の一言(3.1): 「マッチングとは、一言でいうと「受けた 1 人ごとに、似た相手を探して組む」方法です」。板書は、受けた 1 人ごとに対照を 1 人・ペアの差を平均して ATT・似ていない対照は使わない

知りたいのは、訓練を受けた 1 人ひとりが、もし受けていなかったらいくら稼いでいたか、です(Day 2 の潜在的結果 $Y(0)$)。この「受けなかった姿」はどこにも記録されないので、誰かで代用するしかありません。対照群の平均で代用すると、年齢も訓練前の年収も違う人まで混ざります(今日の問いの 15,992 人がそれです)。そこで発想を変えて、処置を受けた 1 人ごとに共変量がそっくりな対照を 1 人探し、その人の結果を代役にします。このペアの引き算を全員ぶん平均したものが、今日の中心の式です。

Fig 1: 式の誕生 4 コマ(2×2)。① 受けた i の「受けなかった姿」が見たいが、記録に無い。② 対照群の平均で代用すると、背景の違う人が混ざる。③ 似た 1 人 m(i) を探してペアにし、その差 Y_i − Y_m(i) を取る。④ 差を全員ぶん平均したものに、ATT の推定量と名前を付けた

ペアさえ組めれば、推定量はペア内の引き算の平均です。

$$
\hat{\tau}{\text{ATT}} = \frac{1}{N_t} \sum{i:,W_i = 1} \bigl( Y_i - Y_{m(i)} \bigr)
$$

式は左からではなく、Σ の下の条件から読みます。「$i:,W_i = 1$」は「処置を受けた人 $i$ について」という意味で、Σ はその人たちだけを 1 人ずつ足し上げる印です。$m(i)$ は「$i$ のために探してきた相手(match)」で、$Y_{m(i)}$ はその相手の結果、つまり $i$ が受けなかった姿の代役です。つなげると、右辺は「処置を受けた人 $i$ ごとに、自分の結果 $Y_i$ からペア相手の結果 $Y_{m(i)}$ を引き、処置群の人数 $N_t$ で割って平均する」と読めます。難しいことは何もしておらず、ペアの引き算を全ペア分ならしているだけです。

Fig 2: 注釈付き数式。式は τ̂_ATT = (1/N_t) Σ (Y_i − Y_m(i))。Σ の下の i: W_i = 1 から読む。記号は上から、i: W_i = 1 は処置を受けた人だけを 1 人ずつ足す印、Y_i は本人の結果(1978 年の年収)、Y_m(i) は探してきた相手の結果で受けなかった姿の代役、1/N_t は処置群の人数(185 人)で割る印。読み下しは「処置を受けた人ごとに、自分の結果から相手の結果を引き、人数で平均する = ATT」

式にしたご利益は、比較に誰を使ったかが式の上で見えることです。式に出てくる対照は、$m(i)$ として呼ばれた人だけです。処置群の誰とも似ていない対照は、ペアに選ばれないので一度も登場しません。Day 7 の IPW が対照群を全員残して重みで分布をならしたのに対し、マッチングは似ていない対照をそもそも使いません。その違いが、この 1 行に書いてあります。

IPWとマッチングは、同じ非交絡性の土台の上に立つ兄弟です。IPWは対照群全員を使い、処置群に似た人を重く、似ていない人を軽くして分布をならします。マッチングは逆に、処置ユニット $i$ ごとに共変量(実務では傾向スコア)が最も近い対照ユニット $m(i)$ を1人探してペアを組み、似ていない対照はそもそも使いません。機械学習の言葉にすると K=1 のK近傍法そのもので、実装も sklearn の NearestNeighbors で済みます。

Fig 3: IPW とマッチングの対比(上下 2 段)。上の IPW(Day 7)は、対照を全員残し、重みでならす。○ の大きさが重みで、似ていない人も軽い重みで残る。下のマッチングは、処置ユニットごとに似た対照を 1 人探して線で結び、似ていない対照は使わない

マッチング推定量が自然に答えるのは ATT(処置群における平均処置効果) $E[Y(1) - Y(0) \mid W = 1]$ です。比較相手を探してもらえるのは処置群の側だからです。今日の問いなら「訓練を受けた人たちにとって、訓練は効いたか」であって、CPSの平均的な人が訓練を受けたらどうなるか(ATE)ではありません。

また今日は復元ありマッチングを使います。同じ対照が複数の処置ユニットのペアになることを許す方式です。似ている相手を何度でも呼び出せるのでマッチの質は上がり、バイアスは減ります。その代わり実質的に使われる対照の人数が減るので、推定のばらつき(分散)は増えます。このトレードオフを承知のうえで使います。

前提はDay 6 の道具立てそのままです。仮定は次の 3 つです。

  1. 非交絡性。この $X$ で条件付ければ割付は as-if random、つまりくじ引きで分けたのと同じように見なせる、という仮定です。
  2. オーバーラップ。Day 6 の条件で、4.3 の共通サポートがその線引きです。
  3. Day 2 の SUTVA。暗黙に仮定しています。職業訓練は労働市場を介して干渉しうる、つまり訓練を受けた人が職を得た分だけ受けなかった人の職が減るなら、ペアの引き算は「訓練の効果」と「押しのけの効果」を混ぜてしまいます。今日はこれを仮定で封じ、崩れる世界は Day 28(空間干渉)で扱います。

読み違いの図: よくある読み違いは「全員の平均を取るほうが、情報を捨てずに確かだ」。実際は、似ていない人を残すと、差に人の違いが混ざる。比べるのは似た相手だけ。図は同じ絵(受けた i と、似ている順に並べた対照 6 人)を上下に描く。上は 6 人全員の平均を比べる側、下は似た 1 人だけを結び、残りを使わない側

3.2 バランス診断:アウトカムを見る前に、SMDで設計を合格させる

マッチングが上手くいったかは、効果の数字ではなく共変量のバランスで判定します。定番の物差しが SMD(標準化平均差) です。

$$
\mathrm{SMD} = \frac{\bar{X}_t - \bar{X}_c}{\sqrt{(s_t^2 + s_c^2)/2}}
$$

分子は処置群の平均 $\bar{X}_t$ と対照群の平均 $\bar{X}_c$ の差、分母は両群の分散を平均して平方根をとった値で、これをプールした標準偏差と呼びます。平均差をプールした標準偏差で割るので、年齢もドルもダミー変数も同じ物差しで比べられます。

Fig 4: SMD の注釈付き数式。SMD = (X̄_t − X̄_c) / √((s_t² + s_c²)/2)。X̄_t は処置群(NSW)の平均、X̄_c は対照群の平均(CPS 全体、またはマッチした相手)。分子は平均の差で、歳・ドル・割合の単位がつく。分母は両群の分散を平均して平方根をとったもので、同じ単位なので割ると消える。読み下しは「2 群の平均の差を、両群のばらつきで割った、単位のないずれ(目安は 0.1 未満)」

経験的な目安は |SMD| < 0.1。全共変量についてマッチング前後のSMDを並べた図はラブプロットと呼ばれ、4.3 の Fig 7 がそれです。

大事なのは診断の順番です。Imbens & Rubin はマッチングを設計フェーズの道具と位置づけます。バランスが合格するまでは、アウトカム re78 を一切見ません。効果の数字を見ながら傾向スコアのスペックをいじり始めると、好みの答えが出るスペックを選ぶ誘惑に勝てないからです。

Fig 5: マッチングの手順(縦に 4 段と結果)。題は「合格するまで、アウトカムは見ない」。① 傾向スコアを推定する(共変量 X からロジスティック回帰で)。② 共通サポートへ絞る(帯の外にいる対照を外す)。③ 最近傍の対照を探す(処置 1 人ごとに 1 人、復元あり)。④ バランスを診断する(|SMD| が目安 0.1 未満か)。不合格なら右の矢印で ① へ戻る。合格したら、アウトカムを見て、ペアの差の平均 = ATT を出す

中間の会話: 「SMD を見て、不合格なら傾向スコアの式を直す。順番が大事」と言うさくらに、顧問が「直している最中に re78 の差をちらっと覗いたら?」。好きな答えが出るまで式をいじってしまう。だから結果は封をして、開けるのは設計が合格してから


4. 手を動かす

4.1 実験ベンチマーク +1,794ドルを確定する

NSW(National Supported Work、全米支援雇用実証) は1970年代の米国で、仕事に就きにくい人へ職業訓練を提供した実験で、参加者をくじ引きで訓練群と対照群に分けました。ランダムに割り付けたので訓練の効果という答えが分かっています。この実験の対照群を、まったく無関係な政府の労働力調査 CPS(Current Population Survey) の一般労働者にすり替えると、答え合わせのできる観察データが手に入ります。「実験の答えを知ったうえで、観察データの手法がどこまで迫れるか」を測れる、という設定そのものが教材です。

LaLonde (1986) はこの実験の答えを金標準に据え、対照群だけをCPSやPSIDといった一般調査に差し替えて当時の計量経済学の手法を試し、どの手法も実験の答えを再現できないことを示しました。観察研究への警鐘として有名になった論文です。13年後、Dehejia & Wahba (1999) が同じデータに傾向スコア法で再挑戦し、共通サポートに注意すれば実験の答えの近くまで戻れることを示しました。今日使う nsw_mixtape はその Dehejia-Wahba サンプルです。

最初に金標準を確定します。実験の中の単純比較です。

コード
from causaldata import nsw_mixtape

nsw = nsw_mixtape.load_pandas().data   # NSW職業訓練実験(Dehejia-Wahbaサンプル)
t = nsw.query("treat == 1")            # 職業訓練を受けた処置群
c_exp = nsw.query("treat == 0")        # 実験の対照群

bench = t["re78"].mean() - c_exp["re78"].mean()
print("実験ベンチマーク = %+.0f ドル(処置 %d人, 対照 %d人)" % (bench, len(t), len(c_exp)))
出力
実験ベンチマーク = +1794 ドル(処置 185人, 対照 260人)

re78 は1978年(訓練後)の年収です。無作為割付なので、Day 4 で見たとおり引き算がそのまま因果効果になります。訓練は年収を平均 +1,794ドル 押し上げました。以降、この数字を答えとして持ち歩きます。

4.2 素朴比較が -8,498ドルに崩壊する

ここからが観察研究の設定です。実験の対照群260人を捨て、代わりに一般人口の調査CPSから15,992人を対照群として連れてきます。まず何も考えずに引き算します。

コード
import pandas as pd
from causaldata import nsw_mixtape, cps_mixtape

nsw = nsw_mixtape.load_pandas().data
cps = cps_mixtape.load_pandas().data   # CPS:一般人口の調査データ(観察対照群)
t = nsw.query("treat == 1")

naive = t["re78"].mean() - cps["re78"].mean()
print("素朴比較(NSW処置群 vs CPS対照群)= %+.0f ドル" % naive)

cols = ["age", "black", "marr", "re74"]
cmp = pd.DataFrame({
    "NSW処置群": t[cols].mean(),
    "CPS対照群": cps[cols].mean(),
}).round(2)
print(cmp)
出力
素朴比較(NSW処置群 vs CPS対照群)= -8498 ドル
        NSW処置群    CPS対照群
age      25.82     33.23
black     0.84      0.07
marr      0.19      0.71
re74   2095.57  14016.80

訓練を受けると年収が 8,498ドル下がる、という数字が出ました。最初にこの符号を見たときは、まず自分のコードを疑いました。もちろん訓練のせいではありません。下の共変量を見れば理由は明白です。NSWの対象者は若く、84%が黒人で、既婚率19%、訓練前(1974年)の年収は平均2,096ドルの低所得層です。CPSは平均的な米国の労働者で、訓練前から年収が14,017ドルあります。そもそも年収水準の違う2つの集団を引き算しているだけで、Day 6 の言葉で言えば交絡因子 $X$ の分布が壊滅的にズレています。これが LaLonde が突きつけた出発点です。

表の 4 列は、どれも訓練を受けた人と大きく違います。人種だけをそろえても足りず、4 列でマスを切ると相手のいないマスだらけになります。そこで、受けやすさを 1 つの数にまとめた傾向スコアで、近い相手を探すのが次の 4.3 です。

4.3 傾向スコアで「似た人」を探し、+2,202ドルまで戻す

ここから Dehejia & Wahba の再挑戦をなぞります。手順は 3.2 の Fig 5 のとおり、傾向スコア推定 → 共通サポートへのトリミング → 最近傍マッチング → バランス診断、の順です。共通サポートとは、処置群と対照群の傾向スコアが重なっている範囲のことです。Day 6 のオーバーラップを、実際の数値で線引きしたものと思ってください。マッチングの距離は傾向スコアそのものではなく、ロジット変換した線形化傾向スコア $\log(e/(1-e))$ で測ります。$e(x)$ は0と1の近くで非線形に圧縮されているので、端での「近さ」が歪むのを補正するためです(Imbens & Rubin 第15章)。

出力を開く前に予想してください。CPS の 15,992 人のうち、傾向スコアの帯に入って、比べる相手になれる対照は何人くらいでしょうか。

予想の図(問い): 題は「比べる相手になれる対照は何人?」。左の札は、CPS の対照(傾向スコアで絞る前)が 15,992 人。右の札(帯の中の対照、処置群に似た範囲)の人数は伏せてある。選択肢は、ア ほぼ全員が入る、イ 3 人に 1 人ほど、ウ 100 人に 1 人ほど

コード
import numpy as np
import pandas as pd
import statsmodels.formula.api as smf
from causaldata import nsw_mixtape, cps_mixtape
from sklearn.neighbors import NearestNeighbors

nsw = nsw_mixtape.load_pandas().data
cps = cps_mixtape.load_pandas().data
t = nsw.query("treat == 1")
bench = t["re78"].mean() - nsw.query("treat == 0")["re78"].mean()

df = pd.concat([t, cps], ignore_index=True).copy()
df["u74"] = (df["re74"] == 0).astype(int)   # 1974年に収入ゼロ
df["u75"] = (df["re75"] == 0).astype(int)   # 1975年に収入ゼロ

# 傾向スコア(Dehejia & Wahba 1999 流のスペック)
f = ("treat ~ age + I(age**2) + I(age**3) + educ + I(educ**2)"
     " + black + hisp + marr + nodegree + re74 + re75 + u74 + u75 + educ:re74")
df["ps"] = smf.logit(f, data=df).fit(disp=0).predict(df)

# 共通サポートへのトリミング:処置群の傾向スコア帯の外にいる対照は使わない
tr, co = df.query("treat == 1"), df.query("treat == 0")
co_in = co[co["ps"].between(tr["ps"].min(), tr["ps"].max())]

# 線形化傾向スコア logit e(x) の1次元で、1対1の最近傍マッチング(復元あり)
def lps(p):
    return np.log(p / (1 - p))

nn = NearestNeighbors(n_neighbors=1).fit(lps(co_in["ps"]).to_numpy().reshape(-1, 1))
_, idx = nn.kneighbors(lps(tr["ps"]).to_numpy().reshape(-1, 1))
matched = co_in.iloc[idx.ravel()]

att = (tr["re78"].values - matched["re78"].values).mean()
print("共通サポート内の対照 = %d / %d 人" % (len(co_in), len(co)))
print("マッチング後の ATT = %+.0f ドル(実験ベンチマーク %+.0f)" % (att, bench))

# バランス診断:マッチング前後のSMD(標準化平均差)
covs = ["age", "educ", "black", "hisp", "marr", "nodegree", "re74", "re75"]
def smd(a, b):
    return (a.mean() - b.mean()) / np.sqrt((a.var() + b.var()) / 2)

bal = pd.DataFrame({
    "マッチング前": [smd(tr[v], co[v]) for v in covs],
    "マッチング後": [smd(tr[v], matched[v]) for v in covs],
}, index=covs).round(2)
print(bal)
出力
共通サポート内の対照 = 5355 / 15992 人
マッチング後の ATT = +2202 ドル(実験ベンチマーク +1794)
          マッチング前  マッチング後
age        -0.80    0.10
educ       -0.68   -0.18
black       2.43   -0.08
hisp       -0.05    0.07
marr       -1.23    0.07
nodegree    0.90    0.16
re74       -1.57    0.09
re75       -1.75   -0.00

予想の図(答え): 帯の中の対照は 5,355 人(15,992 人のうち)。答えはイ(3 人に 1 人ほど)

計算の道筋は次の 3 段です。数字は 4.1 から 4.3 の出力と本文のものです。

手計算の階段: 題は「似た相手を 1 人ずつ探して、差を平均する」。① 対照を帯の中に絞る(CPS 全体 15,992 人、傾向スコアの帯の中 5,355 人)。② 処置 1 人ごとに相手を 1 人(185 組、相手に使われた対照 115 人、同じ対照を何度も使う)。③ ペアの差を全員ぶん平均する(185 組の(本人 − 相手)を平均。参考に素朴比較 -8,498、実験の答え +1,794)。すると、効果(ATT)は +2,202 ドル

まずトリミングの行を見てください。CPSの15,992人のうち、処置群の傾向スコア帯に入る対照は 5,355人 だけです。3人に2人は「NSWの対象者に似ている確率」が低すぎて、比較相手になりません。下の Fig 6 がその様子です。左の網掛けが共通サポートの外で、CPSの大半がここに落ちます。さらに、サポート内の5,355人のうち実際にペアとして選ばれた対照は115人でした。復元ありマッチングでは、よく似た少数の対照が繰り返し使われます。

Fig 6: マッチングの模式。題は「似た相手を探す。左の網掛けは使わない」。処置ユニットごとに傾向スコア最近傍の対照を探す。左の網掛けは共通サポート外で、CPS の 3 人に 2 人は使わない。帯の中の対照 5,355 人のうち、ペアに使われたのは 115 人

次にバランス診断です。表の各行が共変量、2列が前後のSMDで、0に近いほど両群がそろっていることを意味します(符号は処置群の平均が小さいときにマイナスになるだけで、大きさだけを見ます)。マッチング前は black のSMDが 2.43、訓練前年収 re75 が 1.75 と、目安 0.1 を桁違いに超える壊滅的な偏りでした。マッチング後は8共変量中6つが0.1の内側に入り、black は 0.08 まで縮みます(educ と nodegree に 0.18、0.16 の偏りが残ります。1次元のスコアでのマッチングは万能ではありません)。ラブプロットで見ると一目瞭然です。

Fig 7: マッチング前後の共変量バランス(ラブプロット)。題は「マッチング後は、多くが目安 0.1 の内側に入る」。black の SMD は 2.43 から 0.08 へ。赤の破線が目安 0.1。橙の点がマッチング前、青の点がマッチング後

設計が概ね合格したので、ここで初めてアウトカムを見ます。ATTは +2,202ドル。素朴比較の -8,498ドルから、実験の答え +1,794ドルのすぐ近くまで戻りました。185ペアの差のばらつきから、推定値がどれくらいぶれるかの目安である標準誤差を見積もると700ドル弱あります(同じ対照を何度も使ったことを無視した粗い目安です)。この幅を踏まえると、+2,202 と +1,794 の違いはノイズの範囲です。3つの推定を並べたのが下の Fig 8 です。

Fig 8: 推定値の比較。題は「マッチングは、実験の答えの近くまで戻る」。実験の答え +1,794、素朴比較 -8,498、マッチング +2,202。赤の破線が実験の答え

中間の会話: 「+2,202 ドル、black の SMD も 0.08、交絡は消えました!」と喜ぶさくらに、顧問が「そろったのは表の 8 列だけ。訓練を受けたいという意欲は、どの列にある?」。どこにも無いし、educ と nodegree も 0.1 を超えたまま。マッチングが直せるのは X の中だけで、外の強さは Day 9 で測る

成り立つ場合と成り立たない場合

仮定 データに出るもの 今日の数字の読み方
成り立つ: 観測した $X$ で割付が説明できる バランス表で、black の SMD が 2.43 から 0.08 に縮む +2,202ドルを、実験の答え +1,794ドルの近くまで戻った数字として読む
成り立たない: 測っていない交絡がある バランス表は、入れた 8 つの共変量のそろい具合しか映さない SMD が合格でも、+2,202ドルを真の効果とは確定できない。どれだけ強い交絡で覆るかは Day 9 で測る

5. 判断の基準

マッチングの推定値を報告してよいか、そしてアウトカムをいつ開けてよいか。問いを 3 つに絞りました。上から順にたどり、最初に右へ出たところが、いまやることです。

Fig 9: 判断フロー「報告してよいか、上から 3 つ問う」。① 主要な交絡は X に入っているか(いいえなら、マッチングでは直せない。感度分析(Day 9)で耐性を測る)。② 処置群の帯の中に、似た対照はいるか(いないなら、帯の外は語らない。語れる対象の狭まりを書く)。③ マッチング後のバランスは合格か(不合格なら、スペックを見直す。効果の数字を見て選ばない)。全部通ったら、共通サポート内の ATT を報告する。ここで初めてアウトカムを見る

  • Q1 は仮定の話で、データからは検証できません。 今日実験の答えの近くへ戻れたのは、割付を説明する共変量(特に訓練前2年分の収入)がたまたま観測されていたからです。マッチングがそろえられるのは観測した $X$ の分布だけで、隠れた交絡には無力です。マッチングは非交絡性を信じたときの最善にすぎず、その信念がどれだけ崩れると結論が覆るかは、次回 Day 9 の感度分析で定量化します。
  • Q2 と Q3 はデータで確かめられる診断です。 Q2 は共通サポートに入る対照の人数(今日は 15,992 人中 5,355 人、Fig 6)、Q3 はバランス表とラブプロット(Fig 7)です。傾向スコアのスペックで答えは動きます。上のコードから3乗項と交差項を落とした素直なスペックに変えると、ATTは +513ドル まで落ち、バランスも最大|SMD| 0.21 と悪化しました。バランスの良いスペックのほうがベンチマークに近かったのは偶然ではなく、これがバランス診断でスペックを選ぶ(ATTを見て選ばない)という規律の根拠です。
  • 全部通ったら、ここで初めてアウトカムを見ます。 効果の数字を見ながらスペックを探すと、+513 から +2,202 まで並んだ候補から好みの答えを選ぶ行為になってしまうからです。報告では、4.3 の標準誤差 700ドル弱が同じ対照を何度も使ったことを無視した粗い目安であることも書き添えます。

注記 答えているのはATTで、しかも共通サポート内の話です。今日の +2,202ドルは「NSWの対象者のような低所得層が訓練を受けたときの効果」であって、CPSの平均的な労働者への効果ではありません。CPSの3人に2人を捨てた時点で、語れる対象は狭くなっています。語れる範囲が狭くなるのは手法の欠点ではなく、外挿で語らないという正直さです。

自分の仕事に当てるなら、次の問いから始められます。いま観察データで効果を報告している施策のうち、受けた側の 1 人ひとりに似た相手を、効果の数字を見る前に選べる共変量だけで探せるものはどれでしょうか。


6. 確認問題

問 1(自分の言葉で説明する) マッチングで ATT を出す手順と、うまくいったかの判定の仕方を、本文を見ずに 2 文で説明してください。

答えと解説

模範解答: マッチングは、処置を受けた 1 人ひとりに共変量(実務では傾向スコア)がそっくりな対照を 1 人探してペアを組み、ペアの差の平均で ATT を出す方法です。うまくいったかは効果の数字ではなく、アウトカムを見る前の共変量のバランス(SMD、目安は絶対値 0.1 未満)で判定し、合格してから初めてアウトカムを開きます。

次の 2 点のどちらかが抜けたら不十分です。

  • 似た相手とペアを組み、ペアの差を平均すること(全員の平均とは比べない)
  • バランスで判定し、結果を見る前に設計を合格させること(ATT を見て選ばない)

詰まったら 3.1 と 3.2 に戻ってください。

問 2(別の場面へ移す) あるウェブサービスで、新機能を使った 500 人と、使っていない 20,000 人がいます。使った人ごとに傾向スコアが最も近い使っていない人を 1 人選んでペアにし、購入額を比べる前にバランス表を見たところ、最大の |SMD| は 0.35 でした。次の一手として最も適切なものはどれでしょうか。

  • ア 購入額の差を、そのまま新機能の効果として報告する
  • イ 使っていない 20,000 人の全員の平均と、使った人の平均を比べる
  • ウ 購入額の差を見る前に、傾向スコアの式を見直して、バランスを取り直す
  • エ 傾向スコアが離れた人も、ペアに足して人数を増やす
答えと解説

ウ。目安の 0.1 を超えているので、設計がまだ合格していません。合格するまでは購入額を見ず、傾向スコアの式を直します(3.2、5 の Q3)。

  • ア(不合格のまま効果を読む読み違い): バランスが崩れたままのペアの差には、新機能の効果と、使った人と相手の違いが混ざります。
  • イ(全員の平均に戻す読み違い): 今日の素朴比較が -8,498ドルに崩れたのは、似ていない人まで混ぜたからです(4.2)。
  • エ(遠い相手まで足す読み違い): 傾向スコアが離れた人には、似た相手がいません。共通サポートの外は語らないのがルールです(5 の Q2)。

問 3(出力を読む) 4.3 のバランス表です。この出力の読み方として正しいものはどれでしょうか。

          マッチング前  マッチング後
age        -0.80    0.10
educ       -0.68   -0.18
black       2.43   -0.08
hisp       -0.05    0.07
marr       -1.23    0.07
nodegree    0.90    0.16
re74       -1.57    0.09
re75       -1.75   -0.00

ア black は符号がプラスからマイナスに変わったので、偏りが逆向きに悪化した イ 0 に近いほど両群がそろっている。8 共変量中 6 つは目安 0.1 の内側に入ったが、educ と nodegree には偏りが残っている ウ マッチング後の値が小さいので、ATT +2,202ドルは真の効果だと確定した エ re75 が -0.00 になったので、訓練前の年収は効果の推定に関係なくなった

答えと解説

イ。表の各行が共変量、2 列が前後の SMD で、大きさだけを見ます。マッチング前は black 2.43 のように目安の 20 倍を超える偏りがありましたが、マッチング後は 6 つが 0.1 の内側に入りました。educ(-0.18)と nodegree(0.16)には偏りが残り、1 次元のスコアでのマッチングは万能ではありません。

ア: 符号は処置群の平均が小さいときにマイナスになるだけで、大きさは 2.43 から 0.08 に縮んでいます。ウ: バランスは観測した共変量がそろった証拠にすぎず、隠れた交絡と推定のばらつき(標準誤差 700ドル弱)は残ります。エ: ほぼ 0 なのは、マッチした対照と処置群で re75 の平均がそろったという意味です。関係なくなったのではなく、そろえたからこそ比較になっています。


7. おわりに

末尾の会話: 「+2,202 ドル、バランスが合格するまで結果は開けませんでした!」と報告するさくらに、顧問が「相手を探し、そろったのを確かめてから開ける。それがマッチングの作法」。さくらは「次の分析は結果の列を消してから始めます、もう誰にも見られません!」と張り切り、顧問は「消したら効果も出せない。封をするだけでいい」

マッチングは、処置を受けた 1 人ひとりに、共変量(実務では傾向スコア)がそっくりな対照を 1 人探してペアを組み、ペアの差の平均で ATT(処置群の平均処置効果)を出す方法です。うまくいったかは効果の数字ではなく、アウトカムを見る前の共変量のバランス(SMD)で判定します。共通サポートの外は語らず、マッチングが直せるのは観測した $X$ の中の偏りだけです。最後に確かめます。マッチングの手順と、うまくいったかの判定の仕方を、本文を見ずに 2 文で言えますか。詰まったら 3.1 と 3.2 に戻ってください。


8. 参考(本棚)

  • Imbens & Rubin『Causal Inference for Statistics, Social, and Biomedical Sciences』第15章 マッチングによる共変量バランスの改善。設計フェーズとしてのマッチング・線形化傾向スコア・「アウトカムを見ない」原則。今日の下敷き
  • 同 第18章 マッチング推定量。ATT推定量・復元あり/なしのトレードオフ・バイアス修正。ペアの引き算の式の出どころ
  • Matheus Facure『Causal Inference for the Brave and True』第10章(Matching)。KNNとしてのマッチングと、マッチング推定量のバイアスの議論
  • LaLonde (1986) "Evaluating the Econometric Evaluations of Training Programs with Experimental Data", American Economic Review。観察手法への警鐘となった原典
  • Dehejia & Wahba (1999) "Causal Effects in Nonexperimental Studies", JASA。傾向スコアでの再挑戦。今日のスペックの元
  • データ: causaldata パッケージの nsw_mixtape / cps_mixtape(Scott Cunningham『Causal Inference: The Mixtape』掲載データ、MITライセンス、2026-08-15取得)。本文の数値はすべて掲載コードの実行結果です

この記事の位置づけ

因果推論を「本を読んだ」で終わらせず、自分の言葉で説明でき、コードで再現できる状態まで落とす 30 日連載の Day 8 です。

Fig 0: 因果推論の地図。今回は「③ 推定する」の Rubin流「マッチング」

図は縦が分析の工程、横が流派です。この記事は「③ 推定する(数字を出す)」の、Rubin流(割付を疑う)の「マッチング」を扱います(図の黒い札)。前提になるのは Day 7(傾向スコアとIPW)。ここで覚える考え方や道具は Day 15(DoWhyの4ステップ)・Day 27(落とし穴チェックリスト) で再登場します。

9. 次回予告(Day 9)

Day 9(感度分析)

マッチングもIPWも、そろえられるのは観測できた $X$ だけです。では、測れていない交絡が残っていたら結論はどうなるのか。Day 6 で「非交絡性は検証できない」と観念しましたが、諦める代わりに問いを変えます。「どれだけ強い隠れ交絡なら、この結論が覆るか」。この強さを1つの数字にするのが E-value で、次回Day 9 は感度分析を手組みします。今日の +2,202ドルがどれくらい打たれ強い数字なのかも、そこで採点します。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?