第9章のPythonコード

第9章 マッチング法

サンプルデータ

wage_training.csv:研修と賃金に関する架空データ.

モジュールのインポート

import pandas as pd
from causalinference import CausalModel

Rによるデータ演習

wagedata = pd.read_csv('wage_training.csv')
wagedata.head()
wagea D years wageb educ female
0 19 1 4 18 17 1
1 27 0 22 27 13 0
2 20 1 2 18 15 1
3 36 1 14 34 14 1
4 28 0 6 28 15 1
mydata = wagedata[['D', 'wagea']].groupby('D').mean().transpose()
mydata.assign(mean_diff = mydata[1] - mydata[0]) # トリートメントグループとコントロールグループの平均値の差
D 0 1 mean_diff
wagea 26.846975 25.718487 -1.128488
wagedata[['D', 'years', 'wageb']].corr() # 相関係数
D years wageb
D 1.000000 -0.190821 -0.183918
years -0.190821 1.000000 0.777174
wageb -0.183918 0.777174 1.000000
# 標準化ユークリッド距離によるマッチング
Y = wagedata['wagea'].to_numpy()
D = wagedata['D'].to_numpy()
X = wagedata[['years', 'wageb']].to_numpy()

result = CausalModel(Y, D, X)

result.est_via_matching(weights = 'inv', matches = 1)

print(result.estimates)

Treatment Effect Estimates: Matching

                     Est.       S.e.          z      P>|z|      [95% Conf. int.]
--------------------------------------------------------------------------------
           ATE      0.927      0.062     14.873      0.000      0.805      1.049
           ATC      0.876      0.070     12.582      0.000      0.740      1.012
           ATT      1.047      0.069     15.141      0.000      0.912      1.183
# 傾向スコアマッチング
result.est_propensity()
ps = result.propensity._data['pscore']

result2 = CausalModel(Y, D, ps)

result2.est_via_matching(matches = 1)

print(result2.estimates)

Treatment Effect Estimates: Matching

                     Est.       S.e.          z      P>|z|      [95% Conf. int.]
--------------------------------------------------------------------------------
           ATE      0.772      0.198      3.893      0.000      0.383      1.161
           ATC      0.842      0.229      3.681      0.000      0.394      1.290
           ATT      0.609      0.205      2.965      0.003      0.206      1.011