確率変数とサイコロ
まず最初はゆがみのない1~6サイコロの例で考えてみましょう。
1から6のサイコロの目はそれぞれ同様に確からしい(それぞれの出方に偏りがない)ことから、それぞれの目の出方は以下のような確率で与えることがでます。
$
P(1 の目が出る確率) = \frac{1}{6}\qquad
P(2 の目が出る確率) = \frac{1}{6}\qquad
P(3 の目が出る確率) = \frac{1}{6}\
P(4 の目が出る確率) = \frac{1}{6}\qquad
P(5 の目が出る確率) = \frac{1}{6}\qquad
P(6 の目が出る確率) = \frac{1}{6}
$
ここでの確率変数$X$以下のように定義すると
$
X = \left\{
\begin{array}{ll}
1 & (1の目が出たとき)\
2 & (2の目が出たとき)\
3 & (3の目が出たとき)\
4 & (4の目が出たとき)\
5 & (5の目が出たとき)\
6 & (6の目が出たとき)\
\end{array}\right.
$
となります。ここでの $X$のように確率的に変動する変数を確率変数と呼びます。また、ここでの確率変数が実際に取る値を実現値といいます。
$
P(X = x) = \frac{1}{6}, \qquad x = 1,2,3,4,5,6
$
ではpythonで実際にサイコロを振ってみましょう。
import numpy as np
import matplotlib as mpl
np.random.seed()
prob_dice = np.array([])
dice = np.array([1,2,3,4,5,6])
dice_data = np.random.choice(dice, dice_times)
dice_times = 10000
for i in range(1,7):
p = len(dice_data[dice_data == i]) / dice_times
print(i, "の出る確率", p)
prob_dice = np.append(prob_dice, len(dice_data[dice_data == i]) / dice_times)
plt.bar(dice, prob_dice)
plt.grid(True)
以下が結果になってます。今回は10000回サイコロを転がし,その確率を出しています。結果が示しているようにそれぞれの目は $\frac{1}{6} = 0.1666...$に近似しています。
確率関数と累積分布関数
確率変数には様々なものがあり、$X$が離散確率変数であるとは $X$の取りうる値が有限個または加算無限個の場合(1,2,3,4,5...のようにとびとびになっている値)をいい、$X$が連続確率変数であるとは密度関数を持つ場合のことをいいます。
離散確率の場合、先ほどのサイコロと同様に各 $x$で確率を考え、それを $x$の関数としたものを確率関数といい、以下のように表すことができます。
$
p(x) = P(X = x)\
$
また確率関数は以下ような性質をもちます。なお、ここでの $\sum$は確率の総和を表しています。
$
p(x) \ge 0, \qquad \forall x \
\sum_{x}^{} p(x) = 1
$
確率関数の累積和をとったものを累積分布関数、もしくは分布関数といいます。なお分布関数には以下のような性質があり、単調性や右連続性などの性質を持ちます。
$
F(x) = P(X \le x) = \sum_{y \le x} p(y)\
(1) \quad \lim_{n \to -\infty}F(x) = 0\
(2) \quad \forall x,y \in \mathbb{R}(実数)ならば\\
\qquad F(x) \ge F(y), \quad F(x) = \lim_{\varepsilon \to 0}F(x + \varepsilon)\
(3) \quad \lim_{n \to +\infty}F(x) = 1
$
ここで $ \forall x$において$F(X)$は右連続( $F(X+) = F(X)$と表す。)であり、$x_n$は単調に減少して収束する数列とすると $\lim_{x_n \to +\infty}F(x_n) = F(x)$ となります。ここでの $x+$は正の方向から単調に減少して $x$に収束することを示しています。すると以下のように $X$の累積分布関数の差をとれば確率関数を求めることができます。
$
p(x) = F(x) - \lim_{x_n \to x-} F(x_n) = F(x) - F(x-)
$
pythonで累積分布を実装すると以下のようになります。
import numpy as np
import matplotlib as mpl
from scipy.stats import norm
import matplotlib.pyplot as plt
x = np.arange(0,3000)
y = norm.cdf(x, loc=1500, scale=500)
plt.plot(x,y)
plt.grid(True)
plt.xlabel("value")
plt.ylabel("possibility")