【Python実践】MetaLearnerで複雑な因果関係を紐解こう

※アフィリエイト広告を利用しています

因果連鎖分析
はじめに

因果推論に用いられる手法は?

近年、データ分析の高度化に伴い、因果推論の重要性が高まっています。

単純な相関分析では捉えきれない複雑な変数間の関係を理解し、業務上の課題を解決するには、因果推論が不可欠です。しかし、因果推論には多くのライブラリが存在し、どのライブラリをどのように使えばよいか、困惑する方も多いのが現状です。

本記事では、業務課題解決に活用できる因果推論の手法と、特に複雑な変数関係への対処法について解説します。具体的な事例と実装コードを交えながら、実践的な活用方法を提示していきます。

ポイント

因果推論ライブラリの使い分け

因果推論を行う上で重要なのが、適切な因果グラフの作成です。人間の持つドメイン知識が因果グラフ設計に大きく役立ちます。

作成した因果グラフを基に、ベイジアンネットワークを用いた因果モデリングと予測をCausalNexで行うことで、複雑さと不確実性を捉えることができます。

一方で、回帰分析では捉えきれない変数間の複雑な関係に対処するには、MetaLearnerやEconMLといった統計的因果推論ライブラリの活用が不可欠です。これらのライブラリは、因果効果の推定に特化した手法を提供しており、業務課題の解決に大きな力を発揮します。

具体的にどうやるの?

MetaLearnerによる統計的因果推論

MetaLearnerでは、S-LearnerT-LearnerX-LearnerDRLearningといった手法が提供されています。

S-Learnerは、処置変数と結果変数の関係を直接モデル化する手法です。

具体的には、処置変数と共変量を説明変数、結果変数を目的変数として、単一の機械学習モデルを構築します。この模型を用いて、処置変数の変化が結果変数にどのような影響を及ぼすかを推定します。

S-Learnerは実装が簡単で解釈が容易ですが、処置群と対照群の違いを十分に考慮できないという弱点があります。

一方、T-Learnerは処置群と対照群それぞれのモデルを構築し、その差から因果効果を推定する手法です。

処置群と対照群の特性の違いを明示的にモデル化できるため、S-Learnerよりも柔軟な因果推論が可能です。ただし、2つのモデルを個別に学習する必要があるため、計算コストが高くなる可能性があります。

X-Learnerは、S-Learnerとt-Learnerの長所を組み合わせた手法です。

処置群と対照群の違いを考慮しつつ、1つのモデルで因果効果を推定できます。まず処置群と対照群それぞれのモデルを構築し、その差分から擬似的な処置効果を計算します。

次に、この擬似処置効果を目的変数とし、処置変数と共変量を説明変数とするモデルを学習します。この2段階のアプローチにより、柔軟性と計算効率性を両立することができます。

最後にDRLearningは、逆確率重み付け(Inverse Probability Weighted)と回帰の利点を活かした手法です。

まず処置割当確率モデルを構築し、その逆確率を用いて処置群と対照群のサンプルを再平衡化します。

その上で、回帰モデルを当てはめ、因果効果を推定します。これにより、観測バイアスを低減しつつ、効率的な推定が可能になります。

手法使い方メリット
S-Learner製品の価格と売上の関係など、変数間の関係が比較的単純な問題に適用実装が簡単で、因果効果の解釈が容易
T-Learner顧客属性が大きく異なる2つの店舗の売上比較など、処置群と対照群の特性が大きく異なる場合に適用処置群と対照群の違いを考慮した柔軟な因果推論が可能
X-Learner新しい広告配信施策の効果検証など、処置群と対照群の特性に差があるが、単純な処置群/対照群モデルでは不十分な場合に適用S-LearnerとT-Learnerの長所を組み合わせ、処置群と対照群の違いを考慮しつつ効率的な推定が可能
DRLearningある施策導入前後で顧客属性が大きく変化した場合など、観測バイアスが大きい状況で適用逆確率重み付けにより観測バイアスを低減しつつ、回帰モデルの利点も活かせる
各手法の使い方とメリット
https://kt-riman.com/scheduling-power-for-work-life-balance/
使ってみよう‼

因果推論の実践的活用

このデータセットは、パン作りの実験データを模擬的に生成したものです。パン作りには発酵の段階が重要で、発酵の進行具合によって最終的な品質が変わってきます。

具体的には、以下の変数が含まれています:

  • x: Fermentation Stage、発酵の段階を表す数値(-1から1の範囲)
  • Z: パン生地への特別な添加物の有無を表すダミー変数(0または1)
  • t: パンの出来栄えを決める発酵とオーブン温度の効果
  • Y: パンの形状品質を表す変数(0から10の整数値、さらに500倍されている)

パンの形状品質(Y)は、発酵の段階(x)、パン生地への特別な添加物の有無(T)、およびパンの種類(t)の影響を受けて決まるものとなっています。

import numpy as np
import pandas as pd
from sklearn.ensemble import RandomForestRegressor
from scipy.special import expit
import matplotlib.pyplot as plt

# データ数
num_data = 500

# パンを発酵したかどうか
x = np.random.uniform(low=-1, high=1, size=num_data)

# パン生地への特別な添加物の有無
e_z = np.random.randn(num_data)
z_prob = expit(-5.0*x + 5*e_z)
Z = np.array([np.random.choice(2, size=1, p=[1-z_prob[i], z_prob[i]])[0] for i in range(num_data)])

# パンの出来栄えを決める t の値を生成
t = np.zeros(num_data)
for i in range(num_data):
    if x[i] < 0:
        t[i] = 0.5
    elif x[i] >= 0 and x[i] < 0.5:
        t[i] = 0.7
    elif x[i] >= 0.5:
        t[i] = 1.0

# パンの出来栄え
e_y = np.random.randn(num_data)
Y = 2.0 + t*Z + 0.3*x + 0.4*e_y

# データフレームに格納
df = pd.DataFrame({'x': x, 'Z': Z, 't': t, 'Y': Y})

S-Learner

S-Learnerは、処置変数(T)と結果変数(Y)の関係を直接モデル化する手法です。ここでは、RandomForestRegressorを使ってS-Learnerのモデルを構築します。

# モデルの定義
reg = RandomForestRegressor(max_depth=3)

# X を特徴量として、ATE(平均処置効果)を求める
X = df.loc[:,["x","Z"]]
X_0 = X.copy()
X_0["Z"] = 0.0

X_1 = X.copy()
X_1["Z"] = 1.0

# ATE(平均処置効果)を求める
ATE = (reg.fit(X, df['Y']).predict(X_1) - reg.fit(X, df['Y']).predict(X_0)).mean()
print("ATE:", ATE)
ATE: 0.6498203055184131

ここでは、発酵の段階(x)と特別な添加物の有無(T)を説明変数として、パンの形状品質(Y)を目的変数としてモデルを学習しています。

そして、特別な添加物を加えた場合(T=1)と加えなかった場合(T=0)での予測値の差分tauを計算することで、特別な添加物の効果を推定しています。

T-Learner

T-Learnerは、処置群と対照群それぞれのモデルを構築し、その差から因果効果を推定する手法です。ここでも RandomForestRegressor を使って実装します。

# Z = 0.0 と Z = 1.0 のデータに分割
df_0 = df[df.Z == 0.0]
df_1 = df[df.Z == 1.0]

# Z = 0.0 のデータに対するモデルの学習
reg_0 = RandomForestRegressor(max_depth=3)
reg_0.fit(df_0[["x"]], df_0[["Y"]])

# Z = 1.0 のデータに対するモデルの学習
reg_1 = RandomForestRegressor(max_depth=3)
reg_1.fit(df_1[["x"]], df_1[["Y"]])

# 各群の平均処置効果 (ATE) の計算
mu_0 = reg_0.predict(df[["x"]])
mu_1 = reg_1.predict(df[["x"]])
ATE = (mu_1 - mu_0).mean()
print("ATE:", ATE)
ATE: 0.6535161210457773

ここでは、まず処置群(T=1)と対照群(T=0)に分けて、それぞれのモデルを学習しています。

次に、それぞれのモデルを使ってデータ全体の予測値を計算し、その差分tauを求めることで、因果効果を推定しています。

X-Learner

処理群と対照群の特徴量が異なる場合に使われる因果推論の手法です。

まず、処理群と対照群それぞれに対して、別々のモデルを学習します。

そして、それぞれの学習済みモデルを使って、全データに対する個人の処理効果を推定します。

最後に、傾向スコアを使ってこれらの推定値を調整することで、平均処理効果(ATE)を得ます。

# Z = 0.0 と Z = 1.0 のデータに分割
df_0 = df[df.Z == 0.0]
df_1 = df[df.Z == 1.0]

# Z = 0.0 のデータに対するモデルの学習
M0 = RandomForestRegressor(max_depth=3)
M0.fit(df_0[["x"]], df_0[["Y"]])

# Z = 1.0 のデータに対するモデルの学習
M1 = RandomForestRegressor(max_depth=3)
M1.fit(df_1[["x"]], df_1[["Y"]])

# 各群における推定された処置効果を計算
tau_0 = M1.predict(df_0[["x"]]) - df_0["Y"]
tau_1 = df_1["Y"] - M0.predict(df_1[["x"]])

# ATT(treatment on the treated)とATU(average treatment effect on the untreated)を求めるモデルを作成
M2 = RandomForestRegressor(max_depth=3)
M2.fit(df_0[["x"]], tau_0)

M3 = RandomForestRegressor(max_depth=3)
M3.fit(df_1[["x"]], tau_1)

# 傾向スコアを求める
X = df[["x"]]  # 説明変数
Z = df["Z"]    # 被説明変数(目的変数)

g_x = LogisticRegression().fit(X, Z)
g_x_val = g_x.predict_proba(X)

# 傾向スコアで調整した推定された処置効果を計算
tau = g_x_val[:, 1]*M2.predict(df[["x"]]) + g_x_val[:, 0]*M3.predict(df[["x"]])

# ATEの計算
mu_0 = M0.predict(df[["x"]])
mu_1 = M1.predict(df[["x"]])
ATE = (mu_1 - mu_0).mean()
print("ATE:", ATE)
ATE: 0.6164808677604013
最後に

3つの手法を使ってみよう

本記事では、因果推論の重要性と、複雑な変数関係にも対応できる手法としてMetaLearnerを紹介しました。

具体的には、S-Learner、T-Learner、X-Learnerの3つの手法について、それぞれの特徴と適用場面を解説しました。また、パンの品質向上の事例を使って実装コードも提示し、実践的な活用方法を示しました。

因果推論は、単なる相関分析を超えて、変数間の本質的な関係を明らかにすることができます。MetaLearnerはその強力なツールであり、様々な業務課題の解決に活用できるはずです。

ぜひ、本記事を参考に、MetaLearnerを使った因果推論に挑戦してみてください。

もっとカスタマイズしたい方へ

因果推論のコーディングを体系的に深めたい方へ

私のブログでは統計的因果推論ライブラリを使って、ビジネスですぐに活かせるコーディングの紹介を主目的としています。

そのためコーディングや成果を最大化するための使用方法はお伝えしますが理論的な部分は不足するかもしれないので、コーディングをカスタマイズできるようになるにはスキル取得のための勉強を独自で進めるよう方が良いと思います。

ただし、ライフスタイルのバランスや家族関係、自己実現のための時間の問題でなかなか踏み出せないのビジネスマンが多いと思います。

そこでお勧めなのは、勉強したい領域のみを自分で選んで、そこだけに特化して短時間で学べる「PyQ」オンラインスクールです。

今回であれば7days Python チャレンジ(7時間)と実務で役立つPython(12時間)を受講すれば習得できるはずです。

  1. 7days Python チャレンジ:7日間の無料体験でプログラミングの基礎を学ぶ
  2. 実務で役立つPython:実務で更にPythonを使っていきたい人のためのコース

月額制なので忙しくなれば途中退会も可能ですので、リスクは低いとおもいます。

タイトルとURLをコピーしました