はじめに
機械学習の勉強を始めたVBAユーザです。
備忘録としてPython・Rの文法をVBAと比較しながらまとめています。
今回は、確率分布についてまとめます。
乱数の発生については、別記事にしました。
目次
確率分布
今回は、確率分布(probability distribution)についてまとめます。
連続確率分布
まず、連続確率分布(continuous probability distribution)から説明します。
確率密度関数
連続確率分布の確率密度関数(probability density function; PDF)についてです。
連続確率分布の例として(1次元)正規分布(normal distribution)(ガウス分布(Gaussian distribution))の場合で説明します。
確率変数 $X$ が平均 $\mu$, 分散 $\sigma^2 >0 $ の(1次元)正規分布に従う $X \sim N(\mu, \sigma^2)$ とします。$X$ の確率密度関数 $f_{X}(x)$ は次の形(ガウス関数)です。
f_{X}(x) = \frac{1}{\sqrt{2\pi\sigma^2}} e^{\frac{-(x-\mu)^2}{2\sigma^2}} = {\frac{1}{\sqrt{2\pi\sigma^2}}} \exp \!\left( - {\frac{(x-\mu)^2}{2\sigma^2}} \right) \quad (x \in \mathbb{R})
Python
Pythonでは、科学技術計算ライブラリの SciPy の統計関係のサブパッケージ scipy.stats を使います。scipy.stats から使用する関数をインポートしておきます。
計算に使うので、Numpy もインポートしておきます。また、ヒストグラムを描画するために Matplotlib の matplotlib.pyplot もインポートしておきます。
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm
m = 50
s = 10
x = np.linspace(0, 100, num=100+1)
print(x)
# [ 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
# 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27.
# ...
# 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97.
# 98. 99. 100.]
y = norm.pdf(x, m, s)
print(y)
# [1.48671951e-07 2.43896075e-07 3.96129909e-07 6.36982518e-07
# 1.01408521e-06 1.59837411e-06 2.49424713e-06 3.85351967e-06
# ...
# 1.01408521e-06 6.36982518e-07 3.96129909e-07 2.43896075e-07
# 1.48671951e-07]
plt.figure()
plt.plot(x, y)
plt.show()
R
m <- 50
s <- 10
x <- 0:100
x
# [1] 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
# [21] 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
# ...
# [81] 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
# [101] 100
y <- dnorm(x, m, s)
y
# [1] 1.486720e-07 2.438961e-07 3.961299e-07 6.369825e-07 1.014085e-06 1.598374e-06
# [7] 2.494247e-06 3.853520e-06 5.894307e-06 8.926166e-06 1.338302e-05 1.986555e-05
# ...
# [97] 1.014085e-06 6.369825e-07 3.961299e-07 2.438961e-07 1.486720e-07
plot(x, y, type="l")
注意)Rでグラフを描画するには、標準パッケージでもできますが、ggplot2
を使った方が「一貫性のある文法で合理的に」描けます。(こちらの記事参照。)
VBA
累積分布関数と分位関数
連続分布の累積分布関数(cumulative distribution function; CDF)(分布関数(distribution function))$F_{X}(x)$、$1-F_{X}(x)$ である相補累積分布関数(complementary cumulative distribution function; CCDF)(上側確率(upper-tail probability), 生存関数(survival function))、累積分布関数の逆関数 ${F_{X}}^{-1}$ である分位関数(quantile function)(分位点関数)です。
\begin{eqnarray*}
F_{X}(x) &=& \mathrm{P}(X \le x) = \int_{-\infty}^{x} f_{X}(t)\,dt \quad (x \in \mathbb{R}) \\
\bar{F_X}(x) &=& \mathrm{P}(X > x) = 1-F_{X}(x) = \int_{x}^{\infty} f_{X}(t)\\
G_{X}(p) &=& {F_{X}}^{-1}(p) \quad (p \in [0,1])
\end{eqnarray*}
Python
m = 0
s = 1
x = np.linspace(-3.5, 3.5, num=100+1)
y = norm.pdf(x, m, s) # Probability density function
z = norm.cdf(x, m, s) # Cumulative distribution function
p = np.arange(0, 1+0.1, 0.1)
print(p)
# [0. 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1. ]
q = norm.ppf(p, m, s) # Percent point function (percentiles) = inverse of cdf
print(q)
# [ -inf -1.28155157 -0.84162123 -0.52440051 -0.2533471 0.
# 0.2533471 0.52440051 0.84162123 1.28155157 inf]
plt.figure()
plt.plot(x, y, label='pdf')
plt.plot(x, z, label='cdf')
plt.plot(q, p, marker='o', linestyle='', color='red', label='ppf')
for i in range(len(p)):
plt.axhline(y=p[i], xmin=0.05, xmax=0.95, linewidth=0.5, color='red', alpha=0.6)
plt.vlines(x=q, ymin=0, ymax=p, linewidth=0.5, color='red', alpha=0.6)
plt.legend(loc='upper left')
# plt.grid()
plt.show()
R
m <- 0
s <- 1
x <- seq(-3.5, 3.5, length=100+1)
x
y <- dnorm(x, m, s)
z <- pnorm(x, m, s)
plot(x, y, xlim=c(-3.5, 3.5), ylim=c(0,1), type="l", col=1)
par(new=T)
plot(x, z, xlim=c(-3.5, 3.5), ylim=c(0,1), type="l", col=2)
p <- seq(0, 1, by=0.1)
p
# [1] 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
q <- qnorm(p, m, s)
q
# [1] -Inf -1.2815516 -0.8416212 -0.5244005 -0.2533471 0.0000000
# [7] 0.2533471 0.5244005 0.8416212 1.2815516 Inf
VBA
モーメント等
確率分布のモーメント(moment)(積率)についてです。
確率密度関数 $f(x)$ のモーメント
- $\mu =\mu_{1}^{(0)}$ は $x$ の平均値。
- $\sigma^2 = \mu_{2} = \mu_{2}^{(0)} - (\mu_{1}^{(0)} )^2 $ は分散、$\sigma ={\sqrt {\mu_2}}$ は標準偏差。
- $\gamma _{1}=\mu _{3}/\sigma ^{3}$は歪度。
- $\gamma _{2}=\mu _{4}/\sigma ^{4}-3$ は尖度。
Python
m = 0
s = 1
print(norm.mean(m, s), norm.var(m, s), norm.std(m, s), norm.median(m, s))
# 0.0 1.0 1.0 0.0
mean, var, skew, kurt = norm.stats(m, s, moments='mvsk')
print(mean, var, skew, kurt)
for n in range(1, 5+1, 1):
moment = norm.moment(n, m, s)
print('Moment({}) = {}'.format(n, moment))
# Moment(1) = 0.0
# Moment(2) = 1.0
# Moment(3) = 0.0
# Moment(4) = 3.0
# Moment(5) = -1.5022529663236356e-14
x = np.linspace(-3.5, 3.5, num=100+1)
y = norm.pdf(x, m, s)
mm = norm.mean(m, s)
ss = norm.std(m, s)
plt.figure()
plt.plot(x, y, label='pdf')
plt.axvline(x= mm, linestyle="-", color='red')
plt.axvline(x= ss, linestyle=':', color='red')
plt.axvline(x=-ss, linestyle=':', color='red')
plt.xlim(-3.5, 3.5)
plt.ylim(0, 0.5)
plt.show()
R
VBA
連続確率分布の例
Python
from scipy.stats import norm, t, chi2, f
plt.figure(figsize=(12,8))
# 正規分布 N(m,s)
x = np.linspace(-5, 5, num=100)
mlist = [0, 0, 0, 1, 2]
slist = [1, 2, 3, 1, 1]
plt.subplot(2, 2, 1)
for i in range(len(mlist)):
m = mlist[i]
s = slist[i]
y = norm.pdf(x, m, s)
plt.plot(x, y, label='N({}, {})'.format(m, s))
plt.legend()
# t分布 t(n)
x = np.linspace(-5, 5, num=100)
plt.subplot(2, 2, 2)
for n in range(1,5+1):
y = t.pdf(x, n)
plt.plot(x, y, label='t({})'.format(n))
plt.legend()
# カイ2乗分布 χ^2(n)
x = np.linspace(0, 10, num=100)
nlist = [1, 2, 3, 5, 10]
plt.subplot(2, 2, 3)
for n in nlist:
y = chi2.pdf(x, n)
plt.plot(x, y, label='Chi2({})'.format(n))
plt.legend()
# F分布 F(n,m)
x = np.linspace(0, 3, num=100)
plt.subplot(2, 2, 4)
nlist = [1, 1, 2, 5, 10, 10, 50, 50]
mlist = [1, 5, 5, 5, 10, 50, 50, 100]
for i in range(len(mlist)):
n = nlist[i]
m = mlist[i]
y = f.pdf(x, n, m)
plt.plot(x, y, label='F({}, {})'.format(n,m))
plt.legend()
plt.show()
R
# 正規分布 N(m,s)
x <- seq(-5, 5, length=100+1)
mlist <- c(0, 0, 0, 1, 2)
slist <- c(1, 2, 3, 1, 1)
for (i in 1:5) {
m <- mlist[i]
s <- slist[i]
y <- dnorm(x, m, s)
plot(x, y, xlim=c(-5,5), ylim=c(0, 0.4), type="l", col=i)
par(new=T)
}
par(new=F)
# t分布 t(n)
x <- seq(-5, 5, length=100+1)
nlist <- 1:5
for (i in 1:length(nlist)) {
n <- nlist[i]
y <- dt(x, df=n)
plot(x, y, xlim=c(-5,5), ylim=c(0,0.4), type="l", col=i)
par(new=T)
}
par(new=F)
# カイ2乗分布 χ^2(n)
x <- seq(0, 10, length=100+1)
nlist <- c(1, 2, 3, 5, 10)
for (i in 1:length(nlist)) {
n <- nlist[i]
y <- dchisq(x, df=n)
plot(x, y, xlim=c(0,10), ylim=c(0,1.2), type="l", col=i)
par(new=T)
}
par(new=F)
# F分布 F(m,n)
x <- seq(0, 3, length=100+1)
nlist <- c(1, 1, 2, 5, 10, 10, 50, 50)
mlist <- c(1, 5, 5, 5, 10, 50, 50, 100)
for (i in 1:length(nlist)) {
n <- nlist[i]
m <- mlist[i]
y <- df(x, df1=n, df2=m)
plot(x, y, xlim=c(0,3), ylim=c(0,2), type="l", col=i)
par(new=T)
}
par(new=F)
VBA
離散確率分布
次に、離散確率分布(discrete probability distribution)についてです。
確率質量関数
連続確率分布の確率密度関数(probability density function; PDF)にあたる離散確率分布の確率質量関数(probability mass function; PMF)です。
Python
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import binom
n = 10
p = 0.5
x = np.arange(0, 10+1, 1)
print(x)
# [ 0 1 2 3 4 5 6 7 8 9 10]
y = binom.pmf(x, n, p)
print(y)
# [0.00097656 0.00976563 0.04394531 0.1171875 0.20507813 0.24609375
# 0.20507813 0.1171875 0.04394531 0.00976563 0.00097656]
plt.figure()
plt.plot(x, y, marker='o')
plt.show()
plt.figure()
plt.plot(x, y, linestyle='', marker='o', markersize=8)
plt.vlines(x, ymin=0, ymax=y, linestyles='-', linewidth=5, color='#1f77b4', alpha=0.5)
plt.show()
R
# pmf
n <- 10
p <- 0.5
x <- 0:10
x
# [1] 0 1 2 3 4 5 6 7 8 9 10
y <- dbinom(x, size=n, prob=p)
y
# [1] 0.0009765625 0.0097656250 0.0439453125 0.1171875000 0.2050781250 0.2460937500
# [7] 0.2050781250 0.1171875000 0.0439453125 0.0097656250 0.0009765625
plot(x, y)
plot(x, y, type="b")
plot(x, y, type="o")
plot(x, y, type="h")
plot(x, y)
par(new=T)
plot(x, y, type="h")
VBA
離散確率分布の累積分布関数と分位関数
離散確率分布の累積分布関数です。
離散確率分布の例として二項分布(binomial distribution) $B(n,p)$ の場合で説明します。
\mathrm{P}(X = k) = {n \choose k}p^{k}(1-p)^{n-k} \quad (k=0,1,2, \dots ,n) \\
\\
{}_{n}\!\mathrm{C} _{k} = {n \choose k} = {\frac{n!}{k!\,(n-k)!}}
Python
n = 10
p = 0.5
x = np.arange(0, 10+1, 1)
y = binom.pmf(x, n, p) # Probability mass function
z = binom.cdf(x, n, p) # Cumulative distribution function
pp = np.arange(0.1, 1+0.1, 0.1)
print(pp)
# [0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1. ]
q = binom.ppf(pp, n, p) # Percent point function (percentiles) = inverse of cdf
print(q)
# [ 3. 4. 4. 5. 5. 5. 6. 6. 7. 10.]
plt.figure()
plt.plot(x, y, marker='o', label='pmf')
# plt.plot(x, z, marker='.', label='cdf')
plt.step(x, z, marker='.', where='post', label='cdf')
plt.plot(q, pp, marker='o', linestyle='', color='red', label='ppf')
for i in range(len(pp)):
plt.axhline(y=pp[i], xmin=0.05, xmax=0.95, linewidth=0.5, color='red', alpha=0.6)
plt.vlines(x=q, ymin=0, ymax=pp, linewidth=0.5, color='red', alpha=0.6)
plt.legend(loc='upper left')
# plt.grid()
plt.show()
R
# cdf
n <- 10
p <- 0.5
x <- 0:10
y <- dbinom(x, size=n, prob=p)
z <- pbinom(x, size=n, prob=p)
plot(x, y, xlim=c(0,10), ylim=c(0,1), type="o", col="blue")
par(new=T)
plot(x, z, xlim=c(0,10), ylim=c(0,1), type="o", col="red")
# ppf
pp = seq(0.1, 1, by=0.1)
pp
# [1] 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
q <- qbinom(pp, size=n, prob=p)
q
# [1] 3 4 4 5 5 5 6 6 7 10
VBA
離散確率分布のモーメント等
Python
n = 10
p = 0.5
mean, var, skew, kurt = binom.stats(n, p, moments='mvsk')
print(mean, var, skew, kurt)
# 5.0 2.5 0.0 -0.2
R
VBA
離散確率分布の例
Python
from scipy.stats import binom, poisson
plt.figure(figsize=(12,4))
# 二項分布 B(n,p)
x = np.arange(0, 10+1, 1)
n = 10
plt.subplot(1, 2, 1)
for i in range(10-1):
p = 0.0 + (i+1)/10
y = binom.pmf(x, n, p)
plt.plot(x, y, label='B({}, {})'.format(n,p), marker='o')
plt.legend()
# ポワソン分布 Po(L)
x = np.arange(0, 20+1, 1)
Llist = [1, 2, 5, 10, 15]
plt.subplot(1, 2, 2)
for L in Llist:
y = poisson.pmf(x, L)
plt.plot(x, y, label='Po({})'.format(L), marker='.')
plt.legend()
plt.show()
R
# 二項分布 B(n,p)
x <- seq(0, 10, 1)
n <- 10
for (i in 1:9) {
p <- 0.0 + i/10
print(p)
y <- dbinom(x, size=n, prob=p)
plot(x, y, xlim=c(0,10), ylim=c(0,0.4), type="o", col=i)
par(new=T)
}
par(new=F)
# ポワソン分布 Po(L)
x <- seq(0, 20, 1)
Llist <- c(1, 2, 5, 10, 15)
for (i in 1:length(Llist)) {
L <- Llist[i]
print(L)
y <- dpois(x, lambda=L)
plot(x, y, xlim=c(0,20), ylim=c(0,0.4), type="o", col=i)
par(new=T)
}
par(new=F)
VBA
まとめ
一覧
各言語で使用する関数等を一覧にまとめます。比較のために、EXCELでの計算も示しました。
確率分布
- $X$ :確率変数
- $f_{X}(x)$ :確率密度関数(probability density function; PDF)
- $F_{X}(x)$ :累積分布関数(cumulative distribution function; CDF)
- $\bar{F_X}(x)$ :相補累積分布関数(complementary cumulative distribution function; CCDF)(上側確率(upper-tail probability), 生存関数(survival function))
- $G_{X}(p)$ :分位関数(quantile function)(分位点関数)
\begin{eqnarray*}
F_{X}(x) &=& \mathrm{P}(X \le x) = \int_{-\infty}^{x} f_{X}(t)\,dt \quad (x \in \mathbb{R}) \\
\bar{F_X}(x) &=& \mathrm{P}(X > x) = 1-F_{X}(x) = \int_{x}^{\infty} f_{X}(t)\\
G_{X}(p) &=& {F_{X}}^{-1}(p) \quad (p \in [0,1])
\end{eqnarray*}
Python | R | VBA | EXCEL | |
---|---|---|---|---|
確率密度関数 (pdf)$f(x)$ |
xxx.pdf(x, ...) |
dxxx(x, ...) |
||
確率分布関数 (cdf)$F(x)$ |
xxx.cdf(x, ...) |
pxxx(x, ...) |
||
分位関数 (ppf)$G(p)$ |
xxx.ppf(p, ...) |
qxxx(p, ...) |
||
乱数 (random numbers) |
xxx.rvs(..., size=N) |
rxxx(n=N, ...) |
注意)xxx
部分は各分布の名称、...
は各分布のパラメータ。例えば、正規分布$N(m,s^2)$なら、Pythonではnorm.pdf(x, m, s)
, norm.cdf(x, m, s)
, norm.ppf(p, m, s)
, norm.rvs(m, s, size=N)
、Rではdnorm(x, m, s)
, pnorm(x, m, s)
, qnorm(p, m, s)
, rnorm(n=N, mean=m, sd=s)
など。
注意)乱数については、こちら参照。
注意)Pythonでは、scipy.stats
から、必要な関数をインポートしたうえで使用。
from scipy.stats import uniform, norm, chi2, t, f, beta, gamma, lognorm, expon
、from scipy.stats import bernoulli, binom, poisson, nbinom, geom, hypergeom, randint
プログラム全体
参考までに使ったプログラムの全体を示します。
Python
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm
m = 50
s = 10
x = np.linspace(0, 100, num=100+1)
print(x)
# [ 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
# 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27.
# ...
# 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97.
# 98. 99. 100.]
y = norm.pdf(x, m, s)
print(y)
# [1.48671951e-07 2.43896075e-07 3.96129909e-07 6.36982518e-07
# 1.01408521e-06 1.59837411e-06 2.49424713e-06 3.85351967e-06
# ...
# 1.01408521e-06 6.36982518e-07 3.96129909e-07 2.43896075e-07
# 1.48671951e-07]
plt.figure()
plt.plot(x, y)
plt.show()
m = 0
s = 1
x = np.linspace(-3.5, 3.5, num=100+1)
y = norm.pdf(x, m, s) # Probability density function
z = norm.cdf(x, m, s) # Cumulative distribution function
p = np.arange(0, 1+0.1, 0.1)
print(p)
# [0. 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1. ]
q = norm.ppf(p, m, s) # Percent point function (percentiles) = inverse of cdf
print(q)
# [ -inf -1.28155157 -0.84162123 -0.52440051 -0.2533471 0.
# 0.2533471 0.52440051 0.84162123 1.28155157 inf]
plt.figure()
plt.plot(x, y, label='pdf')
plt.plot(x, z, label='cdf')
plt.plot(q, p, marker='o', linestyle='', color='red', label='ppf')
for i in range(len(p)):
plt.axhline(y=p[i], xmin=0.05, xmax=0.95, linewidth=0.5, color='red', alpha=0.6)
plt.vlines(x=q, ymin=0, ymax=p, linewidth=0.5, color='red', alpha=0.6)
plt.legend(loc='upper left')
# plt.grid()
plt.show()
m = 0
s = 1
print(norm.mean(m, s), norm.var(m, s), norm.std(m, s), norm.median(m, s))
# 0.0 1.0 1.0 0.0
mean, var, skew, kurt = norm.stats(m, s, moments='mvsk')
print(mean, var, skew, kurt)
for n in range(1, 5+1, 1):
moment = norm.moment(n, m, s)
print('Moment({}) = {}'.format(n, moment))
# Moment(1) = 0.0
# Moment(2) = 1.0
# Moment(3) = 0.0
# Moment(4) = 3.0
# Moment(5) = -1.5022529663236356e-14
x = np.linspace(-3.5, 3.5, num=100+1)
y = norm.pdf(x, m, s)
mm = norm.mean(m, s)
ss = norm.std(m, s)
plt.figure()
plt.plot(x, y, label='pdf')
plt.axvline(x= mm, linestyle="-", color='red')
plt.axvline(x= ss, linestyle=':', color='red')
plt.axvline(x=-ss, linestyle=':', color='red')
plt.xlim(-3.5, 3.5)
plt.ylim(0, 0.5)
plt.show()
from scipy.stats import norm, t, chi2, f
plt.figure(figsize=(12,8))
# 正規分布 N(m,s)
x = np.linspace(-5, 5, num=100)
mlist = [0, 0, 0, 1, 2]
slist = [1, 2, 3, 1, 1]
plt.subplot(2, 2, 1)
for i in range(len(mlist)):
m = mlist[i]
s = slist[i]
y = norm.pdf(x, m, s)
plt.plot(x, y, label='N({}, {})'.format(m, s))
plt.legend()
# t分布 t(n)
x = np.linspace(-5, 5, num=100)
plt.subplot(2, 2, 2)
for n in range(1,5+1):
y = t.pdf(x, n)
plt.plot(x, y, label='t({})'.format(n))
plt.legend()
# カイ2乗分布 χ^2(n)
x = np.linspace(0, 10, num=100)
nlist = [1, 2, 3, 5, 10]
plt.subplot(2, 2, 3)
for n in nlist:
y = chi2.pdf(x, n)
plt.plot(x, y, label='Chi2({})'.format(n))
plt.legend()
# F分布 F(n,m)
x = np.linspace(0, 3, num=100)
plt.subplot(2, 2, 4)
nlist = [1, 1, 2, 5, 10, 10, 50, 50]
mlist = [1, 5, 5, 5, 10, 50, 50, 100]
for i in range(len(mlist)):
n = nlist[i]
m = mlist[i]
y = f.pdf(x, n, m)
plt.plot(x, y, label='F({}, {})'.format(n,m))
plt.legend()
plt.show()
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import binom
n = 10
p = 0.5
x = np.arange(0, 10+1, 1)
print(x)
# [ 0 1 2 3 4 5 6 7 8 9 10]
y = binom.pmf(x, n, p)
print(y)
# [0.00097656 0.00976563 0.04394531 0.1171875 0.20507813 0.24609375
# 0.20507813 0.1171875 0.04394531 0.00976563 0.00097656]
plt.figure()
plt.plot(x, y, marker='o')
plt.show()
plt.figure()
plt.plot(x, y, linestyle='', marker='o', markersize=8)
plt.vlines(x, ymin=0, ymax=y, linestyles='-', linewidth=5, color='#1f77b4', alpha=0.5)
plt.show()
n = 10
p = 0.5
x = np.arange(0, 10+1, 1)
y = binom.pmf(x, n, p) # Probability mass function
z = binom.cdf(x, n, p) # Cumulative distribution function
pp = np.arange(0.1, 1+0.1, 0.1)
print(pp)
# [0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1. ]
q = binom.ppf(pp, n, p) # Percent point function (percentiles) = inverse of cdf
print(q)
# [ 3. 4. 4. 5. 5. 5. 6. 6. 7. 10.]
plt.figure()
plt.plot(x, y, marker='o', label='pmf')
# plt.plot(x, z, marker='.', label='cdf')
plt.step(x, z, marker='.', where='post', label='cdf')
plt.plot(q, pp, marker='o', linestyle='', color='red', label='ppf')
for i in range(len(pp)):
plt.axhline(y=pp[i], xmin=0.05, xmax=0.95, linewidth=0.5, color='red', alpha=0.6)
plt.vlines(x=q, ymin=0, ymax=pp, linewidth=0.5, color='red', alpha=0.6)
plt.legend(loc='upper left')
# plt.grid()
plt.show()
n = 10
p = 0.5
mean, var, skew, kurt = binom.stats(n, p, moments='mvsk')
print(mean, var, skew, kurt)
# 5.0 2.5 0.0 -0.2
from scipy.stats import binom, poisson
plt.figure(figsize=(12,4))
# 二項分布 B(n,p)
x = np.arange(0, 10+1, 1)
n = 10
plt.subplot(1, 2, 1)
for i in range(10-1):
p = 0.0 + (i+1)/10
y = binom.pmf(x, n, p)
plt.plot(x, y, label='B({}, {})'.format(n,p), marker='o')
plt.legend()
# ポワソン分布 Po(L)
x = np.arange(0, 20+1, 1)
Llist = [1, 2, 5, 10, 15]
plt.subplot(1, 2, 2)
for L in Llist:
y = poisson.pmf(x, L)
plt.plot(x, y, label='Po({})'.format(L), marker='.')
plt.legend()
plt.show()
R
# pdf
m <- 50
s <- 10
x <- 0:100
x
# [1] 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
# [21] 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
# ...
# [81] 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
# [101] 100
y <- dnorm(x, m, s)
y
# [1] 1.486720e-07 2.438961e-07 3.961299e-07 6.369825e-07 1.014085e-06 1.598374e-06
# [7] 2.494247e-06 3.853520e-06 5.894307e-06 8.926166e-06 1.338302e-05 1.986555e-05
# ...
# [97] 1.014085e-06 6.369825e-07 3.961299e-07 2.438961e-07 1.486720e-07
plot(x, y, type="l")
# cdf
m <- 0
s <- 1
x <- seq(-3.5, 3.5, length=100+1)
x
y <- dnorm(x, m, s)
z <- pnorm(x, m, s)
plot(x, y, xlim=c(-3.5, 3.5), ylim=c(0,1), type="l", col=1)
par(new=T)
plot(x, z, xlim=c(-3.5, 3.5), ylim=c(0,1), type="l", col=2)
# ppf
p <- seq(0, 1, by=0.1)
p
# [1] 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
q <- qnorm(p, m, s)
q
# [1] -Inf -1.2815516 -0.8416212 -0.5244005 -0.2533471 0.0000000
# [7] 0.2533471 0.5244005 0.8416212 1.2815516 Inf
# 正規分布 N(m,s)
x <- seq(-5, 5, length=100+1)
mlist <- c(0, 0, 0, 1, 2)
slist <- c(1, 2, 3, 1, 1)
for (i in 1:5) {
m <- mlist[i]
s <- slist[i]
y <- dnorm(x, m, s)
plot(x, y, xlim=c(-5,5), ylim=c(0, 0.4), type="l", col=i)
par(new=T)
}
par(new=F)
# t分布 t(n)
x <- seq(-5, 5, length=100+1)
nlist <- 1:5
for (i in 1:length(nlist)) {
n <- nlist[i]
y <- dt(x, df=n)
plot(x, y, xlim=c(-5,5), ylim=c(0,0.4), type="l", col=i)
par(new=T)
}
par(new=F)
# カイ2乗分布 χ^2(n)
x <- seq(0, 10, length=100+1)
nlist <- c(1, 2, 3, 5, 10)
for (i in 1:length(nlist)) {
n <- nlist[i]
y <- dchisq(x, df=n)
plot(x, y, xlim=c(0,10), ylim=c(0,1.2), type="l", col=i)
par(new=T)
}
par(new=F)
# F分布 F(m,n)
x <- seq(0, 3, length=100+1)
nlist <- c(1, 1, 2, 5, 10, 10, 50, 50)
mlist <- c(1, 5, 5, 5, 10, 50, 50, 100)
for (i in 1:length(nlist)) {
n <- nlist[i]
m <- mlist[i]
y <- df(x, df1=n, df2=m)
plot(x, y, xlim=c(0,3), ylim=c(0,2), type="l", col=i)
par(new=T)
}
par(new=F)
# pmf
n <- 10
p <- 0.5
x <- 0:10
x
# [1] 0 1 2 3 4 5 6 7 8 9 10
y <- dbinom(x, size=n, prob=p)
y
# [1] 0.0009765625 0.0097656250 0.0439453125 0.1171875000 0.2050781250 0.2460937500
# [7] 0.2050781250 0.1171875000 0.0439453125 0.0097656250 0.0009765625
plot(x, y)
plot(x, y, type="b")
plot(x, y, type="o")
plot(x, y, type="h")
plot(x, y)
par(new=T)
plot(x, y, type="h")
# cdf
n <- 10
p <- 0.5
x <- 0:10
y <- dbinom(x, size=n, prob=p)
z <- pbinom(x, size=n, prob=p)
plot(x, y, xlim=c(0,10), ylim=c(0,1), type="o", col="blue")
par(new=T)
plot(x, z, xlim=c(0,10), ylim=c(0,1), type="o", col="red")
# ppf
pp = seq(0.1, 1, by=0.1)
pp
# [1] 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
q <- qbinom(pp, size=n, prob=p)
q
# [1] 3 4 4 5 5 5 6 6 7 10
# 二項分布 B(n,p)
x <- seq(0, 10, 1)
n <- 10
for (i in 1:9) {
p <- 0.0 + i/10
print(p)
y <- dbinom(x, size=n, prob=p)
plot(x, y, xlim=c(0,10), ylim=c(0,0.4), type="o", col=i)
par(new=T)
}
par(new=F)
# ポワソン分布 Po(L)
x <- seq(0, 20, 1)
Llist <- c(1, 2, 5, 10, 15)
for (i in 1:length(Llist)) {
L <- Llist[i]
print(L)
y <- dpois(x, lambda=L)
plot(x, y, xlim=c(0,20), ylim=c(0,0.4), type="o", col=i)
par(new=T)
}
par(new=F)
VBA
参考
- Python
- R
- VBA
- Excel
- リファレンス