RuntaScience diary

気象系データを扱う学生 旅が好きです

【Numpy】Python Numpyによる、様々なランダムプロット

この記事をシェアする

f:id:RuntaScience:20210507153213p:plain

はじめに

NumPyでは様々なランダム関数を提供しています。今回はその中でもよく用いられる以下の表の分布をpython NumPyで描写したいと思います。

idx Name method
1 正規分布
正規分布*1
np.random.normal(loc=0.0, scale=1.0, size=None)
np.random.standard_normal(size=None)
2 対数正規分布 np.random.lognormal(mean=0.0, sigma=1.0, size=None)
3 二項分布 np.random.binomial(n, p, size=None)
4 ベータ分布 np.random.beta(a, b, size=None)
5 ガンマ分布 np.random.gamma(shape, scale=1.0, size=None)
6 ポアソン分布 np.random.poisson(lam=1.0, size=None)
7 指数分布 np.random.exponential(scale=1.0, size=None)
8 一様分布 np.random.uniform(low=0.0, high=1.0, size=None)

*1 normal distribution (mean=0, std=1)
※np: numpy

Random sampling (numpy.random) — NumPy v1.12 Manual

E[X]: Mean, V[X]: Standard deviationとして、それぞれの分布をNumpyで描きます 描写にはSeabornのkdeplotを用います。

正規分布

\displaystyle{
Normal(x|\mu,\sigma)=\frac{1}{\sqrt{2\pi\sigma^2}}exp\left(-\frac{1}{2} \frac{
(x-\mu)^2}{\sigma^2}\right)
}

\displaystyle{
E[X]=\mu, V[X]=\sigma^2
}
import numpy as np

np.random.seed(57)
mu, sigma = 1, 1
data = np.random.normal(mu, sigma, 1000)
import matplotlib.pyplot as plt
import seaborn as sns

fig = plt.figure(figsize=(12,6))
plt.rcParams["font.size"] = 18
ax1 = plt.subplot(111) #density plot
ax2 = ax1.twinx() #histogram

sns.kdeplot(data, label="KDE", ax=ax1, color="r") #density plot
ax2.hist(data, bins=100, color="c") #histogram

ax1.grid()

ax1.set_ylabel("PDF")
ax2.set_ylabel("Frequency")

plt.show()

f:id:RuntaScience:20210507151440p:plain

対数正規分布

\displaystyle{
Lognormal(x|\mu,\sigma)=\frac{1}{\sigma x\sqrt{2\pi}}exp\left(-\frac{1}{2} \frac{
(ln(x)-\mu)^2}{\sigma^2}\right)
}

\displaystyle{
E[X]=exp(\mu+\frac{\sigma^2}{2}), V[X]=exp\left(2\mu+\sigma^2\right)(exp(\sigma^{2})-1)
}
import numpy as np

np.random.seed(57)
mu, sigma = 1, 1
data = np.random.lognormal(mu, sigma, 1000)
import matplotlib.pyplot as plt
import seaborn as sns

fig = plt.figure(figsize=(12,6))
plt.rcParams["font.size"] = 18
ax1 = plt.subplot(111) #density plot
ax2 = ax1.twinx() #histogram

sns.kdeplot(data, label="KDE", ax=ax1, color="r") #density plot
ax2.hist(data, bins=100, color="c") #histogram

ax1.grid()

ax1.set_ylabel("PDF")
ax2.set_ylabel("Frequency")

plt.show()

f:id:RuntaScience:20210507151458p:plain

二項分布

\displaystyle{
Binomial(x|N,\theta)=\frac{N!}{x!(N-x)!}\theta^x (1-\theta)^{N-x}
}

N: 試行回数(number of trials)、θ: 成功の確率(probability of each trial)

\displaystyle{
E[X]=N\theta, V[X]=N\theta(1-\theta)
}
import numpy as np

np.random.seed(57)
n, p = 10, 0.6
data = np.random.lognormal(n, p, 1000)
import matplotlib.pyplot as plt
import seaborn as sns

fig = plt.figure(figsize=(12,6))
plt.rcParams["font.size"] = 18
ax1 = plt.subplot(111) #density plot
ax2 = ax1.twinx() #histogram

sns.kdeplot(data, label="KDE", ax=ax1, color="r") #density plot
ax2.hist(data, bins=100, color="c") #histogram

ax1.grid()

ax1.set_ylabel("PDF")
ax2.set_ylabel("Frequency")

plt.show()

f:id:RuntaScience:20210507151516p:plain

ベータ分布

\displaystyle{
Beta(x|\alpha, \beta)=\frac{1}{B(\alpha, \beta)}x^{\alpha-1} (1-x)^{\beta-1}
}

\displaystyle{
E[X]=\frac{\alpha}{\alpha-\beta}, V[X]=\frac{\alpha\beta}{(\alpha+\beta)^2(\alpha+\beta+1)}
}
import numpy as np

np.random.seed(57)
a, b = 2, 5
data = np.random.beta(a, b, 1000)
import matplotlib.pyplot as plt
import seaborn as sns

fig = plt.figure(figsize=(12,6))
plt.rcParams["font.size"] = 18
ax1 = plt.subplot(111) #density plot
ax2 = ax1.twinx() #histogram

sns.kdeplot(data, label="KDE", ax=ax1, color="r") #density plot
ax2.hist(data, bins=100, color="c") #histogram

ax1.grid()

ax1.set_ylabel("PDF")
ax2.set_ylabel("Frequency")

plt.show()

f:id:RuntaScience:20210507151525p:plain

ガンマ分布

\displaystyle{
Gamma(x|k, \theta)=\frac{1}{\Gamma(k)\theta^k}x^{k-1} exp(-\frac{x}{\theta})
}

\displaystyle{
E[X]=k\theta, V[X]=k\theta^2
}
import numpy as np
np.random.seed(57)
k, theta = 2, 2
data = np.random.gamma(k, theta, 1000)
import matplotlib.pyplot as plt
import seaborn as sns

fig = plt.figure(figsize=(12,6))
plt.rcParams["font.size"] = 18
ax1 = plt.subplot(111) #density plot
ax2 = ax1.twinx() #histogram

sns.kdeplot(data, label="KDE", ax=ax1, color="r") #density plot
ax2.hist(data, bins=100, color="c") #histogram

ax1.grid()

ax1.set_ylabel("PDF")
ax2.set_ylabel("Frequency")

plt.show()

f:id:RuntaScience:20210507151540p:plain

ポアソン分布

\displaystyle{
Poisson(x|\lambda)=\frac{1}{x!}\lambda^{x} exp(-\lambda)
}

\displaystyle{
E[X]=\lambda, V[X]=\lambda
}
import numpy as np

np.random.seed(57)
lam = 10
data = np.random.poisson(lam, 1000)
import matplotlib.pyplot as plt
import seaborn as sns

fig = plt.figure(figsize=(12,6))
plt.rcParams["font.size"] = 18
ax1 = plt.subplot(111) #density plot
ax2 = ax1.twinx() #histogram

sns.kdeplot(data, label="KDE", ax=ax1, color="r") #density plot
ax2.hist(data, bins=100, color="c") #histogram

ax1.grid()

ax1.set_ylabel("PDF")
ax2.set_ylabel("Frequency")

plt.show()

f:id:RuntaScience:20210507151549p:plain

指数分布

\displaystyle{
Exponential(x|\theta)=\frac{1}{\theta} exp\left(-\frac{x}{\theta}\right)
}

\displaystyle{
E[X]=\theta, V[X]=\theta^2
}
import numpy as np

np.random.seed(57)
theta = 2
data = np.random.exponential(theta, 1000)
import matplotlib.pyplot as plt
import seaborn as sns

fig = plt.figure(figsize=(12,6))
plt.rcParams["font.size"] = 18
ax1 = plt.subplot(111) #density plot
ax2 = ax1.twinx() #histogram

sns.kdeplot(data, label="KDE", ax=ax1, color="r") #density plot
ax2.hist(data, bins=100, color="c") #histogram

ax1.grid()

ax1.set_ylabel("PDF")
ax2.set_ylabel("Frequency")

plt.show()

f:id:RuntaScience:20210507151642p:plain

一様分布

\displaystyle{
Uniform(x|a, b)=\frac{1}{b-a}
}

\displaystyle{
E[X]=\frac{b+a}{2}, V[X]=\frac{(b-a)^2}{12}
}
import numpy as np

np.random.seed(57)
a, b = 0.2, 0.8
data = np.random.uniform(a, b , 1000)
import matplotlib.pyplot as plt

fig = plt.figure(figsize=(12,6))
plt.rcParams["font.size"] = 18
ax1 = plt.subplot(111) #density plot
ax2 = ax1.twinx() #histogram

ax1.hlines(1/(b-a), a, b, color="r") 
ax2.hist(data, bins=100, color="c") #histogram

ax1.grid()

ax1.set_ylabel("PDF")
ax2.set_ylabel("Frequency")

plt.show()

f:id:RuntaScience:20210507151654p:plain

参考文献

numpy.org

docs.scipy.org

seaborn.pydata.org

プライバシーポリシー
お問い合わせ