import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np第6章のPythonコード
第6章 相関関係と因果関係
モジュールのインポート
6.1 相関 \(\neq\) 因果
videodata = pd.read_csv('video_game.csv')
sns.set_theme()
sns.scatterplot(x = 'hours', y = 'grade', data = videodata)
plt.show()
videodata.corr(numeric_only = True)| grade | hours | |
|---|---|---|
| grade | 1.000000 | -0.820747 |
| hours | -0.820747 | 1.000000 |
6.1.3 同時性
crimedata = pd.read_csv('police_crime.csv', encoding="shift-jis")
sns.scatterplot(x = 'police', y = 'crime', data = crimedata)
plt.show()
crimedata.corr(numeric_only = True)| police | crime | |
|---|---|---|
| police | 1.000000 | 0.128985 |
| crime | 0.128985 | 1.000000 |
6.2 ルービンの因果モデル
6.2.2 平均トリートメント効果
np.random.seed(2022)
n = 400
D = np.random.binomial(n = 1, p = 0.6, size = n) # 確率 0.6 で 1,確率 0.4 で 0 をとるトリートメント変数
TE = 2 # トリートメント効果 = 2 で個人間の差は無いと想定
Y = TE * D + np.random.normal(size = n) # 結果変数
EY1 = sum(D * Y) / sum(D)
EY0 = sum((1 - D) * Y) / sum(1 - D)
print(EY1 - EY0)1.8626205381054488
Z = np.random.uniform(size = n)
D = np.random.binomial(n = 1, p = Z, size = n)
Y = TE * D + (2 * Z - 1) + np.random.normal(size = n)
EY1 = sum(D * Y) / sum(D)
EY0 = sum((1 - D) * Y) / sum(1 - D)
print(EY1 - EY0)2.707623608936378