import numpy as np
import math
import matplotlib.pyplot as plt
import pandas as pd
import scipy.stats as stats
import seaborn as sns
第3章のPythonコード
第3章 確率論の基礎
モジュールのインポート
乱数の設定
= 2022) np.random.seed(seed
3.1.2 試行と事象
= ['Head', 'Tail']
coin = 100, replace = True) np.random.choice(coin, size
3.1.3 コイン投げのシミュレーション
100) / (math.factorial(50) ** 2) / (2 ** 100) math.factorial(
= [1, 0]
coin = np.random.choice(coin, size = 100, replace = True)
z
sum() z.
= 100000
S = np.zeros(S)
rec = [1, 0]
coin
for i in range(S):
= np.random.choice(coin, 100, replace = True)
z = z.sum() rec[i]
= 20)
plt.hist(rec, bins plt.show()
pd.DataFrame(rec).describe()
3.1.4 論理演算によるカウントの方法
2 > 1
2 > 1000
200 == 100 * 2
True + True
True * False
= (rec == 50)
count print(count)
sum() count.
count.mean()
3.2.3 独立ではない例
# 独立性の確認
= 10000 # シミュレーション回数
S = np.random.normal(loc = 50, scale = 10, size = S) # Xを抽出
X = np.random.normal(loc = 50, scale = 10, size = S) # Yを抽出
Y = X + Y # Zを構成 Z
# Pr(X > 70) * Pr(Z > 100)
> 70).mean() * (Z > 100).mean() (X
# Pr(X > 70 かつ Z > 100)
> 70) * (Z > 100)).mean() ((X
3.2.4 独立性と相関係数
= np.random.normal(loc = 50, scale = 10, size = 100000)
X = np.random.normal(loc = 50, scale = 10, size = 100000)
Y
np.corrcoef(X, Y)
= -((X - 50) ** 2) / 10
Z np.corrcoef(X, Z)
plt.scatter(X, Z) plt.show()
3.3.1 分布関数
= np.linspace(0, 100, 1000)
x 50, 10))
plt.plot(x, stats.norm.cdf(x, plt.show()
print(stats.norm.cdf(60, 50, 10) - stats.norm.cdf(40, 50, 10))
3.3.2 確率密度関数
print(stats.norm.cdf(50 + 0.1, 50, 10) - stats.norm.cdf(50, 50, 10))
print(stats.norm.pdf(50, 50, 10))
print(stats.norm.pdf(80, 50, 10))
= np.linspace(start = 0, stop = 100, num = 1000)
x 50, 10))
plt.plot(x, stats.norm.pdf(x, plt.show()
3.3.7 データによる条件付期待値の推定
= pd.read_csv("wage.csv")
wagedata wagedata.head()
wagedata.describe()
sns.pairplot(wagedata)
= wagedata.loc[wagedata['educ'] == 12]
educ12 = wagedata.loc[wagedata['educ'] == 16] educ16
'wage'].mean() educ12[
'wage'].mean() educ16[
= wagedata.loc[wagedata['educ'] < 12]
educ11_less = wagedata.loc[wagedata['educ'] >= 12]
educ12_more 'wage'].mean() educ11_less[
'wage'].mean() educ12_more[
3.4.2 中心極限定理のシミュレーション
= 10000
S = 10000
n = np.zeros(S)
Zn
for i in range(S):
= np.random.normal(loc = 50, scale = 10, size = n)
X = X.mean()
Xbar = X.var()
Sn = (n ** 0.5) * (Xbar - 50) / (Sn ** 0.5)
Zn[i]
= 20)
plt.hist(Zn, bins plt.show()
pd.DataFrame(Zn).describe()
3.4.3 信頼区間のシミュレーション
# 信頼区間シミュレーション
= 10000 # シミュレーション回数
S = 10000 # 標本の大きさ
n = np.zeros(S) # 結果記録用のベクトル
rec
for i in range(S): # 繰り返し開始
= np.random.normal(loc = 50, scale = 10, size = n) # N(50,10^2) から標本抽出
X = X.mean()
Xbar = X.var()
Sn = (Xbar - 1.96 * ((Sn / n) ** 0.5) < 50) * (50 < Xbar + 1.96 * ((Sn / n) ** 0.5))
rec[i]
# 確率を計算 rec.mean()
3.4.4 信頼区間の導出
print(stats.norm.cdf(69.6, 50, 10) - stats.norm.cdf(30.4, 50, 10))