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