投稿

因果探索や因果推論の実践でよく用いられる実際のデータセットの例

因果探索や因果推論の実践でよく用いられる実際のデータセットの例です。これらのデータセットはそれぞれのドメインや目的に合わせて、変数間の因果関係の検証に使われるケーススタディとして有用です。 1. Sachs データセット 概要  Sachs データセットは、細胞内タンパク質のシグナル伝達ネットワークに関する実測データです。サンプル数は約 700 件、 11 種類のタンパク質(変数)を持ち、実験的介入により記録されたそれぞれの濃度や活性値が含まれています。 利用例 因果探索アルゴリズム( DirectLiNGAM 、 PC アルゴリズムなど)の評価 バイオインフォマティクス分野で、実際の細胞シグナル伝達経路の因果構造を再現するためのベンチマークデータとして利用される 参考: Sachs et al., 2005 2. Tübingen Cause-Effect Pairs データセット 概要  このデータセットは、多様な領域(経済、気象、医学、エネルギーなど)から抽出された変数ペアの集合です。各ペアについて「どちらが原因でどちらが結果か」が既知の、厳選された実例が多数収録されています。 利用例 1 対の変数間で因果方向の推定精度を検証するタスク シングルペアごとにアルゴリズムの強み・弱みの比較評価に使用される 注: 手法によっては、数百のペアが公開されており、因果推論のベンチマークとして広く利用されています。 3. Job Training / NSW ( National Supported Work )データセット 概要  社会政策の効果検証のために作成されたデータセットで、職業訓練プログラムが参加者の収入や就業状況に与える影響を評価する目的で収集されています。  利用例  介入(訓練プログラム)とそのアウトカム(所得・就労率)との間で、因果推論の手法(例えば、傾向スコアマッチングや差分の差分法)を適用する実証研究 組織内の Balanced Scorecard において、研修の効果からその後の業務改善、顧客満足、最終的な企業業績に至る因果の流れを評価する際の参考例としても考えられます 4. ビジネスパフォーマンスのケーススタディデータ 概要  Balanced Scorecar...

バランススコアカード(BSC)で職場研修→業務改善→顧客満足→財務向上の因果ストーリー例を作成

イメージ
バランススコアカード( BSC )で職場研修 → 業務改善 → 顧客満足 → 財務向上の因果ストーリー例を作成し、因果数値シミュレーションできるようデータを生成し、これを Direct Lingam を使用し因果探索して、データから DAG を描写するコードを考えてみます。 もちろん、Googlecolabで実装しますので、先ずはライブラリのインストールから開始します。 # Reinstall core scientific packages !pip install --upgrade --force-reinstall numpy scipy scikit-learn !pip install lingam   import numpy as np import pandas as pd   # データ生成 np.random.seed(42) n_samples = 500 training = np.random.normal(5, 1, n_samples) improvement = 0.5 * training + np.random.normal(0, 0.5, n_samples) satisfaction = 0.7 * improvement + np.random.normal(0, 0.5, n_samples) financial = 0.6 * satisfaction + np.random.normal(0, 0.5, n_samples)   data = pd.DataFrame({     "Training": training,     "Improvement": improvement,     "Satisfaction": satisfaction,     "Financial": financial }) from lingam.direct_lingam import DirectLiNGAM   # DirectLiNGAM モデル model = DirectLiNGAM() model.f...

制約ベース手法との違い と  関数型因果モデル(FCM)

イメージ
次のコード例では、 データ生成時に依存関係を強めに設定しているので、因果関係が検出されやすいようにしています。 bn.structure_learning.fit で direct-lingam を使って構造学習を行います。 学習結果の隣接行列から、エッジが (from, to) の形で存在するか(値が 0 以外の場合)をチェックしてエッジリストを作成します。 各ノードに対して、その親ノードからの影響(回帰係数)を OLS 回帰で推定し、エッジごとのスコアとして出力します。 以下のコードをご確認ください。 python import numpy as np import pandas as pd import bnlearn as bn import statsmodels.api as sm   # ① データ生成(依存関係を強化) np.random.seed(42) n_samples = 300 temperature = np.random.uniform(20, 40, n_samples) ice_cream_sales = 5 * temperature + np.random.normal(0, 1, n_samples) swimming_accidents = 2 * temperature + np.random.normal(0, 1, n_samples)   data = pd.DataFrame({     'Temperature': temperature,     'IceCreamSales': ice_cream_sales,     'SwimmingAccidents': swimming_accidents })   # ② bnlearn による構造学習( direct-lingam を利用) model = bn.structure_learning.fit(data, methodtype='direct-lingam') # model['adjmat'] ...

bnlearnライブラリを使用して、ベイジアンネットワーク(Bayesian Network)の構造を定義し、DAG(Directed Acyclic Graph:有向非巡回グラフ)を構築して可視化

イメージ
このコード例では、 bnlearn ライブラリ を使用して、ベイジアンネットワーク( Bayesian Network )の構造を定義し、 DAG ( Directed Acyclic Graph :有向非巡回グラフ)を構築して可視化しています。 #!pip install bnlearn networkx matplotlib pandas numpy --upgrade   import numpy as np import pandas as pd import bnlearn as bn import networkx as nx import matplotlib.pyplot as plt   # ベイジアンネットワーク構造を定義 edges = [     ('Temperature', 'IceCreamSales'),     ('Temperature', 'SwimmingAccidents') ]   # DAG を生成 DAG = bn.make_DAG(edges)   # DAG を NetworkX グラフに変換 nx_graph = nx.DiGraph(DAG['adjmat'].values) nx_graph = nx.relabel_nodes(nx_graph, {i: node for i, node in enumerate(DAG['adjmat'].columns)})   # グラフの描画 plt.figure(figsize=(8, 6)) pos = nx.spring_layout(nx_graph, seed=42) nx.draw(nx_graph, pos, with_labels=True, node_color='lightblue', node_size=2000, font_size=10, font_weight='bold', arrowsize=20)   plt.title("Causal DAG using bnlearn") plt.show() 出力結果 [bnlearn]> Auto generate placeholders...

LiNGAMを活用して因果関係を明確に視覚化する非常に実践的な例

イメージ
今回は NetworkX を使って DAG を描画する方法をご紹介します。以下のコードは、 NetworkX を直接利用して因果関係をグラフとして描画する例です。 import numpy as np import pandas as pd import networkx as nx import matplotlib.pyplot as plt   # データ生成 np.random.seed(42) n_samples = 300 temperature = np.random.uniform(20, 40, n_samples) ice_cream_sales = temperature + np.random.normal(0, 2, n_samples) swimming_accidents = temperature + np.random.normal(0, 1, n_samples) data = pd.DataFrame({     'Temperature': temperature,     'IceCreamSales': ice_cream_sales,     'SwimmingAccidents': swimming_accidents })   # DAG のエッジを直接指定 edges = [     ("Temperature", "IceCreamSales"),     ("Temperature", "SwimmingAccidents") ]   # NetworkX グラフの作成 G = nx.DiGraph() G.add_edges_from(edges)   # グラフの描画 plt.figure(figsize=(8, 6)) pos = nx.spring_layout(G, seed=42)  # ノードの位置を決定 nx.draw(G, pos, with_labels=True, node_color='lightblue', node_size=2000, font_size=10, font_weight=...

因果探索の検討事項

因果探索の検討事項 ①     「アイスクリーム売上と水泳事故件数の生成データでは、気温がアイスクリーム売上と水泳事故件数の両方に影響を与えている」とのことでせっていしましたが、常識的な背景での因果構造を抜きにして、生成データのみから DAG のエッジ方向性を正確に把握決定することはできるか? ②     それから、自然界や社会的な観察データのみで 常識的な背景での因果構造を全く抜きにして 正しいエッジの方向を知ることはできるか?   1. 生成データのみから DAG のエッジ方向性を正確に決定できるか? データ生成の構造において、「気温( Temperature )」が「アイスクリーム売上( IceCreamSales )」と「水泳事故件数( SwimmingAccidents )」の両方に影響を与えているという状況を想定します。この場合、背景的因果構造を知らずに、生成データのみから DAG (有向非巡回グラフ)のエッジの方向性を正確に決定できるかどうか?   可能である理由 因果探索アルゴリズム(例えば、 PC アルゴリズムや GES など)を用いれば、データに含まれる変数間の条件付き独立性( Conditional Independence )を検出し、それをもとに DAG のエッジの方向性を推定できます。具体的には、以下のようなプロセスで方向性が決定されます。 データから、 IceCreamSales と SwimmingAccidents が Temperature を条件付けたときに独立である ( IceCreamSales ⊥ SwimmingAccidents | Temperature ) ことを検出できます。 この条件付き独立性から、 Temperature が両方の変数の共通の原因であると推測され、以下のような DAG が推定されます。 Temperature → IceCreamSales Temperature → SwimmingAccidents したがって、生成データのみからでも、 DAG のエッジの方向性をある程度正確に決定することは可能です。 ...