jiku log

JTCのデータサイエンス中間管理職の学び

「因果推論」を読む―第3.2節 回帰分析に基づく手法―

はじめに

統計的因果推論を学ぶために,金本 拓 著「因果推論」を読み始めた。
www.ohmsha.co.jp

サンプルコードのページも充実している。
note.com

第3章「基本的な因果推論手法」は,基本的な因果推論手法を紹介しており,以下のような構成になっている。

  • 3.1 分析の全体像と各種手法の前提
  • 3.2 回帰分析に基づく手法
  • 3.3 共変量調整・傾向スコア
  • 3.4 二重にロバストな推定法
  • 3.5 自然実験(準実験)の全体像
  • 3.6 回帰不連続デザイン
  • 3.7 操作変数法
  • 3.8 差分の差分法
  • 3.9 合成コントロール

今回は,第3.2節「回帰分析に基づく手法」のサンプルコードをもとに,因果推論の内容を学んでいった。

問題設定と試したこと

問題設定

炭酸飲料の売り上げに対する気温とTVCMの関係を構造方程式モデリングでモデル化する,という問題設定である。各変数間の関係を,回帰係数として表現する。
詳細は,金本 拓 著「因果推論」の第3.2節を参照していただきたい。

今回試したこと

構造方程式モデリングによって,回帰係数やそのp値を計算していた。構造方程式モデリングを実行するために,semopyを用いていた。
今回は重回帰分析との違いを確認するために,重回帰分析の結果と比較することとした。

今回は,因果推論本のサンプルコードに紹介されていたPythonのうち,chap3_SEM.ipynbをすべて実行した後に追加分析を行なった。

重回帰分析

Pythonstatsmodelsライブラリを用いて,重回帰分析を行なった。

# 追加分析:単に重回帰分析を行なう。

import statsmodels.api as sm

# 説明変数と目的変数の設定
X = data[['TV_CM', 'Temperature_C']]  # 説明変数
y = data['Soda_Sales']  # 目的変数

# 定数項を含めた説明変数
X_with_const = sm.add_constant(X)

# 重回帰分析の実施
model = sm.OLS(y, X_with_const)  # OLS(最小二乗法)モデルを構築
results = model.fit()  # モデルの学習

print("\nモデルの概要:")
print(results.summary())

出力結果はこちら。

モデルの概要:
                            OLS Regression Results                            
==============================================================================
Dep. Variable:             Soda_Sales   R-squared:                       0.913
Model:                            OLS   Adj. R-squared:                  0.912
Method:                 Least Squares   F-statistic:                     1037.
Date:                Sat, 31 Aug 2024   Prob (F-statistic):          2.53e-105
Time:                        22:14:17   Log-Likelihood:                -610.07
No. Observations:                 200   AIC:                             1226.
Df Residuals:                     197   BIC:                             1236.
Df Model:                           2                                         
Covariance Type:            nonrobust                                         
=================================================================================
                    coef    std err          t      P>|t|      [0.025      0.975]
---------------------------------------------------------------------------------
const             7.8745      2.105      3.740      0.000       3.723      12.026
TV_CM             0.5133      0.036     14.393      0.000       0.443       0.584
Temperature_C     2.0433      0.048     42.851      0.000       1.949       2.137
==============================================================================
Omnibus:                        1.031   Durbin-Watson:                   1.927
Prob(Omnibus):                  0.597   Jarque-Bera (JB):                1.025
Skew:                          -0.171   Prob(JB):                        0.599
Kurtosis:                       2.923   Cond. No.                         325.
==============================================================================

Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.

TV_CMの回帰係数は0.5133,Temperature_Cの回帰係数は2.0433だったので,「因果推論」で紹介されていた結果と差がなかった。予想通り構造方程式モデリングと重回帰分析の結果には差がなかった

まとめと感想

今回のケースでは,semopyの結果と重回帰分析の結果が変わらないことを確認した。一方でsemopyを用いたほうが,DAGを表示する機能などがあり有益であると感じた。