主観的因果性入門：コルモゴロフ複雑性

# はじめに

因果推論について学びます。


## 1. 因果関係とは？

- 原因と結果の関係
- 例：
  - 雨が降る（原因）→ 地面が濡れる（結果）
  - ボタンを押す（原因）→ ドアが開く（結果）

🤔 でも、全ての関係が因果関係？

## 2. 主観的因果性

主観的因果性：人々が因果関係をどう認識するか

#### 主観的因果性の特徴
- 複雑さを減らす
- 予測しにくい
- 原因が結果より先に起こる
- 「もし〜なかったら」と考えられる
- 説明ができる


## 3. コルモゴロフ複雑性による説明

**コルモゴロフ複雑性**：情報や対象を最も短く表現するために必要な情報量


- $K(y)$：yを説明するのに必要な情報量
- $K(y|x)$：xを知った上でyを説明するのに必要な情報量
- 主観的因果性の強さ：$C(x,y) = 1 - K(y|x) / K(y)$

🌟 $C(x,y)$が1に近いほど、因果関係が強いと感じる！

---

### 具体例：天気と傘

x: 天気（0 = 晴れ、1 = 雨）
y: 傘の使用（0 = 使わない、1 = 使う）

>データ：
>x: 0 1 0 1 0 1 0 1
>y: 0 1 0 1 0 1 0 1

$K(y) \approx 8$ bit（yをそのまま書く）
$K(y|x) \approx 1$ bit（「y = x」というルール）

$C(x,y) = 1 - 1/8 = 0.875$ （強い因果関係！）


🌟 この方法により、データの規則性と因果関係の認識を定量化できる

---

## まとめ

- 主観的因果性：人々の因果関係の認識
- 特徴：複雑さの減少、予測困難さ、時間順序など
- コルモゴロフ複雑性で数値化できる
- $C(x,y)$が1に近いほど、因果関係が強いと感じる

🌟 因果関係の認識は、世界の理解と意思決定に重要！

## コード

```python

import zlib
import math

def approximate_kolmogorov_complexity(sequence):
    # シーケンスを圧縮し、その長さを複雑性の近似値として使用
    compressed = zlib.compress(sequence.encode())
    return len(compressed)

def conditional_complexity(y, x):
    # xが与えられた時のyの条件付き複雑性を計算
    combined = ''.join([f"{xi}{yi}" for xi, yi in zip(x, y)])
    k_combined = approximate_kolmogorov_complexity(combined)
    k_x = approximate_kolmogorov_complexity(x)
    return k_combined - k_x

def subjective_causality(x, y):
    k_y = approximate_kolmogorov_complexity(y)
    k_y_given_x = conditional_complexity(y, x)
    c_x_y = 1 - k_y_given_x / k_y
    return max(0, min(c_x_y, 1))  # 0から1の範囲に制限

# 例：天気と傘の使用
weather = "01010101" * 100  # データ量を増やして圧縮の効果を高める
umbrella = "01010101" * 100

causality = subjective_causality(weather, umbrella)
print(f"天気と傘の主観的因果性: {causality:.3f}")

# 比較：ランダムなデータ
import random
random_data = ''.join(random.choice('01') for _ in range(len(weather)))
random_causality = subjective_causality(weather, random_data)
print(f"天気とランダムデータの主観的因果性: {random_causality:.3f}")

# 比較：部分的に相関のあるデータ
partial_correlated = ''.join('1' if w == '1' or random.random() < 0.2 else '0' for w in weather)
partial_causality = subjective_causality(weather, partial_correlated)
print(f"天気と部分相関データの主観的因果性: {partial_causality:.3f}")

```
>実行結果の例：
>Copy天気と傘の主観的因果性: 0.990
>天気とランダムデータの主観的因果性: 0.009
>天気と部分相関データの主観的因果性: 0.805

この結果は、天気と傘の使用には強い因果関係があり、ランダムデータとの関係は非常に弱く、部分的に相関のあるデータとは中程度の因果関係があることを示しています。

:::note warn
この方法はコルモゴロフ複雑性の近似にすぎず、厳密な計算ではありません。
:::

### コルモゴロフ複雑性の厳密な計算が不可能な理理由

コルモゴロフ複雑性の厳密な計算が不可能である理由は、計算理論と関係しています。

- **1.停止問題との関連**:
   コルモゴロフ複雑性を計算するには、与えられた文字列を生成する最短のプログラムを見つける必要があります。しかし、任意のプログラムが停止するかどうかを判定する一般的な方法は存在しません（これは「停止問題」として知られています）。そのため、あるプログラムが本当に最短であるかどうかを決定することができません。

- **2.無限の可能性**:
   ある文字列を生成するプログラムは無限に存在する可能性があります。全ての可能なプログラムを調べ尽くすことは不可能です。

- **3.不完全性定理との関連**:
   ゲーデルの不完全性定理により、十分に強力な形式システム内で、その系の矛盾のなさを証明することはできません。コルモゴロフ複雑性の計算も同様の制限に直面します。

- **4.計算不可能性**:
   コルモゴロフ複雑性関数そのものが計算不可能な関数であることが証明されています。これは、任意の入力に対してその複雑性を計算する汎用アルゴリズムが存在しないことを意味します。

- **5.自己参照のパラドックス**:
   最短のプログラムを定義しようとすると、そのプログラム自体の記述が必要になり、自己参照のパラドックスに陥ります。

- **6.圧縮の限界**:
   データ圧縮の観点から見ると、あらゆるデータを常により小さく圧縮できるアルゴリズムは存在しません。同様に、あらゆる文字列に対して最短のプログラムを見つけることはできません。

これらの理由により、コルモゴロフ複雑性の厳密な計算は理論的に不可能です。しかし、近似的な方法や上限・下限の推定は可能であり、実践的な応用においては十分有用です。

## 用語集

- **因果関係**：あることが別のことを引き起こす関係
- **主観的因果性**: 人々が因果関係を認識する心理学的現象
- **コルモゴロフ複雑性**：情報や対象を最も短く表現するために必要な情報量　別名：記述複雑性、アルゴリズム的複雑性
- **反事実的条件**：「もし〜だったら」という仮想的な状況に基づく条件
- **決定係数（R^2）**: 回帰分析において説明変数の予測力を示す指標
- **自由意志**: 自身の行動を自由に選択できるという信念や感覚
- **パールの「do」演算子**: 因果推論モデルにおいて介入を表現する操作
- **複雑性**: 事象や系の記述や説明に必要な情報量
- **反事実的依存**: 実際には起こらなかった仮想的な状況に基づく依存関係
- **説明力**: ある事象が別の事象を理解可能にする能力
- **非対称性**: 双方向の関係が同等でないこと
- **文脈依存性**: 状況や背景に応じて解釈や意味が変化する性質