第8章のPythonコード

第8章 ランダム化実験

サンプルデータ

class_attendance.csv:出欠と学業成績に関する架空データ.

モジュールのインポート

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from statsmodels.formula.api import ols

8.1 授業の出席率と成績:セレクションバイアス

8.1.1 因果関係?単なる相関関係?

classdata = pd.read_csv('class_attendance.csv') # データの読み込み

sns.set_theme()
sns.stripplot(x = 'D', y = 'Y', data = classdata)
plt.show()

8.2 ランダム化実験

8.2.2 セレクションバイアスの除去

result = ols('Y ~ D', data = classdata).fit()
result.params
Intercept    50.733333
D            19.100000
dtype: float64
Y1mean = sum(classdata.eval('D * Y')) / sum(classdata['D'])
Y0mean = sum(classdata.eval('(1 - D) * Y')) / sum(1 - classdata['D'])

Y0mean          # コントロールグループの平均値 = α
Y1mean - Y0mean # 平均値の差 = β
19.099999999999994
meandata = classdata[['D', 'Y']].groupby('D').mean().transpose()
meandata.assign(diff = meandata[1] - meandata[0])
D 0 1 diff
Y 50.733333 69.833333 19.1
result = ols('Y ~ D + motiv', data = classdata).fit()
print(result.summary().tables[1])
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
Intercept     41.2033      2.801     14.712      0.000      35.595      46.811
D              1.2385      4.817      0.257      0.798      -8.407      10.884
motiv          0.9888      0.231      4.276      0.000       0.526       1.452
==============================================================================