シンプソンのパラドックス

シンプソンのパラドックス

シンプソンのパラドックスは、データを解釈する際に生じる混乱を示す統計学上のパラドックスです

具体的には、集団全体部分集団の間で、同じデータを用いて異なる結論が導かれることを示します。
このパラドックスは、条件付き確率の誤解やサンプルサイズの影響に関連しています。

例えば、ある特定の属性を持つ集団を部分集団として考えた場合、その属性に関する統計的傾向が逆転することがあります。
つまり、部分集団での割合が高いのに、全体集団での割合が低くなる場合があります。

このパラドックスは、統計的推論データ解釈において、慎重な考慮が必要であることを強調します。

サンプルソース

シンプソンのパラドックスは、3つの異なる群のデータを結合した場合に、それぞれのグループの平均値が異なるにも関わらず、結合した全体の平均値が逆にそれらの平均値よりも高い場合を指します。

以下に、シンプソンのパラドックスを示す簡単な例を用いてPythonでグラフ化する方法を示します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import numpy as np
import matplotlib.pyplot as plt

# グループ1: 平均値=5, 標準偏差=1, サンプル数=100
group1_mean = 5
group1_std = 1
group1_samples = np.random.normal(group1_mean, group1_std, 100)

# グループ2: 平均値=7, 標準偏差=1, サンプル数=100
group2_mean = 7
group2_std = 1
group2_samples = np.random.normal(group2_mean, group2_std, 100)

# グループ3: 平均値=9, 標準偏差=1, サンプル数=100
group3_mean = 9
group3_std = 1
group3_samples = np.random.normal(group3_mean, group3_std, 100)

# 結合したデータ
combined_data = np.concatenate((group1_samples, group2_samples, group3_samples))

# プロット
plt.figure(figsize=(10, 6))

# グループ1のヒストグラム
plt.hist(group1_samples, bins=20, alpha=0.5, label='Group 1')

# グループ2のヒストグラム
plt.hist(group2_samples, bins=20, alpha=0.5, label='Group 2')

# グループ3のヒストグラム
plt.hist(group3_samples, bins=20, alpha=0.5, label='Group 3')

# 結合したデータのヒストグラム
plt.hist(combined_data, bins=20, alpha=0.5, label='Combined', color='black')

plt.xlabel('Value')
plt.ylabel('Frequency')
plt.title('Simpson\'s Paradox Example')
plt.legend()
plt.grid(True)
plt.show()

このコードでは、3つの異なる群のデータを生成し、それぞれをヒストグラムとしてプロットします。

結合した全体のデータもヒストグラムとしてプロットされ、シンプソンのパラドックスを可視化します。

[実行結果]

ソースコード解説

ソースコードの部分について詳細に説明します。

1. ライブラリのインポート:

1
2
import numpy as np
import matplotlib.pyplot as plt
  • numpy は数値計算を行うためのPythonライブラリで、np としてインポートされています。
  • matplotlib.pyplot はグラフを描画するためのPythonライブラリで、plt としてインポートされています。

2. グループのデータ生成:

1
2
3
group1_mean = 5
group1_std = 1
group1_samples = np.random.normal(group1_mean, group1_std, 100)
  • group1_meangroup1_std はグループ1のデータの平均値標準偏差を表します。
  • np.random.normal() 関数を使用して、平均値group1_mean標準偏差group1_std正規分布に従うデータを生成します。
  • これにより、グループ1のデータが group1_samples として格納されます。
    $100$個のサンプルが生成されます。

3. 同様に、グループ2とグループ3のデータも生成されます。

4. データの結合:

1
combined_data = np.concatenate((group1_samples, group2_samples, group3_samples))
  • np.concatenate() 関数を使用して、3つのグループのデータを結合して1つの配列にします。
  • これにより、全体のデータが combined_data として格納されます。

5. プロット:

1
2
3
4
5
6
7
8
9
10
11
plt.figure(figsize=(10, 6))
plt.hist(group1_samples, bins=20, alpha=0.5, label='Group 1')
plt.hist(group2_samples, bins=20, alpha=0.5, label='Group 2')
plt.hist(group3_samples, bins=20, alpha=0.5, label='Group 3')
plt.hist(combined_data, bins=20, alpha=0.5, label='Combined', color='black')
plt.xlabel('Value')
plt.ylabel('Frequency')
plt.title('Simpson\'s Paradox Example')
plt.legend()
plt.grid(True)
plt.show()
  • plt.figure(figsize=(10, 6)) は、図のサイズを設定します。
  • plt.hist() 関数は、ヒストグラムを描画します。
    alpha パラメータは透明度を設定し、label パラメータは凡例のラベルを設定します。
  • plt.xlabel()plt.ylabel() は、x軸とy軸のラベルを設定します。
  • plt.title() は図のタイトルを設定します。
  • plt.legend() は、凡例を表示します。
  • plt.grid(True) は、グリッド線を表示します。
  • plt.show() は、図を表示します。

このコードは、3つの異なるグループのデータを生成し、それらをヒストグラムとしてプロットしています。

さらに、結合したデータのヒストグラムもプロットされ、シンプソンのパラドックスが可視化されています。

結果解説

[実行結果]

このグラフでは、シンプソンのパラドックスの例を示しています。

各グループのヒストグラム:

  • “Group 1”, “Group 2”, “Group 3” というラベルが付けられた3つのヒストグラムが表示されています。
  • 各グループは、それぞれ異なる平均値標準偏差を持ちます。
  • 各グループのヒストグラムは、それぞれのグループが持つデータの分布を示しています。
    ヒストグラムは、データの値の範囲をいくつかの階級(ビン)に分割し、各階級に含まれるデータの頻度(個数)を表示します。

結合したデータのヒストグラム:

  • “Combined” というラベルが付けられた黒いヒストグラムが表示されています。
  • このヒストグラムは、3つの異なるグループからのデータを結合した全体のデータの分布を示しています。
  • 結合したデータのヒストグラムは、各グループのデータの組み合わせから得られる全体のデータの分布を示しています。

シンプソンのパラドックスの本質は、個々のグループの平均値が異なる方向に移動する一方で、結合したデータの平均値がそれらの平均値よりも大きくなることです。

これは、データが持つ特定の相関構造関係性によって引き起こされることがあります。