ヘロログ
統計学

離散一様分布

離散一様分布は、もっとも基本的な離散型確率分布の一つである。「どの値も同じ確率で出現する」という単純な状況をモデル化する。連続値に対して同様の性質をもつのが連続一様分布である。

日常生活でも離散一様分布は頻繁に登場する。公平なサイコロを振ったときの目の出方、くじ引きで番号を引く場面、ルーレットで数字を選ぶゲームなど、すべての選択肢が等しい確率で選ばれる状況が該当する。

統計学では、離散一様分布は乱数生成の基礎として重要な役割を果たす。コンピュータでランダムな整数を生成するとき、まず離散一様分布に従う乱数を作り、それを変換して他の分布に従う乱数を生成することが多い。

定義

確率変数 X1, 2, \ldots, K の値を等確率でとるとき、X離散一様分布(discrete uniform distribution)に従うという。

離散一様分布の確率関数
P(X = x) = \dfrac{1}{K}, \quad x = 1, 2, \ldots, K

ここで K はとりうる値の個数である。すべての値に対して確率が \dfrac{1}{K} で一定であることが、この分布の特徴である。

より一般に、\{a, a+1, \ldots, b\} 上の離散一様分布も考えられる。この場合、K = b - a + 1 として同様に扱える。

確率分布のグラフ

離散一様分布の確率関数をグラフで表すと、すべての値で同じ高さの棒グラフになる。以下は K = 6(1から6の整数)の場合である。

P(X=x) 1/6 0 x 1 2 3 4 5 6
図1: 離散一様分布の確率関数(K=6)

このように、どの値も等しい確率 \dfrac{1}{6} \approx 0.167 をもつ。

期待値と分散

期待値

\{1, 2, \ldots, K\} 上の離散一様分布の期待値は次の公式で求められる。

期待値
E[X] = \dfrac{K + 1}{2}

これは 1 から K までの平均値に等しく、直感的にも納得できる。

【導出】 期待値の定義に従って計算する。

\begin{aligned} E[X] &= \sum_{x=1}^{K} x \cdot P(X = x) \\[5pt] &= \sum_{x=1}^{K} x \cdot \dfrac{1}{K} \\[5pt] &= \dfrac{1}{K} \sum_{x=1}^{K} x \\[5pt] &= \dfrac{1}{K} \cdot \dfrac{K(K+1)}{2} = \dfrac{K + 1}{2} \end{aligned}

ここで、\sum_{x=1}^{K} x = 1 + 2 + \cdots + K = \dfrac{K(K+1)}{2} の公式を用いた。

分散

分散は次の公式で与えられる。

分散
V[X] = \dfrac{K^2 - 1}{12}

【導出】 分散の公式 V[X] = E[X^2] - (E[X])^2 を使う。まず E[X^2] を求める。

\begin{aligned} E[X^2] &= \sum_{x=1}^{K} x^2 \cdot \dfrac{1}{K} = \dfrac{1}{K} \cdot \dfrac{K(K+1)(2K+1)}{6} = \dfrac{(K+1)(2K+1)}{6} \end{aligned}

ここで、\sum_{x=1}^{K} x^2 = \dfrac{K(K+1)(2K+1)}{6} の公式を用いた。

したがって、分散は

\begin{aligned} V[X] &= E[X^2] - (E[X])^2 \\[5pt] &= \dfrac{(K+1)(2K+1)}{6} - \left(\dfrac{K+1}{2}\right)^2 \\[5pt] &= (K+1) \left( \dfrac{2K+1}{6} - \dfrac{K+1}{4} \right) \\[5pt] &= (K+1) \cdot \dfrac{2(2K+1) - 3(K+1)}{12} \\[5pt] &= (K+1) \cdot \dfrac{K - 1}{12} = \dfrac{K^2 - 1}{12} \end{aligned}
ポイント

\{1, 2, \ldots, K\} 上の離散一様分布では

  • 期待値:E[X] = \dfrac{K+1}{2}
  • 分散:V[X] = \dfrac{K^2 - 1}{12}

確率母関数

確率母関数(probability generating function)は次のように求められる。

\begin{aligned} G(s) &= E[s^X] = \sum_{x=1}^{K} s^x \cdot \dfrac{1}{K} \\[5pt] &= \dfrac{1}{K} (s + s^2 + \cdots + s^K) \\[5pt] &= \dfrac{1}{K} \cdot \dfrac{s(1 - s^K)}{1 - s} = \dfrac{s(1 - s^K)}{K(1 - s)} \end{aligned}

ここで、等比級数の和の公式 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)。

期待値は

E[X] = \dfrac{6 + 1}{2} = \dfrac{7}{2} = 3.5

分散は

V[X] = \dfrac{6^2 - 1}{12} = \dfrac{35}{12} \approx 2.917

標準偏差は \sigma = \sqrt{2.917} \approx 1.708 である。

例2:番号札を引く場合

1から8までの番号が書かれた8枚の札から、1枚をランダムに引くとする。引いた札の番号 XK = 8 の離散一様分布に従う。

期待値と分散を求める。

\begin{aligned} E[X] &= \dfrac{8 + 1}{2} = 4.5 \\[5pt] V[X] &= \dfrac{8^2 - 1}{12} = \dfrac{63}{12} = 5.25 \end{aligned}

また、「5以上の番号を引く確率」は

P(X \geq 5) = P(X = 5) + P(X = 6) + P(X = 7) + P(X = 8) = \dfrac{4}{8} = \dfrac{1}{2}

練習問題

問1. 1から10までの整数が書かれたカードが1枚ずつ、計10枚ある。この中から1枚をランダムに引いたとき、カードに書かれた数 X の期待値と分散を求めよ。

XK = 10 の離散一様分布に従う。

\begin{aligned} E[X] &= \dfrac{10 + 1}{2} = 5.5 \\[5pt] V[X] &= \dfrac{10^2 - 1}{12} = \dfrac{99}{12} = 8.25 \end{aligned}
問2. XY が互いに独立に \{1, 2, 3, 4\} 上の離散一様分布に従うとき、和 S = X + Y の期待値と分散を求めよ。

まず XY それぞれについて(K = 4

E[X] = E[Y] = \dfrac{4 + 1}{2} = 2.5, \quad V[X] = V[Y] = \dfrac{4^2 - 1}{12} = 1.25

期待値の加法性より

E[S] = E[X] + E[Y] = 2.5 + 2.5 = 5

XY が独立なので、分散も加法性が成り立ち

V[S] = V[X] + V[Y] = 1.25 + 1.25 = 2.5
問3. X\{1, 2, \ldots, 8\} 上の離散一様分布に従うとき、P(X \leq 3) を求めよ。

各値の確率は \dfrac{1}{8} なので

P(X \leq 3) = P(X = 1) + P(X = 2) + P(X = 3) = \dfrac{1}{8} + \dfrac{1}{8} + \dfrac{1}{8} = \dfrac{3}{8} = 0.375

まとめ

項目 内容
分布名 離散一様分布(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を使って離散一様分布の計算やシミュレーションを行う。

discrete_uniform.py
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}")
=== 離散一様分布(K=6)=== 期待値(理論値): E[X] = 3.5 分散(理論値) : V[X] = 2.9167 標準偏差 : σ = 1.7078 scipy.statsによる計算: 期待値: 3.5 分散 : 2.9167 確率関数 P(X=x): P(X=1) = 0.1667 P(X=2) = 0.1667 P(X=3) = 0.1667 P(X=4) = 0.1667 P(X=5) = 0.1667 P(X=6) = 0.1667 シミュレーション(n=10000): 標本平均: 3.4999 標本分散: 2.9194

シミュレーション結果が理論値に近い値を示しており、大数の法則により標本サイズを増やすほど理論値に収束する。