離散一様分布は、もっとも基本的な離散型確率分布の一つである。「どの値も同じ確率で出現する」という単純な状況をモデル化する。連続値に対して同様の性質をもつのが連続一様分布である。
日常生活でも離散一様分布は頻繁に登場する。公平なサイコロを振ったときの目の出方、くじ引きで番号を引く場面、ルーレットで数字を選ぶゲームなど、すべての選択肢が等しい確率で選ばれる状況が該当する。
統計学では、離散一様分布は乱数生成の基礎として重要な役割を果たす。コンピュータでランダムな整数を生成するとき、まず離散一様分布に従う乱数を作り、それを変換して他の分布に従う乱数を生成することが多い。
定義
確率変数 X が 1, 2, \ldots, K の値を等確率でとるとき、X は離散一様分布(discrete uniform distribution)に従うという。
ここで K はとりうる値の個数である。すべての値に対して確率が \dfrac{1}{K} で一定であることが、この分布の特徴である。
より一般に、\{a, a+1, \ldots, b\} 上の離散一様分布も考えられる。この場合、K = b - a + 1 として同様に扱える。
確率分布のグラフ
離散一様分布の確率関数をグラフで表すと、すべての値で同じ高さの棒グラフになる。以下は K = 6(1から6の整数)の場合である。
このように、どの値も等しい確率 \dfrac{1}{6} \approx 0.167 をもつ。
期待値と分散
期待値
\{1, 2, \ldots, K\} 上の離散一様分布の期待値は次の公式で求められる。
これは 1 から K までの平均値に等しく、直感的にも納得できる。
【導出】 期待値の定義に従って計算する。
ここで、\sum_{x=1}^{K} x = 1 + 2 + \cdots + K = \dfrac{K(K+1)}{2} の公式を用いた。
分散
分散は次の公式で与えられる。
【導出】 分散の公式 V[X] = E[X^2] - (E[X])^2 を使う。まず E[X^2] を求める。
ここで、\sum_{x=1}^{K} x^2 = \dfrac{K(K+1)(2K+1)}{6} の公式を用いた。
したがって、分散は
\{1, 2, \ldots, K\} 上の離散一様分布では
- 期待値:E[X] = \dfrac{K+1}{2}
- 分散:V[X] = \dfrac{K^2 - 1}{12}
確率母関数
確率母関数(probability generating function)は次のように求められる。
ここで、等比級数の和の公式 s + s^2 + \cdots + s^K = \dfrac{s(1 - s^K)}{1 - s} を用いた。
確率母関数から期待値と分散を求めることもできる。E[X] = G'(1)、E[X(X-1)] = G''(1) の関係を使う。
簡単な計算例
例1:サイコロの場合
公平な6面サイコロを1回振ったとき、出る目 X は \{1, 2, 3, 4, 5, 6\} 上の離散一様分布に従う(K = 6)。
期待値は
分散は
標準偏差は \sigma = \sqrt{2.917} \approx 1.708 である。
例2:番号札を引く場合
1から8までの番号が書かれた8枚の札から、1枚をランダムに引くとする。引いた札の番号 X は K = 8 の離散一様分布に従う。
期待値と分散を求める。
また、「5以上の番号を引く確率」は
練習問題
X は K = 10 の離散一様分布に従う。
まず X と Y それぞれについて(K = 4)
期待値の加法性より
X と Y が独立なので、分散も加法性が成り立ち
各値の確率は \dfrac{1}{8} なので
まとめ
| 項目 | 内容 |
|---|---|
| 分布名 | 離散一様分布(discrete uniform distribution) |
| 確率関数 | P(X = x) = \dfrac{1}{K} (x = 1, 2, \ldots, K) |
| 期待値 | E[X] = \dfrac{K + 1}{2} |
| 分散 | V[X] = \dfrac{K^2 - 1}{12} |
| 確率母関数 | G(s) = \dfrac{s(1 - s^K)}{K(1 - s)} |
| 応用例 | サイコロ、くじ引き、乱数生成 |
Pythonで実装する
Pythonを使って離散一様分布の計算やシミュレーションを行う。
import numpy as np
from scipy import stats
# パラメータ設定
K = 6 # 1からKまでの整数
# 期待値と分散(理論値)
E_X = (K + 1) / 2
V_X = (K**2 - 1) / 12
print("=== 離散一様分布(K=6)===")
print(f"期待値(理論値): E[X] = {E_X}")
print(f"分散(理論値) : V[X] = {V_X:.4f}")
print(f"標準偏差 : σ = {np.sqrt(V_X):.4f}")
# scipy.statsを使用した計算
# randint(low, high+1) で low から high までの一様分布
dist = stats.randint(1, K + 1)
print(f"\nscipy.statsによる計算:")
print(f"期待値: {dist.mean()}")
print(f"分散 : {dist.var():.4f}")
# 確率関数の確認
print(f"\n確率関数 P(X=x):")
for x in range(1, K + 1):
print(f" P(X={x}) = {dist.pmf(x):.4f}")
# シミュレーション
np.random.seed(42)
n_samples = 10000
samples = np.random.randint(1, K + 1, size=n_samples)
print(f"\nシミュレーション(n={n_samples}):")
print(f"標本平均: {np.mean(samples):.4f}")
print(f"標本分散: {np.var(samples, ddof=0):.4f}")
シミュレーション結果が理論値に近い値を示しており、大数の法則により標本サイズを増やすほど理論値に収束する。