In [1]:
import numpy as np
import matplotlib.pyplot as plt

np.random.seed(1000)

np.random.randn(1000)で標準正規分布(平均0,標準偏差1)を1000個生成する。
np.random.normal(0, 1, 100)で平均0,標準偏差1の正規分布を1000個生成する。
なので以下の2行は同値です。

In [2]:
R = np.random.randn(1000)
R = np.random.normal(0, 1, 1000)

平均値、標準偏差、データの個数を設定します。

In [3]:
μ = 5 # 平均値
σ = 3 # 標準偏差
N = 100000 # データの個数

上と同じようにnp.random.normal(平均値, 標準偏差, データの個数)で設定します。

In [4]:
r = np.random.normal(μ, σ, N)

一般正規分布は[µ-1.96*σ, µ+1.96*σ]の間に含まれるのは全体の95%なので、
np.whereでその範囲を設定してr2に入れます。

In [5]:
r2 = r[np.where((r <= µ+1.96*σ)&(r >= µ-1.96*σ))]

試しに計算してみると確かに約95%になっています。

In [6]:
print(len(r2) / len(r) * 100)
94.988

以下の式で一般正規分布を標準正規分布に変換できるらしいので実際に確かめてみます。

In [7]:
R = (r - μ) / σ

では表示させてみます。赤が平均5,標準偏差3の正規分布。
黒が95%を塗りつぶしたもの。
青は標準正規分布に変換したものです。

In [8]:
plt.hist(r,  bins=100, color='#ff0000', alpha=0.5)
plt.hist(r2, bins=100, color='#000000', alpha=0.5)
plt.hist(R,  bins=100, color='#0000ff', alpha=0.5)
plt.show()

何故か赤と黒のグラフがズレていますがこれはrangeを設定することで解消されます。

In [9]:
plt.hist(r,  bins=100, range=(-7,17), color='#ff0000', alpha=0.5)
plt.hist(r2, bins=100, range=(-7,17), color='#000000', alpha=0.5)
plt.hist(R,  bins=100, color='#0000ff', alpha=0.5)
plt.show()

次に、「『正規分布からランダムにn個取り出したものを平均したもの』を10000個用意したもののヒストグラム」を見ていこうと思います。

In [10]:
import random

平均値0,標準偏差5,10000個のデータから25個を取り出します。

In [11]:
μ2 = 0 # 平均値
σ2 = 5 # 標準偏差
N2 = 10000 # データの個数
n  = 25 # 標本の個数

In [12]:
r3 = np.random.normal(μ2, σ2, N2)

random.sample(リスト,抽出する数)でランダムに要素を抽出します。
そしてそれの平均値をr4配列に追加していきます。(10000回)

In [13]:
r4 = []
for i in range(10000):
    r4_sum = sum(random.sample(list(r3), n))
    r4.append(r4_sum/n)

r4の中身が10000個になっていることを確認します。

In [14]:
print(len(r4))
10000

先程と同じようにヒストグラムに表示してみます。
黄緑が元のグラフ。水色が抽出したもののグラフです。

In [15]:
plt.hist(r3,  bins=100, range=(-20,20), color='#00ff00', alpha=0.5)
plt.hist(r4,  bins=100, range=(-20,20), color='#00ffff', alpha=0.5)
plt.show()