バランススコアカード(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.fit(data)
# 結果の表示
print("因果行列:")
print(model.adjacency_matrix_)
import networkx as nx
import matplotlib.pyplot as
plt
# 因果行列の取得
causal_matrix =
model.adjacency_matrix_
# グラフ構築
G = nx.DiGraph()
features = data.columns
for i in
range(len(features)):
for j in
range(len(features)):
if causal_matrix[i, j] != 0:
G.add_edge(features[i], features[j])
# DAG 描画
pos = nx.spring_layout(G)
nx.draw(G, pos,
with_labels=True, node_size=2000, node_color="skyblue", font_size=10,
font_weight="bold")
plt.title("Causal
DAG")
plt.show()
出力結果
因果行列:
[[0. 0. 0.59103349 0. ]
[0.32551171 0. 0.46546388 0. ]
[0.
0. 0. 0. ]
[0.
0. 0.60359795 0. ]]
因果行列の概要
行列の値は各変数間の因果関係の強さを示しています。
- (1, 3): 「Financial」から「Satisfaction」への因果効果は 0.59103349。
- (2, 3): 「Improvement」から「Satisfaction」への因果効果は 0.46546388。
- (4, 3): 「Training」から「Improvement」への因果効果は 0.32551171。
- その他: 他のセルの値が「0」の場合、その変数間には直接的な因果関係がないと判断されています。
DAGの解釈
アップロードされたDAGを解釈すると以下が分かります。
- 「Financial」が「Satisfaction」に影響を与えている。
- 「Improvement」が「Satisfaction」に影響を与えている。
- 「Training」が「Improvement」に影響を与えている。
因果構造
図の中での明らかな因果構造
1.
「Training」→「Improvement」 職場研修が業務改善に寄与している。
2.
「Improvement」→「Satisfaction」 業務改善が顧客満足に影響を与えている。
「Financial」→「Satisfaction」 財務向上が顧客満足に影響を与えている。
因果構造から「チームの成功への流れ」というストーリーを考える
ある企業が、社内のスキルアップと生産性向上のための大規模な研修プログラムを実施しました。このプログラムでは、従業員が新しい業務フローや効率化のノウハウを学びました。
因果の教訓
1.
研修が業務改善を後押し プログラムを受けた従業員は、プロセス効率化や新たなスキル活用に取り組み、業務改善が明確に見られるようになりました。
2.
業務改善が顧客満足度を高める 改善された業務フローにより、顧客対応のスピードと品質が向上し、結果として顧客満足度が急上昇しました。
3.
顧客満足が財務指標に好影響 満足度の向上はリピーターの増加や口コミの拡大に繋がり、売上げが予想を超えるペースで伸びたのです。
このストーリーのポイント
- 小さな改善でも、因果的な波及効果によって企業全体の利益に繋がる。
- 適切なインプット(研修)を選ぶことが、強いアウトプット(財務の向上)を生む
アップロードされた行列によると、財務指標(Financial)が顧客満足(Satisfaction)に影響を与えている因果関係が示されていますね。ですので、ストーリーの因果の流れに矛盾が生じています。
現実世界の解釈としては、「財務指標の改善が顧客満足に影響する可能性も考えられる」と修正すべきでしょう。たとえば、企業の収益が増えれば、サービス品質の向上や顧客体験の強化に投資でき、それが顧客満足に繋がる、というストーリーも成り立ちます。
※DAGのエッジの向きと因果行列の0以外の数値の位地との間に関係があるような気がしますが、いかがでしょうか?
DAGと因果行列は、実は同じ情報を異なる表現で示していると考えることができます。具体的には、因果行列の各位置 (i, j) における0以外の値は、変数iが変数jに直接影響を与えている(すなわち、i → j の因果関係が存在する) ことを意味します。
たとえば、今回の行列を見ると
- 位置 (0, 2) の 0.59103349 変数0(おそらく「Training」)が変数2(おそらく「Satisfaction」)に直接的な影響を与えている。
- 位置 (1, 0) の 0.32551171 変数1(おそらく「Improvement」)が変数0(「Training」)に影響していると推定されています。
- 位置 (1, 2) の 0.46546388 変数1が変数2に対しても影響を与えている。
- 位置 (3, 2) の 0.60359795 変数3(おそらく「Financial」)が変数2(「Satisfaction」)に影響している。
このように、因果行列における非ゼロの位置 (つまり、行 i から列 j への値) がそのままDAGでのエッジの向き、「変数iから変数jへの矢印」として表現されます。DAGはグラフィカルな表現で、どの変数がどの変数を直接「駆動」するかが明示されるため、因果行列の非ゼロエントリの位置と完全に対応しています。
ただし、注意すべき点として、DirectLiNGAMのような手法はデータから因果順序(潜在的な順序)を探索するため、理論的に想定される因果関係(たとえば「Training → Improvement → Satisfaction → Financial」)と推定結果が完全に一致しない場合があります。今回の結果では、例えば「Improvement → Training」といった想定外のエッジが出ている点や、複数の変数が「Satisfaction」に影響を与えていると推定されている点が見受けられます。これは、アルゴリズムの特性やサンプルの特性、あるいはノイズの影響によるものとして解釈できます。
まとめ
- 因果行列の非ゼロの位置 (i, j) は、DAGにおけるi→jの有向エッジと対応しています。
- 数値の大きさは、そのエッジの強さ(効果の大きさ)を示します。
- 因果行列をもとにDAGを描画すると、どの変数がどの変数に直接作用しているかが一目で分かるため、エッジの向きと因果行列の位置には明確な関係があると言えます。
この観点から、エッジの向きと因果行列中の非ゼロ要素の位置は、因果探索で得られた構造を理解する上で非常に重要な手がかりとなります。