はじめに
統計的因果推論を学ぶために,金本 拓 著「因果推論」を読み始めた。
www.ohmsha.co.jp
サンプルコードのページも充実している。
note.com
第3章「基本的な因果推論手法」は,基本的な因果推論手法を紹介しており,以下のような構成になっている。
今回は,第3.2節「回帰分析に基づく手法」のサンプルコードをもとに,因果推論の内容を学んでいった。
問題設定と試したこと
問題設定
炭酸飲料の売り上げに対する気温とTVCMの関係を構造方程式モデリングでモデル化する,という問題設定である。各変数間の関係を,回帰係数として表現する。
詳細は,金本 拓 著「因果推論」の第3.2節を参照していただきたい。
今回試したこと
構造方程式モデリングによって,回帰係数やそのp値を計算していた。構造方程式モデリングを実行するために,semopyを用いていた。
今回は重回帰分析との違いを確認するために,重回帰分析の結果と比較することとした。
今回は,因果推論本のサンプルコードに紹介されていたPythonのうち,chap3_SEM.ipynbをすべて実行した後に追加分析を行なった。
重回帰分析
Pythonのstatsmodelsライブラリを用いて,重回帰分析を行なった。
# 追加分析:単に重回帰分析を行なう。 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を表示する機能などがあり有益であると感じた。