データ分析·22分で読める

因果推論入門|RCT/DID/傾向スコア/IV/RDD/合成コントロールをPython実務で使い分ける【2026年版】

因果推論の6手法(RCT・DID・傾向スコア・IV・RDD・合成コントロール)を実務目線で整理。Rubin Causal Model と Pearl の do-calculus、DoWhy/EconML/CausalML/statsmodels によるPython実装5本、Netflix・Airbnb・Uber・Instacart の企業事例、よくある間違いと「最初に学ぶべき3手法」まで、論文・公式ドキュメント出典付きで体系解説。

因果推論Causal InferenceA/BテストDID傾向スコア操作変数法RDD合成コントロールUplift ModelingDoWhyEconMLCausalMLPython効果検証
シェア
因果推論入門|RCT/DID/傾向スコア/IV/RDD/合成コントロールをPython実務で使い分ける【2026年版】

なぜ今「因果推論」が実務で必要なのか

「キャンペーンを打ったら売上が10%上がった」「クーポンを配ったユーザーは継続率が高い」 ―― こうした前後比較・群間比較は、そのままでは因果の証拠にならない。 売上は季節要因で動き、クーポン配布対象はもともと優良顧客であるかもしれない。 相関を因果と混同したまま打ち手を決めると、効いていない施策に予算を流し続けることになる。

Netflixが技術ブログで書いているように、A/Bテストを毎週数百本回している組織ですら 「因果推論は単独の手法ではなく、実験の設計・分析・長期影響の推定・ヘテロ効果の発見まで横断する方法論」として扱われている (Netflix Tech Blog: A Survey of Causal Inference Applications)。 Uber・Airbnb・Microsoftが相次いでOSSライブラリ(CausalML / ACE / DoWhy / EconML)を公開しているのも、 「意思決定の品質を上げる中核技術」として因果推論を位置付けているからだ。

本記事では、実務で使われる6つの手法(RCT / DID / 傾向スコア / IV / RDD / 合成コントロール)を、 理論・Python実装・企業事例・失敗パターンまで通しで整理する。 読み終えると「どのデータ状況で、どの手法を、どのライブラリで回せばよいか」が判断できる状態を目指す。

理論的枠組み ― 反実仮想・ATE・Rubin・Pearl

反実仮想 (Counterfactual)

因果推論のすべての出発点は「もしあのとき処置しなかったら、この人はどうなっていたか」という反実仮想である。 現実に観測できるのは「処置した場合の結果」か「処置しなかった場合の結果」のどちらか一方だけで、 残りの一方は原理的に観測不能 ―― これが因果推論の根本問題 (Fundamental Problem of Causal Inference)と呼ばれる (Holland, 1986)。因果推論の各手法は、本質的に「観測不能な反実仮想を、他のデータでどう近似するか」の技法である。

処置効果 ― ATE・ATT・CATE

処置Tの結果Yへの効果を測る指標には、スコープの違いで複数ある。

  • ATE (Average Treatment Effect): 集団全体の平均処置効果 E[Y(1) - Y(0)]。「この施策を全員に打ったら平均どれだけ効くか」
  • ATT (Average Treatment effect on the Treated): 処置を受けた人たちにとっての平均効果 E[Y(1) - Y(0) | T=1]。「実際にキャンペーン対象になったユーザーに、平均どれだけ効いたか」
  • CATE (Conditional Average Treatment Effect): 特定の属性Xを持つ人での平均効果 E[Y(1) - Y(0) | X=x]Heterogeneous Treatment Effect (HTE)とも呼ばれ、ターゲティング最適化の基礎になる

2つの学派 ― Rubin Causal Model と Pearl の Do-calculus

因果推論には歴史的に2つの大きな理論体系がある。

  • Rubin Causal Model (RCM): 各個体に潜在的結果 Y(1), Y(0) を仮定し、観測された結果は「どちらが実現したか」で決まるとする枠組み (Rubin, 2005, JASA)。 潜在的結果フレームワーク (Potential Outcomes Framework) とも呼ばれ、計量経済学・統計学で主流。
  • Pearl の Do-calculus: 有向非巡回グラフ (DAG) で因果関係を表現し、P(Y | do(T=t)) という「介入確率」を数学的に導出する枠組み (Pearl, Causality, 2000)。 バックドア基準・フロントドア基準で「どの変数を調整すれば因果効果を識別できるか」を機械的に判定できる。

実務的には両者は補完関係にある。Microsoft Researchが開発したDoWhyはPearlのDAGで識別 (Identify)を行い、 RubinフレームワークでATEを推定 (Estimate)し、感度分析で反証 (Refute)するという 「Model → Identify → Estimate → Refute」の4ステップで統合している (DoWhy documentation)。

6つの主要手法の全体像

1. RCT (Randomized Controlled Trial) ― ゴールドスタンダード

処置をランダムに割り付けるので、処置群と対照群の属性分布が期待値として等しくなる ―― これが交絡を原理的に解消し、 単純な平均の差が因果効果になる。ウェブプロダクトにおけるA/Bテストはこの最も一般的な応用だ。 Netflixは技術ブログで「A/Bテストは単なる統計検定ではなく、因果推論の設計問題として扱っている」と明言している (Netflix Tech Blog)。

ただしRCTにも限界はある。倫理的・実務的に割り付けができない介入(料金値上げ、全社的な施策、ブランディング広告)、SUTVA違反(処置群のユーザー行動が対照群にスピルオーバーするネットワーク効果)、長期影響の計測が難しい(6ヶ月後のリテンションはA/Bテストで追えない)、といった制約がある。 Netflixは短期代理指標 (proxy metric) から長期KPIを推定する手法を研究している (Netflix: Learning Better Proxy Metrics)。

2. DID (Difference-in-Differences) ― パラレルトレンド仮定

処置群と対照群の処置前後の変化量の差を取ることで、時系列トレンド・共通ショックの影響を除去する手法。 ある地域でキャンペーンを打って他地域は打たなかった、といったシチュエーションで使う。 DIDの生命線は「もし処置がなかったら、両群は並行に推移していたはず」というパラレルトレンド仮定(Parallel Trends Assumption)。処置前期間の推移を可視化して確認するのが定石だ。

Airbnb研究では、欧州27か国のCOVID-19対応強度を連続処置として扱ったDID分析が行われている (Airbnb pricing during pandemic, ScienceDirect)。

3. 傾向スコアマッチング (PSM) / IPW ― 観察データでのバランシング

処置を受ける確率(傾向スコア e(X) = P(T=1 | X))を共変量Xから推定し、 処置群の各個体に対し傾向スコアが近い対照群の個体をマッチング (PSM) するか、 傾向スコアの逆数で重み付け (IPW: Inverse Probability Weighting) することで、共変量のバランスを取る (Rosenbaum & Rubin, 1983, Biometrika)。 「観測された交絡要因はすべてXに含まれている」という強い無視可能性 (Strong Ignorability)が仮定。 観測されていない交絡が残っているとバイアスは消えない。

4. 操作変数法 (IV: Instrumental Variable) ― 自然実験

処置Tに影響するが結果Yには処置経由でしか影響しない「操作変数 Z」を使い、ZのTへの影響経由でYへの因果効果を識別する。 代表例はAngrist & Krueger (1991) の「義務教育年数と収入」で、誕生月(四半期)を操作変数として使った研究 (Angrist & Krueger, 1991, NBER)。 Web施策では「メール送信の配信遅延(サーバー側の確率的な遅延)」をIVとしてメール開封のLTV効果を測る、といった応用がある。 操作変数の要件(関連性・外生性・排他性)を満たす変数を見つけるのが最大の難しさ。

5. 回帰不連続デザイン (RDD)

ランニング変数(連続変数)が閾値を超えたかどうかで処置が決まるとき、閾値の直前・直後の個体を比較する手法。 「ちょうど閾値付近にいた個体は、処置を受けたかどうか以外はほぼ同じ」という準実験的仮定を使う。 Instacartは配送時刻のカットオフを利用したRDDで、昼12時の直前・直後に注文した顧客のチェックアウト率を比較し 施策効果を測定している (Instacart Engineering: Optimizing at the Edge with RDD)。 EC実務ではロイヤルティプログラムのティア閾値(年間購入金額99,999円 vs 100,001円)、 送料無料の閾値、クーポン配布対象スコアの閾値などが典型的な応用場面だ。

6. 合成コントロール法 (Synthetic Control)

介入対象が1つしかないケース(1つの地域だけで施策実施、1つのブランドのリブランディング、等)で、 複数の対照候補を加重平均して「介入がなかった場合の仮想的な対照」を合成する手法。 Abadie・Diamond・Hainmueller (2010) の、カリフォルニア州タバコ規制 Proposition 99 の効果推定が原典 (Abadie et al., 2010, JASA)。 カリフォルニアの介入後のタバコ消費を、他州の加重和で構築した「合成カリフォルニア」と比較することで、 2000年までに年間1人あたり26パック消費量が減少したと推定した。 国単位・企業単位のマクロ介入で、RCTが不可能な場合のデファクト手法になっている。

手法選択のフローチャート

実務でどの手法を使うかは、データ状況と介入の性質で決まる。迷ったら次の順序で判定する。

データ状況第一選択補助手法
処置をランダム割付可能RCT / A/BテストCATE推定(EconML / CausalML)でHTEを見る
処置群・対照群があり、処置前後のパネルデータDIDパラレルトレンド検証、Event Study
観察データしかないが共変量は豊富傾向スコア (PSM / IPW)Doubly Robust推定、感度分析
未観測交絡が疑われるが操作変数があるIV2SLS、弱操作変数検定
閾値ルールで処置が決まるRDDMcCrary検定、バンド幅選択
介入対象が1つの集団のみ合成コントロールPlacebo検定、Leave-one-out
組織制約でA/Bテストが不可能Airbnb ACE方式ML反実仮想推定 + A/A検証

Pythonでの実装 ― DoWhy / EconML / CausalML / statsmodels

Microsoft ResearchとMicrosoft ALICEチーム、Uber ML Platformチームがそれぞれ公開しているDoWhy(識別+推定+反証の統合フレームワーク)、EconML(Double MLを中心とするHTE推定)、CausalML(Uber発のUplift / メタラーナー)が3大OSSだ (DoWhyEconMLCausalML)。 パネル分析・DID・2SLSなどの計量経済学ベースの手法はstatsmodelslinearmodelsで実装できる。

例1: DoWhyで「Model → Identify → Estimate → Refute」の標準ワークフロー

import numpy as np
import pandas as pd
import dowhy
from dowhy import CausalModel

# サンプルデータ: クーポン配布(T)が購入金額(Y)に与える効果を推定
np.random.seed(0)
n = 5000
age = np.random.normal(35, 10, n)
past_purchase = np.random.normal(50, 20, n)
# クーポン配布確率は年齢・過去購入額に依存(交絡)
p = 1 / (1 + np.exp(-(0.03 * age + 0.02 * past_purchase - 2)))
T = np.random.binomial(1, p)
# 真の処置効果 = 15
Y = 100 + 0.5 * age + 1.2 * past_purchase + 15 * T + np.random.normal(0, 10, n)
df = pd.DataFrame({"age": age, "past_purchase": past_purchase, "T": T, "Y": Y})

# 1. Model: 因果グラフを明示
model = CausalModel(
    data=df,
    treatment="T",
    outcome="Y",
    common_causes=["age", "past_purchase"],
)

# 2. Identify: バックドア基準で識別可能か判定
identified = model.identify_effect(proceed_when_unidentifiable=True)

# 3. Estimate: 傾向スコアIPWで推定
estimate = model.estimate_effect(
    identified,
    method_name="backdoor.propensity_score_weighting",
)
print("ATE estimate:", estimate.value)

# 4. Refute: 処置をランダム置換しても効果が残るか感度分析
refute = model.refute_estimate(
    identified, estimate, method_name="placebo_treatment_refuter"
)
print(refute)

例2: EconMLのLinearDMLでCATE(ヘテロ処置効果)を推定

from econml.dml import LinearDML
from sklearn.ensemble import GradientBoostingRegressor, GradientBoostingClassifier

# 共変量X、処置T、結果Y
X = df[["age", "past_purchase"]].values
T = df["T"].values
Y = df["Y"].values

dml = LinearDML(
    model_y=GradientBoostingRegressor(),
    model_t=GradientBoostingClassifier(),
    discrete_treatment=True,
    cv=5,
)
dml.fit(Y, T, X=X)

# 全体の平均効果
ate = dml.ate(X)
print("ATE:", ate)

# ユーザーごとの処置効果(CATE)
cate = dml.effect(X)
print("CATE分布:", pd.Series(cate).describe())

# 信頼区間付き
lb, ub = dml.effect_interval(X, alpha=0.05)
print("95% CI width (mean):", (ub - lb).mean())

Double Machine Learning (DML) は、結果モデル M_y(X) と処置モデル M_t(X) の両方を機械学習で推定し、 残差同士の関係から処置効果を切り出す手法。高次元共変量・非線形関係に対応しつつ、漸近正規性で信頼区間を構築できる (EconML: Double ML documentation)。

例3: CausalMLのメタラーナーでUplift Modeling

from causalml.inference.meta import BaseXRegressor
from sklearn.ensemble import GradientBoostingRegressor

# X-Learner: 処置群・対照群のサイズが不均衡な場合に強い
learner = BaseXRegressor(
    learner=GradientBoostingRegressor(n_estimators=100),
)

cate_x, lb, ub = learner.estimate_ate(
    X=df[["age", "past_purchase"]].values,
    treatment=df["T"].values,
    y=df["Y"].values,
    return_ci=True,
    bootstrap_ci=True,
    n_bootstraps=500,
)
print(f"ATE: {cate_x[0]:.2f}  95% CI: [{lb[0]:.2f}, {ub[0]:.2f}]")

# ユーザー単位のUplift Score → ターゲティング最適化
uplift = learner.fit_predict(
    X=df[["age", "past_purchase"]].values,
    treatment=df["T"].values,
    y=df["Y"].values,
)
df["uplift"] = uplift
top_decile = df.nlargest(int(len(df) * 0.1), "uplift")
print("Uplift上位10%の平均効果:", top_decile["uplift"].mean())

CausalMLはUberが公開しているOSSで、S/T/X/R-Learnerなどメタラーナーを標準化している (uber/causalml, GitHub)。 「キャンペーンを打つ価値が最も高いユーザーは誰か」というターゲティング最適化で実運用されており、 Uberの論文では複数処置・コスト最適化まで拡張されている (Zhao et al., 2019, arXiv: Uplift Modeling for Multiple Treatments with Cost Optimization)。

例4: statsmodelsでDifference-in-Differences

import pandas as pd
import statsmodels.formula.api as smf

# 地域A(処置群), 地域B(対照群), 処置は2024年1月から
# post: 処置期間ダミー, treat: 処置群ダミー
panel = pd.DataFrame({
    "region": ["A"] * 24 + ["B"] * 24,
    "month": list(range(24)) * 2,
    "treat": [1] * 24 + [0] * 24,
    "post": ([0] * 12 + [1] * 12) * 2,
    "sales": (
        [100 + i + 0 for i in range(12)]
        + [100 + 12 + i + 20 for i in range(12)]  # 処置後に+20のジャンプ
        + [100 + i for i in range(12)]
        + [100 + 12 + i for i in range(12)]
    ),
})

# DID推定: treat * post の係数が因果効果
model = smf.ols("sales ~ treat + post + treat:post", data=panel).fit(
    cov_type="cluster", cov_kwds={"groups": panel["region"]}
)
print(model.summary().tables[1])
did_effect = model.params["treat:post"]
print(f"DID推定による処置効果: {did_effect:.2f}")

例5: linearmodelsで操作変数法 (2SLS)

import numpy as np
import pandas as pd
from linearmodels.iv import IV2SLS

np.random.seed(1)
n = 5000
# 操作変数 Z: 外生ショック(例: 配信サーバーのランダム遅延)
Z = np.random.binomial(1, 0.5, n)
# 未観測交絡 U
U = np.random.normal(0, 1, n)
# 処置 T は Z と U に依存(Zは操作変数、Uは未観測交絡)
T = 0.4 * Z + 0.3 * U + np.random.normal(0, 0.5, n)
T = (T > T.mean()).astype(int)
# 結果 Y は T と U に依存(真のT効果 = 5)
Y = 5 * T + 2 * U + np.random.normal(0, 1, n)

df_iv = pd.DataFrame({"Y": Y, "T": T, "Z": Z})
df_iv["const"] = 1

# OLS(バイアスあり、過大/過小推定される)
ols_res = IV2SLS(df_iv["Y"], df_iv[["const", "T"]], None, None).fit()
print("OLSでのT係数(バイアスあり):", ols_res.params["T"])

# 2SLS(操作変数Zで補正、真の効果≒5を回復)
iv_res = IV2SLS(
    dependent=df_iv["Y"],
    exog=df_iv[["const"]],
    endog=df_iv[["T"]],
    instruments=df_iv[["Z"]],
).fit()
print("2SLSでのT係数(真値に近い):", iv_res.params["T"])
print("First-stage F-stat:", iv_res.first_stage.diagnostics)

First-stage F統計量が10未満だと「弱操作変数」扱いで、推定値のバイアスが大きくなる点に注意 (Stock, Wright, Yogo, 2002, JEP)。

実務事例 ― Netflix・Airbnb・Uber・Instacart

Netflix ― A/BテストとHTE / 長期影響の推定

Netflixは週に数百本のA/Bテストを回す組織だが、課題は「短期の指標では長期KPI(契約継続率・視聴時間)を測りきれない」ことだった。 そこで短期プロキシ指標から長期KPIを推定するcausalな枠組みを開発し、A/Bテストの意思決定速度を上げている (Netflix Tech Blog: Learning Better Proxy Metrics)。 またHTEに特化した社内ツール sherlock を公開しており、CATE推定でセグメント別の施策効果を発見している (Netflix: sherlockHeterogeneous Treatment Effects at Netflix)。

Airbnb ― ACE (Artificial Counterfactual Estimation)

Airbnbは運用エージェントのワークフロー自動化ツールの効果を測りたかったが、 組織制約・サンプルサイズの小ささからランダム割付ができなかった。 そこで対照群データで予測モデルを学習し、実測値との乖離で「体系的バイアス」を補正、 そのうえで処置群に適用して因果効果を推定するACEを開発した。A/Bテスト結果と検証した結果ほぼ同一の推定値が得られている (Airbnb Tech Blog: ACE)。 「A/Bテストができない場面でも、ML + 反実仮想推定で因果を取りに行く」実務の代表例。

Uber ― CausalMLによるUplift Modeling

Uberはドライバーインセンティブ・プロモ配布・メッセージング施策など、 「限られた予算でどのユーザーに何を配るのが最も効くか」というターゲティング最適化が中核。 CausalMLで各ユーザーのUplift Score(=CATE)を推定し、コストを考慮した複数処置の最適化にまで踏み込んでいる (Uber Research: Uplift Modeling for Multiple Treatments with Cost Optimization)。

Instacart ― 閾値カットオフのRDD

配送ウィンドウの正午カットオフを使ったRDDで「正午ちょうど前後の顧客」のチェックアウト率を比較し、 配送時間制約の因果効果を測定 (Instacart Engineering: RDD)。 EC実務なら「送料無料カットオフ」「会員ランク閾値」「クーポン配布スコア閾値」がそのまま応用できる。

EC/D2Cでの典型パターン

  • キャンペーン効果の正味推定: 前後比較ではなく、対象外セグメントを対照群にDID
  • クーポンのROI最適化: Uplift Modelingで「クーポンなしでも買う人」を除外し、本当に押し上げられるユーザーに配布
  • 送料無料・ロイヤルティ閾値: RDDで閾値前後の顧客のLTV差を測定
  • 新規出店・リブランディング: 合成コントロールで「施策しなかったら」の売上を合成
  • 広告チャネル統合効果: MMM(Marketing Mix Modeling)+ 因果推論で各チャネルの真の寄与を推定

よくある間違い

1. 前後比較だけで因果を主張

「キャンペーン後に売上が上がった」は、季節要因・トレンド・他の施策・市場変化をすべて混ぜ込んだ結果。 必ず対照群(同期間に施策を受けなかった群)と比較する。対照群が取れない場合は合成コントロール法を検討する。

2. 交絡変数の見落とし

処置と結果の両方に影響する変数を調整せずに回帰すると、因果効果の推定にバイアスが乗る。 Pearl流のDAGを描いて「バックドアパス」を明示的に閉じるのが王道。DoWhyを使えば自動でバックドア基準を判定してくれる。

3. SUTVA違反(スピルオーバー)

Stable Unit Treatment Value Assumption ―― 「他人の処置状態が自分の結果に影響しない」仮定。 ソーシャルネットワーク上の施策、マーケットプレイスでの価格変更、エリア単位のキャンペーン等では成り立たないことが多い。 AirbnbやUberはクラスタランダム化(都市・サブエリア単位でランダム化)でSUTVA違反を緩和している。

4. 多重比較問題

セグメントを細かく切って「どこかで統計的有意」を探すと、false discoveryが量産される。 事前登録された仮説か、Bonferroni・Benjamini-Hochbergなどの多重検定補正が必要。 Netflixでも「Experimentsの数が増えるほど、誤発見率の管理が最重要課題」と明言されている。

5. 弱操作変数・パラレルトレンド未検証

IVのFirst-stage F統計量が10未満だと推定が大きくブレる。DIDは処置前のトレンドが並行であることを可視化しないとバイアスが残る。 これらの「仮定の検証」を省くと手法の正当性が失われる。

6. 機械学習の精度と因果効果の混同

「予測精度が高いモデル」は「因果効果を正しく推定するモデル」とは限らない。 予測に効く変数はCollider(合流点)やMediator(媒介変数)であることもあり、これを回帰に入れると因果効果にバイアスが乗る (Chernozhukov et al., Double/Debiased ML)。

実務者が最初に学ぶべき3手法

理論はどれも奥深いが、実務で頻度が高く投資対効果が大きい手法は次の3つに絞られる。

  1. RCT / A/Bテスト ― 割付可能な介入は原則これ。設計段階でサンプルサイズ・SUTVA・プロキシ指標を詰めておく。 Netflixが書いているように、単なる検定ではなく因果推論の設計問題として扱う。
  2. DID ― 観察データでも、処置前後のパネルがあれば適用できる。 地域・店舗・時期で自然な比較群が取れるので、EC実務で最も手が出しやすい。statsmodelsで実装可能。
  3. 傾向スコア (PSM / IPW) + Doubly Robust ― 観察データしかないケースでの第一選択。 DoWhyの4ステップワークフローに載せて、identify → estimate → refute まで通すと再現性が確保できる。

IV・RDD・合成コントロールは「RCT/DID/PSMでどうしても手が届かない」状況のための高度なツールと捉え、必要になったときに学ぶのがコスパが良い。

まとめ

  • 因果推論は「相関ではない真の効果」を推定する方法論。 根本問題である反実仮想の観測不能性を、RCT・DID・傾向スコア・IV・RDD・合成コントロールなどの仮定と設計で近似する。
  • 理論的にはRubin Causal Model(潜在的結果)とPearlのdo-calculus(DAG)が両輪。 DoWhyはこの両者をModel → Identify → Estimate → Refuteの統一APIに落とし込んだ実装。
  • 実装の三種の神器はDoWhy(全体設計)、EconML(Double MLでのCATE)、CausalML(Uplift / メタラーナー)。 DID・2SLSはstatsmodels / linearmodelsで十分。
  • Netflix(プロキシ指標・HTE)、Airbnb(ACE)、Uber(Uplift)、Instacart(RDD)などの事例は、 「ビジネス制約でRCTが取れない状況でも、設計と手法の組み合わせで因果を取りに行く」ことを示している。
  • 実務で最初に投資すべきはRCT・DID・傾向スコアの3つ。 前後比較で因果を主張しない、交絡を明示する、SUTVA / パラレルトレンドを検証する、多重比較を補正する ―― の4つは最低限の規律。

関連サービスのご案内

AI Readyデータ基盤の構築から、分析自動化AIエージェントの導入まで一気通貫で

因果推論を実務に根付かせるには、処置・結果・共変量がすぐに突き合わせられるデータ基盤と、 分析結果を意思決定に接続する仕組みが欠かせません。 DecisionFlowは、AI Readyなデータ基盤の構築から、KPI変動検知 → 問い生成 → 自動分析 → 意思決定までを一気通貫でパイプライン化します。

関連記事:データドリブンな意思決定の誤解と設計論EC/D2CのKPI設計完全ガイドお問い合わせ

記事が役に立ったらシェアしてください
シェア